KiCad PCB EDA Suite
ACTION_TOOLBAR Class Reference

Define the structure of a toolbar with buttons that invoke ACTIONs. More...

#include <action_toolbar.h>

Inheritance diagram for ACTION_TOOLBAR:

Public Member Functions

 ACTION_TOOLBAR (EDA_BASE_FRAME *parent, wxWindowID id=wxID_ANY, const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxDefaultSize, long style=wxAUI_TB_DEFAULT_STYLE)
 
virtual ~ACTION_TOOLBAR ()
 
void SetAuiManager (wxAuiManager *aManager)
 Set the AUI manager that this toolbar belongs to. More...
 
void Add (const TOOL_ACTION &aAction, bool aIsToggleEntry=false, bool aIsCancellable=false)
 Add a TOOL_ACTION-based button to the toolbar. More...
 
void AddButton (const TOOL_ACTION &aAction)
 Add a large button such as used in the KiCad Manager Frame's launch bar. More...
 
void AddScaledSeparator (wxWindow *aWindow)
 Add a separator that introduces space on either side to not squash the tools when scaled. More...
 
void AddToolContextMenu (const TOOL_ACTION &aAction, std::unique_ptr< ACTION_MENU > aMenu)
 Add a context menu to a specific tool item on the toolbar. More...
 
void AddGroup (ACTION_GROUP *aGroup, bool aIsToggleEntry=false)
 Add a set of actions to a toolbar as a group. More...
 
void SelectAction (ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
 Select an action inside a group. More...
 
void UpdateControlWidth (int aID)
 Update the toolbar item width of a control using its best size. More...
 
void ClearToolbar ()
 Clear the toolbar and remove all associated menus. More...
 
void SetToolBitmap (const TOOL_ACTION &aAction, const wxBitmap &aBitmap)
 Updates the bitmap of a particular tool. More...
 
void Toggle (const TOOL_ACTION &aAction, bool aState)
 Apply the default toggle action. More...
 
void Toggle (const TOOL_ACTION &aAction, bool aEnabled, bool aChecked)
 
bool KiRealize ()
 Use this over Realize() to avoid a rendering glitch with fixed orientation toolbars. More...
 
void RefreshBitmaps ()
 Reload all the bitmaps for the tools (e.g. More...
 

Static Public Attributes

static constexpr bool TOGGLE = true
 
static constexpr bool CANCEL = true
 

Protected Member Functions

void doSelectAction (ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
 Update a group toolbar item to look like a specific action. More...
 
void popupPalette (wxAuiToolBarItem *aItem)
 Popup the ACTION_TOOLBAR_PALETTE associated with the ACTION_GROUP of the given toolbar item. More...
 
void onMouseClick (wxMouseEvent &aEvent)
 Handler for when a drag event occurs on an item. More...
 
void onItemDrag (wxAuiToolBarEvent &aEvent)
 The default tool event handler. More...
 
void onToolEvent (wxAuiToolBarEvent &aEvent)
 Handle a right-click on a menu item. More...
 
void onToolRightClick (wxAuiToolBarEvent &aEvent)
 Handle the button select inside the palette. More...
 
void onPaletteEvent (wxCommandEvent &aEvent)
 Handle the palette timer triggering. More...
 
void onTimerDone (wxTimerEvent &aEvent)
 
void onThemeChanged (wxSysColourChangedEvent &aEvent)
 Render the triangle in the lower-right corner that represents that an action palette is available for an item. More...
 
void OnCustomRender (wxDC &aDc, const wxAuiToolBarItem &aItem, const wxRect &aRect) override
 

Protected Attributes

wxTimer * m_paletteTimer
 
wxAuiManager * m_auiManager
 
TOOL_MANAGERm_toolManager
 
ACTION_TOOLBAR_PALETTEm_palette
 
std::map< int, bool > m_toolKinds
 
std::map< int, bool > m_toolCancellable
 
std::map< int, const TOOL_ACTION * > m_toolActions
 
std::map< int, ACTION_GROUP * > m_actionGroups
 
std::map< int, std::unique_ptr< ACTION_MENU > > m_toolMenus
 

Detailed Description

Define the structure of a toolbar with buttons that invoke ACTIONs.

Definition at line 183 of file action_toolbar.h.

Constructor & Destructor Documentation

◆ ACTION_TOOLBAR()

ACTION_TOOLBAR::ACTION_TOOLBAR ( EDA_BASE_FRAME parent,
wxWindowID  id = wxID_ANY,
const wxPoint &  pos = wxDefaultPosition,
const wxSize &  size = wxDefaultSize,
long  style = wxAUI_TB_DEFAULT_STYLE 
)

Definition at line 184 of file action_toolbar.cpp.

185  :
186  wxAuiToolBar( parent, id, pos, size, style ),
187  m_paletteTimer( nullptr ),
188  m_auiManager( nullptr ),
189  m_toolManager( parent->GetToolManager() ),
190  m_palette( nullptr )
191 {
192  m_paletteTimer = new wxTimer( this );
193 
194 #if !wxCHECK_VERSION( 3, 1, 0 )
195  // Custom art provider makes dark mode work on wx < 3.1
196  WX_AUI_TOOLBAR_ART* newArt = new WX_AUI_TOOLBAR_ART();
197  SetArtProvider( newArt );
198 #endif
199 
200  Connect( wxEVT_COMMAND_TOOL_CLICKED, wxAuiToolBarEventHandler( ACTION_TOOLBAR::onToolEvent ),
201  nullptr, this );
202  Connect( wxEVT_AUITOOLBAR_RIGHT_CLICK,
203  wxAuiToolBarEventHandler( ACTION_TOOLBAR::onToolRightClick ),
204  nullptr, this );
205  Connect( wxEVT_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEventHandler( ACTION_TOOLBAR::onItemDrag ),
206  nullptr, this );
207  Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( ACTION_TOOLBAR::onMouseClick ), nullptr, this );
208  Connect( wxEVT_LEFT_UP, wxMouseEventHandler( ACTION_TOOLBAR::onMouseClick ), nullptr, this );
209  Connect( m_paletteTimer->GetId(), wxEVT_TIMER,
210  wxTimerEventHandler( ACTION_TOOLBAR::onTimerDone ), nullptr, this );
211 
212  Bind( wxEVT_SYS_COLOUR_CHANGED,
213  wxSysColourChangedEventHandler( ACTION_TOOLBAR::onThemeChanged ), this );
214 }
void onItemDrag(wxAuiToolBarEvent &aEvent)
The default tool event handler.
void onToolRightClick(wxAuiToolBarEvent &aEvent)
Handle the button select inside the palette.
void onTimerDone(wxTimerEvent &aEvent)
void onToolEvent(wxAuiToolBarEvent &aEvent)
Handle a right-click on a menu item.
void onMouseClick(wxMouseEvent &aEvent)
Handler for when a drag event occurs on an item.
wxWidgets 3.1 has support for dark mode detection, but 3.0 doesn't.
void onThemeChanged(wxSysColourChangedEvent &aEvent)
Render the triangle in the lower-right corner that represents that an action palette is available for...
ACTION_TOOLBAR_PALETTE * m_palette
wxAuiManager * m_auiManager
TOOL_MANAGER * m_toolManager
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
wxTimer * m_paletteTimer

References m_paletteTimer, onItemDrag(), onMouseClick(), onThemeChanged(), onTimerDone(), onToolEvent(), and onToolRightClick().

◆ ~ACTION_TOOLBAR()

ACTION_TOOLBAR::~ACTION_TOOLBAR ( )
virtual

Definition at line 217 of file action_toolbar.cpp.

218 {
219  delete m_paletteTimer;
220 
221  // Clear all the maps keeping track of our items on the toolbar
222  m_toolMenus.clear();
223  m_actionGroups.clear();
224  m_toolCancellable.clear();
225  m_toolKinds.clear();
226  m_toolActions.clear();
227 }
std::map< int, const TOOL_ACTION * > m_toolActions
std::map< int, bool > m_toolCancellable
std::map< int, std::unique_ptr< ACTION_MENU > > m_toolMenus
std::map< int, ACTION_GROUP * > m_actionGroups
std::map< int, bool > m_toolKinds
wxTimer * m_paletteTimer

References m_actionGroups, m_paletteTimer, m_toolActions, m_toolCancellable, m_toolKinds, and m_toolMenus.

Member Function Documentation

◆ Add()

void ACTION_TOOLBAR::Add ( const TOOL_ACTION aAction,
bool  aIsToggleEntry = false,
bool  aIsCancellable = false 
)

Add a TOOL_ACTION-based button to the toolbar.

After selecting the entry, a TOOL_EVENT command containing name of the action is sent.

Parameters
aActionis the action to add.
aIsToggleEntrymakes the toolbar item a toggle entry when true.
aIsCancellablewhen true, cancels the tool if clicked when tool is active.

Definition at line 230 of file action_toolbar.cpp.

231 {
232  wxASSERT( GetParent() );
233  wxASSERT_MSG( !( aIsCancellable && !aIsToggleEntry ), "aIsCancellable requires aIsToggleEntry" );
234 
235  int toolId = aAction.GetUIId();
236  wxBitmap bmp = KiScaledBitmap( aAction.GetIcon(), GetParent() );
237 
238  AddTool( toolId, wxEmptyString, bmp, MakeDisabledBitmap( bmp ),
239  aIsToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL,
240  aAction.GetDescription(), wxEmptyString, nullptr );
241 
242  m_toolKinds[ toolId ] = aIsToggleEntry;
243  m_toolActions[ toolId ] = &aAction;
244  m_toolCancellable[ toolId ] = aIsCancellable;
245 }
wxBitmap MakeDisabledBitmap(const wxBitmap &aSource)
int GetUIId() const
Definition: tool_action.h:130
std::map< int, const TOOL_ACTION * > m_toolActions
std::map< int, bool > m_toolCancellable
const BITMAPS GetIcon() const
Return an icon associated with the action.
Definition: tool_action.h:179
wxString GetDescription(bool aIncludeHotkey=true) const
Definition: tool_action.cpp:97
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight, bool aQuantized)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148
std::map< int, bool > m_toolKinds

References TOOL_ACTION::GetDescription(), TOOL_ACTION::GetIcon(), TOOL_ACTION::GetUIId(), KiScaledBitmap(), m_toolActions, m_toolCancellable, m_toolKinds, and MakeDisabledBitmap().

Referenced by KICAD_MANAGER_FRAME::RecreateBaseHToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar(), GERBVIEW_FRAME::ReCreateHToolbar(), SYMBOL_VIEWER_FRAME::ReCreateHToolbar(), PL_EDITOR_FRAME::ReCreateHToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateHToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar(), FOOTPRINT_WIZARD_FRAME::ReCreateHToolbar(), CVPCB_MAINFRAME::ReCreateHToolbar(), SCH_EDIT_FRAME::ReCreateHToolbar(), SYMBOL_EDIT_FRAME::ReCreateHToolbar(), PCB_EDIT_FRAME::ReCreateHToolbar(), EDA_3D_VIEWER_FRAME::ReCreateMainToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateOptToolbar(), GERBVIEW_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateOptToolbar(), PL_EDITOR_FRAME::ReCreateOptToolbar(), SCH_EDIT_FRAME::ReCreateOptToolbar(), SYMBOL_EDIT_FRAME::ReCreateOptToolbar(), PCB_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateVToolbar(), PL_EDITOR_FRAME::ReCreateVToolbar(), SCH_EDIT_FRAME::ReCreateVToolbar(), SYMBOL_EDIT_FRAME::ReCreateVToolbar(), and PCB_EDIT_FRAME::ReCreateVToolbar().

◆ AddButton()

void ACTION_TOOLBAR::AddButton ( const TOOL_ACTION aAction)

Add a large button such as used in the KiCad Manager Frame's launch bar.

Parameters
aAction

Definition at line 248 of file action_toolbar.cpp.

249 {
250  int toolId = aAction.GetUIId();
251  wxBitmap bmp = KiScaledBitmap( aAction.GetIcon(), GetParent() );
252 
253  AddTool( toolId, wxEmptyString, bmp, MakeDisabledBitmap( bmp ),
254  wxITEM_NORMAL, aAction.GetDescription(), wxEmptyString, nullptr );
255 
256  m_toolKinds[ toolId ] = false;
257  m_toolActions[ toolId ] = &aAction;
258 }
wxBitmap MakeDisabledBitmap(const wxBitmap &aSource)
int GetUIId() const
Definition: tool_action.h:130
std::map< int, const TOOL_ACTION * > m_toolActions
const BITMAPS GetIcon() const
Return an icon associated with the action.
Definition: tool_action.h:179
wxString GetDescription(bool aIncludeHotkey=true) const
Definition: tool_action.cpp:97
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight, bool aQuantized)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148
std::map< int, bool > m_toolKinds

References TOOL_ACTION::GetDescription(), TOOL_ACTION::GetIcon(), TOOL_ACTION::GetUIId(), KiScaledBitmap(), m_toolActions, m_toolKinds, and MakeDisabledBitmap().

◆ AddGroup()

void ACTION_TOOLBAR::AddGroup ( ACTION_GROUP aGroup,
bool  aIsToggleEntry = false 
)

Add a set of actions to a toolbar as a group.

One action from the group will be displayed at a time.

Parameters
aGroupis the group to add. The first action in the group will be the first shown on the toolbar.
aIsToggleEntrymakes the toolbar item a toggle entry when true

Definition at line 287 of file action_toolbar.cpp.

288 {
289  int groupId = aGroup->GetUIId();
290  const TOOL_ACTION* defaultAction = aGroup->GetDefaultAction();
291  wxBitmap bmp = KiScaledBitmap( defaultAction->GetIcon(), GetParent() );
292 
293  wxASSERT( GetParent() );
294  wxASSERT( defaultAction );
295 
296  m_toolKinds[ groupId ] = aIsToggleEntry;
297  m_toolActions[ groupId ] = defaultAction;
298  m_actionGroups[ groupId ] = aGroup;
299 
300  // Add the main toolbar item representing the group
301  AddTool( groupId, wxEmptyString, bmp, MakeDisabledBitmap( bmp ),
302  aIsToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL,
303  wxEmptyString, wxEmptyString, nullptr );
304 
305  // Select the default action
306  doSelectAction( aGroup, *defaultAction );
307 }
wxBitmap MakeDisabledBitmap(const wxBitmap &aSource)
std::map< int, const TOOL_ACTION * > m_toolActions
void doSelectAction(ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
Update a group toolbar item to look like a specific action.
const BITMAPS GetIcon() const
Return an icon associated with the action.
Definition: tool_action.h:179
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight, bool aQuantized)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148
const TOOL_ACTION * GetDefaultAction() const
Get the default action to use when first creating this group's toolbar palette icon.
std::map< int, ACTION_GROUP * > m_actionGroups
Represent a single user action.
Definition: tool_action.h:67
int GetUIId() const
Get the ID used in the UI to reference this group.
std::map< int, bool > m_toolKinds

References doSelectAction(), ACTION_GROUP::GetDefaultAction(), TOOL_ACTION::GetIcon(), ACTION_GROUP::GetUIId(), KiScaledBitmap(), m_actionGroups, m_toolActions, m_toolKinds, and MakeDisabledBitmap().

Referenced by PCB_EDIT_FRAME::ReCreateVToolbar().

◆ AddScaledSeparator()

void ACTION_TOOLBAR::AddScaledSeparator ( wxWindow *  aWindow)

Add a separator that introduces space on either side to not squash the tools when scaled.

Parameters
aWindowis the window to get the scaling factor of

Definition at line 261 of file action_toolbar.cpp.

262 {
263  int scale = Pgm().GetCommonSettings()->m_Appearance.icon_scale;
264 
265  if( scale == 0 )
266  scale = KiIconScale( aWindow );
267 
268  if( scale > 4 )
269  AddSpacer( 16 * ( scale - 4 ) / 4 );
270 
271  AddSeparator();
272 
273  if( scale > 4 )
274  AddSpacer( 16 * ( scale - 4 ) / 4 );
275 }
int KiIconScale(wxWindow *aWindow)
Return the automatic scale factor that would be used for a given window by KiScaledBitmap and KiScale...
Definition: bitmap.cpp:122
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
const int scale

References KiIconScale(), Pgm(), and scale.

Referenced by PCB_EDIT_FRAME::AddActionPluginTools(), GERBVIEW_FRAME::ReCreateAuxiliaryToolbar(), PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar(), KICAD_MANAGER_FRAME::RecreateBaseHToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar(), GERBVIEW_FRAME::ReCreateHToolbar(), SYMBOL_VIEWER_FRAME::ReCreateHToolbar(), PL_EDITOR_FRAME::ReCreateHToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateHToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar(), FOOTPRINT_WIZARD_FRAME::ReCreateHToolbar(), CVPCB_MAINFRAME::ReCreateHToolbar(), SCH_EDIT_FRAME::ReCreateHToolbar(), SYMBOL_EDIT_FRAME::ReCreateHToolbar(), PCB_EDIT_FRAME::ReCreateHToolbar(), EDA_3D_VIEWER_FRAME::ReCreateMainToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateOptToolbar(), GERBVIEW_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateOptToolbar(), PCB_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateVToolbar(), PL_EDITOR_FRAME::ReCreateVToolbar(), SCH_EDIT_FRAME::ReCreateVToolbar(), SYMBOL_EDIT_FRAME::ReCreateVToolbar(), and PCB_EDIT_FRAME::ReCreateVToolbar().

◆ AddToolContextMenu()

void ACTION_TOOLBAR::AddToolContextMenu ( const TOOL_ACTION aAction,
std::unique_ptr< ACTION_MENU aMenu 
)

Add a context menu to a specific tool item on the toolbar.

This toolbar gets ownership of the menu object, and will delete it when the ClearToolbar() function is called.

Parameters
aActionis the action to get the menu
aMenuis the context menu

Definition at line 278 of file action_toolbar.cpp.

280 {
281  int toolId = aAction.GetUIId();
282 
283  m_toolMenus[toolId] = std::move( aMenu );
284 }
int GetUIId() const
Definition: tool_action.h:130
std::map< int, std::unique_ptr< ACTION_MENU > > m_toolMenus

References TOOL_ACTION::GetUIId(), and m_toolMenus.

Referenced by FOOTPRINT_EDIT_FRAME::ReCreateOptToolbar(), SCH_EDIT_FRAME::ReCreateOptToolbar(), SYMBOL_EDIT_FRAME::ReCreateOptToolbar(), PCB_EDIT_FRAME::ReCreateOptToolbar(), and PCB_EDIT_FRAME::ReCreateVToolbar().

◆ ClearToolbar()

void ACTION_TOOLBAR::ClearToolbar ( )

Clear the toolbar and remove all associated menus.

Definition at line 393 of file action_toolbar.cpp.

394 {
395  // Clear all the maps keeping track of our items on the toolbar
396  m_toolMenus.clear();
397  m_actionGroups.clear();
398  m_toolCancellable.clear();
399  m_toolKinds.clear();
400  m_toolActions.clear();
401 
402  // Remove the actual tools from the toolbar
403  Clear();
404 }
std::map< int, const TOOL_ACTION * > m_toolActions
std::map< int, bool > m_toolCancellable
std::map< int, std::unique_ptr< ACTION_MENU > > m_toolMenus
std::map< int, ACTION_GROUP * > m_actionGroups
std::map< int, bool > m_toolKinds

References m_actionGroups, m_toolActions, m_toolCancellable, m_toolKinds, and m_toolMenus.

Referenced by GERBVIEW_FRAME::ReCreateAuxiliaryToolbar(), PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar(), KICAD_MANAGER_FRAME::RecreateBaseHToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar(), GERBVIEW_FRAME::ReCreateHToolbar(), SYMBOL_VIEWER_FRAME::ReCreateHToolbar(), PL_EDITOR_FRAME::ReCreateHToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateHToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar(), FOOTPRINT_WIZARD_FRAME::ReCreateHToolbar(), CVPCB_MAINFRAME::ReCreateHToolbar(), SCH_EDIT_FRAME::ReCreateHToolbar(), SYMBOL_EDIT_FRAME::ReCreateHToolbar(), PCB_EDIT_FRAME::ReCreateHToolbar(), EDA_3D_VIEWER_FRAME::ReCreateMainToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateOptToolbar(), GERBVIEW_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateOptToolbar(), PL_EDITOR_FRAME::ReCreateOptToolbar(), SCH_EDIT_FRAME::ReCreateOptToolbar(), SYMBOL_EDIT_FRAME::ReCreateOptToolbar(), PCB_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateVToolbar(), PL_EDITOR_FRAME::ReCreateVToolbar(), SCH_EDIT_FRAME::ReCreateVToolbar(), SYMBOL_EDIT_FRAME::ReCreateVToolbar(), and PCB_EDIT_FRAME::ReCreateVToolbar().

◆ doSelectAction()

void ACTION_TOOLBAR::doSelectAction ( ACTION_GROUP aGroup,
const TOOL_ACTION aAction 
)
protected

Update a group toolbar item to look like a specific action.

Note: This function does not verify that the action is inside the group.

Definition at line 324 of file action_toolbar.cpp.

325 {
326  wxASSERT( GetParent() );
327 
328  int groupId = aGroup->GetUIId();
329 
330  wxAuiToolBarItem* item = FindTool( groupId );
331 
332  if( !item )
333  return;
334 
335  // Update the item information
336  item->SetShortHelp( aAction.GetDescription() );
337  item->SetBitmap( KiScaledBitmap( aAction.GetIcon(), GetParent() ) );
338  item->SetDisabledBitmap( MakeDisabledBitmap( item->GetBitmap() ) );
339 
340  // Register a new handler with the new UI conditions
341  if( m_toolManager )
342  {
343  const ACTION_CONDITIONS* cond = m_toolManager->GetActionManager()->GetCondition( aAction );
344 
345  wxASSERT_MSG( cond, wxString::Format( "Missing UI condition for action %s",
346  aAction.GetName() ) );
347 
350  }
351 
352  // Update the currently selected action
353  m_toolActions[ groupId ] = &aAction;
354 
355  Refresh();
356 }
wxBitmap MakeDisabledBitmap(const wxBitmap &aSource)
virtual void UnregisterUIUpdateHandler(const TOOL_ACTION &aAction)
Unregister a UI handler for an action that was registered using RegisterUIUpdateHandler.
Definition: tools_holder.h:83
std::map< int, const TOOL_ACTION * > m_toolActions
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
const BITMAPS GetIcon() const
Return an icon associated with the action.
Definition: tool_action.h:179
wxString GetDescription(bool aIncludeHotkey=true) const
Definition: tool_action.cpp:97
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight, bool aQuantized)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:294
TOOL_MANAGER * m_toolManager
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
int GetUIId() const
Get the ID used in the UI to reference this group.
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:199
const ACTION_CONDITIONS * GetCondition(const TOOL_ACTION &aAction) const
Get the conditions to use for a specific tool action.
virtual void RegisterUIUpdateHandler(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Register an action's update conditions with the UI layer to allow the UI to appropriately display the...
Definition: tools_holder.h:63
const std::string & GetName() const
Return name of the action.
Definition: tool_action.h:101

References Format(), TOOL_MANAGER::GetActionManager(), ACTION_MANAGER::GetCondition(), TOOL_ACTION::GetDescription(), TOOL_ACTION::GetIcon(), TOOL_ACTION::GetName(), TOOL_MANAGER::GetToolHolder(), ACTION_GROUP::GetUIId(), KiScaledBitmap(), m_toolActions, m_toolManager, MakeDisabledBitmap(), Refresh(), TOOLS_HOLDER::RegisterUIUpdateHandler(), and TOOLS_HOLDER::UnregisterUIUpdateHandler().

Referenced by AddGroup(), onPaletteEvent(), and SelectAction().

◆ KiRealize()

bool ACTION_TOOLBAR::KiRealize ( )

Use this over Realize() to avoid a rendering glitch with fixed orientation toolbars.

The standard Realize() draws both horizontal and vertical to determine sizing However with many icons, potato PCs, etc, you can actually see that double draw This custom function avoids the double draw if the HORIZONTAL or VERTICAL toolbar properties are set.

Definition at line 776 of file action_toolbar.cpp.

777 {
778  wxClientDC dc( this );
779 
780  if( !dc.IsOk() )
781  return false;
782 
783  // calculate hint sizes for both horizontal and vertical
784  // in the order that leaves toolbar in correct final state
785 
786  // however, skip calculating alternate orientations if we don't need them due to window style
787  bool retval = true;
788 
789  if( m_orientation == wxHORIZONTAL )
790  {
791  if( !( GetWindowStyle() & wxAUI_TB_HORIZONTAL ) )
792  {
793  m_vertHintSize = GetSize();
794  retval = RealizeHelper( dc, false );
795  }
796 
797  if( retval && RealizeHelper( dc, true ) )
798  {
799  m_horzHintSize = GetSize();
800  }
801  else
802  {
803  retval = false;
804  }
805  }
806  else
807  {
808  if( !( GetWindowStyle() & wxAUI_TB_VERTICAL ) )
809  {
810  m_horzHintSize = GetSize();
811  retval = RealizeHelper( dc, true );
812  }
813 
814  if( retval && RealizeHelper( dc, false ) )
815  {
816  m_vertHintSize = GetSize();
817  }
818  else
819  {
820  retval = false;
821  }
822  }
823 
824  Refresh( false );
825  return retval;
826 }
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...

References Refresh().

Referenced by GERBVIEW_FRAME::ReCreateAuxiliaryToolbar(), PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar(), GERBVIEW_FRAME::ReCreateHToolbar(), SYMBOL_VIEWER_FRAME::ReCreateHToolbar(), PL_EDITOR_FRAME::ReCreateHToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateHToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar(), SCH_EDIT_FRAME::ReCreateHToolbar(), PCB_EDIT_FRAME::ReCreateHToolbar(), EDA_3D_VIEWER_FRAME::ReCreateMainToolbar(), GERBVIEW_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_VIEWER_FRAME::ReCreateOptToolbar(), PL_EDITOR_FRAME::ReCreateOptToolbar(), SCH_EDIT_FRAME::ReCreateOptToolbar(), PCB_EDIT_FRAME::ReCreateOptToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateVToolbar(), PL_EDITOR_FRAME::ReCreateVToolbar(), SCH_EDIT_FRAME::ReCreateVToolbar(), and PCB_EDIT_FRAME::ReCreateVToolbar().

◆ OnCustomRender()

void ACTION_TOOLBAR::OnCustomRender ( wxDC &  aDc,
const wxAuiToolBarItem &  aItem,
const wxRect &  aRect 
)
overrideprotected

Definition at line 739 of file action_toolbar.cpp.

740 {
741  auto it = m_actionGroups.find( aItem.GetId() );
742 
743  if( it == m_actionGroups.end() )
744  return;
745 
746  // Choose the color to draw the triangle
747  wxColour clr;
748 
749  if( aItem.GetState() & wxAUI_BUTTON_STATE_DISABLED )
750  clr = wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT );
751  else
752  clr = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNTEXT );
753 
754  // Must set both the pen (for the outline) and the brush (for the polygon fill)
755  aDc.SetPen( wxPen( clr ) );
756  aDc.SetBrush( wxBrush( clr ) );
757 
758  // Make the side length of the triangle approximately 1/5th of the bitmap
759  int sideLength = KiROUND( aRect.height / 5.0 );
760 
761  // This will create a triangle with its point at the bottom right corner,
762  // and its other two corners along the right and bottom sides
763  wxPoint btmRight = aRect.GetBottomRight();
764  wxPoint topCorner( btmRight.x, btmRight.y - sideLength );
765  wxPoint btmCorner( btmRight.x - sideLength, btmRight.y );
766 
767  wxPointList points;
768  points.Append( &btmRight );
769  points.Append( &topCorner );
770  points.Append( &btmCorner );
771 
772  aDc.DrawPolygon( &points );
773 }
std::map< int, ACTION_GROUP * > m_actionGroups
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:73

References KiROUND(), and m_actionGroups.

◆ onItemDrag()

void ACTION_TOOLBAR::onItemDrag ( wxAuiToolBarEvent &  aEvent)
protected

The default tool event handler.

Definition at line 549 of file action_toolbar.cpp.

550 {
551  int toolId = aEvent.GetToolId();
552 
553  if( m_actionGroups.find( toolId ) != m_actionGroups.end() )
554  {
555  wxAuiToolBarItem* item = FindTool( toolId );
556 
557  // Use call after because opening the palette from a mouse handler
558  // creates a weird mouse state that causes problems on OSX.
559  CallAfter( &ACTION_TOOLBAR::popupPalette, item );
560 
561  // Don't skip this event since we are handling it
562  return;
563  }
564 
565  // Skip since we don't care about it
566  aEvent.Skip();
567 }
void popupPalette(wxAuiToolBarItem *aItem)
Popup the ACTION_TOOLBAR_PALETTE associated with the ACTION_GROUP of the given toolbar item.
std::map< int, ACTION_GROUP * > m_actionGroups

References m_actionGroups, and popupPalette().

Referenced by ACTION_TOOLBAR().

◆ onMouseClick()

void ACTION_TOOLBAR::onMouseClick ( wxMouseEvent &  aEvent)
protected

Handler for when a drag event occurs on an item.

Definition at line 521 of file action_toolbar.cpp.

522 {
523  wxAuiToolBarItem* item = FindToolByPosition( aEvent.GetX(), aEvent.GetY() );
524 
525  if( item )
526  {
527  // Ensure there is no active palette
528  if( m_palette )
529  {
530  m_palette->Hide();
531  m_palette->Destroy();
532  m_palette = nullptr;
533  }
534 
535  // Start the popup conditions if it is a left mouse click and the tool clicked is a group
536  if( aEvent.LeftDown() && ( m_actionGroups.find( item->GetId() ) != m_actionGroups.end() ) )
537  m_paletteTimer->StartOnce( PALETTE_OPEN_DELAY );
538 
539  // Clear the popup conditions if it is a left up, because that implies a click happened
540  if( aEvent.LeftUp() )
541  m_paletteTimer->Stop();
542  }
543 
544  // Skip the event so wx can continue processing the mouse event
545  aEvent.Skip();
546 }
#define PALETTE_OPEN_DELAY
ACTION_TOOLBAR_PALETTE * m_palette
std::map< int, ACTION_GROUP * > m_actionGroups
wxTimer * m_paletteTimer

References m_actionGroups, m_palette, m_paletteTimer, and PALETTE_OPEN_DELAY.

Referenced by ACTION_TOOLBAR().

◆ onPaletteEvent()

void ACTION_TOOLBAR::onPaletteEvent ( wxCommandEvent &  aEvent)
protected

Handle the palette timer triggering.

Definition at line 582 of file action_toolbar.cpp.

583 {
584  if( !m_palette )
585  return;
586 
587  OPT_TOOL_EVENT evt;
589 
590  // Find the action corresponding to the button press
591  auto actionIt = std::find_if( group->GetActions().begin(), group->GetActions().end(),
592  [=]( const TOOL_ACTION* aAction )
593  {
594  return aAction->GetUIId() == aEvent.GetId();
595  } );
596 
597  if( actionIt != group->GetActions().end() )
598  {
599  const TOOL_ACTION* action = *actionIt;
600 
601  // Dispatch a tool event
602  evt = action->MakeEvent();
603  evt->SetHasPosition( false );
604  m_toolManager->ProcessEvent( *evt );
606 
607  // Update the main toolbar item with the selected action
608  doSelectAction( group, *action );
609  }
610 
611  // Hide the palette
612  m_palette->Hide();
613  m_palette->Destroy();
614  m_palette = nullptr;
615 }
ACTION_GROUP * GetGroup()
virtual void RefreshCanvas()
Definition: tools_holder.h:153
A group of actions that will be displayed together on a toolbar palette.
void doSelectAction(ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
Update a group toolbar item to look like a specific action.
bool ProcessEvent(const TOOL_EVENT &aEvent)
Propagate an event to tools that requested events of matching type(s).
ACTION_TOOLBAR_PALETTE * m_palette
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:294
TOOL_MANAGER * m_toolManager
Represent a single user action.
Definition: tool_action.h:67
TOOL_EVENT MakeEvent() const
Return the event associated with the action (i.e.
Definition: tool_action.cpp:72
void SetHasPosition(bool aHasPosition)
Returns if the action associated with this event should be treated as immediate regardless of the cur...
Definition: tool_event.h:241
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:548

References doSelectAction(), ACTION_TOOLBAR_PALETTE::GetGroup(), TOOL_MANAGER::GetToolHolder(), group, m_palette, m_toolManager, TOOL_ACTION::MakeEvent(), TOOL_MANAGER::ProcessEvent(), TOOLS_HOLDER::RefreshCanvas(), and TOOL_EVENT::SetHasPosition().

Referenced by popupPalette().

◆ onThemeChanged()

void ACTION_TOOLBAR::onThemeChanged ( wxSysColourChangedEvent &  aEvent)
protected

Render the triangle in the lower-right corner that represents that an action palette is available for an item.

Definition at line 829 of file action_toolbar.cpp.

830 {
832  RefreshBitmaps();
833 
834  aEvent.Skip();
835 }
void ThemeChanged()
Notifies the store that the icon theme has been changed by the user, so caches must be invalidated.
void RefreshBitmaps()
Reload all the bitmaps for the tools (e.g.
BITMAP_STORE * GetBitmapStore()
Definition: bitmap.cpp:93

References GetBitmapStore(), RefreshBitmaps(), and BITMAP_STORE::ThemeChanged().

Referenced by ACTION_TOOLBAR().

◆ onTimerDone()

void ACTION_TOOLBAR::onTimerDone ( wxTimerEvent &  aEvent)
protected

Definition at line 570 of file action_toolbar.cpp.

571 {
572  // We need to search for the tool using the client coordinates
573  wxPoint mousePos = ScreenToClient( wxGetMousePosition() );
574 
575  wxAuiToolBarItem* item = FindToolByPosition( mousePos.x, mousePos.y );
576 
577  if( item )
578  popupPalette( item );
579 }
void popupPalette(wxAuiToolBarItem *aItem)
Popup the ACTION_TOOLBAR_PALETTE associated with the ACTION_GROUP of the given toolbar item.

References popupPalette().

Referenced by ACTION_TOOLBAR().

◆ onToolEvent()

void ACTION_TOOLBAR::onToolEvent ( wxAuiToolBarEvent &  aEvent)
protected

Handle a right-click on a menu item.

Definition at line 440 of file action_toolbar.cpp.

441 {
442  int id = aEvent.GetId();
443  wxEventType type = aEvent.GetEventType();
444  OPT_TOOL_EVENT evt;
445 
446  bool handled = false;
447 
448  if( m_toolManager && type == wxEVT_COMMAND_TOOL_CLICKED && id >= TOOL_ACTION::GetBaseUIId() )
449  {
450  const auto actionIt = m_toolActions.find( id );
451 
452  // The toolbar item is toggled before the event is sent, so we check for it not being
453  // toggled to see if it was toggled originally
454  if( m_toolCancellable[id] && !GetToolToggled( id ) )
455  {
456  // Send a cancel event
458  handled = true;
459  }
460  else if( actionIt != m_toolActions.end() )
461  {
462  // Dispatch a tool event
463  evt = actionIt->second->MakeEvent();
464  evt->SetHasPosition( false );
465  m_toolManager->ProcessEvent( *evt );
467  handled = true;
468  }
469  }
470 
471  // Skip the event if we don't handle it
472  if( !handled )
473  aEvent.Skip();
474 }
virtual void RefreshCanvas()
Definition: tools_holder.h:153
std::map< int, const TOOL_ACTION * > m_toolActions
static int GetBaseUIId()
Definition: tool_action.h:135
bool ProcessEvent(const TOOL_EVENT &aEvent)
Propagate an event to tools that requested events of matching type(s).
std::map< int, bool > m_toolCancellable
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:294
TOOL_MANAGER * m_toolManager
void CancelTool()
Send a cancel event to the tool currently at the top of the tool stack.
OPT< TOOL_EVENT > OPT_TOOL_EVENT
Definition: tool_event.h:548

References TOOL_MANAGER::CancelTool(), TOOL_ACTION::GetBaseUIId(), TOOL_MANAGER::GetToolHolder(), m_toolActions, m_toolCancellable, m_toolManager, TOOL_MANAGER::ProcessEvent(), and TOOLS_HOLDER::RefreshCanvas().

Referenced by ACTION_TOOLBAR().

◆ onToolRightClick()

void ACTION_TOOLBAR::onToolRightClick ( wxAuiToolBarEvent &  aEvent)
protected

Handle the button select inside the palette.

Definition at line 477 of file action_toolbar.cpp.

478 {
479  int toolId = aEvent.GetToolId();
480 
481  // This means the event was not on a button
482  if( toolId == -1 )
483  return;
484 
485  // Ensure that the ID used maps to a proper tool ID.
486  // If right-clicked on a group item, this is needed to get the ID of the currently selected
487  // action, since the event's ID is that of the group.
488  const auto actionIt = m_toolActions.find( toolId );
489 
490  if( actionIt != m_toolActions.end() )
491  toolId = actionIt->second->GetUIId();
492 
493  // Find the menu for the action
494  const auto menuIt = m_toolMenus.find( toolId );
495 
496  if( menuIt == m_toolMenus.end() )
497  return;
498 
499  // Update and show the menu
500  std::unique_ptr<ACTION_MENU>& owningMenu = menuIt->second;
501 
502  // Get the actual menu pointer to show it
503  ACTION_MENU* menu = owningMenu.get();
504  SELECTION dummySel;
505 
506  if( CONDITIONAL_MENU* condMenu = dynamic_cast<CONDITIONAL_MENU*>( menu ) )
507  condMenu->Evaluate( dummySel );
508 
509  menu->UpdateAll();
510  PopupMenu( menu );
511 
512  // Remove hovered item when the menu closes, otherwise it remains hovered even if the
513  // mouse is not on the toolbar
514  SetHoverItem( nullptr );
515 }
Defines the structure of a menu based on ACTIONs.
Definition: action_menu.h:48
void UpdateAll()
Run update handlers for the menu and its submenus.
std::map< int, const TOOL_ACTION * > m_toolActions
std::map< int, std::unique_ptr< ACTION_MENU > > m_toolMenus

References m_toolActions, m_toolMenus, and ACTION_MENU::UpdateAll().

Referenced by ACTION_TOOLBAR().

◆ popupPalette()

void ACTION_TOOLBAR::popupPalette ( wxAuiToolBarItem *  aItem)
protected

Popup the ACTION_TOOLBAR_PALETTE associated with the ACTION_GROUP of the given toolbar item.

Handler for a mouse up/down event

Definition at line 618 of file action_toolbar.cpp.

619 {
620  // Clear all popup conditions
621  m_paletteTimer->Stop();
622 
623  wxWindow* toolParent = dynamic_cast<wxWindow*>( m_toolManager->GetToolHolder() );
624 
625  wxASSERT( GetParent() );
626  wxASSERT( m_auiManager );
627  wxASSERT( toolParent );
628 
629  // Ensure the item we are using for the palette has a group associated with it.
630  const auto it = m_actionGroups.find( aItem->GetId() );
631 
632  if( it == m_actionGroups.end() )
633  return;
634 
635  ACTION_GROUP* group = it->second;
636 
637  wxAuiPaneInfo& pane = m_auiManager->GetPane( this );
638 
639  // We use the size of the toolbar items for our palette buttons
640  wxRect toolRect = GetToolRect( aItem->GetId() );
641 
642  // The position for the palette window must be in screen coordinates
643  wxPoint pos( ClientToScreen( toolRect.GetPosition() ) );
644 
645  // True for vertical buttons, false for horizontal
646  bool dir = true;
647  size_t numActions = group->m_actions.size();
648 
649  // The size of the palette in the long dimension
650  int paletteLongDim = ( 2 * PALETTE_BORDER ) // The border on all sides of the buttons
651  + ( BUTTON_BORDER ) // The border on the start of the buttons
652  + ( numActions * BUTTON_BORDER ) // The other button borders
653  + ( numActions * toolRect.GetHeight() ); // The size of the buttons
654 
655  // Determine the position of the top left corner of the palette window
656  switch( pane.dock_direction )
657  {
658  case wxAUI_DOCK_TOP:
659  // Top toolbars need to shift the palette window down by the toolbar padding
660  dir = true; // Buttons are vertical in the palette
661  pos = ClientToScreen( toolRect.GetBottomLeft() );
662  pos += wxPoint( -PALETTE_BORDER, // Shift left to align the button edges
663  m_bottomPadding ); // Shift down to move away from the toolbar
664  break;
665 
666  case wxAUI_DOCK_BOTTOM:
667  // Bottom toolbars need to shift the palette window up by its height (all buttons +
668  // border + toolbar padding)
669  dir = true; // Buttons are vertical in the palette
670  pos = ClientToScreen( toolRect.GetTopLeft() );
671  pos += wxPoint( -PALETTE_BORDER, // Shift left to align the button
672  // Shift up by the entire length of the palette.
673  -( paletteLongDim + m_topPadding ) );
674  break;
675 
676  case wxAUI_DOCK_LEFT:
677  // Left toolbars need to shift the palette window up by the toolbar padding
678  dir = false; // Buttons are horizontal in the palette
679  pos = ClientToScreen( toolRect.GetTopRight() );
680  pos += wxPoint( m_rightPadding, // Shift right to move away from the toolbar
681  -( PALETTE_BORDER ) ); // Shift up to align the button tops
682  break;
683 
684  case wxAUI_DOCK_RIGHT:
685  // Right toolbars need to shift the palette window left by its width (all buttons +
686  // border + toolbar padding)
687  dir = false; // Buttons are horizontal in the palette
688  pos = ClientToScreen( toolRect.GetTopLeft() );
689 
690  // Shift left by the entire length of the palette.
691  pos += wxPoint( -( paletteLongDim + m_leftPadding ),
692  -( PALETTE_BORDER ) ); // Shift up to align the button
693  break;
694  }
695 
696  m_palette = new ACTION_TOOLBAR_PALETTE( GetParent(), dir );
697 
698  // We handle the button events in the toolbar class, so connect the right handler
700  m_palette->SetButtonSize( toolRect );
701  m_palette->Connect( wxEVT_BUTTON, wxCommandEventHandler( ACTION_TOOLBAR::onPaletteEvent ),
702  nullptr, this );
703 
704 
705  // Add the actions in the group to the palette and update their enabled state
706  // We purposely don't check items in the palette
707  for( const TOOL_ACTION* action : group->m_actions )
708  {
709  wxUpdateUIEvent evt( action->GetUIId() );
710 
711  toolParent->ProcessWindowEvent( evt );
712 
713  m_palette->AddAction( *action );
714 
715  if( evt.GetSetEnabled() )
716  m_palette->EnableAction( *action, evt.GetEnabled() );
717  }
718 
719  // Release the mouse to ensure the first click will be recognized in the palette
720  ReleaseMouse();
721 
722  m_palette->SetPosition( pos );
723  m_palette->Popup();
724 
725  // Clear the mouse state on the toolbar because otherwise wxWidgets gets confused
726  // and won't properly display any highlighted items after the palette is closed.
727  // (This is the equivalent of calling the DoResetMouseState() private function)
728  RefreshOverflowState();
729  SetHoverItem( nullptr );
730  SetPressedItem( nullptr );
731 
732  m_dragging = false;
733  m_tipItem = nullptr;
734  m_actionPos = wxPoint( -1, -1 );
735  m_actionItem = nullptr;
736 }
int GetUIId() const
Definition: tool_action.h:130
void SetButtonSize(wxRect &aSize)
Set the size all the buttons on this palette should be.
A group of actions that will be displayed together on a toolbar palette.
void AddAction(const TOOL_ACTION &aAction)
Add an action to the palette.
void SetGroup(ACTION_GROUP *aGroup)
Set the action group that this palette contains the actions for.
ACTION_TOOLBAR_PALETTE * m_palette
TOOLS_HOLDER * GetToolHolder() const
Definition: tool_manager.h:294
wxAuiManager * m_auiManager
TOOL_MANAGER * m_toolManager
std::map< int, ACTION_GROUP * > m_actionGroups
Represent a single user action.
Definition: tool_action.h:67
#define PALETTE_BORDER
void Popup(wxWindow *aFocus=nullptr) override
Popup this window.
#define BUTTON_BORDER
void EnableAction(const TOOL_ACTION &aAction, bool aEnable=true)
Enable the button for an action on the palette.
wxTimer * m_paletteTimer
A popup window that contains a row of toolbar-like buttons for the user to choose from.
void onPaletteEvent(wxCommandEvent &aEvent)
Handle the palette timer triggering.

References ACTION_TOOLBAR_PALETTE::AddAction(), BUTTON_BORDER, ACTION_TOOLBAR_PALETTE::EnableAction(), TOOL_MANAGER::GetToolHolder(), TOOL_ACTION::GetUIId(), group, m_actionGroups, m_auiManager, m_palette, m_paletteTimer, m_toolManager, onPaletteEvent(), PALETTE_BORDER, ACTION_TOOLBAR_PALETTE::Popup(), ACTION_TOOLBAR_PALETTE::SetButtonSize(), and ACTION_TOOLBAR_PALETTE::SetGroup().

Referenced by onItemDrag(), and onTimerDone().

◆ RefreshBitmaps()

void ACTION_TOOLBAR::RefreshBitmaps ( )

Reload all the bitmaps for the tools (e.g.

when switching icon themes)

Definition at line 838 of file action_toolbar.cpp.

839 {
840  for( const std::pair<int, const TOOL_ACTION*> pair : m_toolActions )
841  {
842  wxAuiToolBarItem* tool = FindTool( pair.first );
843 
844  wxBitmap bmp = KiScaledBitmap( pair.second->GetIcon(), GetParent() );
845 
846  tool->SetBitmap( bmp );
847  tool->SetDisabledBitmap( MakeDisabledBitmap( bmp ) );
848  }
849 
850  Refresh();
851 }
wxBitmap MakeDisabledBitmap(const wxBitmap &aSource)
std::map< int, const TOOL_ACTION * > m_toolActions
void Refresh()
Update the board display after modifying it by a python script (note: it is automatically called by a...
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight, bool aQuantized)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148

References KiScaledBitmap(), m_toolActions, MakeDisabledBitmap(), and Refresh().

Referenced by onThemeChanged().

◆ SelectAction()

void ACTION_TOOLBAR::SelectAction ( ACTION_GROUP aGroup,
const TOOL_ACTION aAction 
)

Select an action inside a group.

Parameters
aGroupis the group that contains the action
aActionis the action inside the group

Definition at line 310 of file action_toolbar.cpp.

311 {
312  bool valid = std::any_of( aGroup->m_actions.begin(), aGroup->m_actions.end(),
313  [&]( const TOOL_ACTION* action2 ) -> bool
314  {
315  // For some reason, we can't compare the actions directly
316  return aAction.GetId() == action2->GetId();
317  } );
318 
319  if( valid )
320  doSelectAction( aGroup, aAction );
321 }
void doSelectAction(ACTION_GROUP *aGroup, const TOOL_ACTION &aAction)
Update a group toolbar item to look like a specific action.
std::vector< const TOOL_ACTION * > m_actions
int GetId() const
Return the unique id of the TOOL_ACTION object.
Definition: tool_action.h:121
Represent a single user action.
Definition: tool_action.h:67

References doSelectAction(), TOOL_ACTION::GetId(), and ACTION_GROUP::m_actions.

◆ SetAuiManager()

void ACTION_TOOLBAR::SetAuiManager ( wxAuiManager *  aManager)
inline

◆ SetToolBitmap()

void ACTION_TOOLBAR::SetToolBitmap ( const TOOL_ACTION aAction,
const wxBitmap &  aBitmap 
)

Updates the bitmap of a particular tool.

Not icon-based because we use it for the custom-drawn layer pair bitmap.

Definition at line 407 of file action_toolbar.cpp.

408 {
409  int toolId = aAction.GetUIId();
410  wxAuiToolBar::SetToolBitmap( toolId, aBitmap );
411 
412  // Set the disabled bitmap: we use the disabled bitmap version of aBitmap.
413  wxAuiToolBarItem* tb_item = wxAuiToolBar::FindTool( toolId );
414 
415  if( tb_item )
416  tb_item->SetDisabledBitmap( MakeDisabledBitmap( aBitmap ) );
417 }
wxBitmap MakeDisabledBitmap(const wxBitmap &aSource)
int GetUIId() const
Definition: tool_action.h:130

References TOOL_ACTION::GetUIId(), and MakeDisabledBitmap().

Referenced by PCB_EDIT_FRAME::PrepareLayerIndicator().

◆ Toggle() [1/2]

void ACTION_TOOLBAR::Toggle ( const TOOL_ACTION aAction,
bool  aState 
)

Apply the default toggle action.

For checked items this is check/uncheck; for non-checked items it's enable/disable.

Definition at line 420 of file action_toolbar.cpp.

421 {
422  int toolId = aAction.GetUIId();
423 
424  if( m_toolKinds[ toolId ] )
425  ToggleTool( toolId, aState );
426  else
427  EnableTool( toolId, aState );
428 }
int GetUIId() const
Definition: tool_action.h:130
std::map< int, bool > m_toolKinds

References TOOL_ACTION::GetUIId(), and m_toolKinds.

◆ Toggle() [2/2]

void ACTION_TOOLBAR::Toggle ( const TOOL_ACTION aAction,
bool  aEnabled,
bool  aChecked 
)

Definition at line 431 of file action_toolbar.cpp.

432 {
433  int toolId = aAction.GetUIId();
434 
435  EnableTool( toolId, aEnabled );
436  ToggleTool( toolId, aEnabled && aChecked );
437 }
int GetUIId() const
Definition: tool_action.h:130

References TOOL_ACTION::GetUIId().

◆ UpdateControlWidth()

void ACTION_TOOLBAR::UpdateControlWidth ( int  aID)

Update the toolbar item width of a control using its best size.

Parameters
aIDis the ID of the toolbar item to update the width for

Definition at line 359 of file action_toolbar.cpp.

360 {
361  wxAuiToolBarItem* item = FindTool( aID );
362  wxASSERT_MSG( item, wxString::Format( "No toolbar item found for ID %d", aID ) );
363 
364  // The control on the toolbar is stored inside the window field of the item
365  wxControl* control = dynamic_cast<wxControl*>( item->GetWindow() );
366  wxASSERT_MSG( control, wxString::Format( "No control located in toolbar item with ID %d", aID ) );
367 
368  // Update the size the item has stored using the best size of the control
369  wxSize bestSize = control->GetBestSize();
370  item->SetMinSize( bestSize );
371 
372  // Update the sizer item sizes
373  // This is a bit convoluted because there are actually 2 sizers that need to be updated:
374  // 1. The main sizer that is used for the entire toolbar (this sizer item can be found in the
375  // toolbar item)
376  if( wxSizerItem* szrItem = item->GetSizerItem() )
377  szrItem->SetMinSize( bestSize );
378 
379  // 2. The controls have a second sizer that allows for padding above/below the control with
380  // stretch space, so we also need to update the sizer item for the control in that sizer with
381  // the new size. We let wx do the search for us, since SetItemMinSize is recursive and will
382  // locate the control on that sizer.
383  if( m_sizer )
384  {
385  m_sizer->SetItemMinSize( control, bestSize );
386 
387  // Now actually update the toolbar with the new sizes
388  m_sizer->Layout();
389  }
390 }
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200

References Format().

Referenced by GERBVIEW_FRAME::ReCreateAuxiliaryToolbar(), PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar(), DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar(), GERBVIEW_FRAME::ReCreateHToolbar(), PL_EDITOR_FRAME::ReCreateHToolbar(), FOOTPRINT_EDIT_FRAME::ReCreateHToolbar(), PCB_EDIT_FRAME::ReCreateHToolbar(), DISPLAY_FOOTPRINTS_FRAME::UpdateToolbarControlSizes(), GERBVIEW_FRAME::UpdateToolbarControlSizes(), PL_EDITOR_FRAME::UpdateToolbarControlSizes(), FOOTPRINT_EDIT_FRAME::UpdateToolbarControlSizes(), and PCB_EDIT_FRAME::UpdateToolbarControlSizes().

Member Data Documentation

◆ CANCEL

◆ m_actionGroups

std::map<int, ACTION_GROUP*> ACTION_TOOLBAR::m_actionGroups
protected

◆ m_auiManager

wxAuiManager* ACTION_TOOLBAR::m_auiManager
protected

Definition at line 343 of file action_toolbar.h.

Referenced by popupPalette(), and SetAuiManager().

◆ m_palette

ACTION_TOOLBAR_PALETTE* ACTION_TOOLBAR::m_palette
protected

Definition at line 345 of file action_toolbar.h.

Referenced by onMouseClick(), onPaletteEvent(), and popupPalette().

◆ m_paletteTimer

wxTimer* ACTION_TOOLBAR::m_paletteTimer
protected

Definition at line 341 of file action_toolbar.h.

Referenced by ACTION_TOOLBAR(), onMouseClick(), popupPalette(), and ~ACTION_TOOLBAR().

◆ m_toolActions

std::map<int, const TOOL_ACTION*> ACTION_TOOLBAR::m_toolActions
protected

◆ m_toolCancellable

std::map<int, bool> ACTION_TOOLBAR::m_toolCancellable
protected

Definition at line 348 of file action_toolbar.h.

Referenced by Add(), ClearToolbar(), onToolEvent(), and ~ACTION_TOOLBAR().

◆ m_toolKinds

std::map<int, bool> ACTION_TOOLBAR::m_toolKinds
protected

Definition at line 347 of file action_toolbar.h.

Referenced by Add(), AddButton(), AddGroup(), ClearToolbar(), Toggle(), and ~ACTION_TOOLBAR().

◆ m_toolManager

TOOL_MANAGER* ACTION_TOOLBAR::m_toolManager
protected

Definition at line 344 of file action_toolbar.h.

Referenced by doSelectAction(), onPaletteEvent(), onToolEvent(), and popupPalette().

◆ m_toolMenus

std::map<int, std::unique_ptr<ACTION_MENU> > ACTION_TOOLBAR::m_toolMenus
protected

◆ TOGGLE


The documentation for this class was generated from the following files: