summaryrefslogtreecommitdiff
path: root/include/tool/tool_dispatcher.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/tool/tool_dispatcher.h')
-rw-r--r--include/tool/tool_dispatcher.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/include/tool/tool_dispatcher.h b/include/tool/tool_dispatcher.h
new file mode 100644
index 0000000..cf6e852
--- /dev/null
+++ b/include/tool/tool_dispatcher.h
@@ -0,0 +1,135 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2013 CERN
+ * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
+ *
+ * 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 2
+ * 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, you may find one here:
+ * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
+ * or you may search the http://www.gnu.org website for the version 2 license,
+ * or you may write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef __TOOL_DISPATCHER_H
+#define __TOOL_DISPATCHER_H
+
+#include <vector>
+#include <wx/event.h>
+#include <tool/tool_event.h>
+
+class TOOL_MANAGER;
+class PCB_BASE_FRAME;
+
+namespace KIGFX
+{
+class VIEW;
+};
+
+/**
+ * Class TOOL_DISPATCHER
+ *
+ * - takes wx events,
+ * - fixes all wx quirks (mouse warping, panning, ordering problems, etc)
+ * - translates coordinates to world space
+ * - low-level input conditioning (drag/click threshold), updating mouse position during view auto-scroll/pan.
+ * - issues TOOL_EVENTS to the tool manager
+ */
+
+class TOOL_DISPATCHER : public wxEvtHandler
+{
+public:
+ /**
+ * Constructor
+ *
+ * @param aToolMgr: tool manager instance the events will be sent to
+ */
+ TOOL_DISPATCHER( TOOL_MANAGER* aToolMgr );
+
+ virtual ~TOOL_DISPATCHER();
+
+ /**
+ * Function ResetState()
+ * Brings the dispatcher to its initial state.
+ */
+ virtual void ResetState();
+
+ /**
+ * Function DispatchWxEvent()
+ * Processes wxEvents (mostly UI events), translates them to TOOL_EVENTs, and makes tools
+ * handle those.
+ * @param aEvent is the wxWidgets event to be processed.
+ */
+ virtual void DispatchWxEvent( wxEvent& aEvent );
+
+ /**
+ * Function DispatchWxCommand()
+ * Processes wxCommands (mostly menu related events) and runs appropriate actions (eg. run the
+ * specified tool).
+ * @param aEvent is the wxCommandEvent to be processed.
+ */
+ virtual void DispatchWxCommand( wxCommandEvent& aEvent );
+
+private:
+ ///> Number of mouse buttons that is handled in events.
+ static const int MouseButtonCount = 3;
+
+ ///> The time threshold for a mouse button press that distinguishes between a single mouse
+ ///> click and a beginning of drag event (expressed in milliseconds).
+ static const int DragTimeThreshold = 300;
+
+ ///> The distance threshold for mouse cursor that disinguishes between a single mouse click
+ ///> and a beginning of drag event (expressed in screen pixels).
+ static const int DragDistanceThreshold = 8;
+
+ ///> Handles mouse related events (click, motion, dragging).
+ bool handleMouseButton( wxEvent& aEvent, int aIndex, bool aMotion );
+
+ ///> Saves the state of key modifiers (Alt, Ctrl and so on).
+ static int decodeModifiers( const wxKeyboardState* aState )
+ {
+ int mods = 0;
+
+ if( aState->ControlDown() )
+ mods |= MD_CTRL;
+
+ if( aState->AltDown() )
+ mods |= MD_ALT;
+
+ if( aState->ShiftDown() )
+ mods |= MD_SHIFT;
+
+ return mods;
+ }
+
+ ///> Redraws the status bar and message panel.
+ void updateUI();
+
+ ///> Stores all the informations regarding a mouse button state.
+ struct BUTTON_STATE;
+
+ ///> The last mouse cursor position (in world coordinates).
+ VECTOR2D m_lastMousePos;
+
+ ///> State of mouse buttons.
+ std::vector<BUTTON_STATE*> m_buttons;
+
+ ///> Returns the instance of VIEW, used by the application.
+ KIGFX::VIEW* getView();
+
+ ///> Instance of tool manager that cooperates with the dispatcher.
+ TOOL_MANAGER* m_toolMgr;
+};
+
+#endif