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 
45 class ACTION_MENU : public wxMenu
46 {
47 public:
49  ACTION_MENU( bool isContextMenu, TOOL_INTERACTIVE* aTool = nullptr );
50 
51  ~ACTION_MENU() override;
52 
53  ACTION_MENU( const ACTION_MENU& aMenu ) = delete;
54  ACTION_MENU& operator=( const ACTION_MENU& aMenu ) = delete;
55 
62  void SetTitle( const wxString& aTitle ) override;
63 
67  void DisplayTitle( bool aDisplay = true );
68 
74  void SetIcon( const BITMAP_OPAQUE* aIcon );
75 
81  wxMenuItem* Add( const wxString& aLabel, int aId, const BITMAP_OPAQUE* aIcon );
82  wxMenuItem* Add( const wxString& aLabel, const wxString& aToolTip, int aId,
83  const BITMAP_OPAQUE* aIcon, bool aIsCheckmarkEntry = false );
84 
92  wxMenuItem* Add( const TOOL_ACTION& aAction, bool aIsCheckmarkEntry = false );
93 
102  wxMenuItem* Add( ACTION_MENU* aMenu );
103 
111  void AddClose( wxString aAppname = "" );
112 
121  void AddQuitOrClose( KIFACE_I* aKiface, wxString aAppname = "" );
122 
128  void Clear();
129 
133  bool HasEnabledItems() const;
134 
142  inline int GetSelected() const
143  {
144  return m_selected;
145  }
146 
150  void UpdateAll();
151 
155  void ClearDirty();
156  void SetDirty();
157 
163  void SetTool( TOOL_INTERACTIVE* aTool );
164 
168  ACTION_MENU* Clone() const;
169 
170  void OnMenuEvent( wxMenuEvent& aEvent );
171  void OnIdle( wxIdleEvent& event );
172 
173  virtual bool PassHelpTextToHandler() { return false; }
174 
175  static constexpr bool CHECK = true;
176 
177 protected:
179  virtual ACTION_MENU* create() const;
180 
182  TOOL_MANAGER* getToolManager() const;
183 
190  virtual void update()
191  {
192  }
193 
200  virtual OPT_TOOL_EVENT eventHandler( const wxMenuEvent& )
201  {
202  return OPT_TOOL_EVENT();
203  }
204 
210  void copyFrom( const ACTION_MENU& aMenu );
211 
212 protected:
216  wxMenuItem* appendCopy( const wxMenuItem* aSource );
217 
219  void setupEvents();
220 
222  void updateHotKeys();
223 
226  void runEventHandlers( const wxMenuEvent& aMenuEvent, OPT_TOOL_EVENT& aToolEvent );
227 
229  void runOnSubmenus( std::function<void(ACTION_MENU*)> aFunction );
230 
232  OPT_TOOL_EVENT findToolAction( int aId );
233 
236 
237  bool m_dirty; // Menu requires update before display
238 
241 
243  wxString m_title;
244 
247 
250 
253 
255  std::map<int, const TOOL_ACTION*> m_toolActions;
256 
258  std::list<ACTION_MENU*> m_submenus;
259 
260  friend class TOOL_INTERACTIVE;
261 };
262 
263 #endif
wxMenuItem * Add(const wxString &aLabel, int aId, const BITMAP_OPAQUE *aIcon)
Add a wxWidgets-style entry to the menu.
A KIFACE (I)mplementation.
Definition: kiface_i.h:37
virtual void update()
Update menu state stub.
Definition: action_menu.h:190
bool m_titleDisplayed
Definition: action_menu.h:239
OPT_TOOL_EVENT findToolAction(int aId)
PNG memory record (file in memory).
Definition: bitmap_def.h:29
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:45
const BITMAP_OPAQUE * m_icon
Stores the id number of selected item.
Definition: action_menu.h:246
int GetSelected() const
Return the position of selected item.
Definition: action_menu.h:142
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.
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:200
virtual bool PassHelpTextToHandler()
Definition: action_menu.h:173
Master controller class:
Definition: tool_manager.h:52
wxPoint m_forcedPosition
Definition: action_menu.h:235
void copyFrom(const ACTION_MENU &aMenu)
Copy another menus data to this instance.
bool m_isContextMenu
Menu title.
Definition: action_menu.h:240
wxString m_title
Optional icon.
Definition: action_menu.h:243
std::list< ACTION_MENU * > m_submenus
Definition: action_menu.h:258
void SetIcon(const BITMAP_OPAQUE *aIcon)
Assign an icon for the entry.
Definition: action_menu.cpp:71
ACTION_MENU & operator=(const ACTION_MENU &aMenu)=delete
int m_selected
Creator of the menu.
Definition: action_menu.h:249
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:252
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:255
void OnMenuEvent(wxMenuEvent &aEvent)
bool m_isForcedPosition
Definition: action_menu.h:234
static constexpr bool CHECK
Definition: action_menu.h:175
void SetTitle(const wxString &aTitle) override
Set title for the menu.
Definition: action_menu.cpp:89
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:46
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:77
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)
void updateHotKeys()
Traverse the submenus tree looking for a submenu capable of handling a particular menu event.
~ACTION_MENU() override
Definition: action_menu.cpp:58
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.