-#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>
+#include <msp/graphics/mspgui_api.h>
namespace Msp {
namespace Input {
+class BinaryControl;
class Device;
enum ControlSrcType
{
- NONE,
+ NO_SOURCE,
BUTTON,
AXIS_POS,
AXIS_NEG
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;
};
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<void> 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);
public:
- 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 &);