]> git.tdb.fi Git - libs/gltk.git/blob - slider.cpp
dc8a28a6ff0c0ca718000cb3923c5e03c1050633
[libs/gltk.git] / slider.cpp
1 #include "slider.h"
2
3 namespace Msp {
4 namespace GLtk {
5
6 Slider::Slider():
7         min(0),
8         max(1),
9         value(0),
10         step(0.1),
11         dragging(false),
12         drag_area_size(0)
13 { }
14
15 void Slider::set_value(double v)
16 {
17         double old_value = value;
18
19         if(v<min)
20                 value = min;
21         else if(v>max)
22                 value = max;
23         else
24         {
25                 unsigned steps = static_cast<unsigned>((v-min)/step+0.5);
26                 value = min+steps*step;
27         }
28
29         if(value!=old_value)
30                 signal_value_changed.emit(value);
31 }
32
33 void Slider::set_range(double a, double b)
34 {
35         min = a;
36         max = b;
37         set_value(value);
38 }
39
40 void Slider::set_step(double s)
41 {
42         step = s;
43         set_value(value);
44 }
45
46 void Slider::start_drag(int p)
47 {
48         dragging = true;
49         drag_start_pos = p;
50         drag_start_value = value;
51         set_state(ACTIVE);
52 }
53
54 void Slider::drag(int p)
55 {
56         if(max>min)
57         {
58                 set_value(drag_start_value+(p-drag_start_pos)*(max-min)/drag_area_size);
59                 rebuild();
60         }
61 }
62
63 void Slider::end_drag()
64 {
65         dragging = false;
66         clear_state(ACTIVE);
67 }
68
69
70 Slider::Loader::Loader(Slider &s):
71         Widget::Loader(s)
72 {
73         add("range", &Slider::min, &Slider::max);
74         add("step",  &Slider::step);
75         add("value", &Slider::value);
76 }
77
78 Slider &Slider::Loader::get_object() const
79 {
80         return static_cast<Slider &>(obj);
81 }
82
83 } // namespace GLtk
84 } // namespace Msp