X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fcontrol.cpp;h=b2f9badd45b673026b90645bca2fcfef104cb648;hb=35d4d400521d30d84c20cd1434626e131cbf9304;hp=8ddcdd772cf2af96cc7e7f51f42e978edebe87cd;hpb=999ca92aa9ee10585c0b2094d84364159253982f;p=libs%2Fgui.git diff --git a/source/input/control.cpp b/source/input/control.cpp index 8ddcdd7..b2f9bad 100644 --- a/source/input/control.cpp +++ b/source/input/control.cpp @@ -1,15 +1,11 @@ -/* $Id$ - -This file is part of libmspgbase -Copyright © 2007 Mikko Rasa, Mikkosoft Productions -Distributed under the LGPL -*/ - -#include +#include #include +#include "binarycontrol.h" #include "control.h" #include "device.h" +using namespace std; + namespace Msp { namespace Input { @@ -29,61 +25,73 @@ std::string ControlSource::str() const { if(type==BUTTON) return dev->get_button_name(index); - else if(type==AXIS_POS || type==AXIS_NEG) - return dev->get_axis_name(index); + else if(type==AXIS_POS) + return dev->get_axis_name(index)+" +"; + else if(type==AXIS_NEG) + return dev->get_axis_name(index)+" -"; else if(type==NONE) return "None"; - return lexical_cast(index); + return lexical_cast(index); } 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(); } -Control::Control(const Control &c): - trackable(c), - src(c.src), - capture_dev(0) +Control::~Control() +{ } + +void Control::capture(Device &d) { - connect_signals(); + notify_callbacks(); + 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)); } -Control &Control::operator=(const Control &c) +void Control::cancel_capture() { notify_callbacks(); - src=c.src; - capture_dev=0; + capture_dev = 0; connect_signals(); +} - return *this; +void Control::set_source(Device &d, ControlSrcType t, unsigned i) +{ + set_source(ControlSource(d, t, i)); } -void Control::capture(Device &d) +void Control::set_source(const ControlSource &s) { 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)); + src = s; + connect_signals(); } -void Control::cancel_capture() +void Control::set_activator(BinaryControl *ctrl) { notify_callbacks(); - capture_dev=0; + activator = ctrl; connect_signals(); } @@ -94,38 +102,39 @@ void Control::connect_signals() case NONE: 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 = 0; 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(); } @@ -133,28 +142,42 @@ void Control::axis_motion(unsigned i, float v, float r) { if(capture_dev) { - ControlSrcType type=NONE; - if(v<-src.dev->get_axis_threshold()) - type=AXIS_NEG; - else if(v>src.dev->get_axis_threshold()) - type=AXIS_POS; + ControlSrcType type = NONE; + if(v<-0.9) + type = AXIS_NEG; + else if(v>0.9) + type = AXIS_POS; if(type!=NONE) { - 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 = 0; 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