Simple GUI Library
slider.cpp
Go to the documentation of this file.
1/**
2 * @author Nikita Mochalov (github.com/tralf-strues)
3 * @file slider.cpp
4 * @date 2021-11-28
5 *
6 * @copyright Copyright (c) 2021
7 */
8
11
12namespace Sgl
13{
14 Slider::Slider(float rangeMin, float rangeMax) : m_RangeMin(rangeMin), m_RangeMax(rangeMax), m_Value(rangeMin)
15 {
16 assert(rangeMin < rangeMax);
17
18 m_DefaultSkin = new DefaultSkins::SliderSkin(this);
19 setSkin(m_DefaultSkin);
20 }
21
22 Slider::Slider(BaseSkin<Slider>* skin, float rangeMin, float rangeMax)
23 : m_RangeMin(rangeMin), m_RangeMax(rangeMax), m_Value(rangeMin)
24 {
25 assert(skin);
26 skin->attach(this);
27 setSkin(skin);
28 }
29
30 Orientation Slider::getOrientation() const { return m_Orientation; }
31 void Slider::setOrientation(Orientation orientation) { m_Orientation = orientation; }
32
33 float Slider::getRangeMin() const { return m_RangeMin; }
34 float Slider::getRangeMax() const { return m_RangeMax; }
35 float Slider::getValue() const { return m_Value; }
36
37 void Slider::setRangeMin(float min)
38 {
39 assert(min < m_RangeMax);
40 m_RangeMin = min;
41
42 if (m_Value < m_RangeMin)
43 {
44 setValue(m_RangeMin);
45 }
46 }
47
48 void Slider::setRangeMax(float max)
49 {
50 assert(m_RangeMin < max);
51 m_RangeMax = max;
52
53 if (m_Value > m_RangeMax)
54 {
55 setValue(m_RangeMax);
56 }
57 }
58
59 void Slider::setValue(float value)
60 {
61 float oldValue = m_Value;
62
63 m_Value = value;
64 m_Value = std::max(m_Value, m_RangeMin);
65 m_Value = std::min(m_Value, m_RangeMax);
66
67 if (m_Value == oldValue)
68 {
69 return;
70 }
71
72 for (auto listener : m_PropertyChangeListeners)
73 {
74 listener->onPropertyChange(new Sml::PropertyChangeEvent<float>(oldValue, m_Value));
75 }
76 }
77
78 void Slider::addOnPropertyChange(Sml::PropertyChangeListener<float>* listener)
79 {
80 m_PropertyChangeListeners.push_back(listener);
81 }
82
83 const std::list<Sml::PropertyChangeListener<float>*>& Slider::getOnPropertyChange()
84 {
85 return m_PropertyChangeListeners;
86 }
87
88 const int32_t SliderWithLabel::DEFAULT_SPACING = 5;
89
90 SliderWithLabel::SliderWithLabel(float rangeMin, float rangeMax, const char* format)
91 : m_Slider(new Slider(rangeMin, rangeMax)), m_Label(new Text("0")), m_Format(format) { attach(); }
92
93 SliderWithLabel::SliderWithLabel(BaseSkin<Slider>* skin, float rangeMin, float rangeMax, const char* format)
94 : m_Slider(new Slider(skin, rangeMin, rangeMax)), m_Label(new Text("0")), m_Format(format) { attach(); }
95
96 Slider* SliderWithLabel::getSlider() { return m_Slider; }
97 Text* SliderWithLabel::getLabel() { return m_Label; }
98
99 void SliderWithLabel::attach()
100 {
101 setBackground(nullptr);
102
103 addChildren(m_Slider, m_Label);
104 setSpacing(DEFAULT_SPACING);
105 setGrowPriority(m_Slider, GrowPriority::ALWAYS);
106
107 class SliderHandler : public Sml::PropertyChangeListener<float>
108 {
109 public:
110 SliderHandler(Text* label, const char* format) : m_Label(label), m_Format(format) {}
111
112 virtual void onPropertyChange(Sml::PropertyChangeEvent<float>* event) override
113 {
114 snprintf(m_Str, sizeof(m_Str), m_Format, event->getNewValue());
115 m_Label->setString(m_Str);
116 }
117
118 private:
119 Text* m_Label;
120 const char* m_Format;
121 char m_Str[128];
122 };
123
124 m_Slider->addOnPropertyChange(new SliderHandler(m_Label, m_Format));
125 }
126}