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