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