]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/control.cpp
Include the matching header first in .cpp files
[libs/gui.git] / source / input / control.cpp
index 50601013acacc985ab256c018693a7f4dc6317ae..f82b9c38cd1946ada7cf0d749b0bae8aa7d5309e 100644 (file)
@@ -1,6 +1,7 @@
+#include "control.h"
 #include <sigc++/bind_return.h>
 #include <msp/strings/lexicalcast.h>
-#include "control.h"
+#include "binarycontrol.h"
 #include "device.h"
 
 using namespace std;
@@ -36,17 +37,29 @@ std::string ControlSource::str() const
 
 
 Control::Control():
-       capture_dev(0)
+       capture_dev(0),
+       activator(0),
+       origin(0),
+       rising_edge(false),
+       falling_edge(false)
 { }
 
 Control::Control(const ControlSource &s):
        src(s),
-       capture_dev(0)
+       capture_dev(0),
+       activator(0),
+       origin(0),
+       rising_edge(false),
+       falling_edge(false)
 { }
 
 Control::Control(Device &d, ControlSrcType t, unsigned i):
        src(d, t, i),
-       capture_dev(0)
+       capture_dev(0),
+       activator(0),
+       origin(0),
+       rising_edge(false),
+       falling_edge(false)
 {
        connect_signals();
 }
@@ -81,6 +94,19 @@ void Control::set_source(const ControlSource &s)
        connect_signals();
 }
 
+void Control::set_activator(BinaryControl *ctrl)
+{
+       notify_callbacks();
+       activator = ctrl;
+       connect_signals();
+}
+
+void Control::reset_edges()
+{
+       rising_edge = false;
+       falling_edge = false;
+}
+
 void Control::connect_signals()
 {
        switch(src.type)
@@ -96,6 +122,9 @@ void Control::connect_signals()
                src.dev->signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Control::axis_motion), false));
                break;
        }
+
+       if(activator)
+               activator->signal_release.connect(sigc::mem_fun(this, &Control::deactivate));
 }
 
 void Control::button_press(unsigned i)
@@ -111,13 +140,13 @@ void Control::button_press(unsigned i)
                connect_signals();
                signal_capture_complete.emit();
        }
-       else if(src.type==BUTTON && i==src.index)
+       else if(src.type==BUTTON && i==src.index && (!activator || activator->get_state()))
                on_press();
 }
 
 void Control::button_release(unsigned i)
 {
-       if(src.type==BUTTON && i==src.index)
+       if(src.type==BUTTON && i==src.index && (!activator || activator->get_state()))
                on_release();
 }
 
@@ -143,10 +172,24 @@ void Control::axis_motion(unsigned i, float v, float r)
                        signal_capture_complete.emit();
                }
        }
-       else if(src.type==AXIS_POS && i==src.index && v>=0)
-               on_motion(v, r);
-       else if(src.type==AXIS_NEG && i==src.index && v<=0)
-               on_motion(-v, -r);
+       else if(activator && !activator->get_state() && i==src.index)
+               origin = v;
+       else if(src.type==AXIS_POS && i==src.index && v>=origin)
+               on_motion(v-origin, r);
+       else if(src.type==AXIS_NEG && i==src.index && v<=origin)
+               on_motion(origin-v, -r);
+}
+
+void Control::deactivate()
+{
+       if(src.type==BUTTON)
+               on_release();
+       else if(src.type==AXIS_POS || src.type==AXIS_NEG)
+       {
+               float v = src.dev->get_axis_value(src.index);
+               on_motion(0, (src.type==AXIS_POS ? origin-v : v-origin));
+               origin = v;
+       }
 }
 
 } // namespace Input