]> git.tdb.fi Git - libs/gltk.git/blob - source/slider.cpp
Improve widget part caching
[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         {
31                 signal_value_changed.emit(value);
32                 rebuild();
33         }
34 }
35
36 void Slider::set_range(double a, double b)
37 {
38         min = a;
39         max = b;
40         set_value(value);
41 }
42
43 void Slider::set_step(double s)
44 {
45         step = s;
46         set_value(value);
47 }
48
49 void Slider::start_drag(int p)
50 {
51         dragging = true;
52         drag_start_pos = p;
53         drag_start_value = value;
54         set_state(ACTIVE);
55 }
56
57 void Slider::drag(int p)
58 {
59         if(max>min)
60                 set_value(drag_start_value+(p-drag_start_pos)*(max-min)/drag_area_size);
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         DataFile::DerivedObjectLoader<Slider, Widget::Loader>(s)
72 {
73         add("range", &Slider::min, &Slider::max);
74         add("step",  &Slider::step);
75         add("value", &Slider::value);
76 }
77
78 } // namespace GLtk
79 } // namespace Msp