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