2026-09-09 01:19:31 +03:00 | | | //+------------------------------------------------------------------+
|
2026-09-10 16:43:28 +03:00 | | | //| LatencyPanel.mqh |
|
2026-09-16 15:37:55 +03:00 | | | //| Copyright 2026, MetaQuotes Ltd. |
|
2026-09-10 16:43:28 +03:00 | | | //| www.mql5.com |
|
2026-09-09 01:19:31 +03:00 | | | //+------------------------------------------------------------------+
|
| | | #ifndef REQUEST_LATENCY_LAB_LATENCY_PANEL_MQH
|
| | | #define REQUEST_LATENCY_LAB_LATENCY_PANEL_MQH
|
| | |
|
| | | #include "..\..\Include\RequestLatencyLab\Models.mqh"
|
| | |
|
| | | #define LAB_PANEL_PREFIX "RLL_Panel_"
|
| | |
|
| | | class CLatencyPanel
|
| | | {
|
| | | private:
|
2026-09-12 22:14:24 +03:00 | | | long m_chart_id;
|
| | | bool m_created;
|
| | | bool m_started; // R13-S1: НАМЕРЕННОЕ состояние кнопки (проекция из контроллера)
|
| | | string m_status;
|
2026-09-09 01:19:31 +03:00 | | |
|
| | | public:
|
2026-09-16 15:37:55 +03:00 | | | CLatencyPanel(void);
|
| | | void Create(const long chart_id);
|
| | | void Destroy(void);
|
2026-09-12 22:14:24 +03:00 | | | bool IsCreated() const { return(m_created); }
|
2026-09-16 15:37:55 +03:00 | | | bool IsStartPressed() const;
|
2026-09-12 22:14:24 +03:00 | | | void SetStatus(const string status)
|
2026-09-09 01:19:31 +03:00 | | | {
|
2026-09-12 22:14:24 +03:00 | | | m_status = status;
|
2026-09-09 01:19:31 +03:00 | | | }
|
2026-09-12 02:21:14 +03:00 | | | //--- R10-B1: состояние кнопки управляется ТОЛЬКО latch команды Start.
|
| | | //--- Кнопка остаётся нажатой/заблокированной, пока явно не вызван
|
| | | //--- SetStarted(false) (после финализации прогона).
|
2026-09-16 15:37:55 +03:00 | | | void SetStarted(const bool started);
|
2026-09-12 11:19:45 +03:00 | | | //--- R13-S1: OBJ_BUTTON при клике САМ переключает OBJPROP_STATE
|
| | | //--- (официальная семантика MQL5). После ОТКЛОНЁННОГО клика (повторный
|
| | | //--- клик занятой кнопки) графический вид восстановливается из
|
| | | //--- намеренного состояния, а не из того, что осталось в объекте.
|
2026-09-16 15:37:55 +03:00 | | | void RestoreStartedState(void);
|
| | | void Update(const bool running);
|
| | | };
|
| | | //+------------------------------------------------------------------+
|
| | | //| Внешние определения методов. |
|
| | | //+------------------------------------------------------------------+
|
| | | CLatencyPanel::CLatencyPanel(void)
|
| | | {
|
| | | m_chart_id = 0;
|
| | | m_created = false;
|
| | | m_started = false;
|
| | | m_status = "IDLE";
|
| | | }
|
| | | void CLatencyPanel::Create(const long chart_id)
|
| | | {
|
| | | m_chart_id = chart_id;
|
| | | if(m_created)
|
| | | return;
|
| | | //--- только объекты, принадлежащие программе
|
| | | ObjectCreate(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJ_RECTANGLE_LABEL, 0, 0, 0);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_XDISTANCE, 10);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_YDISTANCE, 20);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_XSIZE, 320);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_YSIZE, 110);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_BGCOLOR, clrDarkSlateGray);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_BORDER_TYPE, BORDER_FLAT);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Bg", OBJPROP_BACK, false);
|
| | | ObjectCreate(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJ_BUTTON, 0, 0, 0);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_XDISTANCE, 20);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_YDISTANCE, 30);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_XSIZE, 120);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_YSIZE, 30);
|
| | | ObjectSetString(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_TEXT, "Start");
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_BGCOLOR, clrForestGreen);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_HIDDEN, false);
|
| | | ObjectCreate(m_chart_id, LAB_PANEL_PREFIX + "StatusLabel", OBJ_LABEL, 0, 0, 0);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "StatusLabel", OBJPROP_XDISTANCE, 20);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "StatusLabel", OBJPROP_YDISTANCE, 75);
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "StatusLabel", OBJPROP_COLOR, clrWhite);
|
| | | ObjectSetString(m_chart_id, LAB_PANEL_PREFIX + "StatusLabel", OBJPROP_TEXT, "Status: IDLE");
|
| | | m_created = true;
|
| | | ChartRedraw(m_chart_id);
|
| | | }
|
| | | void CLatencyPanel::Destroy(void)
|
| | | {
|
| | | if(!m_created)
|
| | | return;
|
| | | //--- удаляем только объекты с нашим префиксом
|
| | | for(int i = ObjectsTotal(m_chart_id, 0, -1) - 1; i >= 0; i--)
|
2026-09-09 01:19:31 +03:00 | | | {
|
2026-09-16 15:37:55 +03:00 | | | const string name = ObjectName(m_chart_id, i, 0, -1);
|
| | | if(StringFind(name, LAB_PANEL_PREFIX) == 0)
|
| | | ObjectDelete(m_chart_id, name);
|
2026-09-09 01:19:31 +03:00 | | | }
|
2026-09-16 15:37:55 +03:00 | | | m_created = false;
|
| | | }
|
| | | bool CLatencyPanel::IsStartPressed() const
|
| | | {
|
| | | if(!m_created)
|
| | | return(false);
|
| | | return(ObjectGetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_STATE) != 0);
|
| | | }
|
| | | void CLatencyPanel::SetStarted(const bool started)
|
| | | {
|
| | | m_started = started; // R13-S1: храним намеренное состояние
|
| | | if(!m_created)
|
| | | return;
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_STATE,
|
| | | (started ? 1 : 0));
|
| | | ObjectSetString(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_TEXT,
|
| | | (started ? "Run…" : "Start"));
|
| | | }
|
| | | void CLatencyPanel::RestoreStartedState(void)
|
| | | {
|
| | | if(!m_created)
|
| | | return;
|
| | | ObjectSetInteger(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_STATE,
|
| | | (m_started ? 1 : 0));
|
| | | ObjectSetString(m_chart_id, LAB_PANEL_PREFIX + "Start", OBJPROP_TEXT,
|
| | | (m_started ? "Run…" : "Start"));
|
| | | }
|
| | | void CLatencyPanel::Update(const bool running)
|
| | | {
|
| | | if(!m_created)
|
| | | return;
|
| | | ObjectSetString(m_chart_id, LAB_PANEL_PREFIX + "StatusLabel", OBJPROP_TEXT,
|
| | | "Status: " + m_status);
|
| | | //--- во время измерений панель не перерисовывается
|
| | | if(!running)
|
| | | ChartRedraw(m_chart_id);
|
| | | }
|
2026-09-09 01:19:31 +03:00 | | |
|
2026-09-12 22:14:24 +03:00 | | | #endif // REQUEST_LATENCY_LAB_LATENCY_PANEL_MQH
|
| | | //+------------------------------------------------------------------+
|