#ifndef ACTIONS_H #define ACTIONS_H #include "Device.h" #include #include #include enum class Action { None, Keypress, Gestures, CycleDPI, ChangeDPI, ToggleSmartshift, ToggleHiresScroll }; enum class Direction { None, Up, Down, Left, Right }; enum class GestureMode { NoPress, OnRelease, OnFewPixels, Axis }; class Device; class ButtonAction { public: Action type; virtual ButtonAction* copy(Device* dev) = 0; virtual void press() = 0; virtual void release() = 0; // ButtonAction(const ButtonAction &a, Device* d) : type (a.type), device (d) {} // ButtonAction* create_instance(Device* d); protected: ButtonAction(Action a) : type (a) {}; Device* device; }; class NoAction : public ButtonAction { public: NoAction() : ButtonAction(Action::None) {} virtual NoAction* copy(Device* dev); virtual void press() {} virtual void release() {} }; class KeyAction : public ButtonAction { public: explicit KeyAction(std::vector k) : ButtonAction(Action::Keypress), keys (std::move(k)) {}; virtual KeyAction* copy(Device* dev); virtual void press(); virtual void release(); private: std::vector keys; }; class Gesture { public: Gesture(ButtonAction* ba, GestureMode m, int pp=0, uint a=0, float am=1) : action (ba), mode (m), per_pixel (pp), axis (a), axis_multiplier (am) { } Gesture(const Gesture &g, Device* dev) : action (g.action->copy(dev)), mode (g.mode), per_pixel (g.per_pixel), axis (g.axis), axis_multiplier (g.axis_multiplier) { } ButtonAction* action; GestureMode mode; int per_pixel; int per_pixel_mod; uint axis; float axis_multiplier; }; class GestureAction : public ButtonAction { public: GestureAction(std::map g) : ButtonAction(Action::Gestures), gestures (std::move(g)) {}; std::map gestures; virtual GestureAction* copy(Device* dev); virtual void press(); virtual void release(); void move(HIDPP20::IReprogControlsV4::Move m); private: bool held; int x = 0; int y = 0; }; class SmartshiftAction : public ButtonAction { public: SmartshiftAction() : ButtonAction(Action::ToggleSmartshift) {}; virtual SmartshiftAction* copy(Device* dev); virtual void press(); virtual void release() {} }; class HiresScrollAction : public ButtonAction { public: HiresScrollAction() : ButtonAction(Action::ToggleHiresScroll) {}; virtual HiresScrollAction* copy(Device* dev); virtual void press(); virtual void release() {} }; class CycleDPIAction : public ButtonAction { public: CycleDPIAction(std::vector d) : ButtonAction(Action::CycleDPI), dpis (d) {}; virtual CycleDPIAction* copy(Device* dev); virtual void press(); virtual void release() {} private: const std::vector dpis; }; class ChangeDPIAction : public ButtonAction { public: ChangeDPIAction(int i) : ButtonAction(Action::ChangeDPI), dpi_inc (i) {}; virtual ChangeDPIAction* copy(Device* dev); virtual void press(); virtual void release() {} private: int dpi_inc; }; #endif //ACTIONS_H