KiCad PCB EDA Suite
action_menu.h
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2013-2017 CERN
5  * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * @author Tomasz Wlostowski <tomasz.wlostowski@cern.ch>
8  * @author Maciej Suminski <maciej.suminski@cern.ch>
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, you may find one here:
22  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
23  * or you may search the http://www.gnu.org website for the version 2 license,
24  * or you may write to the Free Software Foundation, Inc.,
25  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
26  */
27 
28 #ifndef __CONTEXT_MENU_H
29 #define __CONTEXT_MENU_H
30 
31 #include <map>
32 #include <list>
33 #include <functional>
34 
35 #include <wx/menu.h>
36 #include <wx/textentry.h>
37 #include <tool/tool_action.h>
38 
39 class KIFACE_I;
40 class TOOL_INTERACTIVE;
41 
42 enum class BITMAPS : unsigned int;
43 
47 class ACTION_MENU : public wxMenu
48 {
49 public:
51  ACTION_MENU( bool isContextMenu, TOOL_INTERACTIVE* aTool = nullptr );
52 
53  ~ACTION_MENU() override;
54 
55  ACTION_MENU( const ACTION_MENU& aMenu ) = delete;
56  ACTION_MENU& operator=( const ACTION_MENU& aMenu ) = delete;
57 
64  void SetTitle( const wxString& aTitle ) override;
65 
69  void DisplayTitle( bool aDisplay = true );
70 
76  void SetIcon( BITMAPS aIcon );
77 
83  wxMenuItem* Add( const wxString& aLabel, int aId, BITMAPS aIcon );
84  wxMenuItem* Add( const wxString& aLabel, const wxString& aToolTip, int aId,
85  BITMAPS aIcon, bool aIsCheckmarkEntry = false );
86 
97  wxMenuItem* Add( const TOOL_ACTION& aAction, bool aIsCheckmarkEntry = false,
98  const wxString& aOverrideLabel = wxEmptyString );
99 
108  wxMenuItem* Add( ACTION_MENU* aMenu );
109 
117  void AddClose( wxString aAppname = "" );
118 
127  void AddQuitOrClose( KIFACE_I* aKiface, wxString aAppname = "" );
128 
134  void Clear();
135 
139  bool HasEnabledItems() const;
140 
148  inline int GetSelected() const
149  {
150  return m_selected;
151  }
152 
156  void UpdateAll();
157 
161  void ClearDirty();
162  void SetDirty();
163 
169  void SetTool( TOOL_INTERACTIVE* aTool );
170 
174  ACTION_MENU* Clone() const;
175 
176  void OnMenuEvent( wxMenuEvent& aEvent );
177  void OnIdle( wxIdleEvent& event );
178 
179  virtual bool PassHelpTextToHandler() { return false; }
180 
181  static constexpr bool NORMAL = false;
182  static constexpr bool CHECK = true;
183 
184 protected:
186  virtual ACTION_MENU* create() const;
187 
189  TOOL_MANAGER* getToolManager() const;
190 
197  virtual void update()
198  {
199  }
200 
207  virtual OPT_TOOL_EVENT eventHandler( const wxMenuEvent& )
208  {
209  return OPT_TOOL_EVENT();
210  }
211 
217  void copyFrom( const ACTION_MENU& aMenu );
218 
219 protected:
223  wxMenuItem* appendCopy( const wxMenuItem* aSource );
224 
226  void setupEvents();
227 
229  void updateHotKeys();
230 
233  void runEventHandlers( const wxMenuEvent& aMenuEvent, OPT_TOOL_EVENT& aToolEvent );
234 
236  void runOnSubmenus( std::function<void(ACTION_MENU*)> aFunction );
237 
239  OPT_TOOL_EVENT findToolAction( int aId );
240 
243 
244  bool m_dirty; // Menu requires update before display
245 
248 
250  wxString m_title;
251 
254 
257 
260 
262  std::map<int, const TOOL_ACTION*> m_toolActions;
263 
265  std::list<ACTION_MENU*> m_submenus;
266 
267  friend class TOOL_INTERACTIVE;
268 };
269 
270 #endif
A KIFACE (I)mplementation.
Definition: kiface_i.h:37
virtual void update()
Update menu state stub.
Definition: action_menu.h:197
bool m_titleDisplayed
Definition: action_menu.h:246
OPT_TOOL_EVENT findToolAction(int aId)
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:47
void SetIcon(BITMAPS aIcon)
Assign an icon for the entry.
Definition: action_menu.cpp:72
int GetSelected() const
Return the position of selected item.
Definition: action_menu.h:148
void runEventHandlers(const wxMenuEvent &aMenuEvent, OPT_TOOL_EVENT &aToolEvent)
Run a function on the menu and all its submenus.
void ClearDirty()
Clear the dirty flag on the menu and all descendants.
void UpdateAll()
Run update handlers for the menu and its submenus.
BITMAPS m_icon
Stores the id number of selected item.
Definition: action_menu.h:253
virtual ACTION_MENU * create() const
< Return an instance of this class. It has to be overridden in inheriting classes.
void SetTool(TOOL_INTERACTIVE *aTool)
Set a tool that is the creator of the menu.
virtual OPT_TOOL_EVENT eventHandler(const wxMenuEvent &)
Event handler stub.
Definition: action_menu.h:207
virtual bool PassHelpTextToHandler()
Definition: action_menu.h:179
Master controller class:
Definition: tool_manager.h:52
wxPoint m_forcedPosition
Definition: action_menu.h:242
void copyFrom(const ACTION_MENU &aMenu)
Copy another menus data to this instance.
bool m_isContextMenu
Menu title.
Definition: action_menu.h:247
Use all material properties from model file.
wxString m_title
Optional icon.
Definition: action_menu.h:250
std::list< ACTION_MENU * > m_submenus
Definition: action_menu.h:265
ACTION_MENU & operator=(const ACTION_MENU &aMenu)=delete
int m_selected
Creator of the menu.
Definition: action_menu.h:256
ACTION_MENU * Clone() const
Create a deep, recursive copy of this ACTION_MENU.
TOOL_INTERACTIVE * m_tool
Associates tool actions with menu item IDs. Non-owning.
Definition: action_menu.h:259
wxMenuItem * appendCopy(const wxMenuItem *aSource)
Append a copy of wxMenuItem.
void runOnSubmenus(std::function< void(ACTION_MENU *)> aFunction)
Check if any of submenus contains a TOOL_ACTION with a specific ID.
std::map< int, const TOOL_ACTION * > m_toolActions
List of submenus.
Definition: action_menu.h:262
void OnMenuEvent(wxMenuEvent &aEvent)
bool m_isForcedPosition
Definition: action_menu.h:241
void SetTitle(const wxString &aTitle) override
Set title for the menu.
Definition: action_menu.cpp:90
BITMAPS
A list of all bitmap identifiers.
Definition: bitmaps_list.h:32
void AddQuitOrClose(KIFACE_I *aKiface, wxString aAppname="")
Add either a standard Quit or Close item to the menu.
ACTION_MENU(bool isContextMenu, TOOL_INTERACTIVE *aTool=nullptr)
< Default constructor
Definition: action_menu.cpp:47
TOOL_MANAGER * getToolManager() const
Represent a single user action.
Definition: tool_action.h:49
void setupEvents()
Update hot key settings for TOOL_ACTIONs in this menu.
Definition: action_menu.cpp:78
wxMenuItem * Add(const wxString &aLabel, int aId, BITMAPS aIcon)
Add a wxWidgets-style entry to the menu.
void Clear()
Remove all the entries from the menu (as well as its title).
bool HasEnabledItems() const
Returns true if the menu has any enabled items.
void OnIdle(wxIdleEvent &event)
#define CHECK(x)
void updateHotKeys()
Traverse the submenus tree looking for a submenu capable of handling a particular menu event.
~ACTION_MENU() override
Definition: action_menu.cpp:59
void SetDirty()
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:569
void AddClose(wxString aAppname="")
Add a standard close item to the menu with the accelerator key CTRL-W.
void DisplayTitle(bool aDisplay=true)
Decide whether a title for a pop up menu should be displayed.