]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/control.cpp
Add an activator system to Control
[libs/gui.git] / source / input / control.cpp
index 50601013acacc985ab256c018693a7f4dc6317ae..b2f9badd45b673026b90645bca2fcfef104cb648 100644 (file)
@@ -1,5 +1,6 @@
 #include <sigc++/bind_return.h>
 #include <msp/strings/lexicalcast.h>
+#include "binarycontrol.h"
 #include "control.h"
 #include "device.h"
 
@@ -36,17 +37,23 @@ std::string ControlSource::str() const
 
 
 Control::Control():
-       capture_dev(0)
+       capture_dev(0),
+       activator(0),
+       origin(0)
 { }
 
 Control::Control(const ControlSource &s):
        src(s),
-       capture_dev(0)
+       capture_dev(0),
+       activator(0),
+       origin(0)
 { }
 
 Control::Control(Device &d, ControlSrcType t, unsigned i):
        src(d, t, i),
-       capture_dev(0)
+       capture_dev(0),
+       activator(0),
+       origin(0)
 {
        connect_signals();
 }
@@ -81,6 +88,13 @@ void Control::set_source(const ControlSource &s)
        connect_signals();
 }
 
+void Control::set_activator(BinaryControl *ctrl)
+{
+       notify_callbacks();
+       activator = ctrl;
+       connect_signals();
+}
+
 void Control::connect_signals()
 {
        switch(src.type)
@@ -96,6 +110,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 +128,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 +160,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