X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Finput%2Fcontrol.h;h=177776d1a4aac86dc413a5364a7e0cdd4900113c;hb=3bb7bd5d99a71420b1dfa8d433f4f274bbe280fa;hp=5b435dcf0a1f478ee0994657998bd87e09eaec9e;hpb=1238b80d08c1983dfa8914f78b294cd44b1a275b;p=libs%2Fgui.git diff --git a/source/input/control.h b/source/input/control.h index 5b435dc..177776d 100644 --- a/source/input/control.h +++ b/source/input/control.h @@ -1,25 +1,20 @@ -/* $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 #include #include +#include namespace Msp { namespace Input { +class BinaryControl; class Device; enum ControlSrcType { - NONE, + NO_SOURCE, BUTTON, AXIS_POS, AXIS_NEG @@ -29,13 +24,13 @@ enum ControlSrcType Specifies the source of a control. This provides a way for setting sources for different types of controls in a uniform way. */ -struct ControlSource +struct MSPGUI_API ControlSource { - Device *dev; - ControlSrcType type; - unsigned index; + Device *dev = nullptr; + ControlSrcType type = NO_SOURCE; + unsigned index = 0; - ControlSource(); + ControlSource() = default; ControlSource(Device &, ControlSrcType, unsigned); std::string str() const; }; @@ -48,39 +43,55 @@ A control uses either a button or half of an axis (positive or negative) as its 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 +class MSPGUI_API Control: public sigc::trackable { public: sigc::signal signal_capture_complete; protected: ControlSource src; - Device *capture_dev; + Device *capture_dev = nullptr; + BinaryControl *activator = nullptr; + float origin = 0.0f; + bool rising_edge = false; + bool falling_edge = false; - Control(); + Control() = default; 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; } + bool has_rising_edge() const { return rising_edge; } + bool has_falling_edge() const { return falling_edge; } + void reset_edges(); 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