EasyAndFastMod/Controls/Slider.mqh

906 lines
76 KiB
MQL5
Raw Permalink Normal View History

2026-01-15 07:23:17 -05:00
<EFBFBD><EFBFBD>//+------------------------------------------------------------------+
//| Slider.mqh |
//| Copyright 2015, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#include "..\Element.mqh"
#include "TextEdit.mqh"
//+------------------------------------------------------------------+
//| ;0AA 4;O A>740=8O A;0945@0 A ?>;5< 22>40 |
//+------------------------------------------------------------------+
class CSlider : public CElement
{
private:
//--- 1J5:BK 4;O A>740=8O M;5<5=B0
CTextEdit m_left_edit;
CTextEdit m_right_edit;
//--- (1) >>@48=0B0 8 (2) @07<5@ >1;0AB8 8=48:0B>@0
int m_slot_y;
int m_slot_y_size;
//--- &25B0 8=48:0B>@0 2 @07=KE A>AB>O=8OE
color m_slot_line_dark_color;
color m_slot_line_light_color;
color m_slot_indicator_color;
color m_slot_indicator_color_locked;
//--- "5:CI0O ?>78F8O ?>;7C=:0 A;0945@0: (1) 7=0G5=85, (2) :>>@48=0BK XY
double m_thumb_x_pos_left;
double m_thumb_x_pos_right;
double m_thumb_x_left;
double m_thumb_x_right;
int m_thumb_y;
//--- 07<5@K ?>;7C=:0 A;0945@0
int m_thumb_x_size;
int m_thumb_y_size;
//--- &25B0 ?>;7C=:0 A;0945@0
color m_thumb_color;
color m_thumb_color_hover;
color m_thumb_color_locked;
color m_thumb_color_pressed;
//--- (1) $>:CA =0 ?>;7C=:5 8 (2) <><5=B 53> ?5@5A5G5=8O 3@0=8F
bool m_thumb_focus_left;
bool m_thumb_focus_right;
bool m_is_crossing_left_thumb_border;
bool m_is_crossing_right_thumb_border;
//--- >;8G5AB2> ?8:A5;59 2 @01>G59 >1;0AB8
int m_pixels_total;
//--- >;8G5AB2> H03>2 2 480?07>=5 7=0G5=89 @01>G59 >1;0AB8
int m_value_steps_total;
//--- 07<5@ H030 >B=>A8B5;L=> H8@8=K @01>G59 >1;0AB8
double m_position_step;
//--- !>AB>O=85 :=>?:8 <KH8 (=060B0/>B60B0)
ENUM_MOUSE_STATE m_clamping_left_thumb;
ENUM_MOUSE_STATE m_clamping_right_thumb;
//--- ;O >?@545;5=8O @568<0 ?5@5<5I5=8O ?>;7C=:0 A;0945@0
bool m_slider_thumb_state;
//--- 5@5<5==K5 A2O70==K5 A ?5@5<5I5=85< ?>;7C=:0
int m_slider_size_fixing;
int m_slider_point_fixing;
//--- 568< 42>9=>3> A;0945@0
bool m_dual_slider_mode;
//---
public:
CSlider(void);
~CSlider(void);
//--- 5B>4K 4;O A>740=8O M;5<5=B0
bool CreateSlider(const string text,const int x_gap,const int y_gap);
//---
private:
void InitializeProperties(const string text,const int x_gap,const int y_gap);
bool CreateCanvas(void);
bool CreateLeftTextEdit(void);
bool CreateRightTextEdit(void);
//---
public:
//--- >72@0I05B C:070B5;8 =0 M;5<5=BK
CTextEdit *GetLeftEditPointer(void) { return(::GetPointer(m_left_edit)); }
CTextEdit *GetRightEditPointer(void) { return(::GetPointer(m_right_edit)); }
//--- &25B0 8=48:0B>@0 A;0945@0 2 @07=KE A>AB>O=8OE
void SlotLineDarkColor(const color clr) { m_slot_line_dark_color=clr; }
void SlotLineLightColor(const color clr) { m_slot_line_light_color=clr; }
void SlotIndicatorColor(const color clr) { m_slot_indicator_color=clr; }
void SlotIndicatorColorLocked(const color clr) { m_slot_indicator_color_locked=clr; }
//--- 568< 42>9=>3> A;0945@0
void DualSliderMode(const bool state) { m_dual_slider_mode=state; }
bool DualSliderMode(void) const { return(m_dual_slider_mode); }
bool State(void) const { return(m_slider_thumb_state); }
//--- 07<5@K ?>;7C=:0 A;0945@0
void ThumbXSize(const int x_size) { m_thumb_x_size=x_size; }
void ThumbYSize(const int y_size) { m_thumb_y_size=y_size; }
//--- &25B0 ?>;7C=:0 A;0945@0
void ThumbColor(const color clr) { m_thumb_color=clr; }
void ThumbColorHover(const color clr) { m_thumb_color_hover=clr; }
void ThumbColorLocked(const color clr) { m_thumb_color_locked=clr; }
void ThumbColorPressed(const color clr) { m_thumb_color_pressed=clr; }
//---
public:
//--- 1@01>BG8: A>1KB89 3@0D8:0
virtual void OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam);
//--- 8AC5B M;5<5=B
virtual void Draw(void);
//---
private:
//--- 1@01>B:0 22>40 7=0G5=8O 2 ?>;5 22>40
bool OnEndEditLeftThumb(const int id,const int index);
bool OnEndEditRightThumb(const int id,const int index);
//--- @>F5AA ?5@5<5I5=8O ?>;7C=:0 A;0945@0
void OnDragLeftThumb(void);
void OnDragRightThumb(void);
//--- 1=>2;5=85 ?>;>65=8O ?>;7C=:0 A;0945@0
void UpdateLeftThumb(const int new_x_point);
void UpdateRightThumb(const int new_x_point);
//--- @>25@:0 D>:CA0 =04 ?>;7C=:><
bool CheckLeftThumbFocus(void);
bool CheckRightThumbFocus(void);
//--- @>25@O5B A>AB>O=85 :=>?:8 <KH8
void CheckMouseOnLeftThumb(void);
void CheckMouseOnRightThumb(void);
//--- 1=C;5=85 ?5@5<5==KE A2O70==KE A ?5@5<5I5=85< ?>;7C=:0 A;0945@0
void ZeroLeftThumbVariables(void);
void ZeroRightThumbVariables(void);
//--- 0AGQB 7=0G5=89 (H038 8 :>MDD8F85=BK)
bool CalculateCoefficients(void);
//--- 0AGQB :>>@48=0BK X ?>;7C=:0 A;0945@0
void CalculateLeftThumbX(void);
void CalculateRightThumbX(void);
//--- 7<5=O5B ?>78F8N ?>;7C=:0 A;0945@0 >B=>A8B5;L=> B5:CI53> 7=0G5=8O
void CalculateLeftThumbPos(void);
void CalculateRightThumbPos(void);
//--- "5:CI89 F25B ?>;7C=:0
uint ThumbColorCurrent(const bool thumb_focus,const ENUM_MOUSE_STATE thumb_clamping);
//--- 8AC5B 3@0=8FK 4;O 8=48:0B>@0
void DrawSlot(void);
//--- 8AC5B 8=48:0B>@
void DrawIndicator(void);
//--- 8AC5B ?>;7C=>: A;0945@0
void DrawLeftThumb(void);
void DrawRightThumb(void);
};
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CSlider::CSlider(void) : m_dual_slider_mode(false),
m_slider_size_fixing(0),
m_slider_point_fixing(0),
m_slot_y(30),
m_slot_y_size(4),
m_slot_line_dark_color(clrSilver),
m_slot_line_light_color(clrWhite),
m_slot_indicator_color(C'85,170,255'),
m_slot_indicator_color_locked(clrLightGray),
m_thumb_x_pos_left(WRONG_VALUE),
m_thumb_x_pos_right(WRONG_VALUE),
m_thumb_x_left(0),
m_thumb_x_right(0),
m_thumb_y(0),
m_thumb_x_size(6),
m_thumb_y_size(14),
m_thumb_color(C'205,205,205'),
m_thumb_color_hover(C'166,166,166'),
m_thumb_color_locked(clrLightGray),
m_thumb_color_pressed(C'96,96,96'),
m_thumb_focus_left(false),
m_thumb_focus_right(false),
m_is_crossing_left_thumb_border(false),
m_is_crossing_right_thumb_border(false)
{
//--- !>E@0=8< 8<O :;0AA0 M;5<5=B0 2 107>2>< :;0AA5
CElementBase::ClassName(CLASS_NAME);
}
//+------------------------------------------------------------------+
//| Destructor |
//+------------------------------------------------------------------+
CSlider::~CSlider(void)
{
}
//+------------------------------------------------------------------+
//| 1@01>BG8: A>1KB8O 3@0D8:0 |
//+------------------------------------------------------------------+
void CSlider::OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
//--- 1@01>B:0 A>1KB8O ?5@5<5I5=8O :C@A>@0
if(id==CHARTEVENT_MOUSE_MOVE)
{
//--- @>25@8< 8 70?><=8< A>AB>O=85 :=>?:8 <KH8
CheckMouseOnRightThumb();
//--- 7<5=8< F25B ?>;7C=:0 A;0945@0
CheckRightThumbFocus();
//--- A;8 C?@02;5=85 ?5@540=> ?>;>A5 A;0945@0, >?@545;8< 5Q ?>;>65=85
if(m_clamping_right_thumb==PRESSED_INSIDE)
{
//--- 5@5<5I5=85 ?>;7C=:0 A;0945@0
OnDragRightThumb();
//--- 0AGQB ?>78F88 ?>;7C=:0 A;0945@0 2 480?07>=5 7=0G5=89
CalculateRightThumbPos();
//--- #AB0=>2:0 =>2>3> 7=0G5=8O 2 ?>;5 22>40
m_right_edit.SetValue(::DoubleToString(m_thumb_x_pos_right,m_right_edit.GetDigits()),false);
//--- 1=>28BL M;5<5=B
Update(true);
m_right_edit.GetTextBoxPointer().Update(true);
return;
}
//--- K9B8, 5A;8 MB> =5 42>9=>9 A;0945@
if(!m_dual_slider_mode)
return;
//--- @>25@8< 8 70?><=8< A>AB>O=85 :=>?:8 <KH8
CheckMouseOnLeftThumb();
//--- 7<5=8< F25B ?>;7C=:0 A;0945@0
CheckLeftThumbFocus();
//--- A;8 C?@02;5=85 ?5@540=> ?>;>A5 A;0945@0, >?@545;8< 5Q ?>;>65=85
if(m_clamping_left_thumb==PRESSED_INSIDE)
{
//--- 5@5<5I5=85 ?>;7C=:0 A;0945@0
OnDragLeftThumb();
//--- 0AGQB ?>78F88 ?>;7C=:0 A;0945@0 2 480?07>=5 7=0G5=89
CalculateLeftThumbPos();
//--- #AB0=>2:0 =>2>3> 7=0G5=8O 2 ?>;5 22>40
m_left_edit.SetValue(::DoubleToString(m_thumb_x_pos_left,m_left_edit.GetDigits()),false);
//--- 1=>28BL M;5<5=B
Update(true);
m_left_edit.GetTextBoxPointer().Update(true);
return;
}
return;
}
//--- 1@01>B:0 A>1KB8O 87<5=5=8O 7=0G5=8O 2 ?>;5 22>40
if(id==CHARTEVENT_CUSTOM+ON_END_EDIT)
{
//--- 1@01>B:0 22>40 7=0G5=8O
if(OnEndEditLeftThumb((int)lparam,(int)dparam))
return;
//--- 1@01>B:0 22>40 7=0G5=8O
if(OnEndEditRightThumb((int)lparam,(int)dparam))
return;
//---
return;
}
}
//+------------------------------------------------------------------+
//| !>740QB A;0945@ A ?>;5< 22>40 |
//+------------------------------------------------------------------+
bool CSlider::CreateSlider(const string text,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(text,x_gap,y_gap);
//--- !>740=85 M;5<5=B0
if(!CreateCanvas())
return(false);
if(!CreateRightTextEdit())
return(false);
if(!CreateLeftTextEdit())
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| =8F80;870F8O A2>9AB2 |
//+------------------------------------------------------------------+
void CSlider::InitializeProperties(const string text,const int x_gap,const int y_gap)
{
m_x =CElement::CalculateX(x_gap);
m_y =CElement::CalculateY(y_gap);
m_label_text =text;
m_back_color =(m_back_color!=clrNONE)? m_back_color : m_main.BackColor();
m_border_color=(m_border_color!=clrNONE)? m_border_color : clrBlack;
//--- 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 CSlider::CreateCanvas(void)
{
//--- $>@<8@>20=85 8<5=8 >1J5:B0
string name=CElementBase::ElementName("slider");
//--- !>740=85 >1J5:B0
if(!CElement::CreateCanvas(name,m_x,m_y,m_x_size,m_y_size))
return(false);
//---
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB ?>;5 22>40 |
//+------------------------------------------------------------------+
bool CSlider::CreateRightTextEdit(void)
{
//--- !>E@0=8< C:070B5;L =0 3;02=K9 M;5<5=B
m_right_edit.MainPointer(this);
//--- >>@48=0BK
int x=0,y=0;
//--- !2>9AB20
m_right_edit.Index(0);
m_right_edit.YSize(20);
m_right_edit.LabelXGap(0);
m_right_edit.MaxValue((m_right_edit.MaxValue()==DBL_MAX)? 1000 : m_right_edit.MaxValue());
m_right_edit.MinValue((m_right_edit.MinValue()==DBL_MIN)? -1000 : m_right_edit.MinValue());
m_right_edit.StepValue(m_right_edit.StepValue());
m_right_edit.SetDigits(m_right_edit.GetDigits());
//--- =0G5=85 2 ?>;5 22>40
int digits=m_right_edit.GetDigits();
string value=(m_right_edit.GetValue()=="")? ::DoubleToString(0,digits) : m_right_edit.GetValue();
m_right_edit.SetValue(value);
//--- 07<5@
int xsize=m_right_edit.GetTextBoxPointer().XSize();
m_right_edit.GetTextBoxPointer().XSize((xsize>0)? xsize : 60);
//---
m_right_edit.AutoXResizeMode(true);
m_right_edit.IsDropdown(CElementBase::IsDropdown());
m_right_edit.GetTextBoxPointer().AnchorRightWindowSide(true);
//--- !>74048< M;5<5=B C?@02;5=8O
if(!m_right_edit.CreateTextEdit(m_label_text,x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_right_edit);
//--- 0AGQB 7=0G5=89 2A?><>30B5;L=KE ?5@5<5==KE
CalculateCoefficients();
//--- 0AGQB :>>@48=0BK X ?>;7C=:0 >B=>A8B5;L=> B5:CI53> 7=0G5=8O 2 ?>;5 22>40
CalculateRightThumbX();
//--- 0AGQB :>>@48=0BK Y ?>;7C=:0
m_thumb_y=m_slot_y-((m_thumb_y_size-m_slot_y_size)/2);
//--- 0AGQB ?>78F88 ?>;7C=:0 A;0945@0 2 480?07>=5 7=0G5=89
CalculateRightThumbPos();
return(true);
}
//+------------------------------------------------------------------+
//| !>740QB ?>;5 22>40 |
//+------------------------------------------------------------------+
bool CSlider::CreateLeftTextEdit(void)
{
if(!m_dual_slider_mode)
return(true);
//--- !>E@0=8< C:070B5;L =0 @>48B5;O
m_left_edit.MainPointer(this);
//--- 07<5@K
int x_size=m_right_edit.GetTextBoxPointer().XSize();
//--- >>@48=0BK
int x=x_size*2+2;
int y=0;
//--- !2>9AB20
m_left_edit.Index(1);
m_left_edit.XSize(x_size+1);
m_left_edit.YSize(20);
m_left_edit.LabelXGap(0);
m_left_edit.MaxValue(m_right_edit.MaxValue());
m_left_edit.MinValue(m_right_edit.MinValue());
m_left_edit.StepValue(m_right_edit.StepValue());
m_left_edit.SetDigits(m_right_edit.GetDigits());
//--- =0G5=85 2 ?>;5 22>40
int digits=m_right_edit.GetDigits();
string value=(m_left_edit.GetValue()=="")? ::DoubleToString(0,digits) : m_left_edit.GetValue();
m_left_edit.SetValue((string)value);
m_left_edit.AnchorRightWindowSide(true);
m_left_edit.IsDropdown(CElementBase::IsDropdown());
m_left_edit.GetTextBoxPointer().XSize(x_size);
m_left_edit.GetTextBoxPointer().AnchorRightWindowSide(true);
//--- !>74048< M;5<5=B C?@02;5=8O
if(!m_left_edit.CreateTextEdit("",x,y))
return(false);
//--- >1028BL M;5<5=B 2 <0AA82
CElement::AddToArray(m_left_edit);
//--- 0AGQB :>>@48=0BK X ?>;7C=:0 >B=>A8B5;L=> B5:CI53> 7=0G5=8O 2 ?>;5 22>40
CalculateLeftThumbX();
//--- 0AGQB ?>78F88 ?>;7C=:0 A;0945@0 2 480?07>=5 7=0G5=89
CalculateLeftThumbPos();
return(true);
}
//+------------------------------------------------------------------+
//| 1@01>B:0 22>40 7=0G5=8O 2 ?>;5 22>40 |
//+------------------------------------------------------------------+
bool CSlider::OnEndEditLeftThumb(const int id,const int index)
{
//--- K945<, 5A;8 845=B8D8:0B>@K 8 8=45:AK =5 A>2?040NB
if(id!=m_left_edit.Id() || index!=m_left_edit.Index())
return(false);
//--- >;CG8< B>;L:> GB> 2254Q==>5 7=0G5=85
double entered_value=::StringToDouble(m_left_edit.GetValue());
//--- 0AAG8B05< :>>@48=0BC X ?>;7C=:0
CalculateLeftThumbX();
//--- 1=>2;5=85 ?>;>65=8O ?>;7C=:0 A;0945@0
UpdateLeftThumb((int)m_thumb_x_left);
//--- 0AAG8B05< ?>78F8N 2 480?07>=5 7=0G5=89
CalculateLeftThumbPos();
//--- #AB0=>2:0 =>2>3> 7=0G5=8O 2 ?>;5 22>40
m_left_edit.SetValue(::DoubleToString(m_thumb_x_pos_left,m_left_edit.GetDigits()));
//--- 1=>28BL M;5<5=B
Update(true);
m_left_edit.GetTextBoxPointer().Update(true);
//--- B?@028< A>>1I5=85 >1 MB><
//::EventChartCustom(m_chart_id,ON_END_EDIT,CElementBase::Id(),index,m_label_text);
return(true);
}
//+------------------------------------------------------------------+
//| 1@01>B:0 22>40 7=0G5=8O 2 ?>;5 22>40 |
//+------------------------------------------------------------------+
bool CSlider::OnEndEditRightThumb(const int id,const int index)
{
//--- K945<, 5A;8 845=B8D8:0B>@K 8 8=45:AK =5 A>2?040NB
if(id!=m_right_edit.Id() || index!=m_right_edit.Index())
return(false);
//--- >;CG8< B>;L:> GB> 2254Q==>5 7=0G5=85
double entered_value=::StringToDouble(m_right_edit.GetValue());
//--- 0AAG8B05< :>>@48=0BC X ?>;7C=:0
CalculateRightThumbX();
//--- 1=>2;5=85 ?>;>65=8O ?>;7C=:0 A;0945@0
UpdateRightThumb((int)m_thumb_x_right);
//--- 0AAG8B05< ?>78F8N 2 480?07>=5 7=0G5=89
CalculateRightThumbPos();
//--- #AB0=>2:0 =>2>3> 7=0G5=8O 2 ?>;5 22>40
m_right_edit.SetValue(::DoubleToString(m_thumb_x_pos_right,m_right_edit.GetDigits()));
//--- 1=>28BL M;5<5=B
Update(true);
m_right_edit.GetTextBoxPointer().Update(true);
//--- B?@028< A>>1I5=85 >1 MB><
//::EventChartCustom(m_chart_id,ON_END_EDIT,CElementBase::Id(),index,m_label_text);
return(true);
}
//+------------------------------------------------------------------+
//| @>F5AA ?5@5<5I5=8O ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::OnDragLeftThumb(void)
{
int x=m_mouse.RelativeX(m_canvas);
//--- ;O >?@545;5=8O =>2>9 X :>>@48=0BK
int new_x_point=0;
//--- A;8 ?>;7C=>: A;0945@0 =50:B825=, ...
if(!m_slider_thumb_state)
{
//--- ...>1=C;8< 2A?><>30B5;L=K5 ?5@5<5==K5 4;O ?5@5<5I5=8O ?>;7C=:0
m_slider_point_fixing =0;
m_slider_size_fixing =0;
return;
}
//--- A;8 B>G:0 D8:A0F88 =C;520O, B> 70?><=8< B5:CICN :>>@48=0BC :C@A>@0
if(m_slider_point_fixing==0)
m_slider_point_fixing=x;
//--- A;8 7=0G5=85 @0AAB>O=8O >B :@09=59 B>G:8 ?>;7C=:0 4> B5:CI59 :>>@48=0BK :C@A>@0 =C;52>5, @0AAG8B05< 53>
if(m_slider_size_fixing==0)
m_slider_size_fixing=(int)m_thumb_x_left-x;
//--- A;8 2 =060B>< A>AB>O=88 ?@>H;8 ?>@>3 2?@02>
if(x-m_slider_point_fixing>0)
{
//--- 0AAG8B05< :>>@48=0BC X
new_x_point=x+m_slider_size_fixing;
//--- 1=>2;5=85 ?>;>65=8O ?>;>AK ?@>:@CB:8
UpdateLeftThumb(new_x_point);
return;
}
//--- A;8 2 =060B>< A>AB>O=88 ?@>H;8 ?>@>3 2;52>
if(x-m_slider_point_fixing<0)
{
//--- 0AAG8B05< :>>@48=0BC X
new_x_point=x-::fabs(m_slider_size_fixing);
//--- 1=>2;5=85 ?>;>65=8O ?>;>AK ?@>:@CB:8
UpdateLeftThumb(new_x_point);
return;
}
}
//+------------------------------------------------------------------+
//| @>F5AA ?5@5<5I5=8O ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::OnDragRightThumb(void)
{
int x=m_mouse.RelativeX(m_canvas);
//--- ;O >?@545;5=8O =>2>9 X :>>@48=0BK
int new_x_point=0;
//--- A;8 ?>;7C=>: A;0945@0 =50:B825=, ...
if(!m_slider_thumb_state)
{
//--- ...>1=C;8< 2A?><>30B5;L=K5 ?5@5<5==K5 4;O ?5@5<5I5=8O ?>;7C=:0
m_slider_point_fixing =0;
m_slider_size_fixing =0;
return;
}
//--- A;8 B>G:0 D8:A0F88 =C;520O, B> 70?><=8< B5:CICN :>>@48=0BC :C@A>@0
if(m_slider_point_fixing==0)
m_slider_point_fixing=x;
//--- A;8 7=0G5=85 @0AAB>O=8O >B :@09=59 B>G:8 ?>;7C=:0 4> B5:CI59 :>>@48=0BK :C@A>@0 =C;52>5, @0AAG8B05< 53>
if(m_slider_size_fixing==0)
m_slider_size_fixing=(int)m_thumb_x_right-x;
//--- A;8 2 =060B>< A>AB>O=88 ?@>H;8 ?>@>3 2?@02>
if(x-m_slider_point_fixing>0)
{
//--- 0AAG8B05< :>>@48=0BC X
new_x_point=x+m_slider_size_fixing;
//--- 1=>2;5=85 ?>;>65=8O ?>;>AK ?@>:@CB:8
UpdateRightThumb(new_x_point);
return;
}
//--- A;8 2 =060B>< A>AB>O=88 ?@>H;8 ?>@>3 2;52>
if(x-m_slider_point_fixing<0)
{
//--- 0AAG8B05< :>>@48=0BC X
new_x_point=x-::fabs(m_slider_size_fixing);
//--- 1=>2;5=85 ?>;>65=8O ?>;>AK ?@>:@CB:8
UpdateRightThumb(new_x_point);
return;
}
}
//+------------------------------------------------------------------+
//| 1=>2;5=85 ?>;>65=8O ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::UpdateLeftThumb(const int new_x_point)
{
int x=new_x_point;
//--- 1=C;5=85 B>G:8 D8:A0F88
m_slider_point_fixing=0;
//--- @020O 3@0=8F0
int right_limit=(!m_dual_slider_mode)? m_x_size-m_thumb_x_size :(int)m_thumb_x_right-m_thumb_x_size;
//--- @>25@:0 =0 2KE>4 87 @01>G59 >1;0AB8
if(x>right_limit)
x=right_limit;
if(x<=0)
x=0;
//--- !>E@0=8BL :>>@48=0BC
m_thumb_x_left=x;
}
//+------------------------------------------------------------------+
//| 1=>2;5=85 ?>;>65=8O ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::UpdateRightThumb(const int new_x_point)
{
int x=new_x_point;
//--- 1=C;5=85 B>G:8 D8:A0F88
m_slider_point_fixing=0;
//--- @020O 3@0=8F0
int right_limit=m_x_size-m_thumb_x_size;
//--- 520O 3@0=8F0
int left_limit=(!m_dual_slider_mode)? 0 :(int)m_thumb_x_left+m_thumb_x_size;
//--- @>25@:0 =0 2KE>4 87 @01>G59 >1;0AB8
if(x>right_limit)
x=right_limit;
if(x<=left_limit)
x=left_limit;
//--- !>E@0=8BL :>>@48=0BC
m_thumb_x_right=x;
}
//+------------------------------------------------------------------+
//| "5:CI89 F25B ?>;7C=:0 |
//+------------------------------------------------------------------+
uint CSlider::ThumbColorCurrent(const bool thumb_focus,const ENUM_MOUSE_STATE thumb_clamping)
{
//--- ?@545;8< F25B ?>;7C=:0
color clr=(thumb_clamping==PRESSED_INSIDE)? m_thumb_color_pressed : m_thumb_color;
//--- A;8 :C@A>@ <KH8 2 7>=5 ?>;7C=:0
if(thumb_focus)
{
//--- A;8 ;520O :=>?:0 <KH8 >B60B0
if(thumb_clamping==NOT_PRESSED)
clr=m_thumb_color_hover;
//--- 520O :=>?:0 <KH8 =060B0 =0 ?>;7C=:5
else if(thumb_clamping==PRESSED_INSIDE)
clr=m_thumb_color_pressed;
}
//--- A;8 :C@A>@ 2=5 7>=K ?>;7C=:0
else
{
//--- 520O :=>?:0 <KH8 >B60B0
if(thumb_clamping==NOT_PRESSED)
clr=(m_is_locked)? m_thumb_color_locked : m_thumb_color;
}
//---
return(::ColorToARGB(clr));
}
//+------------------------------------------------------------------+
//| @>25@:0 D>:CA0 =04 ?>;7C=:>< |
//+------------------------------------------------------------------+
bool CSlider::CheckLeftThumbFocus(void)
{
//--- K9B8, 5A;8 =520;84=K9 C:070B5;L
if(::CheckPointer(m_mouse)==POINTER_INVALID)
return(false);
//--- @>25@:0 D>:CA0 =04 ?>;7C=:><
int x =m_mouse.RelativeX(m_canvas);
int y =m_mouse.RelativeY(m_canvas);
//--- @>25@:0 D>:CA0
m_thumb_focus_left=(x>m_thumb_x_left && x<m_thumb_x_left+m_thumb_x_size &&
y>m_thumb_y && y<m_thumb_y+m_thumb_y_size);
//--- A;8 MB> <><5=B ?5@5A5G5=8O 3@0=8F M;5<5=B0
if((m_thumb_focus_left && !m_is_crossing_left_thumb_border) ||
(!m_thumb_focus_left && m_is_crossing_left_thumb_border))
{
m_is_crossing_left_thumb_border=m_thumb_focus_left;
//--- 0@8A>20BL ?@O<>C3>;L=8: A 70;82:>9
DrawLeftThumb();
m_canvas.Update();
return(true);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| @>25@:0 D>:CA0 =04 ?>;7C=:>< |
//+------------------------------------------------------------------+
bool CSlider::CheckRightThumbFocus(void)
{
//--- K9B8, 5A;8 =520;84=K9 C:070B5;L
if(::CheckPointer(m_mouse)==POINTER_INVALID)
return(false);
//--- @>25@:0 D>:CA0 =04 ?>;7C=:><
int x =m_mouse.RelativeX(m_canvas);
int y =m_mouse.RelativeY(m_canvas);
//--- @>25@:0 D>:CA0
m_thumb_focus_right=(x>m_thumb_x_right && x<m_thumb_x_right+m_thumb_x_size &&
y>m_thumb_y && y<m_thumb_y+m_thumb_y_size);
//--- A;8 MB> <><5=B ?5@5A5G5=8O 3@0=8F M;5<5=B0
if((m_thumb_focus_right && !m_is_crossing_right_thumb_border) ||
(!m_thumb_focus_right && m_is_crossing_right_thumb_border))
{
m_is_crossing_right_thumb_border=m_thumb_focus_right;
//--- 0@8A>20BL ?@O<>C3>;L=8: A 70;82:>9
DrawRightThumb();
m_canvas.Update();
return(true);
}
//---
return(true);
}
//+------------------------------------------------------------------+
//| @>25@O5B A>AB>O=85 :=>?:8 <KH8 |
//+------------------------------------------------------------------+
void CSlider::CheckMouseOnLeftThumb(void)
{
//--- K9B8, 5A;8 MB> =5 42>9=>9 A;0945@
if(!m_dual_slider_mode)
return;
//--- A;8 ;520O :=>?:0 <KH8 >B60B0
if(!m_mouse.LeftButtonState())
{
//--- 1=C;8< ?5@5<5==K5
ZeroLeftThumbVariables();
return;
}
//--- A;8 ;520O :=>?:0 <KH8 =060B0
else
{
//--- K945<, 5A;8 :=>?:0 C65 =060B0 2 :0:>9-;81> >1;0AB8
if(m_clamping_left_thumb!=NOT_PRESSED)
return;
//--- =5 >1;0AB8 ?>;7C=:0 A;0945@0
if(!m_thumb_focus_left)
m_clamping_left_thumb=PRESSED_OUTSIDE;
//---  >1;0AB8 ?>;7C=:0 A;0945@0
else
{
m_slider_thumb_state =true;
m_clamping_left_thumb =PRESSED_INSIDE;
//--- 5@5@8A>20BL ?>;7C=>:
DrawLeftThumb();
m_canvas.Update();
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),0,"");
//--- B?@028< A>>1I5=85 >1 87<5=5=88 2 3@0D8G5A:>< 8=B5@D59A5
::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0,"");
}
}
}
//+------------------------------------------------------------------+
//| @>25@O5B A>AB>O=85 :=>?:8 <KH8 |
//+------------------------------------------------------------------+
void CSlider::CheckMouseOnRightThumb(void)
{
//--- A;8 ;520O :=>?:0 <KH8 >B60B0
if(!m_mouse.LeftButtonState())
{
//--- 1=C;8< ?5@5<5==K5
ZeroRightThumbVariables();
return;
}
//--- A;8 ;520O :=>?:0 <KH8 =060B0
else
{
//--- K945<, 5A;8 :=>?:0 C65 =060B0 2 :0:>9-;81> >1;0AB8
if(m_clamping_right_thumb!=NOT_PRESSED)
return;
//--- =5 >1;0AB8 ?>;7C=:0 A;0945@0
if(!m_thumb_focus_right)
m_clamping_right_thumb=PRESSED_OUTSIDE;
//---  >1;0AB8 ?>;7C=:0 A;0945@0
else
{
m_slider_thumb_state=true;
m_clamping_right_thumb=PRESSED_INSIDE;
//--- 5@5@8A>20BL ?>;7C=>:
DrawRightThumb();
m_canvas.Update();
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),0,"");
//--- B?@028< A>>1I5=85 >1 87<5=5=88 2 3@0D8G5A:>< 8=B5@D59A5
::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0,"");
}
}
}
//+------------------------------------------------------------------+
//| 1=C;5=85 ?5@5<5==KE A2O70==KE A ?5@5<5I5=85< ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::ZeroLeftThumbVariables(void)
{
//--- K9B8, 5A;8 MB> =5 42>9=>9 A;0945@
if(!m_dual_slider_mode)
return;
//--- A;8 70H;8 AN40, B> MB> 7=0G8B, GB> ;520O :=>?:0 <KH8 >B60B0.
// A;8 4> MB>3> 7060B85 ;52>9 :=>?:8 <KH8 1K;> >ACI5AB2;5=> =04 ?>;7C=:>< A;0945@0...
if(m_clamping_left_thumb==PRESSED_INSIDE)
{
//--- ... >B?@028< A>>1I5=85, GB> 87<5=5=85 7=0G5=8O 2 ?>;5 22>40 ?>A@54AB2>< ?>;7C=:0 7025@H5=0
::EventChartCustom(m_chart_id,ON_END_EDIT,CElementBase::Id(),CElementBase::Index(),"");
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),1,"");
//--- B?@028< A>>1I5=85 >1 87<5=5=88 2 3@0D8G5A:>< 8=B5@D59A5
::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0,"");
}
//--- 1=C;8BL ?5@5<5==K5
if(m_clamping_left_thumb!=NOT_PRESSED)
{
m_slider_thumb_state =false;
m_slider_size_fixing =0;
m_clamping_left_thumb =NOT_PRESSED;
//--- 5@5@8A>20BL ?>;7C=>:
DrawLeftThumb();
m_canvas.Update();
}
}
//+------------------------------------------------------------------+
//| 1=C;5=85 ?5@5<5==KE A2O70==KE A ?5@5<5I5=85< ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::ZeroRightThumbVariables(void)
{
//--- A;8 70H;8 AN40, B> MB> 7=0G8B, GB> ;520O :=>?:0 <KH8 >B60B0.
// A;8 4> MB>3> 7060B85 ;52>9 :=>?:8 <KH8 1K;> >ACI5AB2;5=> =04 ?>;7C=:>< A;0945@0...
if(m_clamping_right_thumb==PRESSED_INSIDE)
{
//--- ... >B?@028< A>>1I5=85, GB> 87<5=5=85 7=0G5=8O 2 ?>;5 22>40 ?>A@54AB2>< ?>;7C=:0 7025@H5=0
::EventChartCustom(m_chart_id,ON_END_EDIT,CElementBase::Id(),CElementBase::Index(),"");
//--- B?@028< A>>1I5=85 =0 >?@545;5=85 4>ABC?=KE M;5<5=B>2
::EventChartCustom(m_chart_id,ON_SET_AVAILABLE,CElementBase::Id(),1,"");
//--- B?@028< A>>1I5=85 >1 87<5=5=88 2 3@0D8G5A:>< 8=B5@D59A5
::EventChartCustom(m_chart_id,ON_CHANGE_GUI,CElementBase::Id(),0,"");
}
//--- 1=C;8BL ?5@5<5==K5
if(m_clamping_right_thumb!=NOT_PRESSED)
{
m_slider_thumb_state =false;
m_slider_size_fixing =0;
m_clamping_right_thumb =NOT_PRESSED;
//--- 5@5@8A>20BL ?>;7C=>:
DrawRightThumb();
m_canvas.Update();
}
}
//+------------------------------------------------------------------+
//| 0AGQB 7=0G5=89 (H038 8 :>MDD8F85=BK) |
//+------------------------------------------------------------------+
bool CSlider::CalculateCoefficients(void)
{
//--- K9B8, 5A;8 H8@8=0 M;5<5=B0 <5=LH5, G5< H8@8=0 ?>;7C=:0 A;0945@0
if(CElementBase::XSize()<m_thumb_x_size)
return(false);
//--- >;8G5AB2> ?8:A5;59 2 @01>G59 >1;0AB8
m_pixels_total=CElementBase::XSize()-m_thumb_x_size;
//--- >;8G5AB2> H03>2 2 480?07>=5 7=0G5=89 @01>G59 >1;0AB8
m_value_steps_total=int((m_right_edit.MaxValue()-m_right_edit.MinValue())/m_right_edit.StepValue());
//--- 07<5@ H030 >B=>A8B5;L=> H8@8=K @01>G59 >1;0AB8
m_position_step=m_right_edit.StepValue()*(double(m_value_steps_total)/double(m_pixels_total));
return(true);
}
//+------------------------------------------------------------------+
//| 0AGQB :>>@48=0BK X ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::CalculateLeftThumbX(void)
{
//--- >@@5:B8@>2:0 A CGQB>< B>3>, GB> <8=8<0;L=>5 7=0G5=85 <>65B 1KBL >B@8F0B5;L=K<
double neg_range=(m_left_edit.MinValue()<0)? ::fabs(m_left_edit.MinValue()/m_position_step) : 0;
//--- 0AAG8B05< :>>@48=0BC X 4;O ?>;7C=:0 A;0945@0
m_thumb_x_left=((double)m_left_edit.GetValue()/m_position_step)+neg_range;
//--- A;8 2KE>48< 70 ?@545;K @01>G59 >1;0AB8 2;52>
if(m_thumb_x_left<0)
m_thumb_x_left=0;
//--- A;8 2KE>48< 70 ?@545;K @01>G59 >1;0AB8 2?@02>
if(m_thumb_x_left+m_thumb_x_size>m_thumb_x_right)
m_thumb_x_left=m_thumb_x_right-m_thumb_x_size;
}
//+------------------------------------------------------------------+
//| 0AGQB :>>@48=0BK X ?>;7C=:0 A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::CalculateRightThumbX(void)
{
//--- >@@5:B8@>2:0 A CGQB>< B>3>, GB> <8=8<0;L=>5 7=0G5=85 <>65B 1KBL >B@8F0B5;L=K<
double neg_range=(m_right_edit.MinValue()<0)? ::fabs(m_right_edit.MinValue()/m_position_step) : 0;
//--- 0AAG8B05< :>>@48=0BC X 4;O ?>;7C=:0 A;0945@0
m_thumb_x_right=((double)m_right_edit.GetValue()/m_position_step)+neg_range;
//--- A;8 2KE>48< 70 ?@545;K @01>G59 >1;0AB8 2;52>
if(m_thumb_x_right<0)
m_thumb_x_right=0;
//--- A;8 2KE>48< 70 ?@545;K @01>G59 >1;0AB8 2?@02>
if(m_thumb_x_right+m_thumb_x_size>m_x_size)
m_thumb_x_right=m_x_size-m_thumb_x_size;
}
//+------------------------------------------------------------------+
//| 0AGQB ?>78F88 ?>;7C=:0 A;0945@0 2 480?07>=5 7=0G5=89 |
//+------------------------------------------------------------------+
void CSlider::CalculateLeftThumbPos(void)
{
//--- >;CG8< =><5@ ?>78F88 ?>;7C=:0 A;0945@0
m_thumb_x_pos_left=m_thumb_x_left*m_position_step;
//--- >@@5:B8@>2:0 A CGQB>< B>3>, GB> <8=8<0;L=>5 7=0G5=85 <>65B 1KBL >B@8F0B5;L=K<
if(m_left_edit.MinValue()<0 && m_thumb_x_left!=WRONG_VALUE)
m_thumb_x_pos_left+=int(m_left_edit.MinValue());
//--- @>25@:0 =0 2KE>4 87 @01>G59 >1;0AB8 2;52>
if(m_thumb_x_left<=0)
m_thumb_x_pos_left=int(m_left_edit.MinValue());
}
//+------------------------------------------------------------------+
//| 0AGQB ?>78F88 ?>;7C=:0 A;0945@0 2 480?07>=5 7=0G5=89 |
//+------------------------------------------------------------------+
void CSlider::CalculateRightThumbPos(void)
{
//--- >;CG8< =><5@ ?>78F88 ?>;7C=:0 A;0945@0
m_thumb_x_pos_right=m_thumb_x_right*m_position_step;
//--- >@@5:B8@>2:0 A CGQB>< B>3>, GB> <8=8<0;L=>5 7=0G5=85 <>65B 1KBL >B@8F0B5;L=K<
if(m_right_edit.MinValue()<0 && m_thumb_x_right!=WRONG_VALUE)
m_thumb_x_pos_right+=int(m_right_edit.MinValue());
//--- @>25@:0 =0 2KE>4 87 @01>G59 >1;0AB8 2?@02>/2;52>
if(m_thumb_x_right+m_thumb_x_size>m_x_size)
m_thumb_x_pos_right=int(m_right_edit.MaxValue());
if(m_thumb_x_right<=0)
m_thumb_x_pos_right=int(m_right_edit.MinValue());
}
//+------------------------------------------------------------------+
//| 8AC5B M;5<5=B |
//+------------------------------------------------------------------+
void CSlider::Draw(void)
{
//--- 0@8A>20BL D>=
CElement::DrawBackground();
//--- 0@8A>20BL 3@0=8FK 8=48:0B>@0
DrawSlot();
//--- 0@8A>20BL 8=48:0B>@
DrawIndicator();
//--- 0@8A>20BL ?>;7C=>: A;0945@0
DrawLeftThumb();
//--- 0@8A>20BL ?>;7C=>: A;0945@0
DrawRightThumb();
}
//+------------------------------------------------------------------+
//| 8AC5B 3@0=8FK 4;O 8=48:0B>@0 |
//+------------------------------------------------------------------+
void CSlider::DrawSlot(void)
{
//--- 5@E=OO 3@0=8F0
int x1=0,x2=m_x_size;
int y1=m_slot_y,y2=y1;
m_canvas.Line(x1,y1,x2,y2,::ColorToARGB(m_slot_line_dark_color));
//--- 86=OO 3@0=8F0
y1+=m_slot_y_size; y2=y1;
m_canvas.Line(x1,y1,x2,y2,::ColorToARGB(m_slot_line_light_color));
}
//+------------------------------------------------------------------+
//| 8AC5B 8=48:0B>@ |
//+------------------------------------------------------------------+
void CSlider::DrawIndicator(void)
{
//--- >>@48=0BK
int x1 =(int)m_thumb_x_left;
int x2 =(int)m_thumb_x_right;
int y1 =m_slot_y+1;
int y2 =m_slot_y+m_slot_y_size-1;
//--- &25B
color clr=(m_is_locked)? m_slot_indicator_color_locked : m_slot_indicator_color;
//--- 8AC5< 8=48:0B>@
m_canvas.FillRectangle(x1,y1,x2,y2,::ColorToARGB(clr));
}
//+------------------------------------------------------------------+
//| 8AC5B ?>;7C=>: A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::DrawLeftThumb(void)
{
//--- K9B8, 5A;8 MB> =5 42>9=>9 A;0945@
if(!m_dual_slider_mode)
return;
//--- >>@48=0BK
int x1 =(int)m_thumb_x_left;
int x2 =(int)m_thumb_x_left+m_thumb_x_size;
int y1 =m_thumb_y;
int y2 =y1+m_thumb_y_size;
//--- 8AC5< ?>;7C=>:
m_canvas.FillRectangle(x1,y1,x2,y2,ThumbColorCurrent(m_thumb_focus_left,m_clamping_left_thumb));
}
//+------------------------------------------------------------------+
//| 8AC5B ?>;7C=>: A;0945@0 |
//+------------------------------------------------------------------+
void CSlider::DrawRightThumb(void)
{
//--- >>@48=0BK
int x1 =(int)m_thumb_x_right;
int x2 =(int)m_thumb_x_right+m_thumb_x_size;
int y1 =m_thumb_y;
int y2 =y1+m_thumb_y_size;
//--- 8AC5< ?>;7C=>:
m_canvas.FillRectangle(x1,y1,x2,y2,ThumbColorCurrent(m_thumb_focus_right,m_clamping_right_thumb));
}
//+------------------------------------------------------------------+