EasyAndFastMod/Controls/StatusBar.mqh

328 lines
26 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| StatusBar.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
#include "TextLabel.mqh"
#include "SeparateLine.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O AB0BCA=>9 AB@>:8 |
//+------------------------------------------------------------------+
class CStatusBar : public CElement
{
private:
//--- 1J5:BK 4;O A>740=8O M;5<5=B0
CTextLabel m_items[];
CSeparateLine m_sep_line[];
//---
public:
CStatusBar(void);
~CStatusBar(void);
//--- 5B>4K 4;O A>740=8O AB0BCA=>9 AB@>:8
bool CreateStatusBar(const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const int x_gap,const int y_gap);
bool CreateCanvas(void);
bool CreateItems(void);
bool CreateSeparateLine(const int line_index);
//---
public:
//--- >72@0I05B C:070B5;L ?C=:B0 8 @0745;8B5;L=>9 ;8=88
CTextLabel *GetItemPointer(const uint index);
CSeparateLine *GetSeparateLinePointer(const uint index);
//--- (1) >;8G5AB2> ?C=:B>2 8 (2) @0745;8B5;L=KE ;8=89
int ItemsTotal(void) const { return(::ArraySize(m_items)); }
int SeparateLinesTotal(void) const { return(::ArraySize(m_sep_line)); }
//--- >102;O5B ?C=:B A C:070==K<8 A2>9AB20<8 4> A>740=8O AB0BCA=>9 AB@>:8
void AddItem(const string text,const int width);
//--- #AB0=>2:0 7=0G5=8O ?> C:070==><C 8=45:AC
void SetValue(const uint index,const string value);
//---
public:
//--- #40;5=85
virtual void Delete(void);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- 0AGQB H8@8=K M;5<5=B0
int CalculationXSize(void);
//--- 0AGQB H8@8=K ?5@2>3> ?C=:B0
int CalculationFirstItemXSize(void);
//--- 0AGQB X-:>>@48=0BK ?C=:B0
int CalculationItemX(const int item_index=0);
//--- 7<5=8BL H8@8=C ?> ?@02><C :@0N >:=0
virtual void ChangeWidthByRightWindowSide(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CStatusBar::CStatusBar(void)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CStatusBar::~CStatusBar(void)
{
}
//+------------------------------------------------------------------+
//| !>740QB AB0BCA=CN AB@>:C |
//+------------------------------------------------------------------+
bool CStatusBar::CreateStatusBar(const int x_gap,const int y_gap)
{
//--- K9B8, 5A;8 =5B C:070B5;O =0 3;02=K9 M;5<5=B
if(!CElement::CheckMainPointer())
return(false);
//--- =8F80;870F8O A2>9AB2
InitializeProperties(x_gap,y_gap);
//--- !>740QB M;5<5=B
if(!CreateCanvas())
return(false);
if(!CreateItems())
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CStatusBar::InitializeProperties(const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_x_size =CalculationXSize();
m_y_size =(m_y_size<1)? 22 : m_y_size;
//--- !2>9AB20 ?> C<>;G0=8N
m_back_color =(m_back_color!=clrNONE)? m_back_color : C'225,225,225';
m_border_color =(m_border_color!=clrNONE)? m_border_color : m_back_color;
m_label_color =(m_label_color!=clrNONE)? m_label_color : clrBlack;
m_label_x_gap =(m_label_x_gap!=WRONG_VALUE)? m_label_x_gap : 0;
m_label_y_gap =(m_label_y_gap!=WRONG_VALUE)? m_label_y_gap : 0;
//--- BABC?K >B :@09=59 B>G:8
CElementBase::XGap(x_gap);
CElementBase::YGap(y_gap);
}
//+------------------------------------------------------------------+
//| !>740QB >1J5:B 4;O @8A>20=8O |
//+------------------------------------------------------------------+
bool CStatusBar::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("statusbar");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB A?8A>: ?C=:B>2 AB0BCA=>9 AB@>:8 |
//+------------------------------------------------------------------+
bool CStatusBar::CreateItems(void)
{
int x=0,y=0;
//--- >;CG8< :>;8G5AB2> ?C=:B>2
int items_total=ItemsTotal();
//--- A;8 =5B =8 >4=>3> ?C=:B0 2 3@C??5, A>>1I8BL >1 MB>< 8 2K9B8
if(items_total<1)
{
::Print(__FUNCTION__," > K7>2 MB>3> <5B>40 =C6=> >ACI5AB2;OBL, "
":>340 2 3@C??5 5ABL E>BO 1K >48= ?C=:B! >A?>;L7C9B5AL <5B>4>< CStatusBar::AddItem()");
return(false);
}
//--- A;8 H8@8=0 ?5@2>3> ?C=:B0 =5 7040=0, B> @0AAG8B05< 5Q >B=>A8B5;L=> >1I59 H8@8=K 4@C38E ?C=:B>2
if(m_items[0].XSize()<1)
m_items[0].XSize(CalculationFirstItemXSize());
//--- !>74048< C:070==>5 :>;8G5AB2> ?C=:B>2
for(int i=0; i<items_total; i++)
{
//--- !>E@0=8< C:070B5;L =0 @>48B5;LA:89 M;5<5=B
m_items[i].MainPointer(this);
//--- >>@48=0B0 X
x=(i>0)? x+m_items[i-1].XSize() : 0;
//--- !2>9AB20
m_items[i].Index(i);
m_items[i].YSize(m_y_size);
m_items[i].Font(CElement::Font());
m_items[i].FontSize(CElement::FontSize());
m_items[i].LabelXGap(m_items[i].LabelXGap()<0? 7 : m_items[i].LabelXGap());
m_items[i].LabelYGap(m_items[i].LabelYGap()<0? 5 : m_items[i].LabelYGap());
//--- !>740=85 >1J5:B0
if(!m_items[i].CreateTextLabel(m_items[i].LabelText(),x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_items[i]);
}
//--- !>740=85 @0745;8B5;L=KE ;8=89
for(int i=1; i<items_total; i++)
CreateSeparateLine(i);
//---
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB @0745;8B5;L=CN ;8=8N |
//+------------------------------------------------------------------+
bool CStatusBar::CreateSeparateLine(const int line_index)
{
//--- 8=88 CAB0=02;820NBAO A> 2B>@>3> (1) ?C=:B0
if(line_index<1)
return(false);
//--- >>@48=0BK
int x =m_items[line_index].XGap();
int y =3;
//--- >@@5:B8@>2:0 8=45:A0
int i=line_index-1;
//--- #25;8G5=85 <0AA820 ;8=89 =0 >48= M;5<5=B
int array_size=::ArraySize(m_sep_line);
::ArrayResize(m_sep_line,array_size+1);
//--- !>E@0=8< C:070B5;L D>@<K
m_sep_line[i].MainPointer(this);
//--- !2>9AB20
m_sep_line[i].Index(i);
m_sep_line[i].TypeSepLine(V_SEP_LINE);
//--- !>740=85 ;8=88
if(!m_sep_line[i].CreateSeparateLine(x,y,2,m_y_size-6))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_sep_line[i]);
return(true);
}
//+------------------------------------------------------------------+
//| >72@0I05B C:070B5;L ?C=:B0 <5=N ?> 8=45:AC |
//+------------------------------------------------------------------+
CTextLabel *CStatusBar::GetItemPointer(const uint index)
{
uint array_size=::ArraySize(m_items);
//--- A;8 =5B =8 >4=>3> ?C=:B0 2 :>=B5:AB=>< <5=N, A>>1I8BL >1 MB><
if(array_size<1)
::Print(__FUNCTION__," > K7>2 MB>3> <5B>40 =C6=> >ACI5AB2;OBL, :>340 5ABL E>BO 1K >48= ?C=:B!");
//--- >@@5:B8@>2:0 2 A;CG05 2KE>40 87 480?07>=0
uint i=(index>=array_size)? array_size-1 : index;
//--- 5@=CBL C:070B5;L
return(::GetPointer(m_items[i]));
}
//+------------------------------------------------------------------+
//| >72@0I05B C:070B5;L @0745;8B5;L=CN ;8=8N ?> 8=45:AC |
//+------------------------------------------------------------------+
CSeparateLine *CStatusBar::GetSeparateLinePointer(const uint index)
{
uint array_size=::ArraySize(m_sep_line);
//--- A;8 =5B =8 >4=>3> ?C=:B0 2 :>=B5:AB=>< <5=N, A>>1I8BL >1 MB><
if(array_size<1)
return(NULL);
//--- >@@5:B8@>2:0 2 A;CG05 2KE>40 87 480?07>=0
uint i=(index>=array_size)? array_size-1 : index;
//--- 5@=CBL C:070B5;L
return(::GetPointer(m_sep_line[i]));
}
//+------------------------------------------------------------------+
//| >102;O5B ?C=:B <5=N |
//+------------------------------------------------------------------+
void CStatusBar::AddItem(const string text,const int width)
{
//--- #25;8G8< @07<5@ <0AA82>2 =0 >48= M;5<5=B
int array_size=::ArraySize(m_items);
::ArrayResize(m_items,array_size+1);
//--- !>E@0=8< 7=0G5=8O ?5@540==KE ?0@0<5B@>2
m_items[array_size].XSize(width);
m_items[array_size].LabelText(text);
}
//+------------------------------------------------------------------+
//| #AB0=02;8205B 7=0G5=85 ?> C:070==><C 8=45:AC |
//+------------------------------------------------------------------+
void CStatusBar::SetValue(const uint index,const string value)
{
//--- @>25@:0 =0 2KE>4 87 480?07>=0
uint array_size=::ArraySize(m_items);
if(array_size<1)
return;
//--- !:>@@5:B8@>20BL 7=0G5=85 8=45:A0, 5A;8 2KE>48B 87 480?07>=0
uint correct_index=(index>=array_size)? array_size-1 : index;
//--- #AB0=>2:0 ?5@540==>3> B5:AB0
m_items[correct_index].LabelText(value);
}
//+------------------------------------------------------------------+
//| #40;5=85 |
//+------------------------------------------------------------------+
void CStatusBar::Delete(void)
{
CElement::Delete();
//--- A2>1>645=85 <0AA82>2 M;5<5=B0
::ArrayFree(m_items);
::ArrayFree(m_sep_line);
}
//+------------------------------------------------------------------+
//| 0AGQB H8@8=K M;5<5=B0 |
//+------------------------------------------------------------------+
int CStatusBar::CalculationXSize(void)
{
return((m_x_size<1 || m_auto_xresize_mode)? m_main.X2()-m_x-m_auto_xresize_right_offset : m_x_size);
}
//+------------------------------------------------------------------+
//| 0AGQB H8@8=K ?5@2>3> ?C=:B0 |
//+------------------------------------------------------------------+
int CStatusBar::CalculationFirstItemXSize(void)
{
int width=0;
//--- >;CG8< :>;8G5AB2> ?C=:B>2
int items_total=ItemsTotal();
if(items_total<1)
return(0);
//--- 0AAG8B05< H8@8=C >B=>A8B5;L=> >1I59 H8@8=K >AB0;L=KE ?C=:B>2
for(int i=1; i<items_total; i++)
width+=m_items[i].XSize();
//---
return(m_x_size-width);
}
//+------------------------------------------------------------------+
//| 7<5=8BL H8@8=C ?> ?@02><C :@0N D>@<K |
//+------------------------------------------------------------------+
void CStatusBar::ChangeWidthByRightWindowSide(void)
{
//--- K9B8, 5A;8 2:;NG5= @568< D8:A0F88 : ?@02><C :@0N D>@<K
if(m_anchor_right_window_side)
return;
//--- >>@48=0BK 8 H8@8=0
int x=0;
//--- 0AAG8B05< 8 CAB0=>28< =>2K9 >1I89 @07<5@
int x_size=m_main.X2()-m_canvas.X()-m_auto_xresize_right_offset;
CElementBase::XSize(x_size);
m_canvas.XSize(x_size);
m_canvas.Resize(x_size,m_y_size);
//--- 0AAG8B05< 8 CAB0=>28< =>2K9 @07<5@ ?5@2><C ?C=:BC
x_size=CalculationFirstItemXSize();
m_items[0].XSize(x_size);
m_items[0].CanvasPointer().XSize(x_size);
m_items[0].CanvasPointer().Resize(x_size,m_y_size);
m_items[0].Update(true);
//--- >;CG8< :>;8G5AB2> ?C=:B>2
int items_total=ItemsTotal();
//--- #AB0=>28< :>>@48=0BC 8 >BABC? 4;O 2A5E ?C=:B>2 :@><5 ?5@2>3>
for(int i=1; i<items_total; i++)
{
x=x+m_items[i-1].XSize();
m_items[i].XGap(x);
m_sep_line[i-1].XGap(x);
m_items[i].CanvasPointer().XGap(x);
m_sep_line[i-1].CanvasPointer().XGap(x);
}
//--- 5@5@8A>20BL M;5<5=B
Draw();
//--- 1=>28BL ?>;>65=85 >1J5:B>2
Moving();
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CStatusBar::Draw(void)
{
//--- 0@8A>20BL D>=
CElement::DrawBackground();
}
//+------------------------------------------------------------------+