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