]> git.tdb.fi Git - libs/gui.git/blobdiff - source/input/control.cpp
Use nullptr in place of 0 or NULL
[libs/gui.git] / source / input / control.cpp
index 50601013acacc985ab256c018693a7f4dc6317ae..4f093573baeaf2418a2faf25ca881934b94aecae 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;
@@ -8,19 +9,13 @@ using namespace std;
 namespace Msp {
 namespace Input {
 
-ControlSource::ControlSource():
-       dev(0),
-       type(NONE),
-       index(0)
-{ }
-
 ControlSource::ControlSource(Device &d, ControlSrcType t, unsigned i):
        dev(&d),
        type(t),
        index(i)
 { }
 
-std::string ControlSource::str() const
+string ControlSource::str() const
 {
        if(type==BUTTON)
                return dev->get_button_name(index);
@@ -28,25 +23,19 @@ std::string ControlSource::str() const
                return dev->get_axis_name(index)+" +";
        else if(type==AXIS_NEG)
                return dev->get_axis_name(index)+" -";
-       else if(type==NONE)
+       else if(type==NO_SOURCE)
                return "None";
 
        return lexical_cast<string>(index);
 }
 
 
-Control::Control():
-       capture_dev(0)
-{ }
-
 Control::Control(const ControlSource &s):
-       src(s),
-       capture_dev(0)
+       src(s)
 { }
 
 Control::Control(Device &d, ControlSrcType t, unsigned i):
-       src(d, t, i),
-       capture_dev(0)
+       src(d, t, i)
 {
        connect_signals();
 }
@@ -65,7 +54,7 @@ void Control::capture(Device &d)
 void Control::cancel_capture()
 {
        notify_callbacks();
-       capture_dev = 0;
+       capture_dev = nullptr;
        connect_signals();
 }
 
@@ -81,11 +70,24 @@ 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)
        {
-       case NONE:
+       case NO_SOURCE:
                break;
        case BUTTON:
                src.dev->signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_press), false));
@@ -96,6 +98,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)
@@ -107,17 +112,17 @@ void Control::button_press(unsigned i)
                src.index = i;
 
                notify_callbacks();
-               capture_dev = 0;
+               capture_dev = nullptr;
                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();
 }
 
@@ -125,28 +130,42 @@ void Control::axis_motion(unsigned i, float v, float r)
 {
        if(capture_dev)
        {
-               ControlSrcType type = NONE;
+               ControlSrcType type = NO_SOURCE;
                if(v<-0.9)
                        type = AXIS_NEG;
                else if(v>0.9)
                        type = AXIS_POS;
 
-               if(type!=NONE)
+               if(type!=NO_SOURCE)
                {
                        src.dev = capture_dev;
                        src.type = type;
                        src.index = i;
 
                        notify_callbacks();
-                       capture_dev = 0;
+                       capture_dev = nullptr;
                        connect_signals();
                        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