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