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)
 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 183 of file action_toolbar.cpp.

184  :
185  wxAuiToolBar( parent, id, pos, size, style ),
186  m_paletteTimer( nullptr ),
187  m_auiManager( nullptr ),
188  m_toolManager( parent->GetToolManager() ),
189  m_palette( nullptr )
190 {
191  m_paletteTimer = new wxTimer( this );
192 
193 #if !wxCHECK_VERSION( 3, 1, 0 )
194  // Custom art provider makes dark mode work on wx < 3.1
195  WX_AUI_TOOLBAR_ART* newArt = new WX_AUI_TOOLBAR_ART();
196  SetArtProvider( newArt );
197 #endif
198 
199  Connect( wxEVT_COMMAND_TOOL_CLICKED, wxAuiToolBarEventHandler( ACTION_TOOLBAR::onToolEvent ),
200  nullptr, this );
201  Connect( wxEVT_AUITOOLBAR_RIGHT_CLICK,
202  wxAuiToolBarEventHandler( ACTION_TOOLBAR::onToolRightClick ),
203  nullptr, this );
204  Connect( wxEVT_AUITOOLBAR_BEGIN_DRAG, wxAuiToolBarEventHandler( ACTION_TOOLBAR::onItemDrag ),
205  nullptr, this );
206  Connect( wxEVT_LEFT_DOWN, wxMouseEventHandler( ACTION_TOOLBAR::onMouseClick ), nullptr, this );
207  Connect( wxEVT_LEFT_UP, wxMouseEventHandler( ACTION_TOOLBAR::onMouseClick ), nullptr, this );
208  Connect( m_paletteTimer->GetId(), wxEVT_TIMER,
209  wxTimerEventHandler( ACTION_TOOLBAR::onTimerDone ), nullptr, this );
210 }
void onItemDrag(wxAuiToolBarEvent &aEvent)
The default tool event handler.
void onToolRightClick(wxAuiToolBarEvent &aEvent)
Handle the button select inside the palette.
void onTimerDone(wxTimerEvent &aEvent)
Render the triangle in the lower-right corner that represents that an action palette is available for...
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.
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(), onTimerDone(), onToolEvent(), and onToolRightClick().

◆ ~ACTION_TOOLBAR()

ACTION_TOOLBAR::~ACTION_TOOLBAR ( )
virtual

Definition at line 213 of file action_toolbar.cpp.

214 {
215  delete m_paletteTimer;
216 
217  // Clear all the maps keeping track of our items on the toolbar
218  m_toolMenus.clear();
219  m_actionGroups.clear();
220  m_toolCancellable.clear();
221  m_toolKinds.clear();
222  m_toolActions.clear();
223 }
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 226 of file action_toolbar.cpp.

227 {
228  wxASSERT( GetParent() );
229  wxASSERT_MSG( !( aIsCancellable && !aIsToggleEntry ), "aIsCancellable requires aIsToggleEntry" );
230 
231  int toolId = aAction.GetUIId();
232  wxBitmap bmp = KiScaledBitmap( aAction.GetIcon(), GetParent() );
233 
234  AddTool( toolId, wxEmptyString, bmp, MakeDisabledBitmap( bmp ),
235  aIsToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL,
236  aAction.GetDescription(), wxEmptyString, nullptr );
237 
238  m_toolKinds[ toolId ] = aIsToggleEntry;
239  m_toolActions[ toolId ] = &aAction;
240  m_toolCancellable[ toolId ] = aIsCancellable;
241 }
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
std::map< int, bool > m_toolKinds
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148

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 244 of file action_toolbar.cpp.

245 {
246  int toolId = aAction.GetUIId();
247  wxBitmap bmp = KiScaledBitmap( aAction.GetIcon(), GetParent() );
248 
249  AddTool( toolId, wxEmptyString, bmp, MakeDisabledBitmap( bmp ),
250  wxITEM_NORMAL, aAction.GetDescription(), wxEmptyString, nullptr );
251 
252  m_toolKinds[ toolId ] = false;
253  m_toolActions[ toolId ] = &aAction;
254 }
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
std::map< int, bool > m_toolKinds
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148

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 283 of file action_toolbar.cpp.

284 {
285  int groupId = aGroup->GetUIId();
286  const TOOL_ACTION* defaultAction = aGroup->GetDefaultAction();
287  wxBitmap bmp = KiScaledBitmap( defaultAction->GetIcon(), GetParent() );
288 
289  wxASSERT( GetParent() );
290  wxASSERT( defaultAction );
291 
292  m_toolKinds[ groupId ] = aIsToggleEntry;
293  m_toolActions[ groupId ] = defaultAction;
294  m_actionGroups[ groupId ] = aGroup;
295 
296  // Add the main toolbar item representing the group
297  AddTool( groupId, wxEmptyString, bmp, MakeDisabledBitmap( bmp ),
298  aIsToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL,
299  wxEmptyString, wxEmptyString, nullptr );
300 
301  // Select the default action
302  doSelectAction( aGroup, *defaultAction );
303 }
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
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
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148

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 257 of file action_toolbar.cpp.

258 {
259  int scale = Pgm().GetCommonSettings()->m_Appearance.icon_scale;
260 
261  if( scale == 0 )
262  scale = KiIconScale( aWindow );
263 
264  if( scale > 4 )
265  AddSpacer( 16 * ( scale - 4 ) / 4 );
266 
267  AddSeparator();
268 
269  if( scale > 4 )
270  AddSpacer( 16 * ( scale - 4 ) / 4 );
271 }
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 274 of file action_toolbar.cpp.

276 {
277  int toolId = aAction.GetUIId();
278 
279  m_toolMenus[toolId] = std::move( aMenu );
280 }
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 389 of file action_toolbar.cpp.

390 {
391  // Clear all the maps keeping track of our items on the toolbar
392  m_toolMenus.clear();
393  m_actionGroups.clear();
394  m_toolCancellable.clear();
395  m_toolKinds.clear();
396  m_toolActions.clear();
397 
398  // Remove the actual tools from the toolbar
399  Clear();
400 }
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 320 of file action_toolbar.cpp.

321 {
322  wxASSERT( GetParent() );
323 
324  int groupId = aGroup->GetUIId();
325 
326  wxAuiToolBarItem* item = FindTool( groupId );
327 
328  if( !item )
329  return;
330 
331  // Update the item information
332  item->SetShortHelp( aAction.GetDescription() );
333  item->SetBitmap( KiScaledBitmap( aAction.GetIcon(), GetParent() ) );
334  item->SetDisabledBitmap( MakeDisabledBitmap( item->GetBitmap() ) );
335 
336  // Register a new handler with the new UI conditions
337  if( m_toolManager )
338  {
339  const ACTION_CONDITIONS* cond = m_toolManager->GetActionManager()->GetCondition( aAction );
340 
341  wxASSERT_MSG( cond, wxString::Format( "Missing UI condition for action %s",
342  aAction.GetName() ) );
343 
346  }
347 
348  // Update the currently selected action
349  m_toolActions[ groupId ] = &aAction;
350 
351  Refresh();
352 }
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
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
wxBitmap KiScaledBitmap(BITMAPS aBitmap, wxWindow *aWindow, int aHeight)
Construct a wxBitmap from a memory record, scaling it if device DPI demands it.
Definition: bitmap.cpp:148
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 772 of file action_toolbar.cpp.

773 {
774  wxClientDC dc( this );
775 
776  if( !dc.IsOk() )
777  return false;
778 
779  // calculate hint sizes for both horizontal and vertical
780  // in the order that leaves toolbar in correct final state
781 
782  // however, skip calculating alternate orientations if we don't need them due to window style
783  bool retval = true;
784 
785  if( m_orientation == wxHORIZONTAL )
786  {
787  if( !( GetWindowStyle() & wxAUI_TB_HORIZONTAL ) )
788  {
789  m_vertHintSize = GetSize();
790  retval = RealizeHelper( dc, false );
791  }
792 
793  if( retval && RealizeHelper( dc, true ) )
794  {
795  m_horzHintSize = GetSize();
796  }
797  else
798  {
799  retval = false;
800  }
801  }
802  else
803  {
804  if( !( GetWindowStyle() & wxAUI_TB_VERTICAL ) )
805  {
806  m_horzHintSize = GetSize();
807  retval = RealizeHelper( dc, true );
808  }
809 
810  if( retval && RealizeHelper( dc, false ) )
811  {
812  m_vertHintSize = GetSize();
813  }
814  else
815  {
816  retval = false;
817  }
818  }
819 
820  Refresh( false );
821  return retval;
822 }
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 735 of file action_toolbar.cpp.

736 {
737  auto it = m_actionGroups.find( aItem.GetId() );
738 
739  if( it == m_actionGroups.end() )
740  return;
741 
742  // Choose the color to draw the triangle
743  wxColour clr;
744 
745  if( aItem.GetState() & wxAUI_BUTTON_STATE_DISABLED )
746  clr = wxSystemSettings::GetColour( wxSYS_COLOUR_GRAYTEXT );
747  else
748  clr = wxSystemSettings::GetColour( wxSYS_COLOUR_BTNTEXT );
749 
750  // Must set both the pen (for the outline) and the brush (for the polygon fill)
751  aDc.SetPen( wxPen( clr ) );
752  aDc.SetBrush( wxBrush( clr ) );
753 
754  // Make the side length of the triangle approximately 1/5th of the bitmap
755  int sideLength = KiROUND( aRect.height / 5.0 );
756 
757  // This will create a triangle with its point at the bottom right corner,
758  // and its other two corners along the right and bottom sides
759  wxPoint btmRight = aRect.GetBottomRight();
760  wxPoint topCorner( btmRight.x, btmRight.y - sideLength );
761  wxPoint btmCorner( btmRight.x - sideLength, btmRight.y );
762 
763  wxPointList points;
764  points.Append( &btmRight );
765  points.Append( &topCorner );
766  points.Append( &btmCorner );
767 
768  aDc.DrawPolygon( &points );
769 }
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:70

References KiROUND(), and m_actionGroups.

◆ onItemDrag()

void ACTION_TOOLBAR::onItemDrag ( wxAuiToolBarEvent &  aEvent)
protected

The default tool event handler.

Definition at line 545 of file action_toolbar.cpp.

546 {
547  int toolId = aEvent.GetToolId();
548 
549  if( m_actionGroups.find( toolId ) != m_actionGroups.end() )
550  {
551  wxAuiToolBarItem* item = FindTool( toolId );
552 
553  // Use call after because opening the palette from a mouse handler
554  // creates a weird mouse state that causes problems on OSX.
555  CallAfter( &ACTION_TOOLBAR::popupPalette, item );
556 
557  // Don't skip this event since we are handling it
558  return;
559  }
560 
561  // Skip since we don't care about it
562  aEvent.Skip();
563 }
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 517 of file action_toolbar.cpp.

518 {
519  wxAuiToolBarItem* item = FindToolByPosition( aEvent.GetX(), aEvent.GetY() );
520 
521  if( item )
522  {
523  // Ensure there is no active palette
524  if( m_palette )
525  {
526  m_palette->Hide();
527  m_palette->Destroy();
528  m_palette = nullptr;
529  }
530 
531  // Start the popup conditions if it is a left mouse click and the tool clicked is a group
532  if( aEvent.LeftDown() && ( m_actionGroups.find( item->GetId() ) != m_actionGroups.end() ) )
533  m_paletteTimer->StartOnce( PALETTE_OPEN_DELAY );
534 
535  // Clear the popup conditions if it is a left up, because that implies a click happened
536  if( aEvent.LeftUp() )
537  m_paletteTimer->Stop();
538  }
539 
540  // Skip the event so wx can continue processing the mouse event
541  aEvent.Skip();
542 }
#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 578 of file action_toolbar.cpp.

579 {
580  if( !m_palette )
581  return;
582 
583  OPT_TOOL_EVENT evt;
585 
586  // Find the action corresponding to the button press
587  auto actionIt = std::find_if( group->GetActions().begin(), group->GetActions().end(),
588  [=]( const TOOL_ACTION* aAction )
589  {
590  return aAction->GetUIId() == aEvent.GetId();
591  } );
592 
593  if( actionIt != group->GetActions().end() )
594  {
595  const TOOL_ACTION* action = *actionIt;
596 
597  // Dispatch a tool event
598  evt = action->MakeEvent();
599  evt->SetHasPosition( false );
600  m_toolManager->ProcessEvent( *evt );
602 
603  // Update the main toolbar item with the selected action
604  doSelectAction( group, *action );
605  }
606 
607  // Hide the palette
608  m_palette->Hide();
609  m_palette->Destroy();
610  m_palette = nullptr;
611 }
ACTION_GROUP * GetGroup()
virtual void RefreshCanvas()
Definition: tools_holder.h:151
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:543

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().

◆ onTimerDone()

void ACTION_TOOLBAR::onTimerDone ( wxTimerEvent &  aEvent)
protected

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

Definition at line 566 of file action_toolbar.cpp.

567 {
568  // We need to search for the tool using the client coordinates
569  wxPoint mousePos = ScreenToClient( wxGetMousePosition() );
570 
571  wxAuiToolBarItem* item = FindToolByPosition( mousePos.x, mousePos.y );
572 
573  if( item )
574  popupPalette( item );
575 }
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 436 of file action_toolbar.cpp.

437 {
438  int id = aEvent.GetId();
439  wxEventType type = aEvent.GetEventType();
440  OPT_TOOL_EVENT evt;
441 
442  bool handled = false;
443 
444  if( m_toolManager && type == wxEVT_COMMAND_TOOL_CLICKED && id >= TOOL_ACTION::GetBaseUIId() )
445  {
446  const auto actionIt = m_toolActions.find( id );
447 
448  // The toolbar item is toggled before the event is sent, so we check for it not being
449  // toggled to see if it was toggled originally
450  if( m_toolCancellable[id] && !GetToolToggled( id ) )
451  {
452  // Send a cancel event
454  handled = true;
455  }
456  else if( actionIt != m_toolActions.end() )
457  {
458  // Dispatch a tool event
459  evt = actionIt->second->MakeEvent();
460  evt->SetHasPosition( false );
461  m_toolManager->ProcessEvent( *evt );
463  handled = true;
464  }
465  }
466 
467  // Skip the event if we don't handle it
468  if( !handled )
469  aEvent.Skip();
470 }
virtual void RefreshCanvas()
Definition: tools_holder.h:151
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:543

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 473 of file action_toolbar.cpp.

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

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

826 {
827  for( const std::pair<int, const TOOL_ACTION*> pair : m_toolActions )
828  {
829  wxAuiToolBarItem* tool = FindTool( pair.first );
830 
831  wxBitmap bmp = KiScaledBitmap( pair.second->GetIcon(), GetParent() );
832 
833  tool->SetBitmap( bmp );
834  tool->SetDisabledBitmap( MakeDisabledBitmap( bmp ) );
835  }
836 
837  Refresh();
838 }
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)
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().

◆ 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 306 of file action_toolbar.cpp.

307 {
308  bool valid = std::any_of( aGroup->m_actions.begin(), aGroup->m_actions.end(),
309  [&]( const TOOL_ACTION* action2 ) -> bool
310  {
311  // For some reason, we can't compare the actions directly
312  return aAction.GetId() == action2->GetId();
313  } );
314 
315  if( valid )
316  doSelectAction( aGroup, aAction );
317 }
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 403 of file action_toolbar.cpp.

404 {
405  int toolId = aAction.GetUIId();
406  wxAuiToolBar::SetToolBitmap( toolId, aBitmap );
407 
408  // Set the disabled bitmap: we use the disabled bitmap version of aBitmap.
409  wxAuiToolBarItem* tb_item = wxAuiToolBar::FindTool( toolId );
410 
411  if( tb_item )
412  tb_item->SetDisabledBitmap( MakeDisabledBitmap( aBitmap ) );
413 }
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 416 of file action_toolbar.cpp.

417 {
418  int toolId = aAction.GetUIId();
419 
420  if( m_toolKinds[ toolId ] )
421  ToggleTool( toolId, aState );
422  else
423  EnableTool( toolId, aState );
424 }
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 427 of file action_toolbar.cpp.

428 {
429  int toolId = aAction.GetUIId();
430 
431  EnableTool( toolId, aEnabled );
432  ToggleTool( toolId, aEnabled && aChecked );
433 }
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 355 of file action_toolbar.cpp.

356 {
357  wxAuiToolBarItem* item = FindTool( aID );
358  wxASSERT_MSG( item, wxString::Format( "No toolbar item found for ID %d", aID ) );
359 
360  // The control on the toolbar is stored inside the window field of the item
361  wxControl* control = dynamic_cast<wxControl*>( item->GetWindow() );
362  wxASSERT_MSG( control, wxString::Format( "No control located in toolbar item with ID %d", aID ) );
363 
364  // Update the size the item has stored using the best size of the control
365  wxSize bestSize = control->GetBestSize();
366  item->SetMinSize( bestSize );
367 
368  // Update the sizer item sizes
369  // This is a bit convoluted because there are actually 2 sizers that need to be updated:
370  // 1. The main sizer that is used for the entire toolbar (this sizer item can be found in the
371  // toolbar item)
372  if( wxSizerItem* szrItem = item->GetSizerItem() )
373  szrItem->SetMinSize( bestSize );
374 
375  // 2. The controls have a second sizer that allows for padding above/below the control with
376  // stretch space, so we also need to update the sizer item for the control in that sizer with
377  // the new size. We let wx do the search for us, since SetItemMinSize is recursive and will
378  // locate the control on that sizer.
379  if( m_sizer )
380  {
381  m_sizer->SetItemMinSize( control, bestSize );
382 
383  // Now actually update the toolbar with the new sizes
384  m_sizer->Layout();
385  }
386 }
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 341 of file action_toolbar.h.

Referenced by popupPalette(), and SetAuiManager().

◆ m_palette

ACTION_TOOLBAR_PALETTE* ACTION_TOOLBAR::m_palette
protected

Definition at line 343 of file action_toolbar.h.

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

◆ m_paletteTimer

wxTimer* ACTION_TOOLBAR::m_paletteTimer
protected

Definition at line 339 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 346 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 345 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 342 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: