1 #include <math.h>
2
3 #include "gui2_slider.h"
4 #include "preferenceManager.h"
5
GuiBasicSlider(GuiContainer * owner,string id,float min_value,float max_value,float start_value,func_t func)6 GuiBasicSlider::GuiBasicSlider(GuiContainer* owner, string id, float min_value, float max_value, float start_value, func_t func)
7 : GuiElement(owner, id), min_value(min_value), max_value(max_value), value(start_value), func(func)
8 {
9 }
10
onDraw(sf::RenderTarget & window)11 void GuiBasicSlider::onDraw(sf::RenderTarget& window)
12 {
13 drawStretched(window, rect, "gui/SliderBackground", selectColor(colorConfig.slider.background));
14
15 sf::Color color = selectColor(colorConfig.slider.forground);
16
17 if (rect.width > rect.height)
18 {
19 float x;
20 x = rect.left + (rect.width - rect.height) * (value - min_value) / (max_value - min_value);
21
22 sf::Sprite sprite;
23 textureManager.setTexture(sprite, "gui/SliderKnob");
24 sprite.setOrigin(0, 0);
25 sprite.setPosition(x, rect.top);
26 sprite.setScale(rect.height / sprite.getTextureRect().width, rect.height / sprite.getTextureRect().width);
27 sprite.setColor(color);
28 window.draw(sprite);
29 }else{
30 float y;
31 y = rect.top + (rect.height - rect.width) * (value - min_value) / (max_value - min_value);
32
33 sf::Sprite sprite;
34 textureManager.setTexture(sprite, "gui/SliderKnob");
35 sprite.setOrigin(0, 0);
36 sprite.setPosition(rect.left, y);
37 sprite.setScale(rect.width / sprite.getTextureRect().width, rect.width / sprite.getTextureRect().width);
38 sprite.setColor(color);
39 window.draw(sprite);
40 }
41 }
42
onMouseDown(sf::Vector2f position)43 bool GuiBasicSlider::onMouseDown(sf::Vector2f position)
44 {
45 onMouseDrag(position);
46 return true;
47 }
48
onMouseDrag(sf::Vector2f position)49 void GuiBasicSlider::onMouseDrag(sf::Vector2f position)
50 {
51 float new_value;
52 if (rect.width > rect.height)
53 new_value = (position.x - rect.left - (rect.height / 2.0)) / (rect.width - rect.height);
54 else
55 new_value = (position.y - rect.top - (rect.width / 2.0)) / (rect.height - rect.width);
56 new_value = min_value + (max_value - min_value) * new_value;
57 if (min_value < max_value)
58 {
59 if (new_value < min_value)
60 new_value = min_value;
61 if (new_value > max_value)
62 new_value = max_value;
63 }else{
64 if (new_value > min_value)
65 new_value = min_value;
66 if (new_value < max_value)
67 new_value = max_value;
68 }
69 if (value != new_value)
70 {
71 value = new_value;
72 if (func)
73 {
74 func_t f = func;
75 f(value);
76 }
77 }
78 }
79
onMouseUp(sf::Vector2f position)80 void GuiBasicSlider::onMouseUp(sf::Vector2f position)
81 {
82 }
83
setValue(float value)84 GuiBasicSlider* GuiBasicSlider::setValue(float value)
85 {
86 if (min_value < max_value)
87 {
88 if (value < min_value)
89 value = min_value;
90 if (value > max_value)
91 value = max_value;
92 }else{
93 if (value > min_value)
94 value = min_value;
95 if (value < max_value)
96 value = max_value;
97 }
98 this->value = value;
99 return this;
100 }
101
setRange(float min,float max)102 GuiBasicSlider* GuiBasicSlider::setRange(float min, float max)
103 {
104 this->min_value = min;
105 this->max_value = max;
106 setValue(this->value);
107 return this;
108 }
109
getValue() const110 float GuiBasicSlider::getValue() const
111 {
112 return value;
113 }
114
115
116
117
118
119
120
121
GuiSlider(GuiContainer * owner,string id,float min_value,float max_value,float start_value,func_t func)122 GuiSlider::GuiSlider(GuiContainer* owner, string id, float min_value, float max_value, float start_value, func_t func)
123 : GuiBasicSlider(owner, id, min_value, max_value, start_value, func)
124 {
125 overlay_label = nullptr;
126 }
127
onDraw(sf::RenderTarget & window)128 void GuiSlider::onDraw(sf::RenderTarget& window)
129 {
130 drawStretched(window, rect, "gui/SliderBackground", selectColor(colorConfig.slider.background));
131
132 sf::Color color = selectColor(colorConfig.slider.forground);
133
134 if (rect.width > rect.height)
135 {
136 float x;
137
138 for(TSnapPoint& point : snap_points)
139 {
140 x = rect.left + (rect.width - rect.height) * (point.value - min_value) / (max_value - min_value);
141
142 sf::Sprite snap_sprite;
143 textureManager.setTexture(snap_sprite, "gui/SliderTick");
144 snap_sprite.setRotation(90);
145 snap_sprite.setPosition(x + rect.height / 2, rect.top + rect.height / 2);
146 snap_sprite.setScale(rect.height / snap_sprite.getTextureRect().width, rect.height / snap_sprite.getTextureRect().width);
147 snap_sprite.setColor(selectColor(colorConfig.slider.background));
148 window.draw(snap_sprite);
149 }
150 x = rect.left + (rect.width - rect.height) * (value - min_value) / (max_value - min_value);
151
152 sf::Sprite sprite;
153 textureManager.setTexture(sprite, "gui/SliderKnob");
154 sprite.setOrigin(0, 0);
155 sprite.setPosition(x, rect.top);
156 sprite.setScale(rect.height / sprite.getTextureRect().width, rect.height / sprite.getTextureRect().width);
157 sprite.setColor(color);
158 window.draw(sprite);
159 }else{
160 float y;
161 for(TSnapPoint& point : snap_points)
162 {
163 y = rect.top + (rect.height - rect.width) * (point.value - min_value) / (max_value - min_value);
164
165 sf::Sprite snap_sprite;
166 textureManager.setTexture(snap_sprite, "gui/SliderTick");
167 snap_sprite.setOrigin(0, 0);
168 snap_sprite.setPosition(rect.left, y);
169 snap_sprite.setScale(rect.width / snap_sprite.getTextureRect().width, rect.width / snap_sprite.getTextureRect().width);
170 snap_sprite.setColor(selectColor(colorConfig.slider.background));
171 window.draw(snap_sprite);
172 }
173 y = rect.top + (rect.height - rect.width) * (value - min_value) / (max_value - min_value);
174
175 sf::Sprite sprite;
176 textureManager.setTexture(sprite, "gui/SliderKnob");
177 sprite.setOrigin(0, 0);
178 sprite.setPosition(rect.left, y);
179 sprite.setScale(rect.width / sprite.getTextureRect().width, rect.width / sprite.getTextureRect().width);
180 sprite.setColor(color);
181 window.draw(sprite);
182 }
183
184 if (overlay_label)
185 {
186 overlay_label->setText(string(value, 0));
187 }
188 }
189
onMouseDown(sf::Vector2f position)190 bool GuiSlider::onMouseDown(sf::Vector2f position)
191 {
192 onMouseDrag(position);
193 return true;
194 }
195
onMouseDrag(sf::Vector2f position)196 void GuiSlider::onMouseDrag(sf::Vector2f position)
197 {
198 float new_value;
199 if (rect.width > rect.height)
200 new_value = (position.x - rect.left - (rect.height / 2.0)) / (rect.width - rect.height);
201 else
202 new_value = (position.y - rect.top - (rect.width / 2.0)) / (rect.height - rect.width);
203 new_value = min_value + (max_value - min_value) * new_value;
204 for(TSnapPoint& point : snap_points)
205 {
206 if (fabs(new_value - point.value) < point.range)
207 new_value = point.value;
208 }
209 if (min_value < max_value)
210 {
211 if (new_value < min_value)
212 new_value = min_value;
213 if (new_value > max_value)
214 new_value = max_value;
215 }else{
216 if (new_value > min_value)
217 new_value = min_value;
218 if (new_value < max_value)
219 new_value = max_value;
220 }
221 if (value != new_value)
222 {
223 value = new_value;
224 if (func)
225 {
226 func_t f = func;
227 f(value);
228 }
229 }
230 }
231
onMouseUp(sf::Vector2f position)232 void GuiSlider::onMouseUp(sf::Vector2f position)
233 {
234 }
235
clearSnapValues()236 GuiSlider* GuiSlider::clearSnapValues()
237 {
238 snap_points.clear();
239 return this;
240 }
241
addSnapValue(float value,float range)242 GuiSlider* GuiSlider::addSnapValue(float value, float range)
243 {
244 snap_points.emplace_back();
245 snap_points.back().value = value;
246 snap_points.back().range = range;
247 return this;
248 }
249
addOverlay()250 GuiSlider* GuiSlider::addOverlay()
251 {
252 if (!overlay_label)
253 {
254 overlay_label = new GuiLabel(this, "", "", 30);
255 overlay_label->setSize(GuiElement::GuiSizeMax, GuiElement::GuiSizeMax);
256 }
257 return this;
258 }
259
260
261
262
263
264
265
266
267
GuiSlider2D(GuiContainer * owner,string id,sf::Vector2f min_value,sf::Vector2f max_value,sf::Vector2f start_value,func_t func)268 GuiSlider2D::GuiSlider2D(GuiContainer* owner, string id, sf::Vector2f min_value, sf::Vector2f max_value, sf::Vector2f start_value, func_t func)
269 : GuiElement(owner, id), min_value(min_value), max_value(max_value), value(start_value), func(func)
270 {
271 }
272
onDraw(sf::RenderTarget & window)273 void GuiSlider2D::onDraw(sf::RenderTarget& window)
274 {
275 drawStretchedHV(window, rect, 25.0f, "gui/SliderBackground", selectColor(colorConfig.slider.background));
276
277 sf::Color color = selectColor(colorConfig.slider.forground);
278
279 float x = rect.left + (rect.width - 50.0) * (value.x - min_value.x) / (max_value.x - min_value.x);
280 float y = rect.top + (rect.height - 50.0) * (value.y - min_value.y) / (max_value.y - min_value.y);
281
282 sf::Sprite sprite;
283 textureManager.setTexture(sprite, "gui/SliderKnob");
284 sprite.setOrigin(0, 0);
285 sprite.setPosition(x, y);
286 sprite.setScale(50.0 / sprite.getTextureRect().width, 50.0 / sprite.getTextureRect().width);
287 sprite.setColor(color);
288 window.draw(sprite);
289 }
290
onMouseDown(sf::Vector2f position)291 bool GuiSlider2D::onMouseDown(sf::Vector2f position)
292 {
293 onMouseDrag(position);
294 return true;
295 }
296
onMouseDrag(sf::Vector2f position)297 void GuiSlider2D::onMouseDrag(sf::Vector2f position)
298 {
299 sf::Vector2f new_value;
300 new_value.x = (position.x - rect.left - 25.0f) / (rect.width - 50.0f);
301 new_value.y = (position.y - rect.top - 25.0f) / (rect.height - 50.0f);
302 new_value.x = min_value.x + (max_value.x - min_value.x) * new_value.x;
303 new_value.y = min_value.y + (max_value.y - min_value.y) * new_value.y;
304 for(TSnapPoint& point : snap_points)
305 {
306 if (fabs(new_value.x - point.value.x) < point.range.x && fabs(new_value.y - point.value.y) < point.range.y)
307 new_value = point.value;
308 }
309 if (min_value.x < max_value.x)
310 {
311 if (new_value.x < min_value.x)
312 new_value.x = min_value.x;
313 if (new_value.x > max_value.x)
314 new_value.x = max_value.x;
315 }else{
316 if (new_value.x > min_value.x)
317 new_value.x = min_value.x;
318 if (new_value.x < max_value.x)
319 new_value.x = max_value.x;
320 }
321 if (min_value.y < max_value.y)
322 {
323 if (new_value.y < min_value.y)
324 new_value.y = min_value.y;
325 if (new_value.y > max_value.y)
326 new_value.y = max_value.y;
327 }else{
328 if (new_value.y > min_value.y)
329 new_value.y = min_value.y;
330 if (new_value.y < max_value.y)
331 new_value.y = max_value.y;
332 }
333 if (value != new_value)
334 {
335 value = new_value;
336 if (func)
337 func(value);
338 }
339 }
340
onMouseUp(sf::Vector2f position)341 void GuiSlider2D::onMouseUp(sf::Vector2f position)
342 {
343 }
344
clearSnapValues()345 GuiSlider2D* GuiSlider2D::clearSnapValues()
346 {
347 snap_points.clear();
348 return this;
349 }
350
addSnapValue(sf::Vector2f value,sf::Vector2f range)351 GuiSlider2D* GuiSlider2D::addSnapValue(sf::Vector2f value, sf::Vector2f range)
352 {
353 snap_points.emplace_back();
354 snap_points.back().value = value;
355 snap_points.back().range = range;
356 return this;
357 }
358
setValue(sf::Vector2f value)359 GuiSlider2D* GuiSlider2D::setValue(sf::Vector2f value)
360 {
361 if (min_value.x < max_value.x)
362 {
363 if (value.x < min_value.x)
364 value.x = min_value.x;
365 if (value.x > max_value.x)
366 value.x = max_value.x;
367 }else{
368 if (value.x > min_value.x)
369 value.x = min_value.x;
370 if (value.x < max_value.x)
371 value.x = max_value.x;
372 }
373 if (min_value.y < max_value.y)
374 {
375 if (value.y < min_value.y)
376 value.y = min_value.y;
377 if (value.y > max_value.y)
378 value.y = max_value.y;
379 }else{
380 if (value.y > min_value.y)
381 value.y = min_value.y;
382 if (value.y < max_value.y)
383 value.y = max_value.y;
384 }
385 this->value = value;
386 return this;
387 }
388
getValue()389 sf::Vector2f GuiSlider2D::getValue()
390 {
391 return value;
392 }
393