211 lines
7.9 KiB
MQL5
211 lines
7.9 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| ChartObjectPanel.mqh |
|
|
//| Copyright 2000-2025, MetaQuotes Ltd. |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#include <ChartObjects\ChartObjectsTxtControls.mqh>
|
|
#include <Arrays\ArrayObj.mqh>
|
|
#include <Arrays\ArrayInt.mqh>
|
|
//+------------------------------------------------------------------+
|
|
//| Class CChartObjectPanel. |
|
|
//| Purpose: Class for grouping objects for managing a chart |
|
|
//+------------------------------------------------------------------+
|
|
class CChartObjectPanel : public CChartObjectButton
|
|
{
|
|
protected:
|
|
CArrayObj m_attachment; // array of attached objects
|
|
CArrayInt m_dX; // array of dX attached objects
|
|
CArrayInt m_dY; // array of dY attached objects
|
|
bool m_expanded; // collapsed/expanded flag
|
|
|
|
public:
|
|
CChartObjectPanel();
|
|
~CChartObjectPanel();
|
|
//--- method for attaching objects
|
|
bool Attach(CChartObjectLabel *chart_object);
|
|
bool X_Distance(const int X);
|
|
int X_Distance(void) const { return(CChartObjectButton::X_Distance()); }
|
|
bool Y_Distance(const int Y);
|
|
int Y_Distance(void) const { return(CChartObjectButton::Y_Distance()); }
|
|
int X_Size() const;
|
|
int X_Size(const int Y) const { return(CChartObjectButton::X_Size()); }
|
|
int Y_Size() const;
|
|
int Y_Size(const int Y) const { return(CChartObjectButton::Y_Size()); }
|
|
|
|
int Timeframes(void) const { return(CChartObjectButton::Timeframes()); }
|
|
virtual bool Timeframes(const int timeframes);
|
|
bool State(const bool state);
|
|
bool State(void) const { return(CChartObjectButton::State()); }
|
|
bool CheckState();
|
|
|
|
protected:
|
|
};
|
|
//+------------------------------------------------------------------+
|
|
//| Constructor |
|
|
//+------------------------------------------------------------------+
|
|
void CChartObjectPanel::CChartObjectPanel(void) : m_expanded(true)
|
|
{
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Destructor. |
|
|
//+------------------------------------------------------------------+
|
|
void CChartObjectPanel::~CChartObjectPanel(void)
|
|
{
|
|
//--- All objects added by the method Add(), deleted automatically
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method Attach |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObjectPanel::Attach(CChartObjectLabel *chart_object)
|
|
{
|
|
if(m_attachment.Add(chart_object))
|
|
{
|
|
int x,y;
|
|
x=chart_object.X_Distance();
|
|
m_dX.Add(chart_object.X_Distance());
|
|
x+=X_Distance();
|
|
chart_object.X_Distance(X_Distance()+chart_object.X_Distance());
|
|
y=CChartObjectButton::Y_Size();
|
|
y+=chart_object.Y_Distance();
|
|
m_dY.Add(chart_object.Y_Distance()+CChartObjectButton::Y_Size()+2);
|
|
chart_object.Y_Distance(Y_Distance()+chart_object.Y_Distance()+CChartObjectButton::Y_Size()+2);
|
|
return(true);
|
|
}
|
|
//---
|
|
return(false);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method X_Distance |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObjectPanel::X_Distance(const int X)
|
|
{
|
|
CChartObjectLabel *chart_object;
|
|
//---
|
|
for(int i=0;i<m_attachment.Total();i++)
|
|
{
|
|
chart_object=m_attachment.At(i);
|
|
chart_object.X_Distance(X+m_dX.At(i));
|
|
}
|
|
//---
|
|
return(CChartObjectButton::X_Distance(X));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method Y_Distance |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObjectPanel::Y_Distance(const int Y)
|
|
{
|
|
CChartObjectLabel *chart_object;
|
|
//---
|
|
for(int i=0;i<m_attachment.Total();i++)
|
|
{
|
|
chart_object=m_attachment.At(i);
|
|
chart_object.Y_Distance(Y+m_dY.At(i));
|
|
}
|
|
//---
|
|
return(CChartObjectButton::Y_Distance(Y));
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method X_Size |
|
|
//+------------------------------------------------------------------+
|
|
int CChartObjectPanel::X_Size() const
|
|
{
|
|
int max_x=CChartObjectButton::X_Size()+X_Distance();
|
|
CChartObjectLabel *chart_object;
|
|
//---
|
|
if(m_expanded)
|
|
{
|
|
for(int i=0;i<m_attachment.Total();i++)
|
|
if((chart_object=m_attachment.At(i))!=NULL)
|
|
if(max_x<chart_object.X_Distance()+chart_object.X_Size())
|
|
max_x=chart_object.X_Distance()+chart_object.X_Size();
|
|
return(max_x-X_Distance()+2);
|
|
}
|
|
//---
|
|
return(CChartObjectButton::X_Size()+2);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method Y_Size |
|
|
//+------------------------------------------------------------------+
|
|
int CChartObjectPanel::Y_Size() const
|
|
{
|
|
int max_y=CChartObjectButton::Y_Size()+Y_Distance();
|
|
CChartObjectLabel *chart_object;
|
|
//---
|
|
if(m_expanded)
|
|
{
|
|
for(int i=0;i<m_attachment.Total();i++)
|
|
if((chart_object=m_attachment.At(i))!=NULL)
|
|
if(max_y<chart_object.Y_Distance()+chart_object.Y_Size())
|
|
max_y=chart_object.Y_Distance()+chart_object.Y_Size();
|
|
return(max_y-Y_Distance()+2);
|
|
}
|
|
//---
|
|
return(CChartObjectButton::Y_Size()+2);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method Timeframes |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObjectPanel::Timeframes(const int timeframes)
|
|
{
|
|
int i;
|
|
bool res=CChartObject::Timeframes(timeframes);
|
|
CChartObjectLabel *chart_object;
|
|
//---
|
|
if(m_expanded)
|
|
for(i=0;i<m_attachment.Total();i++)
|
|
{
|
|
chart_object=m_attachment.At(i);
|
|
res&=chart_object.Timeframes(timeframes);
|
|
}
|
|
//---
|
|
return(res);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method State |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObjectPanel::State(const bool state)
|
|
{
|
|
if(CChartObjectButton::State(state))
|
|
{
|
|
m_expanded=state;
|
|
return(true);
|
|
}
|
|
//---
|
|
return(false);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| Method CheckState |
|
|
//+------------------------------------------------------------------+
|
|
bool CChartObjectPanel::CheckState(void)
|
|
{
|
|
//--- state changed
|
|
if(m_expanded!=State())
|
|
{
|
|
//--- apply new state
|
|
m_expanded=State();
|
|
|
|
if(m_expanded)
|
|
{
|
|
//--- make all objects visible
|
|
for(int i=0;i<m_attachment.Total();i++)
|
|
{
|
|
CChartObjectLabel *chart_object=m_attachment.At(i);
|
|
chart_object.Timeframes(-1);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//--- make all objects invisible
|
|
for(int i=0;i<m_attachment.Total();i++)
|
|
{
|
|
CChartObjectLabel *chart_object=m_attachment.At(i);
|
|
chart_object.Timeframes(0x100000);
|
|
}
|
|
}
|
|
|
|
return(true);
|
|
}
|
|
//---
|
|
return(false);
|
|
}
|
|
//+------------------------------------------------------------------+
|