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