]> git.tdb.fi Git - libs/gui.git/blob - source/input/control.cpp
Add the target type to lexical_cast invocations
[libs/gui.git] / source / input / control.cpp
1 #include <msp/strings/lexicalcast.h>
2 #include "control.h"
3 #include "device.h"
4
5 using namespace std;
6
7 namespace Msp {
8 namespace Input {
9
10 ControlSource::ControlSource():
11         dev(0),
12         type(NONE),
13         index(0)
14 { }
15
16 ControlSource::ControlSource(Device &d, ControlSrcType t, unsigned i):
17         dev(&d),
18         type(t),
19         index(i)
20 { }
21
22 std::string ControlSource::str() const
23 {
24         if(type==BUTTON)
25                 return dev->get_button_name(index);
26         else if(type==AXIS_POS)
27                 return dev->get_axis_name(index)+" +";
28         else if(type==AXIS_NEG)
29                 return dev->get_axis_name(index)+" -";
30         else if(type==NONE)
31                 return "None";
32
33         return lexical_cast<string>(index);
34 }
35
36
37 Control::Control():
38         capture_dev(0)
39 { }
40
41 Control::Control(const ControlSource &s):
42         src(s),
43         capture_dev(0)
44 { }
45
46 Control::Control(Device &d, ControlSrcType t, unsigned i):
47         src(d, t, i),
48         capture_dev(0)
49 {
50         connect_signals();
51 }
52
53 void Control::capture(Device &d)
54 {
55         notify_callbacks();
56         capture_dev = &d;
57         capture_dev->signal_button_press.connect(sigc::mem_fun(this, &Control::button_press));
58         capture_dev->signal_axis_motion.connect(sigc::mem_fun(this, &Control::axis_motion));
59 }
60
61 void Control::cancel_capture()
62 {
63         notify_callbacks();
64         capture_dev = 0;
65         connect_signals();
66 }
67
68 void Control::set_source(Device &d, ControlSrcType t, unsigned i)
69 {
70         set_source(ControlSource(d, t, i));
71 }
72
73 void Control::set_source(const ControlSource &s)
74 {
75         notify_callbacks();
76         src = s;
77         connect_signals();
78 }
79
80 void Control::connect_signals()
81 {
82         switch(src.type)
83         {
84         case NONE:
85                 break;
86         case BUTTON:
87                 src.dev->signal_button_press.connect(sigc::mem_fun(this, &Control::button_press));
88                 src.dev->signal_button_release.connect(sigc::mem_fun(this, &Control::button_release));
89                 break;
90         case AXIS_POS:
91         case AXIS_NEG:
92                 src.dev->signal_axis_motion.connect(sigc::mem_fun(this, &Control::axis_motion));
93                 break;
94         }
95 }
96
97 void Control::button_press(unsigned i)
98 {
99         if(capture_dev)
100         {
101                 src.dev = capture_dev;
102                 src.type = BUTTON;
103                 src.index = i;
104
105                 notify_callbacks();
106                 capture_dev = 0;
107                 connect_signals();
108                 signal_capture_complete.emit();
109         }
110         else if(src.type==BUTTON && i==src.index)
111                 on_press();
112 }
113
114 void Control::button_release(unsigned i)
115 {
116         if(src.type==BUTTON && i==src.index)
117                 on_release();
118 }
119
120 void Control::axis_motion(unsigned i, float v, float r)
121 {
122         if(capture_dev)
123         {
124                 ControlSrcType type = NONE;
125                 if(v<-0.9)
126                         type = AXIS_NEG;
127                 else if(v>0.9)
128                         type = AXIS_POS;
129
130                 if(type!=NONE)
131                 {
132                         src.dev = capture_dev;
133                         src.type = type;
134                         src.index = i;
135
136                         notify_callbacks();
137                         capture_dev = 0;
138                         connect_signals();
139                         signal_capture_complete.emit();
140                 }
141         }
142         else if(src.type==AXIS_POS && i==src.index && v>=0)
143                 on_motion(v, r);
144         else if(src.type==AXIS_NEG && i==src.index && v<=0)
145                 on_motion(-v, -r);
146 }
147
148 } // namespace Input
149 } // namespace Msp