KiCad PCB EDA Suite
Loading...
Searching...
No Matches
action_toolbar.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 The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
20#pragma once
21
22#include <map>
23#include <memory>
24#include <vector>
25#include <wx/bitmap.h> // Needed for the auibar include
26#include <wx/aui/auibar.h>
27#include <wx/aui/framemanager.h>
28#include <wx/popupwin.h>
29#include <wx/panel.h>
30#include <tool/action_manager.h>
31#include <frame_type.h>
32
33class ACTION_MENU;
34class BITMAP_BUTTON;
35class EDA_BASE_FRAME;
36class TOOL_ACTION;
37class TOOL_MANAGER;
39
44{
45public:
46 // Make the toolbar a friend so it can easily access everything inside here
47 friend class ACTION_TOOLBAR;
48
49 ACTION_GROUP( const std::string_view& aName );
50
51 ACTION_GROUP( const std::string_view& aName, const std::vector<const TOOL_ACTION*>& aActions );
52
61 void SetDefaultAction( const TOOL_ACTION& aDefault );
62
66 const TOOL_ACTION* GetDefaultAction() const { return m_defaultAction; }
67
71 std::string GetName() const { return m_name; }
72
76 int GetUIId() const;
77
85 void SetActions( const std::vector<const TOOL_ACTION*>& aActions );
86
90 const std::vector<const TOOL_ACTION*>& GetActions() const { return m_actions; }
91
92protected:
94 int m_id;
95
97 std::string m_name;
98
101
103 std::vector<const TOOL_ACTION*> m_actions;
104};
105
106
110class ACTION_TOOLBAR_PALETTE : public wxPopupTransientWindow
111{
112public:
120 ACTION_TOOLBAR_PALETTE( wxWindow* aParent, bool aVertical );
121
127 void AddAction( const TOOL_ACTION& aAction );
128
135 void EnableAction( const TOOL_ACTION& aAction, bool aEnable = true );
136
143 void CheckAction( const TOOL_ACTION& aAction, bool aCheck = true );
144
152 void SetButtonSize( wxRect& aSize ) { m_buttonSize = aSize; }
153
159 void Popup( wxWindow* aFocus = nullptr ) override;
160
164 void SetGroup( ACTION_GROUP* aGroup ) { m_group = aGroup; }
166
167#ifdef __WXMSW__
168 bool MSWHandleMessage( WXLRESULT* aResult, WXUINT aMessage, WXWPARAM aWParam,
169 WXLPARAM aLParam ) override;
170#endif
171
172protected:
173 void onCharHook( wxKeyEvent& aEvent );
174
175 // The group that the buttons in the palette are part of
177
180
183
184 wxPanel* m_panel;
185 wxBoxSizer* m_mainSizer;
186 wxBoxSizer* m_buttonSizer;
187
189 std::map<int, BITMAP_BUTTON*> m_buttons;
190};
191
192// Forward declare this because the toolbar wants it
194
198class ACTION_TOOLBAR : public wxAuiToolBar
199{
200public:
201 ACTION_TOOLBAR( EDA_BASE_FRAME* parent, wxWindowID id = wxID_ANY,
202 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
203 long style = wxAUI_TB_DEFAULT_STYLE );
204
205 virtual ~ACTION_TOOLBAR();
206
212 void SetAuiManager( wxAuiManager* aManager ) { m_auiManager = aManager; }
213
214 void SetToolManager( TOOL_MANAGER* aManager ) { m_toolManager = aManager; }
215
225 void Add( const TOOL_ACTION& aAction );
226
236 void Add( const TOOL_ACTION& aAction, bool aIsToggleEntry,
237 bool aIsCancellable = false );
238
244 void AddButton( const TOOL_ACTION& aAction );
245
252 void AddScaledSeparator( wxWindow* aWindow );
253
257 void Add( wxControl* aControl, const wxString& aLabel = wxEmptyString );
258
268 void AddToolContextMenu( const TOOL_ACTION& aAction, std::unique_ptr<ACTION_MENU> aMenu );
269
280 void AddGroup( std::unique_ptr<ACTION_GROUP> aGroup );
281
288 void SelectAction( ACTION_GROUP* aGroup, const TOOL_ACTION& aAction );
289
294 void SelectAction( const TOOL_ACTION& aAction );
295
302 void ApplyConfiguration( const TOOLBAR_CONFIGURATION& aConfig );
303
307 void UpdateControlWidths();
308
314 void UpdateControlWidth( int aID );
315
319 void ClearToolbar();
320
326 void SetToolBitmap( const TOOL_ACTION& aAction, const wxBitmapBundle& aBitmap );
327
333 void Toggle( const TOOL_ACTION& aAction, bool aState );
334
335 void Toggle( const TOOL_ACTION& aAction, bool aEnabled, bool aChecked );
336
345 bool KiRealize();
346
350 void RefreshBitmaps();
351
355 static std::list<ACTION_TOOLBAR_CONTROL*>& GetAllCustomControls()
356 {
357 static std::list<ACTION_TOOLBAR_CONTROL*> m_controls;
358 return m_controls;
359 }
360
364 static std::list<ACTION_TOOLBAR_CONTROL*> GetCustomControlList( FRAME_T aContext );
365
366 static constexpr bool TOGGLE = true;
367 static constexpr bool CANCEL = true;
368
369protected:
375 void doSelectAction( ACTION_GROUP* aGroup, const TOOL_ACTION& aAction );
376
381 void popupPalette( wxAuiToolBarItem* aItem );
382
384 void onMouseClick( wxMouseEvent& aEvent );
385
387 void onItemDrag( wxAuiToolBarEvent& aEvent );
388
390 void onToolEvent( wxAuiToolBarEvent& aEvent );
391
393 void onRightClick( wxAuiToolBarEvent& aEvent );
394
397 void onRightUp( wxMouseEvent& aEvent );
398
400 void showContextMenu( int aToolId );
401
403 void onPaletteEvent( wxCommandEvent& aEvent );
404
406 void onTimerDone( wxTimerEvent& aEvent );
407
408 void onThemeChanged( wxSysColourChangedEvent &aEvent );
409
412 void OnCustomRender( wxDC& aDc, const wxAuiToolBarItem& aItem, const wxRect& aRect ) override;
413
414 void DoSetToolTipText( const wxString& aTip ) override;
415
416protected:
417 // Timer used to determine when the palette should be opened after a group item is pressed
420
421 wxAuiManager* m_auiManager;
424
425 std::map<int, bool> m_toolKinds;
426 std::map<int, bool> m_toolCancellable;
427 std::map<int, const TOOL_ACTION*> m_toolActions;
428
430 std::vector<int> m_controlIDs;
431
432 std::map<int, std::unique_ptr<ACTION_GROUP>> m_actionGroups;
433 std::map<int, std::unique_ptr<ACTION_MENU>> m_toolMenus;
434
436 std::map<std::string, std::string> m_groupSelections;
437};
438
446typedef std::function<void ( ACTION_TOOLBAR* )> ACTION_TOOLBAR_CONTROL_FACTORY;
447
448
453{
454public:
455 ACTION_TOOLBAR_CONTROL( const std::string& aName, const wxString& aUiName,
456 const wxString& aDescription, std::vector<FRAME_T> aSupportedContexts ) :
457 m_name( aName ),
458 m_uiname( aUiName ),
459 m_description( aDescription ),
460 m_supportedContexts( aSupportedContexts )
461 {
462 wxASSERT_MSG( aName.starts_with( "control" ),
463 wxString::Format( "Control name \"%s\" must start with \"control\"", aName ) );
464
465 ACTION_TOOLBAR::GetAllCustomControls().push_back( this );
466 }
467
468 const std::string& GetName() const { return m_name; }
469 const wxString& GetUiName() const { return m_uiname; }
470 const wxString& GetDescription() const { return m_description; }
471
472 bool SupportedFor( FRAME_T aFrame ) const
473 {
474 for( FRAME_T candidate : m_supportedContexts )
475 {
476 if( aFrame == candidate )
477 return true;
478 }
479
480 return false;
481 }
482
483protected:
487 std::string m_name;
488
492 wxString m_uiname;
493
498
502 std::vector<FRAME_T> m_supportedContexts;
503};
504
A group of actions that will be displayed together on a toolbar palette.
void SetDefaultAction(const TOOL_ACTION &aDefault)
Set the default action to use when first creating the toolbar palette icon.
friend class ACTION_TOOLBAR
ACTION_GROUP(const std::string_view &aName)
const std::vector< const TOOL_ACTION * > & GetActions() const
Get a vector of all the actions contained inside this group.
std::vector< const TOOL_ACTION * > m_actions
void SetActions(const std::vector< const TOOL_ACTION * > &aActions)
Set the actions contained in this group.
int GetUIId() const
Get the ID used in the UI to reference this group.
int m_id
< The action ID for this action group
const TOOL_ACTION * m_defaultAction
The actions that compose the group. Non-owning.
const TOOL_ACTION * GetDefaultAction() const
Get the default action to use when first creating this group's toolbar palette icon.
std::string m_name
The default action to display on the toolbar item.
std::string GetName() const
Get the name of the group.
Define the structure of a menu based on ACTIONs.
Definition action_menu.h:43
static ACTION_TOOLBAR_CONTROL gridSelect
static ACTION_TOOLBAR_CONTROL overrideLocks
static ACTION_TOOLBAR_CONTROL layerSelector
static ACTION_TOOLBAR_CONTROL zoomSelect
static ACTION_TOOLBAR_CONTROL unitSelector
static ACTION_TOOLBAR_CONTROL ipcScripting
static ACTION_TOOLBAR_CONTROL bodyStyleSelector
Class to hold basic information about controls that can be added to the toolbars.
wxString m_uiname
Short description to show for the control.
ACTION_TOOLBAR_CONTROL(const std::string &aName, const wxString &aUiName, const wxString &aDescription, std::vector< FRAME_T > aSupportedContexts)
std::string m_name
Name of the control - must start with "control.".
const wxString & GetDescription() const
const wxString & GetUiName() const
bool SupportedFor(FRAME_T aFrame) const
std::vector< FRAME_T > m_supportedContexts
List of frame types that support the control.
const std::string & GetName() const
wxString m_description
User-visible tooltip for the control.
A popup window that contains a row of toolbar-like buttons for the user to choose from.
void CheckAction(const TOOL_ACTION &aAction, bool aCheck=true)
Check/Toggle the button for an action on the palette.
void onCharHook(wxKeyEvent &aEvent)
wxBoxSizer * m_buttonSizer
The buttons that act as the toolbar on the palette.
void AddAction(const TOOL_ACTION &aAction)
Add an action to the palette.
ACTION_TOOLBAR_PALETTE(wxWindow *aParent, bool aVertical)
Create the palette.
void SetButtonSize(wxRect &aSize)
Set the size all the buttons on this palette should be.
void SetGroup(ACTION_GROUP *aGroup)
Set the action group that this palette contains the actions for.
wxRect m_buttonSize
True if the palette uses vertical buttons, false for horizontal buttons.
void EnableAction(const TOOL_ACTION &aAction, bool aEnable=true)
Enable the button for an action on the palette.
ACTION_GROUP * m_group
The size each button on the toolbar should be.
std::map< int, BITMAP_BUTTON * > m_buttons
ACTION_GROUP * GetGroup()
void Popup(wxWindow *aFocus=nullptr) override
Popup this window.
Define the structure of a toolbar with buttons that invoke ACTIONs.
void RefreshBitmaps()
Reload all the bitmaps for the tools (e.g.
void SetToolBitmap(const TOOL_ACTION &aAction, const wxBitmapBundle &aBitmap)
Updates the bitmap of a particular tool.
void OnCustomRender(wxDC &aDc, const wxAuiToolBarItem &aItem, const wxRect &aRect) override
static constexpr bool TOGGLE
void onTimerDone(wxTimerEvent &aEvent)
void doSelectAction(ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
Update a group toolbar item to look like a specific action.
static constexpr bool CANCEL
void SetAuiManager(wxAuiManager *aManager)
Set the AUI manager that this toolbar belongs to.
void onMouseClick(wxMouseEvent &aEvent)
Handler for when a drag event occurs on an item.
void AddButton(const TOOL_ACTION &aAction)
Add a large button such as used in the KiCad Manager Frame's launch bar.
wxAuiManager * m_auiManager
void UpdateControlWidth(int aID)
Update the toolbar item width of a control using its best size.
ACTION_TOOLBAR(EDA_BASE_FRAME *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxAUI_TB_DEFAULT_STYLE)
void Toggle(const TOOL_ACTION &aAction, bool aState)
Apply the default toggle action.
void SelectAction(ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
Select an action inside a group.
void Add(const TOOL_ACTION &aAction)
Add a TOOL_ACTION-based button to the toolbar.
static std::list< ACTION_TOOLBAR_CONTROL * > & GetAllCustomControls()
Get the list of custom controls that could be used on toolbars.
void onPaletteEvent(wxCommandEvent &aEvent)
Handle the palette timer triggering.
void onRightClick(wxAuiToolBarEvent &aEvent)
Handle a right mouse button release; resolves the tool ourselves to work around a wxAuiToolBar hit-te...
wxTimer * m_paletteTimer
std::map< int, std::unique_ptr< ACTION_MENU > > m_toolMenus
void onToolEvent(wxAuiToolBarEvent &aEvent)
Handle a right-click on a menu item.
void onItemDrag(wxAuiToolBarEvent &aEvent)
The default tool event handler.
std::map< int, bool > m_toolKinds
static std::list< ACTION_TOOLBAR_CONTROL * > GetCustomControlList(FRAME_T aContext)
Get the list of custom controls that could be used on a particular frame type.
std::map< int, std::unique_ptr< ACTION_GROUP > > m_actionGroups
void AddGroup(std::unique_ptr< ACTION_GROUP > aGroup)
Add a set of actions to a toolbar as a group.
void AddToolContextMenu(const TOOL_ACTION &aAction, std::unique_ptr< ACTION_MENU > aMenu)
Add a context menu to a specific tool item on the toolbar.
void DoSetToolTipText(const wxString &aTip) override
std::map< int, bool > m_toolCancellable
void AddScaledSeparator(wxWindow *aWindow)
Add a separator that introduces space on either side to not squash the tools when scaled.
bool KiRealize()
Use this over Realize() to avoid a rendering glitch with fixed orientation toolbars.
void popupPalette(wxAuiToolBarItem *aItem)
Popup the ACTION_TOOLBAR_PALETTE associated with the ACTION_GROUP of the given toolbar item.
virtual ~ACTION_TOOLBAR()
ACTION_TOOLBAR_PALETTE * m_palette
std::vector< int > m_controlIDs
IDs for all the control items in this toolbar.
void onThemeChanged(wxSysColourChangedEvent &aEvent)
Render the triangle in the lower-right corner that represents that an action palette is available for...
EDA_BASE_FRAME * m_parent
void SetToolManager(TOOL_MANAGER *aManager)
std::map< int, const TOOL_ACTION * > m_toolActions
std::map< std::string, std::string > m_groupSelections
Selected action per group name.
void ClearToolbar()
Clear the toolbar and remove all associated menus.
void onRightUp(wxMouseEvent &aEvent)
Show the context menu registered for the given tool ID (handles group remapping).
void showContextMenu(int aToolId)
Handle the button select inside the palette.
void UpdateControlWidths()
Update the width of all wxControl tools on thsi toolbar.
void ApplyConfiguration(const TOOLBAR_CONFIGURATION &aConfig)
Replace the contents of this toolbar with the configuration given in aConfig.
TOOL_MANAGER * m_toolManager
A bitmap button widget that behaves like an AUI toolbar item's button when it is drawn.
The base frame for deriving all KiCad main window classes.
Represent a single user action.
Master controller class:
std::function< void(ACTION_TOOLBAR *)> ACTION_TOOLBAR_CONTROL_FACTORY
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition frame_type.h:29