]> git.tdb.fi Git - libs/gltk.git/blob - source/slider.cpp
Pass coordinates relative to the receiving widget's geometry
[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 }
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 }
71
72
73 Slider::Loader::Loader(Slider &s):
74         Widget::Loader(s)
75 {
76         add("range", &Slider::min, &Slider::max);
77         add("step",  &Slider::step);
78         add("value", &Slider::value);
79 }
80
81 Slider &Slider::Loader::get_object() const
82 {
83         return static_cast<Slider &>(wdg);
84 }
85
86 } // namespace GLtk
87 } // namespace Msp