UTE/Strategy/Panel/ElDropDownList.mqh

213 lines
16 KiB
MQL5
Raw Permalink Normal View History

2025-05-30 16:34:43 +02:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| ElDropDownList.mqh |
//| Copyright 2015, Vasiliy Sokolov. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, Vasiliy Sokolov."
#property link "http://www.mql5.com"
#include <Object.mqh>
#include <Arrays\ArrayObj.mqh>
#include "..\Dictionary.mqh"
#include "Node.mqh"
#include "ElChart.mqh"
#include "ElButton.mqh"
#include "Events\Event.mqh"
#include "Events\EventChartObjClick.mqh"
#include "Events\EventChartMouseMove.mqh"
#define UP_ARROW CharToString(0x35)
#define DN_ARROW CharToString(0x36)
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
class CMenu : public CObject
{
public:
string Text;
CMenu(string text){Text=text;}
};
//+------------------------------------------------------------------+
//| @0D8G5A:89 M;5<5=B "@0A:@K20NI89AO A?8A>:" |
//+------------------------------------------------------------------+
class CElDropDownList : public CElChart
{
private:
CElButton m_btn_list; // =>?:0, @0A:@K20NI0O A?8A>:
CElChart m_fon; // $>= @0A:@KB>3> A?8A:0
CDictionary m_list; // !?8A>: M;5<5=B>2
CElChart* m_selected; // K45;5==K9 M;5<5=B
void Showed(bool showed);
void OnObjClick(CEventChartObjClick *objClick);
void OnMouseMove(CEventChartMouseMove *mouseMove);
protected:
virtual void OnXCoordChange(void);
virtual void OnYCoordChange(void);
virtual void OnWidthChange(void);
virtual void OnHeightChange(void);
public:
CElDropDownList(void);
void AddElement(string text);
void SelectElementByName(string name);
virtual void Event(CEvent *event);
};
//+------------------------------------------------------------------+
//| >78F8>=8@C5B >1J5:B ?@8 A>740=88 |
//+------------------------------------------------------------------+
CElDropDownList::CElDropDownList(void) : CElChart(OBJ_EDIT),m_fon(OBJ_RECTANGLE_LABEL)
{
m_btn_list.BorderType(BORDER_RAISED);
m_btn_list.BackgroundColor(clrWhiteSmoke);
m_btn_list.TextFont("Webdings");
m_btn_list.TextSize(9);
m_btn_list.Text(CharToString(0x36));
m_elements.Add(GetPointer(m_btn_list));
}
//+------------------------------------------------------------------+
//| >102;O5B =>2K9 M;5<5=B <5=N. |
//+------------------------------------------------------------------+
void CElDropDownList::AddElement(string text)
{
if(m_list.ContainsKey(text))return;
CElChart *elMenu=new CElChart(OBJ_EDIT);
elMenu.XCoord(XCoord()+1);
elMenu.YCoord(m_fon.YCoord()+20*m_list.Total()+1);
elMenu.Height(20);
elMenu.Width(Width()-2);
elMenu.Text(text);
elMenu.BorderColor(elMenu.BackgroundColor());
m_list.AddObject(elMenu.Name(), elMenu);
m_fon.Height(20*m_list.Total()+2);
}
//+------------------------------------------------------------------+
//| K45;O5B M;5<5=B ?> 8<5=8 name |
//+------------------------------------------------------------------+
void CElDropDownList::SelectElementByName(string name)
{
FOREACH_DICT(m_list)
{
CElChart* elMenu = node;
if(elMenu.Text() == name)
{
m_selected=elMenu;
Text(m_selected.Text());
break;
}
}
}
//+------------------------------------------------------------------+
//| 5@5E20BK205< A>1KB8O 8 @5038@C5< =0 =8E. |
//+------------------------------------------------------------------+
void CElDropDownList::Event(CEvent *event)
{
CNode::Event(event);
if(event.EventType()==EVENT_CHART_OBJECT_CLICK)
OnObjClick(event);
if(event.EventType()==EVENT_CHART_MOUSE_MOVE)
OnMouseMove(event);
}
//+------------------------------------------------------------------+
//| 1@010BK205B H5;G>: :=>?:8 <KH8 |
//+------------------------------------------------------------------+
void CElDropDownList::OnObjClick(CEventChartObjClick *objClick)
{
if(m_list.ContainsKey(objClick.ObjectName()))
{
m_btn_list.Text(DN_ARROW);
m_btn_list.State(PUSH_OFF);
Showed(false);
m_selected=m_list.GetObjectByKey(objClick.ObjectName());
Text(m_selected.Text());
EventChartCustom(ChartID(),EVENT_CHART_LIST_CHANGED,0.0,0.0,Name());
return;
}
if(objClick.ObjectName() != m_btn_list.Name())return;
if(m_btn_list.State()==PUSH_ON)
{
m_btn_list.Text(UP_ARROW);
Showed(true);
}
else
{
m_btn_list.Text(DN_ARROW);
Showed(false);
}
}
//+------------------------------------------------------------------+
//| 1@010BK205B 42865=85 <KH8 |
//+------------------------------------------------------------------+
void CElDropDownList::OnMouseMove(CEventChartMouseMove *mouseMove)
{
if(!m_fon.IsShowed())return;
//?@545;O5<, =0E>48BAO ;8 C:070B5;L <KH8 2 >1;0AB8 A?8A:0 M;5<5=B>2
bool isX=mouseMove.XCoord()>=m_fon.XCoord() &&
mouseMove.XCoord()<=m_fon.XCoord()+m_fon.Width();
bool isY=mouseMove.YCoord()>=m_fon.YCoord() &&
mouseMove.YCoord()<=m_fon.YCoord()+m_fon.Height();
bool isMain=isX && isY;
if(!isMain)return;
//A;8 =0E>48BAO, 2KAG8BK205< AB@>:C, :>B>@CN =5>1E>48<> ?>4A25B8BL
long pips = mouseMove.YCoord() - m_fon.YCoord();
int index = (int)MathFloor(pips/20.0);
if(m_list.Total() <= index)return;
int i=0;
for(CElChart *node=m_list.GetFirstNode(); node!=NULL; node=m_list.GetNextNode(),i++)
{
if(i==index)
node.BackgroundColor(clrWhiteSmoke);
else
node.BackgroundColor(clrWhite);
}
}
//+------------------------------------------------------------------+
//| B>1@0605B 2A5 pop up M;5<5=BK |
//+------------------------------------------------------------------+
void CElDropDownList::Showed(bool showed)
{
if(showed)
m_fon.Show();
else
m_fon.Hide();
FOREACH_DICT(m_list)
{
CElChart *el=node;
if(showed)
el.Show();
else
el.Hide();
}
}
//+------------------------------------------------------------------+
//| A;54 70 87<5=5=85< ?@82O7:8 E, <5=O5< 4>G5@=88 M;5<5=BK |
//+------------------------------------------------------------------+
void CElDropDownList::OnXCoordChange(void)
{
m_btn_list.XCoord(XCoord()+Width()-18);
m_fon.XCoord(XCoord());
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CElDropDownList::OnYCoordChange(void)
{
m_btn_list.YCoord(YCoord()+2);
m_fon.YCoord(YCoord()+Height()+1);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CElDropDownList::OnHeightChange(void)
{
m_btn_list.Height(Height()-4);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CElDropDownList::OnWidthChange(void)
{
m_btn_list.Width(Height()-4);
m_fon.Width(Width());
}
//+------------------------------------------------------------------+