-#include <msp/core/except.h>
-#include <msp/strings/lexicalcast.h>
#include "control.h"
+#include <sigc++/bind_return.h>
+#include <msp/strings/lexicalcast.h>
+#include "binarycontrol.h"
#include "device.h"
+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);
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(index);
+ 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();
}
+Control::~Control()
+{ }
+
void Control::capture(Device &d)
{
notify_callbacks();
- capture_dev=&d;
- capture_dev->signal_button_press.connect(sigc::mem_fun(this, &Control::button_press));
- capture_dev->signal_axis_motion.connect(sigc::mem_fun(this, &Control::axis_motion));
+ capture_dev = &d;
+ capture_dev->signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_press), false));
+ capture_dev->signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Control::axis_motion), false));
}
void Control::cancel_capture()
{
notify_callbacks();
- capture_dev=0;
+ capture_dev = nullptr;
connect_signals();
}
void Control::set_source(const ControlSource &s)
{
notify_callbacks();
- src=s;
+ src = 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::mem_fun(this, &Control::button_press));
- src.dev->signal_button_release.connect(sigc::mem_fun(this, &Control::button_release));
+ src.dev->signal_button_press.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_press), false));
+ src.dev->signal_button_release.connect(sigc::bind_return(sigc::mem_fun(this, &Control::button_release), false));
break;
case AXIS_POS:
case AXIS_NEG:
- src.dev->signal_axis_motion.connect(sigc::mem_fun(this, &Control::axis_motion));
+ src.dev->signal_axis_motion.connect(sigc::bind_return(sigc::mem_fun(this, &Control::axis_motion), false));
break;
- default:
- throw Exception("Invalid source in Control");
}
+
+ if(activator)
+ activator->signal_release.connect(sigc::mem_fun(this, &Control::deactivate));
}
void Control::button_press(unsigned i)
{
if(capture_dev)
{
- src.dev=capture_dev;
- src.type=BUTTON;
- src.index=i;
+ src.dev = capture_dev;
+ src.type = BUTTON;
+ 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();
}
{
if(capture_dev)
{
- ControlSrcType type=NONE;
+ ControlSrcType type = NO_SOURCE;
if(v<-0.9)
- type=AXIS_NEG;
+ type = AXIS_NEG;
else if(v>0.9)
- type=AXIS_POS;
+ type = AXIS_POS;
- if(type!=NONE)
+ if(type!=NO_SOURCE)
{
- src.dev=capture_dev;
- src.type=type;
- src.index=i;
+ 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