1 #include "pch.h"
2 #include "MyGUI_Precompiled.h"
3 #include "Slider.h"
4 #include "MyGUI_InputManager.h"
5 #include "MyGUI_Button.h"
6 #include "MyGUI_ResourceSkin.h"
7 #include "MyGUI_ImageBox.h"
8 
9 namespace MyGUI
10 {
11 
Slider()12 	Slider::Slider() :
13 		mWidgetStart(nullptr),
14 		mWidgetEnd(nullptr),
15 		mWidgetTrack(nullptr),
16 		mfValue(0.f), mfDefault(0.5f)
17 	{
18 	}
19 
20 	//  Init
21 	//-----------------------------------------------------------------------------------------------
initialiseOverride()22 	void Slider::initialiseOverride()
23 	{
24 		Base::initialiseOverride();
25 
26 		eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse);
27 		eventMouseDrag += newDelegate(this, &Slider::notifyMouse);
28 		eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel);
29 
30 		assignWidget(mWidgetTrack, "Track");
31 		if (mWidgetTrack != nullptr)
32 		{
33 			mWidgetTrack->eventMouseDrag += newDelegate(this, &Slider::notifyMouse);
34 			mWidgetTrack->eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse);
35 			mWidgetTrack->eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel);
36 			mWidgetTrack->setVisible(false);
37 		}
38 
39 		/*
40 		assignWidget(mWidgetStart, "Start");
41 		if (mWidgetStart != nullptr)
42 		{
43 			mWidgetStart->eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse);
44 			mWidgetStart->eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel);
45 		}
46 		assignWidget(mWidgetEnd, "End");
47 		if (mWidgetEnd != nullptr)
48 		{
49 			mWidgetEnd->eventMouseButtonPressed += newDelegate(this, &Slider::notifyMouse);
50 			mWidgetEnd->eventMouseWheel += newDelegate(this, &Slider::notifyMouseWheel);
51 		}*/
52 	}
53 
shutdownOverride()54 	void Slider::shutdownOverride()
55 	{
56 		mWidgetStart = nullptr;
57 		mWidgetEnd = nullptr;
58 		mWidgetTrack = nullptr;
59 
60 		Base::shutdownOverride();
61 	}
62 
updateTrack()63 	void Slider::updateTrack()
64 	{
65 		if (mWidgetTrack == nullptr)
66 			return;
67 
68 		_forcePick(mWidgetTrack);
69 
70 		if (!mWidgetTrack->getVisible())
71 			mWidgetTrack->setVisible(true);
72 
73 		int iTrack = mWidgetTrack->getSize().width;
74 		int iSize = mWidgetTrack->getParent()->getSize().width - iTrack;
75 
76 		int pos = mfValue * iSize;
77 
78 		mWidgetTrack->setPosition(pos, mWidgetTrack->getTop());
79 	}
80 
81 	///  mouse button
82 	//-----------------------------------------------------------------------------------------------
notifyMouse(Widget * _sender,int _left,int _top,MouseButton _id)83 	void Slider::notifyMouse(Widget* _sender, int _left, int _top, MouseButton _id)
84 	{
85 		//eventMouseButtonPressed(this, _left, _top, _id);
86 		const IntPoint& p = mWidgetTrack->getParent()->getAbsolutePosition();
87 		const IntSize& s = mWidgetTrack->getParent()->getSize();
88 		int iTrack = mWidgetTrack->getSize().width;
89 
90 		//  LMB set (in slider range)
91 		if (_id == MouseButton::Left)
92 		{
93 			float fx = (_left-iTrack/2 - p.left) / float(s.width - iTrack);
94 			//float fy = (_top - p.top) / float(s.height);
95 			fx = std::max(0.f, std::min(1.f, fx));
96 
97 			mfValue = fx;
98 			eventValueChanged(this, mfValue);
99 			updateTrack();
100 		}
101 		else  /// RMB reset to default value
102 		if (_id == MouseButton::Right)
103 		{
104 			mfValue = mfDefault;
105 			eventValueChanged(this, mfValue);
106 			updateTrack();
107 		}
108 	}
109 
110 
getValue() const111 	float Slider::getValue() const
112 	{
113 		return mfValue;
114 	}
115 
setValue(float val)116 	void Slider::setValue(float val)
117 	{
118 		//if (mValue == val)
119 		//	return;
120 
121 		mfValue = val;  //std::max(0.f, std::min(1.f, val));
122 		updateTrack();
123 	}
124 
125 
126 	//  mouse wheel
127 	//--------------------------------------------------------------------------------
onMouseWheel(int _rel)128 	void Slider::onMouseWheel(int _rel)
129 	{
130 		notifyMouseWheel(nullptr, _rel);
131 
132 		Base::onMouseWheel(_rel);
133 	}
134 
notifyMouseWheel(Widget * _sender,int _rel)135 	void Slider::notifyMouseWheel(Widget* _sender, int _rel)
136 	{
137 		mfValue = std::max(0.f, std::min(1.f, mfValue - _rel/120.f*0.5f * 0.125f ));
138 		eventValueChanged(this, mfValue);
139 		updateTrack();
140 	}
141 
setPropertyOverride(const std::string & _key,const std::string & _value)142 	void Slider::setPropertyOverride(const std::string& _key, const std::string& _value)
143 	{
144 		if (_key == "Value")
145 			setValue(utility::parseValue<float>(_value));
146 		else
147 		{
148 			Base::setPropertyOverride(_key, _value);
149 			return;
150 		}
151 		eventChangeProperty(this, _key, _value);
152 	}
153 
154 
155 	//  update track on resize
setSize(int _width,int _height)156 	void Slider::setSize(int _width, int _height)
157 	{
158 		setSize(IntSize(_width, _height));
159 	}
160 
setCoord(int _left,int _top,int _width,int _height)161 	void Slider::setCoord(int _left, int _top, int _width, int _height)
162 	{
163 		setCoord(IntCoord(_left, _top, _width, _height));
164 	}
165 
setSize(const IntSize & _size)166 	void Slider::setSize(const IntSize& _size)
167 	{
168 		Base::setSize(_size);
169 		updateTrack();
170 	}
171 
setCoord(const IntCoord & _coord)172 	void Slider::setCoord(const IntCoord& _coord)
173 	{
174 		Base::setCoord(_coord);
175 		updateTrack();
176 	}
177 
178 }
179