]> git.tdb.fi Git - libs/gui.git/blob - source/input/smoothcontrol.cpp
eb308784b3175e86611186dd7622a94e3f5df099
[libs/gui.git] / source / input / smoothcontrol.cpp
1 #include "smoothcontrol.h"
2
3 namespace Msp {
4 namespace Input {
5
6 SmoothControl::SmoothControl():
7         value(0),
8         paired_ctrl(0),
9         dead_zone(0.1),
10         threshold(0.9)
11 { }
12
13 SmoothControl::SmoothControl(const ControlSource &s):
14         Control(s),
15         value(0),
16         paired_ctrl(0),
17         dead_zone(0.1),
18         threshold(0.9)
19 { }
20
21 SmoothControl::SmoothControl(Device &d, ControlSrcType t, unsigned i):
22         Control(d, t, i),
23         value(0),
24         paired_ctrl(0),
25         dead_zone(0.1),
26         threshold(0.9)
27 { }
28
29 SmoothControl::~SmoothControl()
30 {
31         pair(0);
32 }
33
34 void SmoothControl::set_dead_zone(float d)
35 {
36         dead_zone=d;
37 }
38
39 void SmoothControl::set_threshold(float t)
40 {
41         threshold=t;
42 }
43
44 void SmoothControl::pair(SmoothControl *ctrl)
45 {
46         if(ctrl==paired_ctrl)
47                 return;
48
49         if(paired_ctrl)
50         {
51                 SmoothControl *old_pair=paired_ctrl;
52                 paired_ctrl=0;
53                 old_pair->pair(0);
54         }
55
56         paired_ctrl=ctrl;
57
58         if(paired_ctrl)
59                 paired_ctrl->pair(this);
60 }
61
62 void SmoothControl::on_press()
63 {
64         on_motion(1, 1-value);
65 }
66
67 void SmoothControl::on_release()
68 {
69         if(value>0)
70                 on_motion(0, -value);
71 }
72
73 void SmoothControl::on_motion(float v, float r)
74 {
75         if(v<-threshold)
76                 value=-1;
77         else if(v>threshold)
78                 value=1;
79         else if(v<-dead_zone)
80                 value=(v+dead_zone)/(threshold-dead_zone);
81         else if(v>dead_zone)
82                 value=(v-dead_zone)/(threshold-dead_zone);
83         else
84                 value=0;
85
86         signal_motion.emit(value);
87
88         if(paired_ctrl && (v>0 || (v==0 && paired_ctrl->value!=0)))
89                 paired_ctrl->on_motion(-v, -r);
90 }
91
92 } // namespace Input
93 } // namespace Msp