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, you may find one here:
18 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
19 * or you may search the http://www.gnu.org website for the version 2 license,
20 * or you may write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
22 */
23
24#pragma once
25
26#include <map>
27#include <memory>
28#include <vector>
29#include <wx/bitmap.h> // Needed for the auibar include
30#include <wx/aui/auibar.h>
31#include <wx/aui/framemanager.h>
32#include <wx/popupwin.h>
33#include <wx/panel.h>
34#include <tool/action_manager.h>
35#include <frame_type.h>
36
37class ACTION_MENU;
38class BITMAP_BUTTON;
39class EDA_BASE_FRAME;
40class TOOL_ACTION;
41class TOOL_MANAGER;
43
48{
49public:
50 // Make the toolbar a friend so it can easily access everything inside here
51 friend class ACTION_TOOLBAR;
52
53 ACTION_GROUP( const std::string_view& aName );
54
55 ACTION_GROUP( const std::string_view& aName, const std::vector<const TOOL_ACTION*>& aActions );
56
65 void SetDefaultAction( const TOOL_ACTION& aDefault );
66
70 const TOOL_ACTION* GetDefaultAction() const { return m_defaultAction; }
71
75 std::string GetName() const { return m_name; }
76
80 int GetUIId() const;
81
89 void SetActions( const std::vector<const TOOL_ACTION*>& aActions );
90
94 const std::vector<const TOOL_ACTION*>& GetActions() const { return m_actions; }
95
96protected:
98 int m_id;
99
101 std::string m_name;
102
105
107 std::vector<const TOOL_ACTION*> m_actions;
108};
109
110
114class ACTION_TOOLBAR_PALETTE : public wxPopupTransientWindow
115{
116public:
124 ACTION_TOOLBAR_PALETTE( wxWindow* aParent, bool aVertical );
125
131 void AddAction( const TOOL_ACTION& aAction );
132
139 void EnableAction( const TOOL_ACTION& aAction, bool aEnable = true );
140
147 void CheckAction( const TOOL_ACTION& aAction, bool aCheck = true );
148
156 void SetButtonSize( wxRect& aSize ) { m_buttonSize = aSize; }
157
163 void Popup( wxWindow* aFocus = nullptr ) override;
164
168 void SetGroup( ACTION_GROUP* aGroup ) { m_group = aGroup; }
170
171protected:
172 void onCharHook( wxKeyEvent& aEvent );
173
174 // The group that the buttons in the palette are part of
176
179
182
183 wxPanel* m_panel;
184 wxBoxSizer* m_mainSizer;
185 wxBoxSizer* m_buttonSizer;
186
188 std::map<int, BITMAP_BUTTON*> m_buttons;
189};
190
191// Forward declare this because the toolbar wants it
193
197class ACTION_TOOLBAR : public wxAuiToolBar
198{
199public:
200 ACTION_TOOLBAR( EDA_BASE_FRAME* parent, wxWindowID id = wxID_ANY,
201 const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize,
202 long style = wxAUI_TB_DEFAULT_STYLE );
203
204 virtual ~ACTION_TOOLBAR();
205
211 void SetAuiManager( wxAuiManager* aManager ) { m_auiManager = aManager; }
212
213 void SetToolManager( TOOL_MANAGER* aManager ) { m_toolManager = aManager; }
214
224 void Add( const TOOL_ACTION& aAction );
225
235 void Add( const TOOL_ACTION& aAction, bool aIsToggleEntry,
236 bool aIsCancellable = false );
237
243 void AddButton( const TOOL_ACTION& aAction );
244
251 void AddScaledSeparator( wxWindow* aWindow );
252
256 void Add( wxControl* aControl, const wxString& aLabel = wxEmptyString );
257
267 void AddToolContextMenu( const TOOL_ACTION& aAction, std::unique_ptr<ACTION_MENU> aMenu );
268
279 void AddGroup( std::unique_ptr<ACTION_GROUP> aGroup );
280
287 void SelectAction( ACTION_GROUP* aGroup, const TOOL_ACTION& aAction );
288
293 void SelectAction( const TOOL_ACTION& aAction );
294
301 void ApplyConfiguration( const TOOLBAR_CONFIGURATION& aConfig );
302
306 void UpdateControlWidths();
307
313 void UpdateControlWidth( int aID );
314
318 void ClearToolbar();
319
325 void SetToolBitmap( const TOOL_ACTION& aAction, const wxBitmapBundle& aBitmap );
326
332 void Toggle( const TOOL_ACTION& aAction, bool aState );
333
334 void Toggle( const TOOL_ACTION& aAction, bool aEnabled, bool aChecked );
335
344 bool KiRealize();
345
349 void RefreshBitmaps();
350
354 static std::list<ACTION_TOOLBAR_CONTROL*>& GetAllCustomControls()
355 {
356 static std::list<ACTION_TOOLBAR_CONTROL*> m_controls;
357 return m_controls;
358 }
359
363 static std::list<ACTION_TOOLBAR_CONTROL*> GetCustomControlList( FRAME_T aContext );
364
365 static constexpr bool TOGGLE = true;
366 static constexpr bool CANCEL = true;
367
368protected:
374 void doSelectAction( ACTION_GROUP* aGroup, const TOOL_ACTION& aAction );
375
380 void popupPalette( wxAuiToolBarItem* aItem );
381
383 void onMouseClick( wxMouseEvent& aEvent );
384
386 void onItemDrag( wxAuiToolBarEvent& aEvent );
387
389 void onToolEvent( wxAuiToolBarEvent& aEvent );
390
392 void onRightClick( wxAuiToolBarEvent& aEvent );
393
395 void onPaletteEvent( wxCommandEvent& aEvent );
396
398 void onTimerDone( wxTimerEvent& aEvent );
399
400 void onThemeChanged( wxSysColourChangedEvent &aEvent );
401
404 void OnCustomRender( wxDC& aDc, const wxAuiToolBarItem& aItem, const wxRect& aRect ) override;
405
406 void DoSetToolTipText( const wxString& aTip ) override;
407
408protected:
409 // Timer used to determine when the palette should be opened after a group item is pressed
412
413 wxAuiManager* m_auiManager;
416
417 std::map<int, bool> m_toolKinds;
418 std::map<int, bool> m_toolCancellable;
419 std::map<int, const TOOL_ACTION*> m_toolActions;
420
422 std::vector<int> m_controlIDs;
423
424 std::map<int, std::unique_ptr<ACTION_GROUP>> m_actionGroups;
425 std::map<int, std::unique_ptr<ACTION_MENU>> m_toolMenus;
426
428 std::map<std::string, std::string> m_groupSelections;
429};
430
438typedef std::function<void ( ACTION_TOOLBAR* )> ACTION_TOOLBAR_CONTROL_FACTORY;
439
440
445{
446public:
447 ACTION_TOOLBAR_CONTROL( const std::string& aName, const wxString& aUiName,
448 const wxString& aDescription, std::vector<FRAME_T> aSupportedContexts ) :
449 m_name( aName ),
450 m_uiname( aUiName ),
451 m_description( aDescription ),
452 m_supportedContexts( aSupportedContexts )
453 {
454 wxASSERT_MSG( aName.starts_with( "control" ),
455 wxString::Format( "Control name \"%s\" must start with \"control\"", aName ) );
456
457 ACTION_TOOLBAR::GetAllCustomControls().push_back( this );
458 }
459
460 const std::string& GetName() const { return m_name; }
461 const wxString& GetUiName() const { return m_uiname; }
462 const wxString& GetDescription() const { return m_description; }
463
464 bool SupportedFor( FRAME_T aFrame ) const
465 {
466 for( FRAME_T candidate : m_supportedContexts )
467 {
468 if( aFrame == candidate )
469 return true;
470 }
471
472 return false;
473 }
474
475protected:
479 std::string m_name;
480
484 wxString m_uiname;
485
490
494 std::vector<FRAME_T> m_supportedContexts;
495};
496
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:47
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 the button select inside the palette.
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 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:33