]> git.tdb.fi Git - libs/gltk.git/blob - source/slider.h
Refactor all slider logic into the Slider class
[libs/gltk.git] / source / slider.h
1 #ifndef MSP_GLTK_SLIDER_H_
2 #define MSP_GLTK_SLIDER_H_
3
4 #include <sigc++/sigc++.h>
5 #include "widget.h"
6
7 namespace Msp {
8 namespace GLtk {
9
10 /**
11 Sliders are used to adjust numeric values visually.  This class provides the
12 common interface and logic for sliders but can't be instantiated.  Use HSlider
13 or VSlider depending on which direction you want the slider to be in.
14 */
15 class Slider: public Widget
16 {
17 public:
18         class Loader: public DataFile::DerivedObjectLoader<Slider, Widget::Loader>
19         {
20         public:
21                 Loader(Slider &);
22         };
23
24 protected:
25         enum Direction
26         {
27                 HORIZONTAL,
28                 VERTICAL
29         };
30
31 public:
32         sigc::signal<void, double> signal_value_changed;
33
34 protected:
35         Direction dir;
36         double min, max;
37         double value;
38         double step;
39
40         bool dragging;
41         double drag_start_pos;
42         double drag_start_value;
43         unsigned drag_area_size;
44         unsigned drag_area_offset;
45         unsigned slider_size;
46         unsigned total_margin;
47
48         Slider(Direction);
49
50 public:
51         void set_value(double);
52         void set_range(double, double);
53         void set_step(double);
54         double get_value() const { return value; }
55
56 protected:
57         virtual void autosize_special(const Part &, Geometry &) const;
58         virtual void rebuild_special(const Part &);
59
60 public:
61         virtual void button_press(int, int, unsigned);
62         virtual void button_release(int, int, unsigned);
63         virtual void pointer_motion(int, int);
64
65 protected:
66         virtual void on_size_change();
67         virtual void on_style_change();
68 };
69
70
71 class VSlider: public Slider
72 {
73 public:
74         VSlider(): Slider(VERTICAL) { }
75
76         virtual const char *get_class() const { return "vslider"; }
77 };
78
79 class HSlider: public Slider
80 {
81 public:
82         HSlider(): Slider(HORIZONTAL) { }
83
84         virtual const char *get_class() const { return "hslider"; }
85 };
86
87 } // namespace GLtk
88 } // namespace Msp
89
90 #endif