1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
/*
ui/slider.cc
This file is part of the Osirion project and is distributed under
the terms of the GNU General Public License version 2
*/
#include "math/functions.h"
#include "ui/paint.h"
#include "ui/slider.h"
namespace ui {
Slider::Slider(Widget *parent, const float minimum, const float maximum) : Widget(parent)
{
slider_minimum = minimum;
slider_maximum = maximum;
slider_value = slider_minimum;
slider_minbutton = new ui::Button(this, "<");
slider_minbutton->set_border(false);
slider_maxbutton = new ui::Button(this, ">>");
slider_maxbutton->set_border(false);
validate();
}
Slider::~Slider() {
}
void Slider::set_value(const float value)
{
slider_value = value;
validate();
}
void Slider::set_minimum(const float minimum)
{
slider_minimum = minimum;
validate();
}
void Slider::set_maximum(const float maximum)
{
slider_maximum = maximum;
validate();
}
void Slider::set_range(const float minimum, const float maximum)
{
slider_minimum = minimum;
slider_maximum = maximum;
validate();
}
void Slider::validate()
{
if (slider_minimum > slider_maximum) {
math::swap(slider_minimum, slider_maximum);
}
math::clamp(slider_value, slider_minimum, slider_maximum);
}
void Slider::print(const size_t indent) const
{
std::string marker("");
con_print << aux::pad_left(marker, indent*2) << label() << " \"" << minimum() << "-" << maximum() << "\"" << std::endl;
}
bool Slider::on_emit(Widget *sender, const Event event, void *data)
{
if (event == EventButtonClicked) {
if (sender == slider_minbutton) {
slider_value = slider_minimum;
emit(EventSliderChanged, this);
return true;
} else if (sender == slider_maxbutton) {
slider_value = slider_maximum;
emit(EventSliderChanged, this);
return true;
}
}
return false;
}
void Slider::resize()
{
// note: slider expects width > height
slider_minbutton->set_size(height(), height());
slider_minbutton->set_location(0, 0);
slider_maxbutton->set_size(height(), height());
slider_maxbutton->set_location(width() - slider_maxbutton->width(), 0);
}
void Slider::draw()
{
if (slider_maximum > slider_minimum) {
const float range = (slider_value - slider_minimum) / (slider_maximum - slider_minimum);
const float x = (width() - 3.0f * height()) * range;
Paint::set_color(palette()->foreground());
Paint::draw_rectangle(math::Vector2f(global_location().x() + height() + x, global_location().y()), math::Vector2f(height(), height()));
}
Widget::draw();
}
} // namespace ui
|