-/* $Id$
-
-This file is part of libmspgbase
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
-#ifndef MSP_GBASE_CONTROL_H_
-#define MSP_GBASE_CONTROL_H_
+#ifndef MSP_INPUT_CONTROL_H_
+#define MSP_INPUT_CONTROL_H_
+#include <string>
#include <sigc++/signal.h>
#include <sigc++/trackable.h>
namespace Msp {
namespace Input {
+class BinaryControl;
class Device;
enum ControlSrcType
source. How the source values are interpreted depends on the exact type of the
control. Controls also support interactive binding by capturing a button press
or axis motion.
+
+A BinaryControl can be used as an activator, requiring that control to be
+active for any events to be processed. This can be used to implement shifted
+controls (when used on a BinaryControl) or click-and-drag functionality (when
+used on a SmoothControl).
*/
class Control: public sigc::trackable
{
protected:
ControlSource src;
Device *capture_dev;
+ BinaryControl *activator;
+ float origin;
Control();
Control(const ControlSource &);
Control(Device &, ControlSrcType, unsigned);
- Control(const Control &);
public:
- Control &operator=(const Control &);
- virtual ~Control() { }
+ virtual ~Control();
void capture(Device &);
void cancel_capture();
+ void set_source(Device &, ControlSrcType, unsigned);
+ void set_source(const ControlSource &);
const ControlSource &get_source() const { return src; }
+ void set_activator(BinaryControl *);
+ BinaryControl *get_activator() const { return activator; }
protected:
- virtual void on_press() =0;
- virtual void on_release() =0;
- virtual void on_motion(float, float) =0;
+ virtual void on_press() = 0;
+ virtual void on_release() = 0;
+ virtual void on_motion(float, float) = 0;
private:
void connect_signals();
void button_press(unsigned);
void button_release(unsigned);
void axis_motion(unsigned, float, float);
+ void deactivate();
+
+ Control(const Control &);
+ Control &operator=(const Control &);
};
} // namespace Input