]> git.tdb.fi Git - libs/gltk.git/blob - source/slider.cpp
Properly account for margins in sliders
[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         drag_area_offset(0),
14         slider_size(1)
15 { }
16
17 void Slider::set_value(double v)
18 {
19         double old_value = value;
20
21         if(v<min)
22                 value = min;
23         else if(v>max)
24                 value = max;
25         else
26         {
27                 unsigned steps = static_cast<unsigned>((v-min)/step+0.5);
28                 value = min+steps*step;
29         }
30
31         if(value!=old_value)
32         {
33                 signal_value_changed.emit(value);
34                 rebuild();
35         }
36 }
37
38 void Slider::set_range(double a, double b)
39 {
40         min = a;
41         max = b;
42         set_value(value);
43 }
44
45 void Slider::set_step(double s)
46 {
47         step = s;
48         set_value(value);
49 }
50
51 void Slider::click(int p)
52 {
53         p -= drag_area_offset;
54         if(p<0 || p>=static_cast<int>(drag_area_size))
55                 return;
56
57         int sp = static_cast<int>((drag_area_size-slider_size)*(value-min)/(max-min));
58         if(p<sp)
59                 set_value(value-step*10);
60         else if(p>=static_cast<int>(sp+slider_size))
61                 set_value(value+step*10);
62         else
63                 start_drag(drag_area_offset+p);
64 }
65
66 void Slider::start_drag(int p)
67 {
68         dragging = true;
69         drag_start_pos = p;
70         drag_start_value = value;
71         set_state(ACTIVE);
72 }
73
74 void Slider::drag(int p)
75 {
76         if(max>min)
77                 set_value(drag_start_value+(p-drag_start_pos)*(max-min)/(drag_area_size-slider_size));
78 }
79
80 void Slider::end_drag()
81 {
82         dragging = false;
83         clear_state(ACTIVE);
84 }
85
86
87 Slider::Loader::Loader(Slider &s):
88         DataFile::DerivedObjectLoader<Slider, Widget::Loader>(s)
89 {
90         add("range", &Slider::min, &Slider::max);
91         add("step",  &Slider::step);
92         add("value", &Slider::value);
93 }
94
95 } // namespace GLtk
96 } // namespace Msp