summaryrefslogtreecommitdiff
path: root/include/tool/context_menu.h
diff options
context:
space:
mode:
authorsaurabhb172020-02-26 16:20:48 +0530
committerGitHub2020-02-26 16:20:48 +0530
commitb77f5d9d8097c38159c6f60917995d6af13bbe1c (patch)
tree1392c90227aeea231c1d86371131e04c40382918 /include/tool/context_menu.h
parentdadc4d490966a24efe15b5cc533ef8695986048a (diff)
parent003d02608917e7a69d1a98438837e94ccf68352a (diff)
downloadKiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.gz
KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.bz2
KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.zip
Merge pull request #4 from FOSSEE/develop
merging dev into master
Diffstat (limited to 'include/tool/context_menu.h')
-rw-r--r--include/tool/context_menu.h230
1 files changed, 230 insertions, 0 deletions
diff --git a/include/tool/context_menu.h b/include/tool/context_menu.h
new file mode 100644
index 0000000..819cb5e
--- /dev/null
+++ b/include/tool/context_menu.h
@@ -0,0 +1,230 @@
+/*
+ * This program source code file is part of KiCad, a free EDA CAD application.
+ *
+ * Copyright (C) 2013-2015 CERN
+ * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
+ * @author Maciej Suminski <maciej.suminski@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 __CONTEXT_MENU_H
+#define __CONTEXT_MENU_H
+
+#include <map>
+#include <list>
+#include <boost/function.hpp>
+
+#include <wx/menu.h>
+#include <tool/tool_action.h>
+
+class TOOL_INTERACTIVE;
+
+/**
+ * Class CONTEXT_MENU
+ *
+ * Defines the structure of a context (usually right-click) popup menu
+ * for a given tool.
+ */
+class CONTEXT_MENU : public wxMenu
+{
+public:
+ ///> Default constructor
+ CONTEXT_MENU();
+
+ ///> Copy constructor
+ CONTEXT_MENU( const CONTEXT_MENU& aMenu );
+
+ virtual ~CONTEXT_MENU();
+
+ CONTEXT_MENU& operator=( const CONTEXT_MENU& aMenu );
+
+ /**
+ * Function SetTitle()
+ * Sets title for the context menu. The title is shown as a text label shown on the top of
+ * the menu.
+ * @param aTitle is the new title.
+ */
+ void SetTitle( const wxString& aTitle );
+
+ /**
+ * Function SetIcon()
+ * Assigns an icon for the entry.
+ * @param aIcon is the icon to be assigned. NULL is used to remove icon.
+ */
+ inline void SetIcon( const BITMAP_OPAQUE* aIcon )
+ {
+ m_icon = aIcon;
+ }
+
+ /**
+ * Function Add()
+ * Adds an entry to the menu. After highlighting/selecting the entry, a TOOL_EVENT command is
+ * sent that contains ID of the entry.
+ * @param aLabel is the text label show in the menu.
+ * @param aId is the ID that is sent in the TOOL_EVENT. It should be unique for every entry.
+ * @param aIcon is an optional icon.
+ */
+ wxMenuItem* Add( const wxString& aLabel, int aId, const BITMAP_OPAQUE* aIcon = NULL );
+
+ /**
+ * Function Add()
+ * Adds an entry to the menu, basing on the TOOL_ACTION object. After selecting the entry,
+ * a TOOL_EVENT command containing name of the action is sent.
+ * @param aAction is the action to be added to menu entry.
+ */
+ wxMenuItem* Add( const TOOL_ACTION& aAction );
+
+ /**
+ * Function Add()
+ * Adds a context menu as a submenu. The difference between this function and wxMenu::AppendSubMenu()
+ * is the capability to handle icons.
+ * @param aMenu is the submenu to be added.
+ * @param aLabel is the caption displayed for the menu entry.
+ * @param aExpand allows to add all entries from the menu as individual entries rather than
+ * add everything as a submenu.
+ */
+ std::list<wxMenuItem*> Add( CONTEXT_MENU* aMenu, const wxString& aLabel, bool aExpand = false );
+
+ /**
+ * Function Clear()
+ * Removes all the entries from the menu (as well as its title). It leaves the menu in the
+ * initial state.
+ */
+ void Clear();
+
+ /**
+ * Function GetSelected()
+ * Returns the position of selected item. If the returned value is negative, that means that
+ * menu was dismissed.
+ * @return The position of selected item in the context menu.
+ */
+ inline int GetSelected() const
+ {
+ return m_selected;
+ }
+
+ /**
+ * Function UpdateAll()
+ * Runs update handlers for the menu and its submenus.
+ */
+ void UpdateAll();
+
+ // Helper typedefs
+ typedef boost::function<OPT_TOOL_EVENT(const wxMenuEvent&)> MENU_HANDLER;
+ typedef boost::function<void()> UPDATE_HANDLER;
+
+ /**
+ * Function SetMenuHandler()
+ * Sets the menu event handler to another function.
+ */
+ inline void SetMenuHandler( MENU_HANDLER aMenuHandler )
+ {
+ m_menu_handler = aMenuHandler;
+ }
+
+ /**
+ * Function SetUpdateHandler()
+ * Sets the update handler to a different function.
+ */
+ inline void SetUpdateHandler( UPDATE_HANDLER aUpdateHandler )
+ {
+ m_update_handler = aUpdateHandler;
+ }
+
+ /**
+ * Function SetTool()
+ * Sets a tool that is the creator of the menu.
+ * @param aTool is the tool that created the menu.
+ */
+ void SetTool( TOOL_INTERACTIVE* aTool );
+
+protected:
+ ///> Returns an instance of TOOL_MANAGER class.
+ TOOL_MANAGER* getToolManager();
+
+ ///> Returns the corresponding wxMenuItem identifier for a TOOL_ACTION object.
+ static inline int getMenuId( const TOOL_ACTION& aAction )
+ {
+ return aAction.GetId() + ACTION_ID;
+ }
+
+private:
+ // Empty stubs used by the default constructor
+ static OPT_TOOL_EVENT menuHandlerStub(const wxMenuEvent& );
+ static void updateHandlerStub();
+
+ /**
+ * Function appendCopy
+ * Appends a copy of wxMenuItem.
+ */
+ wxMenuItem* appendCopy( const wxMenuItem* aSource );
+
+ ///> Common part of copy constructor and assignment operator.
+ void copyFrom( const CONTEXT_MENU& aMenu );
+
+ ///> Initializes handlers for events.
+ void setupEvents();
+
+ ///> The default menu event handler.
+ void onMenuEvent( wxMenuEvent& aEvent );
+
+ ///> Updates hot key settings for TOOL_ACTIONs in this menu.
+ void updateHotKeys();
+
+ ///> Traverses the submenus tree looking for a submenu capable of handling a particular menu
+ ///> event. In case it is handled, it is returned the aToolEvent parameter.
+ void runEventHandlers( const wxMenuEvent& aMenuEvent, OPT_TOOL_EVENT& aToolEvent );
+
+ ///> Runs a function on the menu and all its submenus.
+ void runOnSubmenus( boost::function<void(CONTEXT_MENU*)> aFunction );
+
+ ///> Flag indicating that the menu title was set up.
+ bool m_titleSet;
+
+ ///> Stores the id number of selected item.
+ int m_selected;
+
+ ///> Creator of the menu
+ TOOL_INTERACTIVE* m_tool;
+
+ ///> Menu items with ID higher than that are considered TOOL_ACTIONs
+ static const int ACTION_ID = 30000;
+
+ ///> Associates tool actions with menu item IDs. Non-owning.
+ std::map<int, const TOOL_ACTION*> m_toolActions;
+
+ ///> List of submenus.
+ std::list<CONTEXT_MENU*> m_submenus;
+
+ ///> Parent CONTEXT_MENU.
+ CONTEXT_MENU* m_parent;
+
+ ///> Optional icon
+ const BITMAP_OPAQUE* m_icon;
+
+ ///> Optional callback to translate wxMenuEvents to TOOL_EVENTs.
+ MENU_HANDLER m_menu_handler;
+
+ ///> Optional callback to update the menu state before it is displayed.
+ UPDATE_HANDLER m_update_handler;
+
+ friend class TOOL_INTERACTIVE;
+};
+
+#endif