summaryrefslogtreecommitdiff
path: root/include/tool/tool_base.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/tool/tool_base.h')
-rw-r--r--include/tool/tool_base.h226
1 files changed, 226 insertions, 0 deletions
diff --git a/include/tool/tool_base.h b/include/tool/tool_base.h
new file mode 100644
index 0000000..584a979
--- /dev/null
+++ b/include/tool/tool_base.h
@@ -0,0 +1,226 @@
+/*
+ * 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_BASE_H
+#define __TOOL_BASE_H
+
+#include <cassert>
+#include <base_struct.h> // for KICAD_T
+
+#include <tool/tool_event.h>
+#include <tool/tool_settings.h>
+
+#include <tool/delegate.h>
+
+class EDA_ITEM;
+class TOOL_MANAGER;
+
+namespace KIGFX
+{
+class VIEW;
+class VIEW_CONTROLS;
+};
+
+enum TOOL_TYPE
+{
+ ///> Tool that interacts with the user
+ INTERACTIVE = 0x01,
+
+ ///> Tool that runs in the background without any user intervention
+ BATCH = 0x02
+};
+
+/// Unique identifier for tools
+typedef int TOOL_ID;
+typedef DELEGATE<int, const TOOL_EVENT&> TOOL_STATE_FUNC;
+
+/**
+ * Class TOOL_BASE
+ *
+ * Base abstract interface for all kinds of tools.
+ */
+
+class TOOL_BASE
+{
+public:
+ TOOL_BASE( TOOL_TYPE aType, TOOL_ID aId, const std::string& aName = std::string( "" ) ) :
+ m_type( aType ),
+ m_toolId( aId ),
+ m_toolName( aName ),
+ m_toolMgr( NULL ) {};
+
+ virtual ~TOOL_BASE() {};
+
+ ///> Determines the reason of reset for a tool
+ enum RESET_REASON
+ {
+ RUN, ///< Tool is invoked after being inactive
+ MODEL_RELOAD, ///< Model changes
+ GAL_SWITCH ///< Rendering engine changes
+ };
+
+ /**
+ * Function Init()
+ * Init() is called once upon a registration of the tool.
+ *
+ * @return True if the initialization went fine, false - otherwise.
+ */
+ virtual bool Init()
+ {
+ return true;
+ }
+
+ /**
+ * Function Reset()
+ * Brings the tool to a known, initial state. If the tool claimed anything from
+ * the model or the view, it must release it when its reset.
+ * @param aReason contains information about the reason of tool reset.
+ */
+ virtual void Reset( RESET_REASON aReason ) = 0;
+
+ /**
+ * Function GetType()
+ * Returns the type of the tool.
+ * @return The type of the tool.
+ */
+ TOOL_TYPE GetType() const
+ {
+ return m_type;
+ }
+
+ /**
+ * Function GetId()
+ * Returns the unique identifier of the tool. The identifier is set by an instance of
+ * TOOL_MANAGER.
+ * @return Identifier of the tool.
+ */
+ TOOL_ID GetId() const
+ {
+ return m_toolId;
+ }
+
+ /**
+ * Function GetName()
+ * Returns the name of the tool. Tool names are expected to obey the format:
+ * application.ToolName (eg. pcbnew.InteractiveSelection).
+ * @return The name of the tool.
+ */
+ const std::string& GetName() const
+ {
+ return m_toolName;
+ }
+
+ /**
+ * Function GetManager()
+ * Returns the instance of TOOL_MANAGER that takes care of the tool.
+ * @return Instance of the TOOL_MANAGER. If there is no TOOL_MANAGER associated, it returns
+ * NULL.
+ */
+ TOOL_MANAGER* GetManager() const
+ {
+ return m_toolMgr;
+ }
+
+ /**
+ * Function SetTransitions()
+ * This method is meant to be overridden in order to specify handlers for events. It is called
+ * every time tool is reset or finished.
+ */
+ virtual void SetTransitions() {};
+
+ TOOL_SETTINGS& GetSettings();
+
+protected:
+ friend class TOOL_MANAGER;
+ friend class TOOL_SETTINGS;
+
+ /**
+ * Function attachManager()
+ *
+ * Sets the TOOL_MANAGER the tool will belong to.
+ * Called by TOOL_MANAGER::RegisterTool()
+ */
+ void attachManager( TOOL_MANAGER* aManager );
+
+ /**
+ * Function getView()
+ *
+ * Returns the instance of VIEW object used in the application. It allows tools to draw.
+ * @return The instance of VIEW.
+ */
+ KIGFX::VIEW* getView() const;
+
+ /**
+ * Function getViewControls()
+ *
+ * Returns the instance of VIEW_CONTROLS object used in the application. It allows tools to
+ * read & modify user input and its settings (eg. show cursor, enable snapping to grid, etc.)
+ * @return The instance of VIEW_CONTROLS.
+ */
+ KIGFX::VIEW_CONTROLS* getViewControls() const;
+
+ /**
+ * Function getEditFrame()
+ *
+ * Returns the application window object, casted to requested user type.
+ */
+ template <typename T>
+ T* getEditFrame() const
+ {
+ return static_cast<T*>( getEditFrameInt() );
+ }
+
+ /**
+ * Function getModel()
+ *
+ * Returns the model object if it matches the requested type.
+ */
+ template <typename T>
+ T* getModel() const
+ {
+ EDA_ITEM* m = getModelInt();
+
+ return static_cast<T*>( m );
+ }
+
+ ///> Stores the type of the tool.
+ TOOL_TYPE m_type;
+
+ ///> Unique identifier for the tool, assigned by a TOOL_MANAGER instance.
+ TOOL_ID m_toolId;
+
+ ///> Name of the tool. Names are expected to obey the format application.ToolName
+ ///> (eg. pcbnew.InteractiveSelection).
+ std::string m_toolName;
+ TOOL_MANAGER* m_toolMgr;
+ TOOL_SETTINGS m_toolSettings;
+
+private:
+ // hide the implementation to avoid spreading half of
+ // kicad and wxWidgets headers to the tools that may not need them at all!
+ EDA_ITEM* getModelInt() const;
+ wxWindow* getEditFrameInt() const;
+};
+
+#endif