]> git.tdb.fi Git - libs/gui.git/blob - source/input/smoothcontrol.h
Update .gitignore to include build products on Windows
[libs/gui.git] / source / input / smoothcontrol.h
1 #ifndef MSP_INPUT_SMOOTHCONTROL_H_
2 #define MSP_INPUT_SMOOTHCONTROL_H_
3
4 #include <msp/graphics/mspgui_api.h>
5 #include "control.h"
6
7 namespace Msp {
8 namespace Input {
9
10 /**
11 A control with a continuous range of values.  A button is treated as either 1
12 or 0.  Axis values are mapped to absolute value.
13
14 Two smooth controls can also be paired to each other.  Motion on one control of
15 the pair will cause negative motion on the other.  This works best when the
16 controls are bound to the opposite sides of the same axis.
17 */
18 class MSPGUI_API SmoothControl: public Control
19 {
20 public:
21         sigc::signal<void, float> signal_motion;
22
23 private:
24         float value = 0.0f;
25         SmoothControl *paired_ctrl = nullptr;
26         float dead_zone = 0.1f;
27         float threshold = 0.9f;
28
29 public:
30         SmoothControl() = default;
31         SmoothControl(const ControlSource &);
32         SmoothControl(Device &, ControlSrcType, unsigned);
33         ~SmoothControl();
34
35         /// Sets the dead zone value.  Any value below this will be treated as 0.
36         void set_dead_zone(float);
37
38         /** Sets the max-out threshold.  Any value above this will be treated as 1.
39         A negative value can be used to disable the threshold entirely. */
40         void set_threshold(float);
41
42         /// Sets dead zone and threshold in a single function call.
43         void set_range(float, float);
44
45         void pair(SmoothControl *ctrl);
46         float get_value() const { return value; }
47
48 private:
49         void on_press() override;
50         void on_release() override;
51         void on_motion(float, float) override;
52 };
53
54 } // namespace Input
55 } // namespace Msp
56
57 #endif