Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
blob: 5de82b2640018a4c3ef8be54d724a9bb0d9a198a (plain)
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