///////////////////////////////////////////////////////////////////////////// // Name: gestureclick.h // Purpose: // Author: Cesar Mauri Loba (cesar at crea-si dot com) // Modified by: // Created: // Copyright: (C) 2008-12 Cesar Mauri Loba - CREA Software Systems // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . ///////////////////////////////////////////////////////////////////////////// #ifndef GESTURECLICK_H #define GESTURECLICK_H #include "waittime.h" #include "configbase.h" #include "cvisualalert.h" #include "mousecommand.h" #include #include #include "keyboardcode.h" class CMouseControl; class CGestureClick : public CConfigBase { public: CGestureClick (CMouseControl& mc); ~CGestureClick (); // Main entry point to signal that the pointer has been moved. // Expect motion performed by the pointer in pixels and current // pointer location in absolute coordinates // Return the mouse command generated mousecmd::mousecmd ProcessMotion (int dxPix, int dyPix, unsigned int xCurr, unsigned int yCurr); //bool GetEnabled() const { return m_enabled; } void SetEnabled(bool value); // Reset internal state. Useful before start calling ProcessMotion void Reset(); bool AreVisualAlertsEnabled() const { return m_visualAlertsEnabled; } void EnableVisualAlerts(bool value); unsigned int GetDwellTime() const { return (unsigned int) (m_dwellCountdown.GetWaitTimeMs() / 100); } void SetDwellTime (unsigned int ds) { if (ds> 50) ds= 50; m_dwellCountdown.SetWaitTimeMs (ds * 100); } unsigned int GetDwellToleranceArea() const { return (unsigned int) m_dwellToleranceArea; } void SetDwellToleranceArea(unsigned int value) { if (value> 8) value= 8; m_dwellToleranceArea= (float) value; } bool GetFastGestureAction() const { return m_fastGestureAction; } void SetFastGestureAction(bool value) { m_fastGestureAction= value; } // Possible actions that can be generated. Values equal or greater than // EActionLast are keystrokes picked from m_keyboardCodes enum EAction { DISABLE= 0, SINGLE, THIRD, SECONDARY, DOUBLE, DRAG, EActionLast }; enum { MOUSE_EVENTS_COUNT= EActionLast }; int GetPossibleActionsCount() const { return MOUSE_EVENTS_COUNT + (int) m_keyboardCodes.size(); } EAction GetActionLeft() const { return m_actionLeft; } void SetActionLeft(EAction action) { assert (GetPossibleActionsCount()> action); if (GetPossibleActionsCount()<= action) action= DISABLE; m_actionLeft = action; } EAction GetActionRight() const { return m_actionRight; } void SetActionRight(EAction action) { assert (GetPossibleActionsCount()> action); if (GetPossibleActionsCount()<= action) action= DISABLE; m_actionRight = action; } EAction GetActionTop() const { return m_actionTop; } void SetActionTop(EAction action) { assert (GetPossibleActionsCount()> action); if (GetPossibleActionsCount()<= action) action= DISABLE; m_actionTop = action; } EAction GetActionBottom() const { return m_actionBottom; } void SetActionBottom(EAction action) { assert (GetPossibleActionsCount()> action); if (GetPossibleActionsCount()<= action) action= DISABLE; m_actionBottom = action; } KeyboardCode GetKeyboardCode(unsigned int position) { assert (position< m_keyboardCodes.size()); return m_keyboardCodes[position]; } unsigned int GetKeyEventsCount() const { return (unsigned int) m_keyboardCodes.size(); } // Configuration methods virtual void InitDefaults(); virtual void WriteProfileData(wxConfigBase* pConfObj); virtual void ReadProfileData(wxConfigBase* pConfObj); private: enum EState { DWELL_TIME, COMPUTE_DIRECTION, WAIT_DWELL }; void InitKeyboardCodes(); mousecmd::mousecmd DoAction (EAction action); // Working attributes volatile bool m_enabled; CWaitTime m_dwellCountdown; CVisualAlertProgress m_progressVisualAlert; CVisualAlertDirection m_gestureVisualAlert; bool m_isLeftPressed; int m_xIniGesture, m_yIniGesture; EState m_state; // Associations CMouseControl* m_mouseControl; // State //bool m_consecutiveClicksAllowed; bool m_visualAlertsEnabled; //Define maximum distance (in pixels) from pointer's starting countdown position //where is allowed to move without cancelling current countdown. float m_dwellToleranceArea; EAction m_actionLeft; EAction m_actionRight; EAction m_actionTop; EAction m_actionBottom; bool m_fastGestureAction; std::vector m_keyboardCodes; }; #endif