]> git.tdb.fi Git - libs/gltk.git/blob - source/slider.cpp
Miscellaneous other fixes
[libs/gltk.git] / source / 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         state |= ACTIVE;
52 }
53
54 void Slider::drag(int p)
55 {
56         if(max>min)
57                 set_value(drag_start_value+(p-drag_start_pos)*(max-min)/drag_area_size);
58 }
59
60 void Slider::end_drag()
61 {
62         dragging = false;
63         state &= ~ACTIVE;
64 }
65
66
67 Slider::Loader::Loader(Slider &s):
68         Widget::Loader(s)
69 {
70         add("range", &Slider::min, &Slider::max);
71         add("step",  &Slider::step);
72         add("value", &Slider::value);
73 }
74
75 Slider &Slider::Loader::get_object() const
76 {
77         return static_cast<Slider &>(obj);
78 }
79
80 } // namespace GLtk
81 } // namespace Msp