From 7ad1103f550fb8aea8db4cc84424d4be36ed461f Mon Sep 17 00:00:00 2001 From: Ian McInerney Date: Thu, 20 Feb 2025 02:53:15 +0000 Subject: [PATCH] Move toolbars to a serializable storage format --- 3d-viewer/3d_viewer/3d_toolbar.cpp | 103 ++- 3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp | 11 +- 3d-viewer/3d_viewer/eda_3d_viewer_frame.h | 4 +- 3d-viewer/3d_viewer/tools/eda_3d_actions.cpp | 6 +- common/eda_base_frame.cpp | 132 ++++ common/eda_draw_frame.cpp | 84 ++- common/tool/action_toolbar.cpp | 152 +++-- cvpcb/cvpcb_mainframe.cpp | 8 +- cvpcb/cvpcb_mainframe.h | 8 +- cvpcb/display_footprints_frame.cpp | 163 ++--- cvpcb/display_footprints_frame.h | 7 +- cvpcb/toolbars_cvpcb.cpp | 124 ++-- cvpcb/tools/cvpcb_actions.cpp | 3 + eeschema/sch_edit_frame.cpp | 166 ++++- eeschema/sch_edit_frame.h | 10 +- eeschema/sim/simulator_frame.cpp | 14 +- eeschema/sim/simulator_frame.h | 2 +- eeschema/sim/toolbars_simulator_frame.cpp | 68 +- eeschema/symbol_diff_frame.cpp | 2 +- eeschema/symbol_diff_frame.h | 2 +- eeschema/symbol_editor/symbol_edit_frame.cpp | 39 +- eeschema/symbol_editor/symbol_edit_frame.h | 9 +- eeschema/symbol_editor/symbol_editor.cpp | 2 +- .../symbol_editor/toolbars_symbol_editor.cpp | 269 ++++---- eeschema/symbol_viewer_frame.cpp | 7 +- eeschema/symbol_viewer_frame.h | 7 +- eeschema/toolbars_sch_editor.cpp | 469 +++++--------- eeschema/toolbars_symbol_viewer.cpp | 92 +-- gerbview/events_called_functions.cpp | 2 - gerbview/gerbview_frame.cpp | 19 +- gerbview/gerbview_frame.h | 20 +- gerbview/toolbars_gerber.cpp | 440 ++++++------- include/eda_base_frame.h | 81 ++- include/eda_draw_frame.h | 42 +- include/id.h | 6 - include/pcb_base_frame.h | 7 + include/settings/app_settings.h | 9 - include/tool/action_toolbar.h | 68 +- include/tool/ui/toolbar_configuration.h | 63 +- kicad/kicad_manager_frame.cpp | 20 +- kicad/kicad_manager_frame.h | 9 +- kicad/menubar.cpp | 45 +- pagelayout_editor/pl_editor_frame.cpp | 12 +- pagelayout_editor/pl_editor_frame.h | 30 +- pagelayout_editor/toolbars_pl_editor.cpp | 285 ++++----- pcbnew/footprint_edit_frame.cpp | 13 +- pcbnew/footprint_edit_frame.h | 15 +- pcbnew/footprint_editor_utils.cpp | 2 +- pcbnew/footprint_viewer_frame.cpp | 17 +- pcbnew/footprint_viewer_frame.h | 8 +- pcbnew/footprint_wizard_frame.cpp | 91 ++- pcbnew/footprint_wizard_frame.h | 5 +- pcbnew/pcb_base_frame.cpp | 46 ++ pcbnew/pcb_edit_frame.cpp | 17 +- pcbnew/pcb_edit_frame.h | 23 +- .../scripting/pcbnew_action_plugins.cpp | 6 +- pcbnew/toolbars_footprint_editor.cpp | 328 ++++------ pcbnew/toolbars_footprint_viewer.cpp | 157 ++--- pcbnew/toolbars_pcb_editor.cpp | 594 ++++++++---------- pcbnew/tools/pcb_actions.cpp | 8 +- 60 files changed, 2233 insertions(+), 2218 deletions(-) diff --git a/3d-viewer/3d_viewer/3d_toolbar.cpp b/3d-viewer/3d_viewer/3d_toolbar.cpp index bc25883605..51d4e70a71 100644 --- a/3d-viewer/3d_viewer/3d_toolbar.cpp +++ b/3d-viewer/3d_viewer/3d_toolbar.cpp @@ -35,73 +35,66 @@ #include #include <3d_viewer_id.h> -void EDA_3D_VIEWER_FRAME::ReCreateMainToolbar() +std::optional EDA_3D_VIEWER_FRAME::DefaultTopMainToolbarConfig() { - wxLogTrace( m_logTrace, wxT( "EDA_3D_VIEWER_FRAME::ReCreateMainToolbar" ) ); - - wxWindowUpdateLocker dummy( this ); - - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; + // clang-format off // Set up toolbar - m_mainToolBar->AddTool( ID_RELOAD3D_BOARD, wxEmptyString, - KiBitmapBundle( BITMAPS::import3d ), - _( "Reload board" ) ); + /* TODO (ISM): Move to action + m_tbTopMain->AddTool( ID_RELOAD3D_BOARD, wxEmptyString, + KiBitmapBundle( BITMAPS::import3d ), + _( "Reload board" ) ); + */ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_TOOL_SCREENCOPY_TOCLIBBOARD, wxEmptyString, - KiBitmapBundle( BITMAPS::copy ), - _( "Copy 3D image to clipboard" ) ); + config.AppendSeparator(); + /* TODO (ISM): Move to action + m_tbTopMain->AddTool( ID_TOOL_SCREENCOPY_TOCLIBBOARD, wxEmptyString, + KiBitmapBundle( BITMAPS::copy ), + _( "Copy 3D image to clipboard" ) ); +*/ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_RENDER_CURRENT_VIEW, wxEmptyString, - KiBitmapBundle( BITMAPS::ray_tracing ), - _( "Render current view using Raytracing" ), wxITEM_CHECK ); + config.AppendSeparator(); + /* TODO (ISM): Move to action + m_tbTopMain->AddTool( ID_RENDER_CURRENT_VIEW, wxEmptyString, + KiBitmapBundle( BITMAPS::ray_tracing ), + _( "Render current view using Raytracing" ), wxITEM_CHECK ); +*/ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::rotateXCW ); - m_mainToolBar->Add( EDA_3D_ACTIONS::rotateXCCW ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::rotateXCW ) + .AppendAction( EDA_3D_ACTIONS::rotateXCCW ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::rotateYCW ); - m_mainToolBar->Add( EDA_3D_ACTIONS::rotateYCCW ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::rotateYCW ) + .AppendAction( EDA_3D_ACTIONS::rotateYCCW ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::rotateZCW ); - m_mainToolBar->Add( EDA_3D_ACTIONS::rotateZCCW ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::rotateZCW ) + .AppendAction( EDA_3D_ACTIONS::rotateZCCW ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::flipView ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::flipView ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::moveLeft ); - m_mainToolBar->Add( EDA_3D_ACTIONS::moveRight ); - m_mainToolBar->Add( EDA_3D_ACTIONS::moveUp ); - m_mainToolBar->Add( EDA_3D_ACTIONS::moveDown ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::moveLeft ) + .AppendAction( EDA_3D_ACTIONS::moveRight ) + .AppendAction( EDA_3D_ACTIONS::moveUp ) + .AppendAction( EDA_3D_ACTIONS::moveDown ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::toggleOrtho, ACTION_TOOLBAR::TOGGLE ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::toggleOrtho ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EDA_3D_ACTIONS::showLayersManager, ACTION_TOOLBAR::TOGGLE ); + config.AppendSeparator() + .AppendAction( EDA_3D_ACTIONS::showLayersManager ); - m_mainToolBar->KiRealize(); + // clang-format on + + return config; } - - diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp index 3157b85eaa..6933364530 100644 --- a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp +++ b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp @@ -91,7 +91,6 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent const wxString& aTitle, long style ) : KIWAY_PLAYER( aKiway, aParent, FRAME_PCB_DISPLAY3D, aTitle, wxDefaultPosition, wxDefaultSize, style, QUALIFIED_VIEWER3D_FRAMENAME( aParent ), unityScale ), - m_mainToolBar( nullptr ), m_canvas( nullptr ), m_currentCamera( m_trackBallCamera ), m_trackBallCamera( 2 * RANGE_SCALE_3D ) @@ -149,13 +148,14 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent m_toolManager->InvokeTool( "3DViewer.Control" ); ReCreateMenuBar(); - ReCreateMainToolbar(); + configureToolbars(); + RecreateToolbars(); m_infoBar = new WX_INFOBAR( this, &m_auimgr ); m_auimgr.SetManagedWindow( this ); - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) ) .Top().Layer( 6 ) ); m_auimgr.AddPane( m_infoBar, EDA_PANE().InfoBar().Name( wxS( "InfoBar" ) ) .Top().Layer( 1 ) ); @@ -641,8 +641,7 @@ void EDA_3D_VIEWER_FRAME::CommonSettingsChanged( int aFlags ) // Regen menu bars, etc EDA_BASE_FRAME::CommonSettingsChanged( aFlags ); - // There is no base class that handles toolbars for this frame - ReCreateMainToolbar(); + RecreateToolbars(); loadCommonSettings(); applySettings( @@ -659,7 +658,7 @@ void EDA_3D_VIEWER_FRAME::ShowChangedLanguage() EDA_BASE_FRAME::ShowChangedLanguage(); SetTitle( _( "3D Viewer" ) ); - ReCreateMainToolbar(); + RecreateToolbars(); if( m_appearancePanel ) { diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_frame.h b/3d-viewer/3d_viewer/eda_3d_viewer_frame.h index 7a20e6949d..33ce0dd401 100644 --- a/3d-viewer/3d_viewer/eda_3d_viewer_frame.h +++ b/3d-viewer/3d_viewer/eda_3d_viewer_frame.h @@ -123,6 +123,8 @@ public: void OnDarkModeToggle(); + std::optional DefaultTopMainToolbarConfig() override; + protected: void setupUIConditions() override; @@ -145,7 +147,6 @@ private: void OnSetFocus( wxFocusEvent& event ); void doReCreateMenuBar() override; - void ReCreateMainToolbar(); /** * Create a Screenshot of the current 3D view. @@ -172,7 +173,6 @@ private: private: wxFileName m_defaultSaveScreenshotFileName; - ACTION_TOOLBAR* m_mainToolBar; EDA_3D_CANVAS* m_canvas; BOARD_ADAPTER m_boardAdapter; CAMERA& m_currentCamera; diff --git a/3d-viewer/3d_viewer/tools/eda_3d_actions.cpp b/3d-viewer/3d_viewer/tools/eda_3d_actions.cpp index 3d778b4019..3f75e25bec 100644 --- a/3d-viewer/3d_viewer/tools/eda_3d_actions.cpp +++ b/3d-viewer/3d_viewer/tools/eda_3d_actions.cpp @@ -157,7 +157,8 @@ TOOL_ACTION EDA_3D_ACTIONS::toggleOrtho( TOOL_ACTION_ARGS() .Scope( AS_GLOBAL ) .FriendlyName( _( "Toggle Orthographic Projection" ) ) .Tooltip( _( "Enable/disable orthographic projection" ) ) - .Icon( BITMAPS::ortho ) ); + .Icon( BITMAPS::ortho ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) ); TOOL_ACTION EDA_3D_ACTIONS::viewFront( TOOL_ACTION_ARGS() .Name( "3DViewer.Control.viewFront" ) @@ -337,5 +338,6 @@ TOOL_ACTION EDA_3D_ACTIONS::showLayersManager( TOOL_ACTION_ARGS() .Scope( AS_GLOBAL ) .FriendlyName( _( "Show Appearance Manager" ) ) .Tooltip( _( "Show/hide the appearance manager" ) ) - .Icon( BITMAPS::layers_manager ) ); + .Icon( BITMAPS::layers_manager ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) ); diff --git a/common/eda_base_frame.cpp b/common/eda_base_frame.cpp index 36bea6e727..6d32d0eac9 100644 --- a/common/eda_base_frame.cpp +++ b/common/eda_base_frame.cpp @@ -70,6 +70,7 @@ #include #include #include +#include #include #include #include @@ -176,6 +177,11 @@ EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType, const wxS KIWAY_HOLDER( aKiway, KIWAY_HOLDER::FRAME ), UNITS_PROVIDER( aIuScale, EDA_UNITS::MILLIMETRES ) { + m_tbTopMain = nullptr; + m_tbTopAux = nullptr; + m_tbRight = nullptr; + m_tbLeft = nullptr; + commonInit( aFrameType ); } @@ -486,6 +492,132 @@ void EDA_BASE_FRAME::setupUIConditions() } +void EDA_BASE_FRAME::RegisterCustomToolbarControlFactory( const std::string& aName, const wxString& aUiName, + const wxString& aDescription, + const ACTION_TOOLBAR_CONTROL_FACTORY& aControlFactory ) +{ + wxASSERT_MSG( aName.starts_with( "control" ), + wxString::Format( "Control name \"%s\" must start with \"control\"", aName ) ); + + m_toolbarControlFactories.emplace_back( aName, aUiName, aDescription, aControlFactory ); +} + + +ACTION_TOOLBAR_CONTROL_FACTORY* EDA_BASE_FRAME::GetCustomToolbarControlFactory( const std::string& aName ) +{ + for( auto& control : m_toolbarControlFactories ) + { + if( control.name == aName ) + return &control.factory; + } + + return nullptr; +} + + +void EDA_BASE_FRAME::configureToolbars() +{ + // Get the default toolbar config for the frame + m_tbConfigLeft = DefaultLeftToolbarConfig(); + m_tbConfigRight = DefaultRightToolbarConfig(); + m_tbConfigTopAux = DefaultTopAuxToolbarConfig(); + m_tbConfigTopMain = DefaultTopMainToolbarConfig(); +} + + +void EDA_BASE_FRAME::RecreateToolbars() +{ + wxWindowUpdateLocker dummy( this ); + + // Drawing tools (typically on right edge of window) + if( m_tbConfigRight.has_value() ) + { + if( !m_tbRight ) + { + m_tbRight = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); + m_tbRight->SetAuiManager( &m_auimgr ); + } + + m_tbRight->ApplyConfiguration( m_tbConfigRight.value() ); + } + + // Options (typically on left edge of window) + if( m_tbConfigLeft.has_value() ) + { + if( !m_tbLeft ) + { + m_tbLeft = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); + m_tbLeft->SetAuiManager( &m_auimgr ); + } + + m_tbLeft->ApplyConfiguration( m_tbConfigLeft.value() ); + } + + // Top main toolbar (the top one) + if( m_tbConfigTopMain.has_value() ) + { + if( !m_tbTopMain ) + { + m_tbTopMain = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_HORIZONTAL ); + m_tbTopMain->SetAuiManager( &m_auimgr ); + } + + m_tbTopMain->ApplyConfiguration( m_tbConfigTopMain.value() ); + } + + // Top aux toolbar (the bottom one) + if( m_tbConfigTopAux.has_value() ) + { + if( !m_tbTopAux ) + { + m_tbTopAux = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_HORIZONTAL ); + m_tbTopAux->SetAuiManager( &m_auimgr ); + } + + m_tbTopAux->ApplyConfiguration( m_tbConfigTopAux.value() ); + } +} + + +void EDA_BASE_FRAME::UpdateToolbarControlSizes() +{ + if( m_tbTopMain ) + m_tbTopMain->UpdateControlWidths(); + + if( m_tbRight ) + m_tbRight->UpdateControlWidths(); + + if( m_tbLeft ) + m_tbLeft->UpdateControlWidths(); + + if( m_tbTopAux ) + m_tbTopAux->UpdateControlWidths(); + +} + + +void EDA_BASE_FRAME::OnToolbarSizeChanged() +{ + if( m_tbTopMain ) + m_auimgr.GetPane( m_tbTopMain ).MaxSize( m_tbTopMain->GetSize() ); + + if( m_tbRight ) + m_auimgr.GetPane( m_tbRight ).MaxSize( m_tbRight->GetSize() ); + + if( m_tbLeft ) + m_auimgr.GetPane( m_tbLeft ).MaxSize( m_tbLeft->GetSize() ); + + if( m_tbTopAux ) + m_auimgr.GetPane( m_tbTopAux ).MaxSize( m_tbTopAux->GetSize() ); + + m_auimgr.Update(); +} + + void EDA_BASE_FRAME::ReCreateMenuBar() { /** diff --git a/common/eda_draw_frame.cpp b/common/eda_draw_frame.cpp index ed33911aad..d5f60ba2e6 100644 --- a/common/eda_draw_frame.cpp +++ b/common/eda_draw_frame.cpp @@ -100,10 +100,6 @@ EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame m_socketServer( nullptr ), m_lastToolbarIconSize( 0 ) { - m_mainToolBar = nullptr; - m_drawToolBar = nullptr; - m_optionsToolBar = nullptr; - m_auxiliaryToolBar = nullptr; m_gridSelectBox = nullptr; m_zoomSelectBox = nullptr; m_searchPane = nullptr; @@ -193,6 +189,45 @@ EDA_DRAW_FRAME::~EDA_DRAW_FRAME() } +void EDA_DRAW_FRAME::configureToolbars() +{ + EDA_BASE_FRAME::configureToolbars(); + + // Grid selection + auto gridSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_gridSelectBox ) + { + m_gridSelectBox = new wxChoice( aToolbar, ID_ON_GRID_SELECT, wxDefaultPosition, + wxDefaultSize, 0, nullptr ); + } + + UpdateGridSelectBox(); + + aToolbar->Add( m_gridSelectBox ); + }; + + RegisterCustomToolbarControlFactory( m_tbGridSelectName, _( "Grid Selector" ), + _( "Grid Selection box" ), gridSelectorFactory ); + + // Zoom selection + auto zoomSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_zoomSelectBox ) + { + m_zoomSelectBox = new wxChoice( aToolbar, ID_ON_ZOOM_SELECT, wxDefaultPosition, + wxDefaultSize, 0, nullptr ); + } + + UpdateZoomSelectBox(); + aToolbar->Add( m_zoomSelectBox ); + }; + + RegisterCustomToolbarControlFactory( m_tbZoomSelectName, _( "Zoom Selector" ), + _( "Zoom selection box" ), zoomSelectorFactory ); +} + + void EDA_DRAW_FRAME::ReleaseFile() { if( m_file_checker.get() != nullptr ) @@ -1167,43 +1202,6 @@ bool EDA_DRAW_FRAME::LibraryFileBrowser( bool doOpen, wxFileName& aFilename, } -void EDA_DRAW_FRAME::RecreateToolbars() -{ - // Rebuild all toolbars, and update the checked state of check tools - if( m_mainToolBar ) - ReCreateHToolbar(); - - if( m_drawToolBar ) // Drawing tools (typically on right edge of window) - ReCreateVToolbar(); - - if( m_optionsToolBar ) // Options (typically on left edge of window) - ReCreateOptToolbar(); - - if( m_auxiliaryToolBar ) // Additional tools under main toolbar - ReCreateAuxiliaryToolbar(); - - -} - - -void EDA_DRAW_FRAME::OnToolbarSizeChanged() -{ - if( m_mainToolBar ) - m_auimgr.GetPane( m_mainToolBar ).MaxSize( m_mainToolBar->GetSize() ); - - if( m_drawToolBar ) - m_auimgr.GetPane( m_drawToolBar ).MaxSize( m_drawToolBar->GetSize() ); - - if( m_optionsToolBar ) - m_auimgr.GetPane( m_optionsToolBar ).MaxSize( m_optionsToolBar->GetSize() ); - - if( m_auxiliaryToolBar ) - m_auimgr.GetPane( m_auxiliaryToolBar ).MaxSize( m_auxiliaryToolBar->GetSize() ); - - m_auimgr.Update(); -} - - void EDA_DRAW_FRAME::ShowChangedLanguage() { EDA_BASE_FRAME::ShowChangedLanguage(); @@ -1418,7 +1416,7 @@ std::vector EDA_DRAW_FRAME::GetOrderedPluginActions( } -void EDA_DRAW_FRAME::addApiPluginTools() +void EDA_DRAW_FRAME::AddApiPluginTools( ACTION_TOOLBAR* aToolbar ) { #ifdef KICAD_IPC_API API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager(); @@ -1437,7 +1435,7 @@ void EDA_DRAW_FRAME::addApiPluginTools() ? action->icon_dark : action->icon_light; - wxAuiToolBarItem* button = m_mainToolBar->AddTool( wxID_ANY, wxEmptyString, icon, + wxAuiToolBarItem* button = aToolbar->AddTool( wxID_ANY, wxEmptyString, icon, action->name ); Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED, diff --git a/common/tool/action_toolbar.cpp b/common/tool/action_toolbar.cpp index 2ee8a0a869..bbe0c1aad7 100644 --- a/common/tool/action_toolbar.cpp +++ b/common/tool/action_toolbar.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -42,27 +43,46 @@ #include #include #include + +#include #include #include #include #include #include +// Needed to handle adding the plugins to the toolbar +// TODO (ISM): This should be better abstracted away from the toolbars +#include +#include -ACTION_GROUP::ACTION_GROUP( const std::string& aName, + +ACTION_GROUP::ACTION_GROUP( const std::string_view& aName ) +{ + m_name = aName; + m_id = ACTION_MANAGER::MakeActionId( m_name ); +} + + +ACTION_GROUP::ACTION_GROUP( const std::string_view& aName, const std::vector& aActions ) +{ + m_name = aName; + m_id = ACTION_MANAGER::MakeActionId( m_name ); + + SetActions( aActions ); +} + + +void ACTION_GROUP::SetActions( const std::vector& aActions ) { wxASSERT_MSG( aActions.size() > 0, wxS( "Action groups must have at least one action" ) ); // The default action is just the first action in the vector m_actions = aActions; m_defaultAction = m_actions[0]; - - m_name = aName; - m_id = ACTION_MANAGER::MakeActionId( m_name ); } - int ACTION_GROUP::GetUIId() const { return m_id + TOOL_ACTION::GetBaseUIId(); @@ -240,64 +260,89 @@ ACTION_TOOLBAR::~ACTION_TOOLBAR() void ACTION_TOOLBAR::ApplyConfiguration( const TOOLBAR_CONFIGURATION& aConfig ) { + wxASSERT( GetParent() ); + // Remove existing tools - Clear(); + ClearToolbar(); std::vector items = aConfig.GetToolbarItems(); - for( auto& toolName : items ) + // Add all the items to the toolbar + for( auto& actionName : items ) { - if( toolName == "separator" ) + if( actionName == "separator" ) { // Add a separator - AddScaledSeparator(); + AddScaledSeparator( GetParent() ); } - else if( toolName.starts_with( "group" ) ) + else if( actionName.starts_with( "group" ) ) { // Add a group of items to the toolbar - std::optional groupConfigOpt = aConfig.GetGroup( toolName ); + const TOOLBAR_GROUP_CONFIG* groupConfig = aConfig.GetGroup( actionName ); - if( !groupConfigOpt.has_value() ) + if( !groupConfig ) { - wxASSERT_MSG( false, wxString::Format( "Unable to find group %s", toolName ) ); + wxASSERT_MSG( false, wxString::Format( "Unable to find group %s", actionName ) ); continue; } - TOOLBAR_GROUP_CONFIG& groupConfig = groupConfigOpt.value(); - std::vector tools; - for( auto& groupItem : groupConfig.GetGroupItems() ) + for( auto& groupItem : groupConfig->GetGroupItems() ) { - TOOL_ACTION* action = m_toolManager->GetActionManager()->FindTool( toolName ); + TOOL_ACTION* action = m_toolManager->GetActionManager()->FindAction( groupItem ); - if( !tool ) + if( !action ) { - wxASSERT_MSG( false, wxString::Format( "Unable to find group tool %s", toolName ) ); + wxASSERT_MSG( false, wxString::Format( "Unable to find group tool %s", actionName ) ); continue; } tools.push_back( action ); } - ACTION_GROUP* group = new ACTION_GROUP( groupConfig.GetName(), tools ); - - AddGroup( group ); + AddGroup( std::make_unique( groupConfig->GetName(), tools ) ); } - else + else if( actionName.starts_with( "control" ) ) { - // Assume anything else is a tool - TOOL_ACTION* action = m_toolManager->GetActionManager()->FindTool( toolName ); + // Add a custom control to the toolbar + EDA_BASE_FRAME* frame = static_cast( GetParent() ); + ACTION_TOOLBAR_CONTROL_FACTORY* factory = frame->GetCustomToolbarControlFactory( actionName ); - if( !tool ) + if( !factory ) { - wxASSERT_MSG( false, wxString::Format( "Unable to find toolbar tool %s", toolName ) ); + wxASSERT_MSG( false, wxString::Format( "Unable to find control factory for %s", actionName ) ); continue; } - Add( action ); + // The factory functions are responsible for adding the controls to the toolbar themselves + (*factory)( this ); + } + else if( actionName.starts_with( "spacer" ) ) + { + // Extract the spacer size from the text, it is the form "spacer:x", with "x" being the size + int sep = actionName.find_last_of( ":" ); + int spacerSize = std::stoi( actionName.substr( sep+1 ) ); + + AddSpacer( spacerSize ); + } + else + { + // Assume anything else is an action + TOOL_ACTION* action = m_toolManager->GetActionManager()->FindAction( actionName ); + + if( !action ) + { + wxASSERT_MSG( false, wxString::Format( "Unable to find toolbar tool %s", actionName ) ); + continue; + } + + Add( *action ); } } + + // Apply the configuration + KiRealize(); } @@ -363,6 +408,14 @@ void ACTION_TOOLBAR::AddScaledSeparator( wxWindow* aWindow ) } +void ACTION_TOOLBAR::Add( wxControl* aControl, const wxString& aLabel ) +{ + wxASSERT( aControl ); + m_controlIDs.push_back( aControl->GetId() ); + AddControl( aControl, aLabel ); +} + + void ACTION_TOOLBAR::AddToolContextMenu( const TOOL_ACTION& aAction, std::unique_ptr aMenu ) { @@ -372,7 +425,7 @@ void ACTION_TOOLBAR::AddToolContextMenu( const TOOL_ACTION& aAction, } -void ACTION_TOOLBAR::AddGroup( ACTION_GROUP* aGroup, bool aIsToggleEntry ) +void ACTION_TOOLBAR::AddGroup( std::unique_ptr aGroup ) { int groupId = aGroup->GetUIId(); const TOOL_ACTION* defaultAction = aGroup->GetDefaultAction(); @@ -380,20 +433,27 @@ void ACTION_TOOLBAR::AddGroup( ACTION_GROUP* aGroup, bool aIsToggleEntry ) wxASSERT( GetParent() ); wxASSERT( defaultAction ); - m_toolKinds[ groupId ] = aIsToggleEntry; + // Turn this into a toggle entry if any one of the actions is a toggle entry + bool isToggleEntry = false; + + for( const auto& act : aGroup->GetActions() ) + isToggleEntry |= act->CheckToolbarState( TOOLBAR_STATE::TOGGLE ); + + + m_toolKinds[ groupId ] = isToggleEntry; m_toolActions[ groupId ] = defaultAction; - m_actionGroups[ groupId ] = aGroup; + m_actionGroups[ groupId ] = std::move( aGroup ); // Add the main toolbar item representing the group AddTool( groupId, wxEmptyString, KiBitmapBundle( defaultAction->GetIcon(), Pgm().GetCommonSettings()->m_Appearance.toolbar_icon_size ), KiDisabledBitmapBundle( defaultAction->GetIcon() ), - aIsToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL, + isToggleEntry ? wxITEM_CHECK : wxITEM_NORMAL, wxEmptyString, wxEmptyString, nullptr ); // Select the default action - doSelectAction( aGroup, *defaultAction ); + doSelectAction( m_actionGroups[ groupId ].get(), *defaultAction ); } @@ -431,13 +491,20 @@ void ACTION_TOOLBAR::doSelectAction( ACTION_GROUP* aGroup, const TOOL_ACTION& aA // Register a new handler with the new UI conditions if( m_toolManager ) { + m_toolManager->GetToolHolder()->UnregisterUIUpdateHandler( groupId ); + const ACTION_CONDITIONS* cond = m_toolManager->GetActionManager()->GetCondition( aAction ); - wxASSERT_MSG( cond, wxString::Format( "Missing UI condition for action %s", - aAction.GetName() ) ); - - m_toolManager->GetToolHolder()->UnregisterUIUpdateHandler( groupId ); - m_toolManager->GetToolHolder()->RegisterUIUpdateHandler( groupId, *cond ); + // Register the new UI condition to control this entry + if( cond ) + { + m_toolManager->GetToolHolder()->RegisterUIUpdateHandler( groupId, *cond ); + } + else + { + wxLogTrace( kicadTraceToolStack, wxString::Format( "No UI condition for action %s", + aAction.GetName() ) ); + } } // Update the currently selected action @@ -447,6 +514,13 @@ void ACTION_TOOLBAR::doSelectAction( ACTION_GROUP* aGroup, const TOOL_ACTION& aA } +void ACTION_TOOLBAR::UpdateControlWidths() +{ + for( int id : m_controlIDs ) + UpdateControlWidth( id ); +} + + void ACTION_TOOLBAR::UpdateControlWidth( int aID ) { wxAuiToolBarItem* item = FindTool( aID ); @@ -729,7 +803,7 @@ void ACTION_TOOLBAR::popupPalette( wxAuiToolBarItem* aItem ) if( it == m_actionGroups.end() ) return; - ACTION_GROUP* group = it->second; + ACTION_GROUP* group = it->second.get(); wxAuiPaneInfo& pane = m_auiManager->GetPane( this ); diff --git a/cvpcb/cvpcb_mainframe.cpp b/cvpcb/cvpcb_mainframe.cpp index 2051c2ea27..3b78d3337c 100644 --- a/cvpcb/cvpcb_mainframe.cpp +++ b/cvpcb/cvpcb_mainframe.cpp @@ -66,7 +66,6 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) : KIWAY_PLAYER( aKiway, aParent, FRAME_CVPCB, _( "Assign Footprints" ), wxDefaultPosition, wxDefaultSize, KICAD_DEFAULT_DRAWFRAME_STYLE, wxT( "CvpcbFrame" ), unityScale ), - m_mainToolBar( nullptr ), m_footprintListBox( nullptr ), m_librariesListBox( nullptr ), m_symbolsListBox( nullptr ), @@ -92,8 +91,9 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); + configureToolbars(); + RecreateToolbars(); ReCreateMenuBar(); - ReCreateHToolbar(); m_footprintListBox = new FOOTPRINTS_LISTBOX( this, ID_CVPCB_FOOTPRINT_LIST ); m_footprintListBox->SetFont( KIUI::GetMonospacedUIFont() ); @@ -108,7 +108,7 @@ CVPCB_MAINFRAME::CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ) : m_auimgr.SetManagedWindow( this ); - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) ); + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) ); m_auimgr.AddPane( m_librariesListBox, EDA_PANE().Palette().Name( "Libraries" ).Left().Layer(1) .Caption( _( "Footprint Libraries" ) ) @@ -1190,7 +1190,7 @@ void CVPCB_MAINFRAME::SetStatusText( const wxString& aText, int aNumber ) void CVPCB_MAINFRAME::ShowChangedLanguage() { EDA_BASE_FRAME::ShowChangedLanguage(); - ReCreateHToolbar(); + RecreateToolbars(); DisplayStatus(); } diff --git a/cvpcb/cvpcb_mainframe.h b/cvpcb/cvpcb_mainframe.h index 02e9b9c899..0e5ad2b816 100644 --- a/cvpcb/cvpcb_mainframe.h +++ b/cvpcb/cvpcb_mainframe.h @@ -139,10 +139,7 @@ public: */ void OnSelectComponent( wxListEvent& event ); - /* - * Functions to rebuild the toolbars and menubars - */ - void ReCreateHToolbar(); + std::optional DefaultTopMainToolbarConfig() override; void ShowChangedLanguage() override; @@ -313,6 +310,8 @@ public: protected: CVPCB_MAINFRAME( KIWAY* aKiway, wxWindow* aParent ); + void configureToolbars() override; + void doReCreateMenuBar() override; void setupUIConditions() override; @@ -388,7 +387,6 @@ private: NETLIST m_netlist; int m_filteringOptions; - ACTION_TOOLBAR* m_mainToolBar; FOOTPRINTS_LISTBOX* m_footprintListBox; LIBRARY_LISTBOX* m_librariesListBox; SYMBOLS_LISTBOX* m_symbolsListBox; diff --git a/cvpcb/display_footprints_frame.cpp b/cvpcb/display_footprints_frame.cpp index b7e3a35351..792ebb856e 100644 --- a/cvpcb/display_footprints_frame.cpp +++ b/cvpcb/display_footprints_frame.cpp @@ -114,20 +114,18 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa m_toolManager->InitTools(); setupUIConditions(); + configureToolbars(); + RecreateToolbars(); // Run the control tool, it is supposed to be always active m_toolManager->InvokeTool( "cvpcb.FootprintViewerInteractiveSelection" ); - ReCreateHToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); - m_auimgr.SetManagedWindow( this ); CreateInfoBar(); - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) ) .Top().Layer( 6 ) ); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( wxS( "OptToolbar" ) ) + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) ) .Left().Layer( 3 ) ); m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( wxS( "DrawFrame" ) ) .Center() ); @@ -146,17 +144,19 @@ DISPLAY_FOOTPRINTS_FRAME::DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aPa // Restore last zoom. (If auto-zooming we'll adjust when we load the footprint.) CVPCB_SETTINGS* cfg = dynamic_cast( config() ); + /* TODO (ISM): Re-enable this once this is turned into an action if( cfg ) { GetCanvas()->GetView()->SetScale( cfg->m_FootprintViewerZoom ); - wxAuiToolBarItem* toolOpt = m_mainToolBar->FindTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL ); + wxAuiToolBarItem* toolOpt = m_tbTopMain->FindTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL ); if( cfg->m_FootprintViewerAutoZoomOnSelect ) toolOpt->SetState( wxAUI_BUTTON_STATE_CHECKED ); else toolOpt->SetState( 0 ); } + */ updateView(); @@ -224,118 +224,64 @@ void DISPLAY_FOOTPRINTS_FRAME::setupUIConditions() } -void DISPLAY_FOOTPRINTS_FRAME::ReCreateVToolbar() +std::optional DISPLAY_FOOTPRINTS_FRAME::DefaultLeftToolbarConfig() { - // Currently, no vertical right toolbar. + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendAction( ACTIONS::selectionTool ) + .AppendAction( ACTIONS::measureTool ); + + config.AppendSeparator() + .AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::togglePolarCoords ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); + + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::showPadNumbers ) + .AppendAction( PCB_ACTIONS::padDisplayMode ) + .AppendAction( PCB_ACTIONS::textOutlines ) + .AppendAction( PCB_ACTIONS::graphicsOutlines ); + + // clang-format on + return config; } -void DISPLAY_FOOTPRINTS_FRAME::ReCreateOptToolbar() +std::optional DISPLAY_FOOTPRINTS_FRAME::DefaultTopMainToolbarConfig() { - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, wxDefaultPosition, - wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - m_optionsToolBar->Add( ACTIONS::selectionTool ); - m_optionsToolBar->Add( ACTIONS::measureTool ); + // clang-format off + config.AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomTool ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::togglePolarCoords ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); + config.AppendSeparator() + .AppendAction( ACTIONS::show3DViewer ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::showPadNumbers ); - m_optionsToolBar->Add( PCB_ACTIONS::padDisplayMode ); - m_optionsToolBar->Add( PCB_ACTIONS::textOutlines ); - m_optionsToolBar->Add( PCB_ACTIONS::graphicsOutlines ); + config.AppendSeparator() + .AppendControl( m_tbGridSelectName ); - m_optionsToolBar->Realize(); -} + config.AppendSeparator() + .AppendControl( m_tbZoomSelectName ); + config.AppendSeparator(); -void DISPLAY_FOOTPRINTS_FRAME::ReCreateHToolbar() -{ - // Note: - // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) - // all wxAuiToolBarItems. - // However the wxAuiToolBarItems are not the owners of controls managed by - // them ( m_zoomSelectBox and m_gridSelectBox ), and therefore do not delete them - // So we do not recreate them after clearing the tools. - - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } - - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomTool ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::show3DViewer ); - - m_mainToolBar->AddScaledSeparator( this ); - - // Grid selection choice box. - if( !m_gridSelectBox ) - m_gridSelectBox = new wxChoice( m_mainToolBar, ID_ON_GRID_SELECT ); - - UpdateGridSelectBox(); - m_mainToolBar->AddControl( m_gridSelectBox ); - - m_mainToolBar->AddScaledSeparator( this ); - - // Zoom selection choice box. - if( !m_zoomSelectBox ) - m_zoomSelectBox = new wxChoice( m_mainToolBar, ID_ON_ZOOM_SELECT ); - - UpdateZoomSelectBox(); - m_mainToolBar->AddControl( m_zoomSelectBox ); - +/* TODO (ISM): Turn this into an action // Option to run Zoom automatique on footprint selection change - m_mainToolBar->AddTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL, wxEmptyString, + m_tbTopMain->AddTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL, wxEmptyString, KiScaledBitmap( BITMAPS::zoom_auto_fit_in_page, this ), _( "Automatic Zoom on footprint change" ), wxITEM_CHECK ); - - m_mainToolBar->AddScaledSeparator( this ); - - m_mainToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - m_mainToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->Realize(); -} - - -void DISPLAY_FOOTPRINTS_FRAME::UpdateToolbarControlSizes() -{ - if( m_mainToolBar ) - { - // Update the item widths - m_mainToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - m_mainToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - } +*/ + // clang-format on + return config; } @@ -364,8 +310,10 @@ void DISPLAY_FOOTPRINTS_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg ) cfg->m_FootprintViewerZoom = GetCanvas()->GetView()->GetScale(); - wxAuiToolBarItem* toolOpt = m_mainToolBar->FindTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL ); + /* TODO (ISM): Move to action framework + wxAuiToolBarItem* toolOpt = m_tbTopMain->FindTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL ); cfg->m_FootprintViewerAutoZoomOnSelect = ( toolOpt->GetState() & wxAUI_BUTTON_STATE_CHECKED ); + */ } @@ -556,13 +504,14 @@ void DISPLAY_FOOTPRINTS_FRAME::updateView() m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD ); - wxAuiToolBarItem* toolOpt = m_mainToolBar->FindTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL ); + /* TODO (ISM): Move to action framework + wxAuiToolBarItem* toolOpt = m_tbTopMain->FindTool( ID_CVPCB_FPVIEWER_AUTOZOOM_TOOL ); if( toolOpt->GetState() & wxAUI_BUTTON_STATE_CHECKED ) m_toolManager->RunAction( ACTIONS::zoomFitScreen ); else m_toolManager->RunAction( ACTIONS::centerContents ); - +*/ UpdateMsgPanel(); } diff --git a/cvpcb/display_footprints_frame.h b/cvpcb/display_footprints_frame.h index b78f15baba..0661537087 100644 --- a/cvpcb/display_footprints_frame.h +++ b/cvpcb/display_footprints_frame.h @@ -47,10 +47,9 @@ public: DISPLAY_FOOTPRINTS_FRAME( KIWAY* aKiway, wxWindow* aParent ); ~DISPLAY_FOOTPRINTS_FRAME() override; - void ReCreateHToolbar() override; - void ReCreateVToolbar() override; - void ReCreateOptToolbar() override; - void UpdateToolbarControlSizes() override; + // Currently, no top aux or right toolbars + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; /** * Refresh the full display for this frame. diff --git a/cvpcb/toolbars_cvpcb.cpp b/cvpcb/toolbars_cvpcb.cpp index 4fc44a41c3..33d9c1982d 100644 --- a/cvpcb/toolbars_cvpcb.cpp +++ b/cvpcb/toolbars_cvpcb.cpp @@ -28,71 +28,79 @@ #include -void CVPCB_MAINFRAME::ReCreateHToolbar() +std::optional CVPCB_MAINFRAME::DefaultTopMainToolbarConfig() { - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - m_mainToolBar->Add( CVPCB_ACTIONS::saveAssociationsToSchematic ); + // clang-format off + config.AppendAction( CVPCB_ACTIONS::saveAssociationsToSchematic ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::showFootprintLibTable ); + config.AppendSeparator() + .AppendAction( ACTIONS::showFootprintLibTable ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( CVPCB_ACTIONS::showFootprintViewer ); + config.AppendSeparator() + .AppendAction( CVPCB_ACTIONS::showFootprintViewer ); + config.AppendSeparator() + .AppendAction( CVPCB_ACTIONS::gotoPreviousNA ) + .AppendAction( CVPCB_ACTIONS::gotoNextNA ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( CVPCB_ACTIONS::gotoPreviousNA ); - m_mainToolBar->Add( CVPCB_ACTIONS::gotoNextNA ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::undo ); - m_mainToolBar->Add( ACTIONS::redo ); - m_mainToolBar->Add( CVPCB_ACTIONS::autoAssociate ); - m_mainToolBar->Add( CVPCB_ACTIONS::deleteAll ); + config.AppendSeparator() + .AppendAction( ACTIONS::undo ) + .AppendAction( ACTIONS::redo ) + .AppendAction( CVPCB_ACTIONS::autoAssociate ) + .AppendAction( CVPCB_ACTIONS::deleteAll ); // Add tools for footprint names filtering: - m_mainToolBar->AddScaledSeparator( this ); + config.AppendSeparator() + .AppendSpacer( 15 ) + .AppendControl( "control.CVPCBFilters" ); - // wxGTK with GTK3 has a serious issue with bold texts: strings are incorrectly sized - // and truncated after the first space. - // so use SetLabelMarkup is a trick to fix this issue. - m_mainToolBar->AddSpacer( 15 ); - wxString msg_bold = _( "Footprint Filters:" ); - wxStaticText* text = new wxStaticText( m_mainToolBar, wxID_ANY, msg_bold ); - text->SetFont( m_mainToolBar->GetFont().Bold() ); - -#ifdef __WXGTK3__ - text->SetLabelMarkup( "" + msg_bold + "" ); -#endif - - m_mainToolBar->AddControl( text ); - - m_mainToolBar->Add( CVPCB_ACTIONS::FilterFPbyFPFilters, ACTION_TOOLBAR::TOGGLE ); - m_mainToolBar->Add( CVPCB_ACTIONS::filterFPbyPin, ACTION_TOOLBAR::TOGGLE ); - m_mainToolBar->Add( CVPCB_ACTIONS::FilterFPbyLibrary, ACTION_TOOLBAR::TOGGLE ); - - m_mainToolBar->AddScaledSeparator( this ); - - m_tcFilterString = new wxTextCtrl( m_mainToolBar, wxID_ANY, wxEmptyString, wxDefaultPosition, - wxDefaultSize, wxTE_PROCESS_ENTER ); - - // Min size on Mac is (a not very useful) single character - m_tcFilterString->SetMinSize( wxSize( 150, -1 ) ); - - m_tcFilterString->Bind( wxEVT_TEXT_ENTER, &CVPCB_MAINFRAME::onTextFilterChanged, this ); - - m_mainToolBar->AddControl( m_tcFilterString ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->Realize(); + // clang-format on + return config; +} + + +void CVPCB_MAINFRAME::configureToolbars() +{ + EDA_BASE_FRAME::configureToolbars(); + + auto footprintFilterFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + + // wxGTK with GTK3 has a serious issue with bold texts: strings are incorrectly sized + // and truncated after the first space. + // so use SetLabelMarkup is a trick to fix this issue. + wxString msg_bold = _( "Footprint Filters:" ); + wxStaticText* text = new wxStaticText( m_tbTopMain, wxID_ANY, msg_bold ); + text->SetFont( m_tbTopMain->GetFont().Bold() ); + + #ifdef __WXGTK3__ + text->SetLabelMarkup( "" + msg_bold + "" ); + #endif + + aToolbar->AddControl( text ); + + aToolbar->Add( CVPCB_ACTIONS::FilterFPbyFPFilters ); + aToolbar->Add( CVPCB_ACTIONS::filterFPbyPin ); + aToolbar->Add( CVPCB_ACTIONS::FilterFPbyLibrary ); + + aToolbar->AddScaledSeparator( this ); + + if( !m_tcFilterString ) + { + m_tcFilterString = new wxTextCtrl( aToolbar, wxID_ANY, wxEmptyString, wxDefaultPosition, + wxDefaultSize, wxTE_PROCESS_ENTER ); + } + + // Min size on Mac is (a not very useful) single character + m_tcFilterString->SetMinSize( wxSize( 150, -1 ) ); + m_tcFilterString->Bind( wxEVT_TEXT_ENTER, &CVPCB_MAINFRAME::onTextFilterChanged, this ); + + aToolbar->AddControl( m_tcFilterString ); + }; + + RegisterCustomToolbarControlFactory( "control.CVPCBFilters", _( "Footprint filters" ), + _( "Footprint filtering controls" ), + footprintFilterFactory ); } diff --git a/cvpcb/tools/cvpcb_actions.cpp b/cvpcb/tools/cvpcb_actions.cpp index e88cb3810f..4e133f9e83 100644 --- a/cvpcb/tools/cvpcb_actions.cpp +++ b/cvpcb/tools/cvpcb_actions.cpp @@ -153,6 +153,7 @@ TOOL_ACTION CVPCB_ACTIONS::FilterFPbyFPFilters( TOOL_ACTION_ARGS() .FriendlyName( _( "Use symbol footprint filters" ) ) .Tooltip( _( "Filter footprint list by footprint filters defined in the symbol" ) ) .Icon( BITMAPS::module_filtered_list ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_NONE ) .Parameter( FOOTPRINTS_LISTBOX::FILTERING_BY_COMPONENT_FP_FILTERS ) ); @@ -162,6 +163,7 @@ TOOL_ACTION CVPCB_ACTIONS::filterFPbyPin( TOOL_ACTION_ARGS() .FriendlyName( _( "Filter by pin count" ) ) .Tooltip( _( "Filter footprint list by pin count" ) ) .Icon( BITMAPS::module_pin_filtered_list ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_NONE ) .Parameter( FOOTPRINTS_LISTBOX::FILTERING_BY_PIN_COUNT ) ); @@ -171,5 +173,6 @@ TOOL_ACTION CVPCB_ACTIONS::FilterFPbyLibrary( TOOL_ACTION_ARGS() .FriendlyName( _( "Filter by library" ) ) .Tooltip( _( "Filter footprint list by library" ) ) .Icon( BITMAPS::module_library_list ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_NONE ) .Parameter( FOOTPRINTS_LISTBOX::FILTERING_BY_LIBRARY ) ); diff --git a/eeschema/sch_edit_frame.cpp b/eeschema/sch_edit_frame.cpp index ce5ec147f0..02d2ead955 100644 --- a/eeschema/sch_edit_frame.cpp +++ b/eeschema/sch_edit_frame.cpp @@ -189,9 +189,9 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); + + configureToolbars(); + RecreateToolbars(); #ifdef KICAD_IPC_API wxTheApp->Bind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED, @@ -224,7 +224,7 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : EESCHEMA_SETTINGS::APPEARANCE appearance_cfg = eeconfig()->m_Appearance; // Rows; layers 4 - 6 - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) ) .Top().Layer( 6 ) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) ) @@ -250,10 +250,10 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_auimgr.AddPane( createHighlightedNetNavigator(), defaultNetNavigatorPaneInfo() ); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( wxS( "OptToolbar" ) ) + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) ) .Left().Layer( 2 ) ); - m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( wxS( "ToolsToolbar" ) ) + m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) ) .Right().Layer( 2 ) ); // Center @@ -2652,7 +2652,159 @@ void SCH_EDIT_FRAME::updateSelectionFilterVisbility() void SCH_EDIT_FRAME::onPluginAvailabilityChanged( wxCommandEvent& aEvt ) { wxLogTrace( traceApi, "SCH frame: EDA_EVT_PLUGIN_AVAILABILITY_CHANGED" ); - ReCreateHToolbar(); + RecreateToolbars(); aEvt.Skip(); } #endif + + +void SCH_EDIT_FRAME::ToggleSearch() +{ + EESCHEMA_SETTINGS* cfg = eeconfig(); + + // Ensure m_show_search is up to date (the pane can be closed outside the menu) + m_show_search = m_auimgr.GetPane( SearchPaneName() ).IsShown(); + + m_show_search = !m_show_search; + + wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() ); + searchPaneInfo.Show( m_show_search ); + + if( m_show_search ) + { + searchPaneInfo.Direction( cfg->m_AuiPanels.search_panel_dock_direction ); + + if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP + || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) + { + SetAuiPaneSize( m_auimgr, searchPaneInfo, -1, cfg->m_AuiPanels.search_panel_height ); + } + else if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT + || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) + { + SetAuiPaneSize( m_auimgr, searchPaneInfo, cfg->m_AuiPanels.search_panel_width, -1 ); + } + + m_searchPane->FocusSearch(); + } + else + { + cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y; + cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x; + cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction; + m_auimgr.Update(); + } +} + + +void SCH_EDIT_FRAME::ToggleProperties() +{ + if( !m_propertiesPanel ) + return; + + bool show = !m_propertiesPanel->IsShownOnScreen(); + + wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() ); + propertiesPaneInfo.Show( show ); + + updateSelectionFilterVisbility(); + + EESCHEMA_SETTINGS* settings = eeconfig(); + + if( show ) + { + SetAuiPaneSize( m_auimgr, propertiesPaneInfo, + settings->m_AuiPanels.properties_panel_width, -1 ); + } + else + { + settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x; + m_auimgr.Update(); + } +} + + +void SCH_EDIT_FRAME::ToggleSchematicHierarchy() +{ + EESCHEMA_SETTINGS* cfg = eeconfig(); + + wxCHECK( cfg, /* void */ ); + + wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() ); + + hierarchy_pane.Show( !hierarchy_pane.IsShown() ); + + updateSelectionFilterVisbility(); + + if( hierarchy_pane.IsShown() ) + { + if( hierarchy_pane.IsFloating() ) + { + hierarchy_pane.FloatingSize( cfg->m_AuiPanels.hierarchy_panel_float_width, + cfg->m_AuiPanels.hierarchy_panel_float_height ); + m_auimgr.Update(); + } + else if( cfg->m_AuiPanels.hierarchy_panel_docked_width > 0 ) + { + // SetAuiPaneSize also updates m_auimgr + SetAuiPaneSize( m_auimgr, hierarchy_pane, + cfg->m_AuiPanels.hierarchy_panel_docked_width, -1 ); + } + } + else + { + if( hierarchy_pane.IsFloating() ) + { + cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x; + cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y; + } + else + { + cfg->m_AuiPanels.hierarchy_panel_docked_width = m_hierarchy->GetSize().x; + } + + m_auimgr.Update(); + } +} + + +void SCH_EDIT_FRAME::ToggleLibraryTree() +{ + EESCHEMA_SETTINGS* cfg = eeconfig(); + + wxCHECK( cfg, /* void */ ); + + wxAuiPaneInfo& db_library_pane = m_auimgr.GetPane( DesignBlocksPaneName() ); + + db_library_pane.Show( !db_library_pane.IsShown() ); + + if( db_library_pane.IsShown() ) + { + if( db_library_pane.IsFloating() ) + { + db_library_pane.FloatingSize( cfg->m_AuiPanels.design_blocks_panel_float_width, + cfg->m_AuiPanels.design_blocks_panel_float_height ); + m_auimgr.Update(); + } + else if( cfg->m_AuiPanels.design_blocks_panel_docked_width > 0 ) + { + // SetAuiPaneSize also updates m_auimgr + SetAuiPaneSize( m_auimgr, db_library_pane, + cfg->m_AuiPanels.design_blocks_panel_docked_width, -1 ); + } + } + else + { + if( db_library_pane.IsFloating() ) + { + cfg->m_AuiPanels.design_blocks_panel_float_width = db_library_pane.floating_size.x; + cfg->m_AuiPanels.design_blocks_panel_float_height = db_library_pane.floating_size.y; + } + else + { + cfg->m_AuiPanels.design_blocks_panel_docked_width = m_designBlocksPane->GetSize().x; + } + + m_auimgr.Update(); + } +} diff --git a/eeschema/sch_edit_frame.h b/eeschema/sch_edit_frame.h index ae75e5a5cf..d6787fd209 100644 --- a/eeschema/sch_edit_frame.h +++ b/eeschema/sch_edit_frame.h @@ -175,9 +175,11 @@ public: void SaveSettings( APP_SETTINGS_BASE* aCfg ) override; void CreateScreens(); - void ReCreateHToolbar() override; - void ReCreateVToolbar() override; - void ReCreateOptToolbar() override; + + // Currently no top auxillary toolbar + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultRightToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; void setupUIConditions() override; @@ -975,6 +977,8 @@ protected: */ bool doAutoSave() override; + void configureToolbars() override; + void doReCreateMenuBar() override; /** diff --git a/eeschema/sim/simulator_frame.cpp b/eeschema/sim/simulator_frame.cpp index 4b2e936496..31ff17423b 100644 --- a/eeschema/sim/simulator_frame.cpp +++ b/eeschema/sim/simulator_frame.cpp @@ -134,10 +134,10 @@ SIMULATOR_FRAME::SIMULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_infoBar = new WX_INFOBAR( this ); mainSizer->Add( m_infoBar, 0, wxEXPAND, 0 ); - m_toolBar = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, - wxAUI_TB_DEFAULT_STYLE|wxAUI_TB_HORZ_LAYOUT|wxAUI_TB_PLAIN_BACKGROUND ); - m_toolBar->Realize(); - mainSizer->Add( m_toolBar, 0, wxEXPAND, 5 ); + m_tbTopMain = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, + wxAUI_TB_DEFAULT_STYLE|wxAUI_TB_HORZ_LAYOUT|wxAUI_TB_PLAIN_BACKGROUND ); + m_tbTopMain->Realize(); + mainSizer->Add( m_tbTopMain, 0, wxEXPAND, 5 ); m_ui = new SIMULATOR_FRAME_UI( this, m_schematicFrame ); mainSizer->Add( m_ui, 1, wxEXPAND, 5 ); @@ -164,7 +164,11 @@ SIMULATOR_FRAME::SIMULATOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); - ReCreateHToolbar(); + // Set the tool manager for the toolbar here, since the tool manager didn't exist when the toolbar + // was created. + m_tbTopMain->SetToolManager( m_toolManager ); + + RecreateToolbars(); ReCreateMenuBar(); Bind( wxEVT_COMMAND_MENU_SELECTED, wxCommandEventHandler( SIMULATOR_FRAME::onExit ), this, diff --git a/eeschema/sim/simulator_frame.h b/eeschema/sim/simulator_frame.h index 2f7ddd7ce7..8b1534aa25 100644 --- a/eeschema/sim/simulator_frame.h +++ b/eeschema/sim/simulator_frame.h @@ -150,7 +150,7 @@ public: void ShowChangedLanguage() override; - void ReCreateHToolbar(); + std::optional DefaultTopMainToolbarConfig() override; /** * Load plot, signal, cursor, measurement, etc. settings from a file. diff --git a/eeschema/sim/toolbars_simulator_frame.cpp b/eeschema/sim/toolbars_simulator_frame.cpp index 0d6d811ca5..3b010e1212 100644 --- a/eeschema/sim/toolbars_simulator_frame.cpp +++ b/eeschema/sim/toolbars_simulator_frame.cpp @@ -27,55 +27,41 @@ #include -void SIMULATOR_FRAME::ReCreateHToolbar() +std::optional SIMULATOR_FRAME::DefaultTopMainToolbarConfig() { - if( m_toolBar ) - { - m_toolBar->ClearToolbar(); - m_toolBar->SetToolManager( GetToolManager() ); - } - else - { - EDA_BASE_FRAME* parent = dynamic_cast( this ); + TOOLBAR_CONFIGURATION config; - wxCHECK( parent, /* void */ ); + // clang-format off + config.AppendAction( EE_ACTIONS::openWorkbook ) + .AppendAction( EE_ACTIONS::saveWorkbook ); - m_toolBar = new ACTION_TOOLBAR( parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - } + config.AppendSeparator() + .AppendAction( EE_ACTIONS::newAnalysisTab ) + .AppendAction( EE_ACTIONS::simAnalysisProperties ); - m_toolBar->Add( EE_ACTIONS::openWorkbook ); - m_toolBar->Add( EE_ACTIONS::saveWorkbook ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::runSimulation ) + .AppendAction( EE_ACTIONS::stopSimulation ); - m_toolBar->AddScaledSeparator( this ); - m_toolBar->Add( EE_ACTIONS::newAnalysisTab ); - m_toolBar->Add( EE_ACTIONS::simAnalysisProperties ); + config.AppendSeparator() + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomInHorizontally ) + .AppendAction( ACTIONS::zoomOutHorizontally ) + .AppendAction( ACTIONS::zoomInVertically ) + .AppendAction( ACTIONS::zoomOutVertically ) + .AppendAction( ACTIONS::zoomFitScreen ); - m_toolBar->AddScaledSeparator( this ); - m_toolBar->Add( EE_ACTIONS::runSimulation ); - m_toolBar->Add( EE_ACTIONS::stopSimulation ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::simProbe ) + .AppendAction( EE_ACTIONS::simTune ); - m_toolBar->AddScaledSeparator( this ); - m_toolBar->Add( ACTIONS::zoomInCenter ); - m_toolBar->Add( ACTIONS::zoomOutCenter ); - m_toolBar->Add( ACTIONS::zoomInHorizontally ); - m_toolBar->Add( ACTIONS::zoomOutHorizontally ); - m_toolBar->Add( ACTIONS::zoomInVertically ); - m_toolBar->Add( ACTIONS::zoomOutVertically ); - m_toolBar->Add( ACTIONS::zoomFitScreen ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::editUserDefinedSignals ) + .AppendAction( EE_ACTIONS::showNetlist ); - m_toolBar->AddScaledSeparator( this ); - m_toolBar->Add( EE_ACTIONS::simProbe ); - m_toolBar->Add( EE_ACTIONS::simTune ); - - m_toolBar->AddScaledSeparator( this ); - m_toolBar->Add( EE_ACTIONS::editUserDefinedSignals ); - m_toolBar->Add( EE_ACTIONS::showNetlist ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_toolBar->KiRealize(); - - m_toolBar->Refresh(); + // clang-format on + return config; } diff --git a/eeschema/symbol_diff_frame.cpp b/eeschema/symbol_diff_frame.cpp index 794ca91d12..59dbb99564 100644 --- a/eeschema/symbol_diff_frame.cpp +++ b/eeschema/symbol_diff_frame.cpp @@ -143,7 +143,7 @@ SYMBOL_DIFF_FRAME::SYMBOL_DIFF_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T CreateInfoBar(); // Manage main toolbar - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) ); + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ) .Bottom().Layer(6) ); m_auimgr.AddPane( libPanel, EDA_PANE().Palette().Name( "Libraries" ).Left().Layer(2) diff --git a/eeschema/symbol_diff_frame.h b/eeschema/symbol_diff_frame.h index 733a36647d..0d1cc9efc0 100644 --- a/eeschema/symbol_diff_frame.h +++ b/eeschema/symbol_diff_frame.h @@ -61,7 +61,7 @@ public: void doCloseWindow() override; void ReCreateHToolbar() override; void ReCreateVToolbar() override; - void ReCreateOptToolbar() override {} + void ReCreateLeftToolbar() override {} void LoadSettings( APP_SETTINGS_BASE* aCfg ) override; void SaveSettings( APP_SETTINGS_BASE* aCfg ) override; diff --git a/eeschema/symbol_editor/symbol_edit_frame.cpp b/eeschema/symbol_editor/symbol_edit_frame.cpp index 4fc1981141..4ae48ff206 100644 --- a/eeschema/symbol_editor/symbol_edit_frame.cpp +++ b/eeschema/symbol_editor/symbol_edit_frame.cpp @@ -179,9 +179,8 @@ SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupUIConditions(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); + configureToolbars(); + RecreateToolbars(); UpdateTitle(); UpdateSymbolMsgPanelInfo(); @@ -197,7 +196,7 @@ SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : CreateInfoBar(); // Rows; layers 4 - 6 - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ) .Top().Layer( 6 ) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ) @@ -223,10 +222,10 @@ SYMBOL_EDIT_FRAME::SYMBOL_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : propertiesPaneInfo.Show( m_settings->m_AuiPanels.show_properties ); updateSelectionFilterVisbility(); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" ) + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" ) .Left().Layer( 2 ) ); - m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" ) + m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" ) .Right().Layer( 2 ) ); // Center @@ -725,6 +724,32 @@ void SYMBOL_EDIT_FRAME::RebuildSymbolUnitsList() } +void SYMBOL_EDIT_FRAME::ToggleProperties() +{ + if( !m_propertiesPanel ) + return; + + bool show = !m_propertiesPanel->IsShownOnScreen(); + + wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() ); + propertiesPaneInfo.Show( show ); + updateSelectionFilterVisbility(); + + if( show ) + { + SetAuiPaneSize( m_auimgr, propertiesPaneInfo, + m_settings->m_AuiPanels.properties_panel_width, -1 ); + } + else + { + m_settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x; + } + + m_auimgr.Update(); + Refresh(); +} + + void SYMBOL_EDIT_FRAME::ToggleLibraryTree() { wxAuiPaneInfo& treePane = m_auimgr.GetPane( m_treePane ); @@ -1800,7 +1825,7 @@ void SYMBOL_EDIT_FRAME::LoadSymbolFromSchematic( SCH_SYMBOL* aSymbol ) setSymWatcher( nullptr ); ReCreateMenuBar(); - ReCreateHToolbar(); + RecreateToolbars(); if( IsLibraryTreeShown() ) ToggleLibraryTree(); diff --git a/eeschema/symbol_editor/symbol_edit_frame.h b/eeschema/symbol_editor/symbol_edit_frame.h index 966c836ad3..ac30c3458d 100644 --- a/eeschema/symbol_editor/symbol_edit_frame.h +++ b/eeschema/symbol_editor/symbol_edit_frame.h @@ -198,9 +198,11 @@ public: bool canCloseWindow( wxCloseEvent& aCloseEvent ) override; void doCloseWindow() override; void OnExitKiCad( wxCommandEvent& event ); - void ReCreateHToolbar() override; - void ReCreateVToolbar() override; - void ReCreateOptToolbar() override; + + // Currently no top auxillary toolbar + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultRightToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; void LoadSettings( APP_SETTINGS_BASE* aCfg ) override; void SaveSettings( APP_SETTINGS_BASE* aCfg ) override; @@ -406,6 +408,7 @@ public: void emptyScreen(); protected: + void configureToolbars() override; void setupUIConditions() override; void doReCreateMenuBar() override; diff --git a/eeschema/symbol_editor/symbol_editor.cpp b/eeschema/symbol_editor/symbol_editor.cpp index ae3e15ac10..ce2cdee76d 100644 --- a/eeschema/symbol_editor/symbol_editor.cpp +++ b/eeschema/symbol_editor/symbol_editor.cpp @@ -303,7 +303,7 @@ bool SYMBOL_EDIT_FRAME::LoadOneLibrarySymbolAux( LIB_SYMBOL* aEntry, const wxStr if( rebuildMenuAndToolbar ) { ReCreateMenuBar(); - ReCreateHToolbar(); + RecreateToolbars(); GetInfoBar()->Dismiss(); } diff --git a/eeschema/symbol_editor/toolbars_symbol_editor.cpp b/eeschema/symbol_editor/toolbars_symbol_editor.cpp index 14b6df1228..4608a9b4ca 100644 --- a/eeschema/symbol_editor/toolbars_symbol_editor.cpp +++ b/eeschema/symbol_editor/toolbars_symbol_editor.cpp @@ -44,174 +44,141 @@ #endif -void SYMBOL_EDIT_FRAME::ReCreateVToolbar() +std::optional SYMBOL_EDIT_FRAME::DefaultLeftToolbarConfig() { - if( m_drawToolBar ) - { - m_drawToolBar->ClearToolbar(); - } - else - { - m_drawToolBar = new ACTION_TOOLBAR( this, ID_V_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_drawToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - // Set up toolbar // clang-format off - m_drawToolBar->Add( ACTIONS::selectionTool ); + config.AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::toggleGridOverrides ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( EE_ACTIONS::placeSymbolPin ); - m_drawToolBar->Add( EE_ACTIONS::placeSymbolText ); - m_drawToolBar->Add( EE_ACTIONS::drawSymbolTextBox ); - m_drawToolBar->Add( EE_ACTIONS::drawRectangle ); - m_drawToolBar->Add( EE_ACTIONS::drawCircle ); - m_drawToolBar->Add( EE_ACTIONS::drawArc ); - m_drawToolBar->Add( EE_ACTIONS::drawBezier ); - m_drawToolBar->Add( EE_ACTIONS::drawSymbolLines ); - m_drawToolBar->Add( EE_ACTIONS::drawSymbolPolygon ); - m_drawToolBar->Add( EE_ACTIONS::placeSymbolAnchor ); - m_drawToolBar->Add( ACTIONS::deleteTool); - // clang-format on - - m_drawToolBar->Realize(); -} - - -void SYMBOL_EDIT_FRAME::ReCreateHToolbar() -{ - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } - - // Set up toolbar - m_mainToolBar->Add( EE_ACTIONS::newSymbol ); - - if( !IsSymbolFromSchematic() ) - m_mainToolBar->Add( ACTIONS::saveAll ); - else - m_mainToolBar->Add( ACTIONS::save ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::undo ); - m_mainToolBar->Add( ACTIONS::redo ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomTool ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::rotateCCW ); - m_mainToolBar->Add( EE_ACTIONS::rotateCW ); - m_mainToolBar->Add( EE_ACTIONS::mirrorV ); - m_mainToolBar->Add( EE_ACTIONS::mirrorH ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::symbolProperties ); - m_mainToolBar->Add( EE_ACTIONS::pinTable ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::showDatasheet ); - m_mainToolBar->Add( EE_ACTIONS::checkSymbol ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::showDeMorganStandard ); - m_mainToolBar->Add( EE_ACTIONS::showDeMorganAlternate ); - - m_mainToolBar->AddScaledSeparator( this ); - - if( m_unitSelectBox == nullptr ) - m_unitSelectBox = new wxComboBox( m_mainToolBar, ID_LIBEDIT_SELECT_UNIT_NUMBER, - wxEmptyString, wxDefaultPosition, wxSize( LISTBOX_WIDTH, -1 ), 0, - nullptr, wxCB_READONLY ); - m_mainToolBar->AddControl( m_unitSelectBox ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::toggleSyncedPinsMode ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::addSymbolToSchematic ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->Realize(); -} - - -void SYMBOL_EDIT_FRAME::ReCreateOptToolbar() -{ - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, - wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } - - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::toggleGridOverrides ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( EE_ACTIONS::showElectricalTypes ); - m_optionsToolBar->Add( EE_ACTIONS::showHiddenPins ); - m_optionsToolBar->Add( EE_ACTIONS::showHiddenFields ); - // m_optionsToolBar->Add( EE_ACTIONS::togglePinAltIcons ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::showElectricalTypes ) + .AppendAction( EE_ACTIONS::showHiddenPins ) + .AppendAction( EE_ACTIONS::showHiddenFields ); + // .AppendAction( EE_ACTIONS::togglePinAltIcons ); if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes ) - m_optionsToolBar->Add( ACTIONS::toggleBoundingBoxes ); + config.AppendAction( ACTIONS::toggleBoundingBoxes ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( ACTIONS::showLibraryTree ); - m_optionsToolBar->Add( ACTIONS::showProperties ); + config.AppendSeparator() + .AppendAction( ACTIONS::showLibraryTree ) + .AppendAction( ACTIONS::showProperties ); + /* TODO: Implement context menus EE_SELECTION_TOOL* selTool = m_toolManager->GetTool(); std::unique_ptr gridMenu = std::make_unique( false, selTool ); gridMenu->Add( ACTIONS::gridProperties ); - m_optionsToolBar->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + m_tbLeft->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + */ - m_optionsToolBar->Realize(); + // clang-format on + return config; } -void SYMBOL_EDIT_FRAME::ToggleProperties() +std::optional SYMBOL_EDIT_FRAME::DefaultRightToolbarConfig() { - if( !m_propertiesPanel ) - return; + TOOLBAR_CONFIGURATION config; - bool show = !m_propertiesPanel->IsShownOnScreen(); + // clang-format off + config.AppendAction( ACTIONS::selectionTool ); - wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() ); - propertiesPaneInfo.Show( show ); - updateSelectionFilterVisbility(); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::placeSymbolPin ) + .AppendAction( EE_ACTIONS::placeSymbolText ) + .AppendAction( EE_ACTIONS::drawSymbolTextBox ) + .AppendAction( EE_ACTIONS::drawRectangle ) + .AppendAction( EE_ACTIONS::drawCircle ) + .AppendAction( EE_ACTIONS::drawArc ) + .AppendAction( EE_ACTIONS::drawBezier ) + .AppendAction( EE_ACTIONS::drawSymbolLines ) + .AppendAction( EE_ACTIONS::drawSymbolPolygon ) + .AppendAction( EE_ACTIONS::placeSymbolAnchor ) + .AppendAction( ACTIONS::deleteTool); - if( show ) - { - SetAuiPaneSize( m_auimgr, propertiesPaneInfo, - m_settings->m_AuiPanels.properties_panel_width, -1 ); - } - else - { - m_settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x; - } - - m_auimgr.Update(); - Refresh(); + // clang-format on + return config; +} + + +std::optional SYMBOL_EDIT_FRAME::DefaultTopMainToolbarConfig() +{ + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendAction( EE_ACTIONS::newSymbol ); + + if( !IsSymbolFromSchematic() ) + config.AppendAction( ACTIONS::saveAll ); + else + config.AppendAction( ACTIONS::save ); + + config.AppendSeparator() + .AppendAction( ACTIONS::undo ) + .AppendAction( ACTIONS::redo ); + + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomTool ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::rotateCCW ) + .AppendAction( EE_ACTIONS::rotateCW ) + .AppendAction( EE_ACTIONS::mirrorV ) + .AppendAction( EE_ACTIONS::mirrorH ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::symbolProperties ) + .AppendAction( EE_ACTIONS::pinTable ); + + config.AppendSeparator() + .AppendAction( ACTIONS::showDatasheet ) + .AppendAction( EE_ACTIONS::checkSymbol ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::showDeMorganStandard ) + .AppendAction( EE_ACTIONS::showDeMorganAlternate ); + + config.AppendSeparator() + .AppendControl( "control.SymEditUnitSelector" ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::toggleSyncedPinsMode ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::addSymbolToSchematic ); + + // clang-format on + return config; +} + + +void SYMBOL_EDIT_FRAME::configureToolbars() +{ + SCH_BASE_FRAME::configureToolbars(); + + auto unitDisplayFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_unitSelectBox ) + { + m_unitSelectBox = new wxComboBox( aToolbar, ID_LIBEDIT_SELECT_UNIT_NUMBER, + wxEmptyString, wxDefaultPosition, + wxSize( LISTBOX_WIDTH, -1 ), 0, + nullptr, wxCB_READONLY ); + } + + aToolbar->Add( m_unitSelectBox ); + }; + + RegisterCustomToolbarControlFactory("control.SymEditUnitSelector", _( "Unit number display" ), + _( "Displays the unit being currently edited" ), + unitDisplayFactory ); } diff --git a/eeschema/symbol_viewer_frame.cpp b/eeschema/symbol_viewer_frame.cpp index 6dccd9c165..8418ba9a82 100644 --- a/eeschema/symbol_viewer_frame.cpp +++ b/eeschema/symbol_viewer_frame.cpp @@ -142,8 +142,9 @@ SYMBOL_VIEWER_FRAME::SYMBOL_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); - ReCreateHToolbar(); - ReCreateVToolbar(); + configureToolbars(); + RecreateToolbars(); + ReCreateMenuBar(); wxPanel* libPanel = new wxPanel( this ); @@ -200,7 +201,7 @@ SYMBOL_VIEWER_FRAME::SYMBOL_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent ) : CreateInfoBar(); // Manage main toolbar - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) ); + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ) .Bottom().Layer(6) ); m_auimgr.AddPane( libPanel, EDA_PANE().Palette().Name( "Libraries" ).Left().Layer(2) diff --git a/eeschema/symbol_viewer_frame.h b/eeschema/symbol_viewer_frame.h index ede3445f3d..8031625653 100644 --- a/eeschema/symbol_viewer_frame.h +++ b/eeschema/symbol_viewer_frame.h @@ -76,8 +76,9 @@ public: void DisplayLibInfos(); void doCloseWindow() override; void CloseLibraryViewer( wxCommandEvent& event ); - void ReCreateHToolbar() override; - void ReCreateVToolbar() override; + + // Only top main toolbar + std::optional DefaultTopMainToolbarConfig() override; void ClickOnLibList( wxCommandEvent& event ); void ClickOnSymbolList( wxCommandEvent& event ); @@ -120,6 +121,8 @@ public: void KiwayMailIn( KIWAY_EXPRESS& mail ) override; protected: + void configureToolbars() override; + void setupUIConditions() override; void doReCreateMenuBar() override; diff --git a/eeschema/toolbars_sch_editor.cpp b/eeschema/toolbars_sch_editor.cpp index 5c41399a56..f211ea2bec 100644 --- a/eeschema/toolbars_sch_editor.cpp +++ b/eeschema/toolbars_sch_editor.cpp @@ -43,358 +43,195 @@ #include #include -/* Create the main Horizontal Toolbar for the schematic editor - */ -void SCH_EDIT_FRAME::ReCreateHToolbar() + +std::optional SCH_EDIT_FRAME::DefaultLeftToolbarConfig() { - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, - wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - // Set up toolbar - if( Kiface().IsSingle() ) // not when under a project mgr - { - m_mainToolBar->Add( ACTIONS::doNew ); - m_mainToolBar->Add( ACTIONS::open ); - } - - m_mainToolBar->Add( ACTIONS::save ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::schematicSetup ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::pageSettings ); - m_mainToolBar->Add( ACTIONS::print ); - m_mainToolBar->Add( ACTIONS::plot ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::paste ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::undo ); - m_mainToolBar->Add( ACTIONS::redo ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::find ); - m_mainToolBar->Add( ACTIONS::findAndReplace ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomFitObjects ); - m_mainToolBar->Add( ACTIONS::zoomTool ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::navigateBack ); - m_mainToolBar->Add( EE_ACTIONS::navigateUp ); - m_mainToolBar->Add( EE_ACTIONS::navigateForward ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::rotateCCW ); - m_mainToolBar->Add( EE_ACTIONS::rotateCW ); - m_mainToolBar->Add( EE_ACTIONS::mirrorV ); - m_mainToolBar->Add( EE_ACTIONS::mirrorH ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::showSymbolEditor ); - m_mainToolBar->Add( ACTIONS::showSymbolBrowser ); - m_mainToolBar->Add( ACTIONS::showFootprintEditor ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::annotate ); - m_mainToolBar->Add( EE_ACTIONS::runERC ); - m_mainToolBar->Add( EE_ACTIONS::showSimulator ); - m_mainToolBar->Add( EE_ACTIONS::assignFootprints ); - m_mainToolBar->Add( EE_ACTIONS::editSymbolFields ); - m_mainToolBar->Add( EE_ACTIONS::generateBOM ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::showPcbNew ); - - // Add scripting console and API plugins - bool scriptingAvailable = SCRIPTING::IsWxAvailable(); - -#ifdef KICAD_IPC_API - bool haveApiPlugins = Pgm().GetCommonSettings()->m_Api.enable_server && - !Pgm().GetPluginManager().GetActionsForScope( PLUGIN_ACTION_SCOPE::SCHEMATIC ).empty(); -#else - bool haveApiPlugins = false; -#endif - - if( scriptingAvailable || haveApiPlugins ) - { - m_mainToolBar->AddScaledSeparator( this ); - - if( haveApiPlugins ) - addApiPluginTools(); - } - - // after adding the tools to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->KiRealize(); -} - - -void SCH_EDIT_FRAME::ReCreateVToolbar() -{ - if( m_drawToolBar ) - { - m_drawToolBar->ClearToolbar(); - } - else - { - m_drawToolBar = new ACTION_TOOLBAR( this, ID_V_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_drawToolBar->SetAuiManager( &m_auimgr ); - } - - // Set up toolbar // clang-format off - m_drawToolBar->Add( ACTIONS::selectionTool ); - m_drawToolBar->Add( EE_ACTIONS::highlightNetTool ); + config.AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::toggleGridOverrides ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( EE_ACTIONS::placeSymbol ); - m_drawToolBar->Add( EE_ACTIONS::placePower ); - m_drawToolBar->Add( EE_ACTIONS::drawWire ); - m_drawToolBar->Add( EE_ACTIONS::drawBus ); - m_drawToolBar->Add( EE_ACTIONS::placeBusWireEntry ); - m_drawToolBar->Add( EE_ACTIONS::placeNoConnect ); - m_drawToolBar->Add( EE_ACTIONS::placeJunction ); - m_drawToolBar->Add( EE_ACTIONS::placeLabel ); - m_drawToolBar->Add( EE_ACTIONS::placeClassLabel ); - m_drawToolBar->Add( EE_ACTIONS::drawRuleArea ); - m_drawToolBar->Add( EE_ACTIONS::placeGlobalLabel ); - m_drawToolBar->Add( EE_ACTIONS::placeHierLabel ); - m_drawToolBar->Add( EE_ACTIONS::drawSheet ); - m_drawToolBar->Add( EE_ACTIONS::placeSheetPin ); - m_drawToolBar->Add( EE_ACTIONS::syncAllSheetsPins ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::toggleHiddenPins ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( EE_ACTIONS::placeSchematicText ); - m_drawToolBar->Add( EE_ACTIONS::drawTextBox ); - m_drawToolBar->Add( EE_ACTIONS::drawTable ); - m_drawToolBar->Add( EE_ACTIONS::drawRectangle ); - m_drawToolBar->Add( EE_ACTIONS::drawCircle ); - m_drawToolBar->Add( EE_ACTIONS::drawArc ); - m_drawToolBar->Add( EE_ACTIONS::drawBezier ); - m_drawToolBar->Add( EE_ACTIONS::drawLines ); - m_drawToolBar->Add( EE_ACTIONS::placeImage ); - m_drawToolBar->Add( ACTIONS::deleteTool ); - // clang-format on + config.AppendSeparator() + .AppendAction( EE_ACTIONS::lineModeFree ) + .AppendAction( EE_ACTIONS::lineMode90 ) + .AppendAction( EE_ACTIONS::lineMode45 ); - m_drawToolBar->KiRealize(); -} + config.AppendSeparator() + .AppendAction( EE_ACTIONS::toggleAnnotateAuto ); - -/* Create Vertical Left Toolbar (Option Toolbar) - */ -void SCH_EDIT_FRAME::ReCreateOptToolbar() -{ - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, - wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } - - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::toggleGridOverrides ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( EE_ACTIONS::toggleHiddenPins ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( EE_ACTIONS::lineModeFree ); - m_optionsToolBar->Add( EE_ACTIONS::lineMode90 ); - m_optionsToolBar->Add( EE_ACTIONS::lineMode45 ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( EE_ACTIONS::toggleAnnotateAuto ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( EE_ACTIONS::showHierarchy ); - m_optionsToolBar->Add( ACTIONS::showProperties ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::showHierarchy ) + .AppendAction( ACTIONS::showProperties ); if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes ) - m_optionsToolBar->Add( ACTIONS::toggleBoundingBoxes ); + config.AppendAction( ACTIONS::toggleBoundingBoxes ); + /* TODO (ISM): Handle context menus EE_SELECTION_TOOL* selTool = m_toolManager->GetTool(); std::unique_ptr gridMenu = std::make_unique( false, selTool ); gridMenu->Add( ACTIONS::gridProperties ); - m_optionsToolBar->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + m_tbLeft->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + */ - m_optionsToolBar->KiRealize(); + // clang-format on + return config; } -void SCH_EDIT_FRAME::ToggleSearch() +std::optional SCH_EDIT_FRAME::DefaultRightToolbarConfig() { - EESCHEMA_SETTINGS* cfg = eeconfig(); + TOOLBAR_CONFIGURATION config; - // Ensure m_show_search is up to date (the pane can be closed outside the menu) - m_show_search = m_auimgr.GetPane( SearchPaneName() ).IsShown(); + // clang-format off + config.AppendAction( ACTIONS::selectionTool ) + .AppendAction( EE_ACTIONS::highlightNetTool ); - m_show_search = !m_show_search; + config.AppendSeparator() + .AppendAction( EE_ACTIONS::placeSymbol ) + .AppendAction( EE_ACTIONS::placePower ) + .AppendAction( EE_ACTIONS::drawWire ) + .AppendAction( EE_ACTIONS::drawBus ) + .AppendAction( EE_ACTIONS::placeBusWireEntry ) + .AppendAction( EE_ACTIONS::placeNoConnect ) + .AppendAction( EE_ACTIONS::placeJunction ) + .AppendAction( EE_ACTIONS::placeLabel ) + .AppendAction( EE_ACTIONS::placeClassLabel ) + .AppendAction( EE_ACTIONS::drawRuleArea ) + .AppendAction( EE_ACTIONS::placeGlobalLabel ) + .AppendAction( EE_ACTIONS::placeHierLabel ) + .AppendAction( EE_ACTIONS::drawSheet ) + .AppendAction( EE_ACTIONS::placeSheetPin ) + .AppendAction( EE_ACTIONS::syncAllSheetsPins ); - wxAuiPaneInfo& searchPaneInfo = m_auimgr.GetPane( SearchPaneName() ); - searchPaneInfo.Show( m_show_search ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::placeSchematicText ) + .AppendAction( EE_ACTIONS::drawTextBox ) + .AppendAction( EE_ACTIONS::drawTable ) + .AppendAction( EE_ACTIONS::drawRectangle ) + .AppendAction( EE_ACTIONS::drawCircle ) + .AppendAction( EE_ACTIONS::drawArc ) + .AppendAction( EE_ACTIONS::drawBezier ) + .AppendAction( EE_ACTIONS::drawLines ) + .AppendAction( EE_ACTIONS::placeImage ) + .AppendAction( ACTIONS::deleteTool ); - if( m_show_search ) - { - searchPaneInfo.Direction( cfg->m_AuiPanels.search_panel_dock_direction ); - - if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_TOP - || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_BOTTOM ) - { - SetAuiPaneSize( m_auimgr, searchPaneInfo, -1, cfg->m_AuiPanels.search_panel_height ); - } - else if( cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_LEFT - || cfg->m_AuiPanels.search_panel_dock_direction == wxAUI_DOCK_RIGHT ) - { - SetAuiPaneSize( m_auimgr, searchPaneInfo, cfg->m_AuiPanels.search_panel_width, -1 ); - } - - m_searchPane->FocusSearch(); - } - else - { - cfg->m_AuiPanels.search_panel_height = m_searchPane->GetSize().y; - cfg->m_AuiPanels.search_panel_width = m_searchPane->GetSize().x; - cfg->m_AuiPanels.search_panel_dock_direction = searchPaneInfo.dock_direction; - m_auimgr.Update(); - } + // clang-format on + return config; } -void SCH_EDIT_FRAME::ToggleProperties() +std::optional SCH_EDIT_FRAME::DefaultTopMainToolbarConfig() { - if( !m_propertiesPanel ) - return; + TOOLBAR_CONFIGURATION config; - bool show = !m_propertiesPanel->IsShownOnScreen(); - - wxAuiPaneInfo& propertiesPaneInfo = m_auimgr.GetPane( PropertiesPaneName() ); - propertiesPaneInfo.Show( show ); - - updateSelectionFilterVisbility(); - - EESCHEMA_SETTINGS* settings = eeconfig(); - - if( show ) + // clang-format off + if( Kiface().IsSingle() ) // not when under a project mgr { - SetAuiPaneSize( m_auimgr, propertiesPaneInfo, - settings->m_AuiPanels.properties_panel_width, -1 ); - } - else - { - settings->m_AuiPanels.properties_panel_width = m_propertiesPanel->GetSize().x; - m_auimgr.Update(); + config.AppendAction( ACTIONS::doNew ); + config.AppendAction( ACTIONS::open ); } + + config.AppendAction( ACTIONS::save ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::schematicSetup ); + + config.AppendSeparator() + .AppendAction( ACTIONS::pageSettings ) + .AppendAction( ACTIONS::print ) + .AppendAction( ACTIONS::plot ); + + config.AppendSeparator() + .AppendAction( ACTIONS::paste ); + + config.AppendSeparator() + .AppendAction( ACTIONS::undo ) + .AppendAction( ACTIONS::redo ); + + config.AppendSeparator() + .AppendAction( ACTIONS::find ) + .AppendAction( ACTIONS::findAndReplace ); + + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomFitObjects ) + .AppendAction( ACTIONS::zoomTool ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::navigateBack ) + .AppendAction( EE_ACTIONS::navigateUp ) + .AppendAction( EE_ACTIONS::navigateForward ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::rotateCCW ) + .AppendAction( EE_ACTIONS::rotateCW ) + .AppendAction( EE_ACTIONS::mirrorV ) + .AppendAction( EE_ACTIONS::mirrorH ); + + config.AppendSeparator() + .AppendAction( ACTIONS::showSymbolEditor ) + .AppendAction( ACTIONS::showSymbolBrowser ) + .AppendAction( ACTIONS::showFootprintEditor ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::annotate ) + .AppendAction( EE_ACTIONS::runERC ) + .AppendAction( EE_ACTIONS::showSimulator ) + .AppendAction( EE_ACTIONS::assignFootprints ) + .AppendAction( EE_ACTIONS::editSymbolFields ) + .AppendAction( EE_ACTIONS::generateBOM ); + + config.AppendSeparator() + .AppendAction( EE_ACTIONS::showPcbNew ); + + // Insert all the IPC plugins here on the toolbar + config.AppendControl( "control.SCHPlugin" ); + + // clang-format on + return config; } - -void SCH_EDIT_FRAME::ToggleSchematicHierarchy() +void SCH_EDIT_FRAME::configureToolbars() { - EESCHEMA_SETTINGS* cfg = eeconfig(); + SCH_BASE_FRAME::configureToolbars(); - wxCHECK( cfg, /* void */ ); - - wxAuiPaneInfo& hierarchy_pane = m_auimgr.GetPane( SchematicHierarchyPaneName() ); - - hierarchy_pane.Show( !hierarchy_pane.IsShown() ); - - updateSelectionFilterVisbility(); - - if( hierarchy_pane.IsShown() ) - { - if( hierarchy_pane.IsFloating() ) + // IPC/Scripting plugin control + // TODO (ISM): Clean this up to make IPC actions just normal tool actions to get rid of this entire + // control + auto pluginControlFactory = [this]( ACTION_TOOLBAR* aToolbar ) { - hierarchy_pane.FloatingSize( cfg->m_AuiPanels.hierarchy_panel_float_width, - cfg->m_AuiPanels.hierarchy_panel_float_height ); - m_auimgr.Update(); - } - else if( cfg->m_AuiPanels.hierarchy_panel_docked_width > 0 ) - { - // SetAuiPaneSize also updates m_auimgr - SetAuiPaneSize( m_auimgr, hierarchy_pane, - cfg->m_AuiPanels.hierarchy_panel_docked_width, -1 ); - } - } - else - { - if( hierarchy_pane.IsFloating() ) - { - cfg->m_AuiPanels.hierarchy_panel_float_width = hierarchy_pane.floating_size.x; - cfg->m_AuiPanels.hierarchy_panel_float_height = hierarchy_pane.floating_size.y; - } - else - { - cfg->m_AuiPanels.hierarchy_panel_docked_width = m_hierarchy->GetSize().x; - } + // Add scripting console and API plugins + bool scriptingAvailable = SCRIPTING::IsWxAvailable(); - m_auimgr.Update(); - } -} + #ifdef KICAD_IPC_API + bool haveApiPlugins = Pgm().GetCommonSettings()->m_Api.enable_server && + !Pgm().GetPluginManager().GetActionsForScope( PluginActionScope() ).empty(); + #else + bool haveApiPlugins = false; + #endif + if( scriptingAvailable || haveApiPlugins ) + { + aToolbar->AddScaledSeparator( aToolbar->GetParent() ); -void SCH_EDIT_FRAME::ToggleLibraryTree() -{ - EESCHEMA_SETTINGS* cfg = eeconfig(); + if( haveApiPlugins ) + AddApiPluginTools( aToolbar ); + } + }; - wxCHECK( cfg, /* void */ ); + RegisterCustomToolbarControlFactory( "control.SCHPlugin", _( "IPC/Scripting plugins" ), + _( "Region to hold the IPC/Scripting action buttons" ), + pluginControlFactory ); - wxAuiPaneInfo& db_library_pane = m_auimgr.GetPane( DesignBlocksPaneName() ); - - db_library_pane.Show( !db_library_pane.IsShown() ); - - if( db_library_pane.IsShown() ) - { - if( db_library_pane.IsFloating() ) - { - db_library_pane.FloatingSize( cfg->m_AuiPanels.design_blocks_panel_float_width, - cfg->m_AuiPanels.design_blocks_panel_float_height ); - m_auimgr.Update(); - } - else if( cfg->m_AuiPanels.design_blocks_panel_docked_width > 0 ) - { - // SetAuiPaneSize also updates m_auimgr - SetAuiPaneSize( m_auimgr, db_library_pane, - cfg->m_AuiPanels.design_blocks_panel_docked_width, -1 ); - } - } - else - { - if( db_library_pane.IsFloating() ) - { - cfg->m_AuiPanels.design_blocks_panel_float_width = db_library_pane.floating_size.x; - cfg->m_AuiPanels.design_blocks_panel_float_height = db_library_pane.floating_size.y; - } - else - { - cfg->m_AuiPanels.design_blocks_panel_docked_width = m_designBlocksPane->GetSize().x; - } - - m_auimgr.Update(); - } -} +} \ No newline at end of file diff --git a/eeschema/toolbars_symbol_viewer.cpp b/eeschema/toolbars_symbol_viewer.cpp index d559b54979..5613e992dc 100644 --- a/eeschema/toolbars_symbol_viewer.cpp +++ b/eeschema/toolbars_symbol_viewer.cpp @@ -33,64 +33,68 @@ #include -void SYMBOL_VIEWER_FRAME::ReCreateHToolbar() +std::optional SYMBOL_VIEWER_FRAME::DefaultTopMainToolbarConfig() { - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - m_mainToolBar->AddTool( ID_LIBVIEW_PREVIOUS, wxEmptyString, - KiScaledBitmap( BITMAPS::lib_previous, this ), - _( "Display previous symbol" ) ); + // clang-format off + /* TODO: Move these to actions + m_tbTopMain->AddTool( ID_LIBVIEW_PREVIOUS, wxEmptyString, + KiScaledBitmap( BITMAPS::lib_previous, this ), + _( "Display previous symbol" ) ); - m_mainToolBar->AddTool( ID_LIBVIEW_NEXT, wxEmptyString, - KiScaledBitmap( BITMAPS::lib_next, this ), - _( "Display next symbol" ) ); + m_tbTopMain->AddTool( ID_LIBVIEW_NEXT, wxEmptyString, + KiScaledBitmap( BITMAPS::lib_next, this ), + _( "Display next symbol" ) ); + */ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::showElectricalTypes ); - m_mainToolBar->Add( EE_ACTIONS::showPinNumbers ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::showElectricalTypes ) + .AppendAction( EE_ACTIONS::showPinNumbers ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::showDeMorganStandard ); - m_mainToolBar->Add( EE_ACTIONS::showDeMorganAlternate ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::showDeMorganStandard ) + .AppendAction( EE_ACTIONS::showDeMorganAlternate ); - m_mainToolBar->AddScaledSeparator( this ); + config.AppendSeparator() + .AppendControl( "control.SymViewUnitSelector" ); - if( m_unitChoice == nullptr ) - m_unitChoice = new wxChoice( m_mainToolBar, ID_LIBVIEW_SELECT_UNIT_NUMBER, - wxDefaultPosition, wxSize( 150, -1 ) ); - m_mainToolBar->AddControl( m_unitChoice ); + config.AppendSeparator() + .AppendAction( ACTIONS::showDatasheet ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::showDatasheet ); + config.AppendSeparator() + .AppendAction( EE_ACTIONS::addSymbolToSchematic ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( EE_ACTIONS::addSymbolToSchematic ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->KiRealize(); - - m_mainToolBar->Refresh(); + // clang-format on + return config; } -void SYMBOL_VIEWER_FRAME::ReCreateVToolbar() +void SYMBOL_VIEWER_FRAME::configureToolbars() { + SCH_BASE_FRAME::configureToolbars(); + + // Toolbar widget for selecting the unit to show in the symbol viewer + auto unitChoiceFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_unitChoice ) + { + m_unitChoice = new wxChoice( m_tbTopMain, ID_LIBVIEW_SELECT_UNIT_NUMBER, + wxDefaultPosition, wxSize( 150, -1 ) ); + } + + aToolbar->Add( m_unitChoice ); + }; + + RegisterCustomToolbarControlFactory("control.SymViewUnitSelector", _( "Symbol unit selector" ), + _( "Displays the unit being currently edited" ), + unitChoiceFactory ); } diff --git a/gerbview/events_called_functions.cpp b/gerbview/events_called_functions.cpp index 7c86cc3c0e..2b457288f9 100644 --- a/gerbview/events_called_functions.cpp +++ b/gerbview/events_called_functions.cpp @@ -75,8 +75,6 @@ BEGIN_EVENT_TABLE( GERBVIEW_FRAME, EDA_DRAW_FRAME ) EVT_UPDATE_UI( ID_ON_GRID_SELECT, GERBVIEW_FRAME::OnUpdateSelectGrid ) EVT_UPDATE_UI( ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE, GERBVIEW_FRAME::OnUpdateSelectDCode ) - EVT_UPDATE_UI( ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, - GERBVIEW_FRAME::OnUpdateLayerSelectBox ) // Drop files event EVT_DROP_FILES( GERBVIEW_FRAME::OnDropFiles ) diff --git a/gerbview/gerbview_frame.cpp b/gerbview/gerbview_frame.cpp index 91106fe7ce..277abf1213 100644 --- a/gerbview/gerbview_frame.cpp +++ b/gerbview/gerbview_frame.cpp @@ -148,18 +148,18 @@ GERBVIEW_FRAME::GERBVIEW_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateOptToolbar(); - ReCreateAuxiliaryToolbar(); + + configureToolbars(); + RecreateToolbars(); m_auimgr.SetManagedWindow( this ); - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer( 6 ) ); - m_auimgr.AddPane( m_auxiliaryToolBar, EDA_PANE().HToolbar().Name( "AuxToolbar" ).Top() + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer( 6 ) ); + m_auimgr.AddPane( m_tbTopAux, EDA_PANE().HToolbar().Name( "TopAuxToolbar" ).Top() .Layer(4) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ).Bottom() .Layer( 6 ) ); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" ).Left() + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" ).Left() .Layer( 3 ) ); m_auimgr.AddPane( m_LayersManager, EDA_PANE().Palette().Name( "LayersManager" ).Right() .Layer( 3 ).Caption( _( "Layers Manager" ) ).PaneBorder( false ) @@ -404,7 +404,10 @@ void GERBVIEW_FRAME::ReFillLayerWidget() m_LayersManager->ReFill(); m_SelLayerBox->Resync(); - ReCreateAuxiliaryToolbar(); + + // Re-build the various boxes in the toolbars + // TODO: Could this be made more precise instead of just blowing away all the toolbars? + RecreateToolbars(); wxAuiPaneInfo& lyrs = m_auimgr.GetPane( m_LayersManager ); wxSize bestz = m_LayersManager->GetBestSize(); @@ -1070,7 +1073,7 @@ void GERBVIEW_FRAME::ActivateGalCanvas() m_LayersManager->ReFill(); m_LayersManager->ReFillRender(); - ReCreateOptToolbar(); + RecreateToolbars(); ReCreateMenuBar(); try diff --git a/gerbview/gerbview_frame.h b/gerbview/gerbview_frame.h index 316a03c1ca..01a3a2d6a8 100644 --- a/gerbview/gerbview_frame.h +++ b/gerbview/gerbview_frame.h @@ -76,22 +76,12 @@ public: bool LoadListOfGerberAndDrillFiles( const wxString& aPath, const wxArrayString& aFilenameList, std::vector* aFileType ); - // Virtual basic functions: - void ReCreateHToolbar() override; - void ReCreateAuxiliaryToolbar() override; - - /** - * Create or update the right vertical toolbar. - */ - void ReCreateVToolbar() override; - - /** - * Create or update the left vertical toolbar (option toolbar) - */ - void ReCreateOptToolbar() override; + // No right toolbar in gerbview + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; + std::optional DefaultTopAuxToolbarConfig() override; void UpdateStatusBar() override; - void UpdateToolbarControlSizes() override; GERBVIEW_SETTINGS* gvconfig() const; @@ -239,7 +229,6 @@ public: void OnQuit( wxCommandEvent& event ); void OnUpdateSelectDCode( wxUpdateUIEvent& aEvent ); - void OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ); /** * Delete the current data and loads a Gerber file selected from history list on current layer. @@ -456,6 +445,7 @@ public: DECLARE_EVENT_TABLE() protected: + void configureToolbars() override; void setupUIConditions() override; void doReCreateMenuBar() override; diff --git a/gerbview/toolbars_gerber.cpp b/gerbview/toolbars_gerber.cpp index 0cf2b31d7b..5da66e6bee 100644 --- a/gerbview/toolbars_gerber.cpp +++ b/gerbview/toolbars_gerber.cpp @@ -36,256 +36,243 @@ #include "widgets/dcode_selection_box.h" -void GERBVIEW_FRAME::ReCreateHToolbar() +std::optional GERBVIEW_FRAME::DefaultLeftToolbarConfig() { - // Note: - // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) - // all wxAuiToolBarItems. - // However the wxAuiToolBarItems are not the owners of controls managed by - // them ( m_TextInfo and m_SelLayerBox ), and therefore do not delete them - // So we do not recreate them after clearing the tools. + TOOLBAR_CONFIGURATION config; - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + // clang-format off + config.AppendAction( ACTIONS::selectionTool ) + .AppendAction( ACTIONS::measureTool ); - // Set up toolbar - m_mainToolBar->Add( GERBVIEW_ACTIONS::clearAllLayers ); - m_mainToolBar->Add( GERBVIEW_ACTIONS::reloadAllLayers ); - m_mainToolBar->Add( GERBVIEW_ACTIONS::openAutodetected ); - m_mainToolBar->Add( GERBVIEW_ACTIONS::openGerber ); - m_mainToolBar->Add( GERBVIEW_ACTIONS::openDrillFile ); + config.AppendSeparator() + .AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::togglePolarCoords ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::print ); + config.AppendSeparator() + .AppendAction( GERBVIEW_ACTIONS::flashedDisplayOutlines ) + .AppendAction( GERBVIEW_ACTIONS::linesDisplayOutlines ) + .AppendAction( GERBVIEW_ACTIONS::polygonsDisplayOutlines ) + .AppendAction( GERBVIEW_ACTIONS::negativeObjectDisplay ) + .AppendAction( GERBVIEW_ACTIONS::dcodeDisplay ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomTool ); + config.AppendSeparator() + .AppendAction( GERBVIEW_ACTIONS::toggleForceOpacityMode ) + .AppendAction( GERBVIEW_ACTIONS::toggleXORMode ) + .AppendAction( ACTIONS::highContrastMode ) + .AppendAction( GERBVIEW_ACTIONS::flipGerberView ); + config.AppendSeparator() + .AppendAction( GERBVIEW_ACTIONS::toggleLayerManager ); - m_mainToolBar->AddScaledSeparator( this ); - - if( !m_SelLayerBox ) - { - m_SelLayerBox = new GBR_LAYER_BOX_SELECTOR( m_mainToolBar, - ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); - } - - m_SelLayerBox->Resync(); - m_mainToolBar->AddControl( m_SelLayerBox ); - - if( !m_TextInfo ) - { - m_TextInfo = new wxTextCtrl( m_mainToolBar, ID_TOOLBARH_GERBER_DATA_TEXT_BOX, wxEmptyString, - wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); - } - - m_mainToolBar->AddControl( m_TextInfo ); - - m_mainToolBar->UpdateControlWidth( ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER ); - m_mainToolBar->UpdateControlWidth( ID_TOOLBARH_GERBER_DATA_TEXT_BOX ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->KiRealize(); + // clang-format on + return config; } -void GERBVIEW_FRAME::ReCreateAuxiliaryToolbar() +std::optional GERBVIEW_FRAME::DefaultTopMainToolbarConfig() { - wxWindowUpdateLocker dummy( this ); + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendAction( GERBVIEW_ACTIONS::clearAllLayers ) + .AppendAction( GERBVIEW_ACTIONS::reloadAllLayers ) + .AppendAction( GERBVIEW_ACTIONS::openAutodetected ) + .AppendAction( GERBVIEW_ACTIONS::openGerber ) + .AppendAction( GERBVIEW_ACTIONS::openDrillFile ); + + config.AppendSeparator() + .AppendAction( ACTIONS::print ); + + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomTool ); + + config.AppendSeparator() + .AppendControl( "control.GerberLayerBox" ) + .AppendControl( "control.GerberTextInfo" ); + + // clang-format on + return config; +} + + +std::optional GERBVIEW_FRAME::DefaultTopAuxToolbarConfig() +{ + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendControl( "control.GerberComponentHighlight" ) + .AppendSpacer( 5 ) + .AppendControl( "control.GerberNetHighlight" ) + .AppendSpacer( 5 ) + .AppendControl( "control.GerberAppertureHighlight" ) + .AppendSpacer( 5 ) + .AppendControl( "control.GerberDcodeSelector" ) + .AppendSeparator() + .AppendControl( m_tbGridSelectName ) + .AppendSeparator() + .AppendControl( m_tbZoomSelectName ); + + // clang-format on + return config; +} + + +void GERBVIEW_FRAME::configureToolbars() +{ + // Base class loads the default settings + EDA_DRAW_FRAME::configureToolbars(); + + // Register factories for the various toolbar controls + auto layerBoxFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelLayerBox ) + { + m_SelLayerBox = new GBR_LAYER_BOX_SELECTOR( aToolbar, + ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, + wxDefaultPosition, wxDefaultSize, 0, nullptr ); + } + + m_SelLayerBox->Resync(); + aToolbar->Add( m_SelLayerBox ); + + // UI update handler for the control + aToolbar->Bind( wxEVT_UPDATE_UI, + [this]( wxUpdateUIEvent& aEvent ) + { + if( m_SelLayerBox->GetCount() ) + { + if( m_SelLayerBox->GetSelection() != GetActiveLayer() ) + m_SelLayerBox->SetSelection( GetActiveLayer() ); + } + }, + m_SelLayerBox->GetId() ); + }; + + RegisterCustomToolbarControlFactory("control.GerberLayerBox", _( "Layer selector widget" ), + _( "Layer selection" ), layerBoxFactory ); + + + auto textInfoFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_TextInfo ) + { + m_TextInfo = new wxTextCtrl( aToolbar, ID_TOOLBARH_GERBER_DATA_TEXT_BOX, wxEmptyString, + wxDefaultPosition, wxDefaultSize, wxTE_READONLY ); + } + + aToolbar->Add( m_TextInfo ); + }; + + RegisterCustomToolbarControlFactory("control.GerberTextInfo", _( "Text info entry" ), + _( "Text info entry" ), textInfoFactory ); - if( m_auxiliaryToolBar ) - { - m_auxiliaryToolBar->ClearToolbar(); - } - else - { - m_auxiliaryToolBar = new ACTION_TOOLBAR( this, ID_AUX_TOOLBAR, wxDefaultPosition, - wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - m_auxiliaryToolBar->SetAuiManager( &m_auimgr ); - } // Creates box to display and choose components: - // (note, when the m_auxiliaryToolBar is recreated, tools are deleted, but controls + // (note, when the m_tbTopAux is recreated, tools are deleted, but controls // are not deleted: they are just no longer managed by the toolbar - if( !m_SelComponentBox ) - m_SelComponentBox = new wxChoice( m_auxiliaryToolBar, ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE ); + auto componentBoxFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelComponentBox ) + m_SelComponentBox = new wxChoice( aToolbar, ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE ); - if( !m_cmpText ) - m_cmpText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Cmp:" ) + wxS( " " ) ); + if( !m_cmpText ) + m_cmpText = new wxStaticText( aToolbar, wxID_ANY, _( "Cmp:" ) + wxS( " " ) ); + + m_SelComponentBox->SetToolTip( _("Highlight items belonging to this component") ); + m_cmpText->SetLabel( _( "Cmp:" ) + wxS( " " ) ); // can change when changing the language + + updateComponentListSelectBox(); + + aToolbar->Add( m_cmpText ); + aToolbar->Add( m_SelComponentBox ); + }; + + RegisterCustomToolbarControlFactory( "control.GerberComponentHighlight", + _( "Component highlight" ), + _( "Highlight items belonging to this component" ), + componentBoxFactory ); - m_SelComponentBox->SetToolTip( _("Highlight items belonging to this component") ); - m_cmpText->SetLabel( _( "Cmp:" ) + wxS( " " ) ); // can change when changing the language - m_auxiliaryToolBar->AddControl( m_cmpText ); - m_auxiliaryToolBar->AddControl( m_SelComponentBox ); - m_auxiliaryToolBar->AddSpacer( 5 ); // Creates choice box to display net names and highlight selected: - if( !m_SelNetnameBox ) - m_SelNetnameBox = new wxChoice( m_auxiliaryToolBar, ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE ); + auto netBoxFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelNetnameBox ) + m_SelNetnameBox = new wxChoice( aToolbar, ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE ); - if( !m_netText ) - m_netText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Net:" ) ); + if( !m_netText ) + m_netText = new wxStaticText( aToolbar, wxID_ANY, _( "Net:" ) ); + + m_SelNetnameBox->SetToolTip( _("Highlight items belonging to this net") ); + m_netText->SetLabel( _( "Net:" ) ); // can change when changing the language + + updateNetnameListSelectBox(); + + aToolbar->Add( m_netText ); + aToolbar->Add( m_SelNetnameBox ); + }; + + RegisterCustomToolbarControlFactory( "control.GerberNetHighlight", _( "Net highlight" ), + _( "Highlight items belonging to this net" ), netBoxFactory ); - m_SelNetnameBox->SetToolTip( _("Highlight items belonging to this net") ); - m_netText->SetLabel( _( "Net:" ) ); // can change when changing the language - m_auxiliaryToolBar->AddControl( m_netText ); - m_auxiliaryToolBar->AddControl( m_SelNetnameBox ); - m_auxiliaryToolBar->AddSpacer( 5 ); // Creates choice box to display aperture attributes and highlight selected: - if( !m_SelAperAttributesBox ) + auto appertureBoxFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelAperAttributesBox ) + { + m_SelAperAttributesBox = new wxChoice( aToolbar, + ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE ); + } + + if( !m_apertText ) + m_apertText = new wxStaticText( aToolbar, wxID_ANY, _( "Attr:" ) ); + + m_SelAperAttributesBox->SetToolTip( _( "Highlight items with this aperture attribute" ) ); + m_apertText->SetLabel( _( "Attr:" ) ); // can change when changing the language + + updateAperAttributesSelectBox(); + + aToolbar->Add( m_apertText ); + aToolbar->Add( m_SelAperAttributesBox ); + }; + + RegisterCustomToolbarControlFactory( "control.GerberAppertureHighlight", _( "Aperture highlight" ), + _( "Highlight items with this aperture attribute" ), + appertureBoxFactory ); + + + // D-code selection + auto dcodeSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) { - m_SelAperAttributesBox = new wxChoice( m_auxiliaryToolBar, - ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE ); - } + if( !m_DCodeSelector ) + { + m_DCodeSelector = new DCODE_SELECTION_BOX( aToolbar, + ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE, + wxDefaultPosition, wxSize( 150, -1 ) ); + } - if( !m_apertText ) - m_apertText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "Attr:" ) ); + if( !m_dcodeText ) + m_dcodeText = new wxStaticText( aToolbar, wxID_ANY, _( "DCode:" ) ); - m_SelAperAttributesBox->SetToolTip( _( "Highlight items with this aperture attribute" ) ); - m_apertText->SetLabel( _( "Attr:" ) ); // can change when changing the language - m_auxiliaryToolBar->AddControl( m_apertText ); - m_auxiliaryToolBar->AddControl( m_SelAperAttributesBox ); - m_auxiliaryToolBar->AddSpacer( 5 ); + m_dcodeText->SetLabel( _( "DCode:" ) ); - if( !m_DCodeSelector ) - { - m_DCodeSelector = new DCODE_SELECTION_BOX( m_auxiliaryToolBar, - ID_TOOLBARH_GERBER_SELECT_ACTIVE_DCODE, - wxDefaultPosition, wxSize( 150, -1 ) ); - } + updateDCodeSelectBox(); - if( !m_dcodeText ) - m_dcodeText = new wxStaticText( m_auxiliaryToolBar, wxID_ANY, _( "DCode:" ) ); + aToolbar->Add( m_dcodeText ); + aToolbar->Add( m_DCodeSelector ); + }; - m_dcodeText->SetLabel( _( "DCode:" ) ); - m_auxiliaryToolBar->AddControl( m_dcodeText ); - m_auxiliaryToolBar->AddControl( m_DCodeSelector ); - - if( !m_gridSelectBox ) - { - m_gridSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_GRID_SELECT, wxDefaultPosition, - wxDefaultSize, 0, nullptr ); - } - - m_auxiliaryToolBar->AddScaledSeparator( this ); - m_auxiliaryToolBar->AddControl( m_gridSelectBox ); - - if( !m_zoomSelectBox ) - { - m_zoomSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_ZOOM_SELECT, wxDefaultPosition, - wxDefaultSize, 0, nullptr ); - } - - m_auxiliaryToolBar->AddScaledSeparator( this ); - m_auxiliaryToolBar->AddControl( m_zoomSelectBox ); - - updateComponentListSelectBox(); - updateNetnameListSelectBox(); - updateAperAttributesSelectBox(); - updateDCodeSelectBox(); - UpdateGridSelectBox(); - UpdateZoomSelectBox(); - - // Go through and ensure the comboboxes are the correct size, since the strings in the - // box could have changed widths. - m_auxiliaryToolBar->UpdateControlWidth( ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - - // after adding the buttons to the toolbar, must call Realize() - m_auxiliaryToolBar->KiRealize(); -} - - -void GERBVIEW_FRAME::ReCreateVToolbar() -{ - // This toolbar isn't used currently -} - - -void GERBVIEW_FRAME::ReCreateOptToolbar() -{ - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, wxDefaultPosition, - wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } - - // TODO: these can be moved to the 'proper' vertical toolbar if and when there are - // actual tools to put there. That, or I'll get around to implementing configurable - // toolbars. - m_optionsToolBar->Add( ACTIONS::selectionTool ); - m_optionsToolBar->Add( ACTIONS::measureTool ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::togglePolarCoords ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::flashedDisplayOutlines ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::linesDisplayOutlines ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::polygonsDisplayOutlines ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::negativeObjectDisplay ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::dcodeDisplay ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::toggleForceOpacityMode ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::toggleXORMode ); - m_optionsToolBar->Add( ACTIONS::highContrastMode ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::flipGerberView ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( GERBVIEW_ACTIONS::toggleLayerManager ); - - m_optionsToolBar->KiRealize(); -} - - -void GERBVIEW_FRAME::UpdateToolbarControlSizes() -{ - if( m_mainToolBar ) - { - // Update the item widths - m_mainToolBar->UpdateControlWidth( ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER ); - m_mainToolBar->UpdateControlWidth( ID_TOOLBARH_GERBER_DATA_TEXT_BOX ); - } - - if( m_auxiliaryToolBar ) - { - // Update the item widths - m_auxiliaryToolBar->UpdateControlWidth( ID_GBR_AUX_TOOLBAR_PCB_CMP_CHOICE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_GBR_AUX_TOOLBAR_PCB_NET_CHOICE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - } + RegisterCustomToolbarControlFactory( "control.GerberDcodeSelector", _( "DCode Selector" ), + _( "Select all items with the selected DCode" ), + dcodeSelectorFactory ); } @@ -491,14 +478,3 @@ void GERBVIEW_FRAME::OnUpdateSelectDCode( wxUpdateUIEvent& aEvent ) gerber->m_Selected_Tool = m_DCodeSelector->GetSelectedDCodeId(); } } - - -void GERBVIEW_FRAME::OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ) -{ - if( m_SelLayerBox->GetCount() ) - { - if( m_SelLayerBox->GetSelection() != GetActiveLayer() ) - m_SelLayerBox->SetSelection( GetActiveLayer() ); - } -} - diff --git a/include/eda_base_frame.h b/include/eda_base_frame.h index f38c81dd49..b2434f2e7e 100644 --- a/include/eda_base_frame.h +++ b/include/eda_base_frame.h @@ -33,15 +33,18 @@ #define EDA_BASE_FRAME_H_ -#include #include +#include +#include #include #include #include #include #include +#include #include +#include #include #include #include @@ -433,6 +436,65 @@ public: */ virtual wxString GetCurrentFileName() const { return wxEmptyString; } + /** + * Get the default actions to show on the left canvas toolbar. + * + * @return default config, or nullopt if the toolbar isn't used. + */ + virtual std::optional DefaultLeftToolbarConfig() { return std::nullopt; }; + + /** + * Get the default actions to show on the right canvas toolbar. + * + * @return default config, or nullopt if the toolbar isn't used. + */ + virtual std::optional DefaultRightToolbarConfig() { return std::nullopt; }; + + /** + * Get the default actions to show on the top main canvas toolbar. + * + * @return default config, or nullopt if the toolbar isn't used. + */ + virtual std::optional DefaultTopMainToolbarConfig() { return std::nullopt; }; + + /** + * Get the default actions to show on the top aux canvas toolbar. + * + * @return default config, or nullopt if the toolbar isn't used. + */ + virtual std::optional DefaultTopAuxToolbarConfig() { return std::nullopt; }; + + virtual void RecreateToolbars(); + + /** + * Update toolbars if desired toolbar icon changed. + */ + void OnToolbarSizeChanged(); + + /** + * Update the sizes of any controls in the toolbars of the frame. + */ + virtual void UpdateToolbarControlSizes(); + + /** + * Register a creation factory for toolbar controls that are present in this frame. + * + * The factory function takes a single argument of type `ACTION_TOOLBAR*`, which is the toolbar + * to add the controls to. + * + * @param aName is the unique name for this control - must be prefixed with "control." + * @param aDescription is a short user-facing description for the + * @param aControlFactory A functor that creates the custom controls and then adds them to the toolbar + */ + void RegisterCustomToolbarControlFactory( const std::string& aName, const wxString& aUiName, + const wxString& aDescription, + const ACTION_TOOLBAR_CONTROL_FACTORY& aControlFactory ); + + /** + * + */ + ACTION_TOOLBAR_CONTROL_FACTORY* GetCustomToolbarControlFactory( const std::string& aName ); + /** * Recreate the menu bar. * @@ -616,6 +678,8 @@ protected: virtual void doReCreateMenuBar() {} + virtual void configureToolbars(); + /** * Handle the auto save timer event. */ @@ -795,6 +859,21 @@ private: * Associate file extensions with action to execute. */ std::map m_acceptedExts; + + // Current toolbar configuration + std::optional m_tbConfigLeft; + std::optional m_tbConfigRight; + std::optional m_tbConfigTopAux; + std::optional m_tbConfigTopMain; + + // Toolbar UI elements + ACTION_TOOLBAR* m_tbTopMain; + ACTION_TOOLBAR* m_tbTopAux; // Additional tools under main toolbar + ACTION_TOOLBAR* m_tbRight; // Drawing tools (typically on right edge of window) + ACTION_TOOLBAR* m_tbLeft; // Options (typically on left edge of window) + + std::vector m_toolbarControlFactories; + }; diff --git a/include/eda_draw_frame.h b/include/eda_draw_frame.h index 7c5d86406b..37ed1fa420 100644 --- a/include/eda_draw_frame.h +++ b/include/eda_draw_frame.h @@ -36,6 +36,7 @@ #include #include #include +#include #include class EDA_ITEM; @@ -210,16 +211,12 @@ public: void EraseMsgBox(); + // Toolbar-related functions virtual void ReCreateHToolbar() { }; virtual void ReCreateVToolbar() { }; - virtual void ReCreateOptToolbar() { }; + virtual void ReCreateLeftToolbar() { }; virtual void ReCreateAuxiliaryToolbar() { } - /** - * Update the sizes of any controls in the toolbars of the frame. - */ - virtual void UpdateToolbarControlSizes() { } - /* * These 4 functions provide a basic way to show/hide grid and /get/set grid color. * @@ -472,16 +469,6 @@ public: */ virtual const BOX2I GetDocumentExtents( bool aIncludeAllVisible = true ) const; - /** - * Rebuild all toolbars and update the checked state of check tools. - */ - void RecreateToolbars(); - - /** - * Update toolbars if desired toolbar icon changed. - */ - void OnToolbarSizeChanged(); - /** * Redraw the menus and what not in current language. */ @@ -523,9 +510,18 @@ public: static std::vector GetOrderedPluginActions( PLUGIN_ACTION_SCOPE aScope, APP_SETTINGS_BASE* aCfg ); + /** + * Append actions from API plugins to the given toolbar. + * + * @param aToolbar is the toolbar to add the plugins to + */ + virtual void AddApiPluginTools( ACTION_TOOLBAR* aToolbar ); + DECLARE_EVENT_TABLE() protected: + void configureToolbars() override; + virtual void SetScreen( BASE_SCREEN* aScreen ) { m_currentScreen = aScreen; } void unitsChangeRefresh() override; @@ -560,12 +556,6 @@ protected: virtual void handleActivateEvent( wxActivateEvent& aEvent ); void onActivate( wxActivateEvent& aEvent ); - /** - * Append actions from API plugins to the main toolbar - */ - virtual void addApiPluginTools(); - - wxSocketServer* m_socketServer; ///< Prevents opening same file multiple times. @@ -584,11 +574,6 @@ protected: wxChoice* m_gridSelectBox; wxChoice* m_zoomSelectBox; - ACTION_TOOLBAR* m_mainToolBar; - ACTION_TOOLBAR* m_auxiliaryToolBar; // Additional tools under main toolbar - ACTION_TOOLBAR* m_drawToolBar; // Drawing tools (typically on right edge of window) - ACTION_TOOLBAR* m_optionsToolBar; // Options (typically on left edge of window) - std::unique_ptr m_findReplaceData; wxArrayString m_findStringHistoryList; wxArrayString m_replaceStringHistoryList; @@ -609,6 +594,9 @@ protected: static bool m_openGLFailureOccured; ///< Has any failure occurred when switching to OpenGL in ///< any EDA_DRAW_FRAME? + const std::string m_tbGridSelectName = "control.GridSelector"; + const std::string m_tbZoomSelectName = "control.ZoomSelector"; + private: BASE_SCREEN* m_currentScreen; ///< current used SCREEN EDA_DRAW_PANEL_GAL* m_canvas; diff --git a/include/id.h b/include/id.h index 4bcffc9430..c1b719793f 100644 --- a/include/id.h +++ b/include/id.h @@ -93,12 +93,6 @@ enum main_id ID_GEN_PLOT_DXF, ID_GEN_PLOT_PDF, - // id for toolbars - ID_H_TOOLBAR, - ID_V_TOOLBAR, - ID_OPT_TOOLBAR, - ID_AUX_TOOLBAR, - ID_LANGUAGE_CHOICE, ID_LANGUAGE_DANISH, ID_LANGUAGE_DEFAULT, diff --git a/include/pcb_base_frame.h b/include/pcb_base_frame.h index fd543320f9..7759ce8ebb 100644 --- a/include/pcb_base_frame.h +++ b/include/pcb_base_frame.h @@ -62,6 +62,7 @@ class FOOTPRINT_EDITOR_SETTINGS; struct MAGNETIC_SETTINGS; class NL_PCBNEW_PLUGIN; class PROGRESS_REPORTER; +class PCB_LAYER_BOX_SELECTOR; #ifdef wxHAS_INOTIFY #define wxFileSystemWatcher wxInotifyFileSystemWatcher @@ -397,6 +398,8 @@ public: void OnFpChangeDebounceTimer( wxTimerEvent& aEvent ); protected: + void configureToolbars() override; + bool canCloseWindow( wxCloseEvent& aCloseEvent ) override; void handleActivateEvent( wxActivateEvent& aEvent ) override; @@ -432,6 +435,10 @@ protected: PCB_DISPLAY_OPTIONS m_displayOptions; PCB_ORIGIN_TRANSFORMS m_originTransforms; + PCB_LAYER_BOX_SELECTOR* m_SelLayerBox; // a combo box to display and select active layer + + const std::string m_tbPcbLayerSelectorName = "control.PCBLayerSelector"; + private: std::unique_ptr m_spaceMouse; diff --git a/include/settings/app_settings.h b/include/settings/app_settings.h index 5eb75509f7..15a6c27fcd 100644 --- a/include/settings/app_settings.h +++ b/include/settings/app_settings.h @@ -166,13 +166,6 @@ public: std::vector> actions; }; - struct TOOLBARS - { - TOOLBAR_CONFIGURATION m_HToolbarConfig; - TOOLBAR_CONFIGURATION m_VToolbarConfig; - TOOLBAR_CONFIGURATION m_optToolbarConfig; - } - APP_SETTINGS_BASE( const std::string& aFilename, int aSchemaVersion ); virtual ~APP_SETTINGS_BASE() {} @@ -202,8 +195,6 @@ public: WINDOW_SETTINGS m_Window; - TOOLBARS m_Toolbars; - /// Active color theme name. wxString m_ColorTheme; diff --git a/include/tool/action_toolbar.h b/include/tool/action_toolbar.h index 99a88d7453..d1580819b6 100644 --- a/include/tool/action_toolbar.h +++ b/include/tool/action_toolbar.h @@ -50,7 +50,9 @@ public: // Make the toolbar a friend so it can easily access everything inside here friend class ACTION_TOOLBAR; - ACTION_GROUP( const std::string& aName, const std::vector& aActions ); + ACTION_GROUP(const std::string_view& aName ); + + ACTION_GROUP( const std::string_view& aName, const std::vector& aActions ); /** * Set the default action to use when first creating the toolbar palette icon. @@ -77,6 +79,15 @@ public: */ int GetUIId() const; + /** + * Set the actions contained in this group. + * + * The first action in the list will be the new default action. + * + * @param aActions is the new set of actions. + */ + void SetActions( const std::vector& aActions ); + /** * Get a vector of all the actions contained inside this group. */ @@ -237,6 +248,11 @@ public: */ void AddScaledSeparator( wxWindow* aWindow ); + /** + * Add a control to the toolbar. + */ + void Add( wxControl* aControl, const wxString& aLabel = wxEmptyString ); + /** * Add a context menu to a specific tool item on the toolbar. * @@ -252,11 +268,13 @@ public: * Add a set of actions to a toolbar as a group. One action from the group will be displayed * at a time. * + * This toolbar gets ownership of the group object, and will delete it when the + * ClearToolbar() function is called. + * * @param aGroup is the group to add. The first action in the group will be the first shown * on the toolbar. - * @param aIsToggleEntry makes the toolbar item a toggle entry when true */ - void AddGroup( ACTION_GROUP* aGroup, bool aIsToggleEntry = false ); + void AddGroup( std::unique_ptr aGroup ); /** * Select an action inside a group @@ -274,6 +292,11 @@ public: */ void ApplyConfiguration( const TOOLBAR_CONFIGURATION& aConfig ); + /** + * Update the width of all wxControl tools on thsi toolbar + */ + void UpdateControlWidths(); + /** * Update the toolbar item width of a control using its best size. * @@ -369,9 +392,44 @@ protected: std::map m_toolKinds; std::map m_toolCancellable; std::map m_toolActions; - std::map m_actionGroups; - std::map> m_toolMenus; + /// IDs for all the control items in this toolbar + std::vector m_controlIDs; + + std::map> m_actionGroups; + std::map> m_toolMenus; +}; + +/** + * Type for the function signature that is used to add custom controls to the toolbar. + * + * Note, these functions SHOULD NOT use the wxWidgets-provided `AddControl` function to + * add the controls to the toolbar, instead they should use the `ACTION_TOOLBAR::Add` functions + * to ensure proper registration of the control. + */ +typedef std::function ACTION_TOOLBAR_CONTROL_FACTORY; + +struct ACTION_TOOLBAR_CONTROL +{ + /** + * Name of the control - must start with "control." + */ + std::string name; + + /** + * Short description to show for the control + */ + wxString uiname; + + /** + * User-visible tooltip for the control + */ + wxString description; + + /** + * Factory function to create the control when required + */ + ACTION_TOOLBAR_CONTROL_FACTORY factory; }; #endif diff --git a/include/tool/ui/toolbar_configuration.h b/include/tool/ui/toolbar_configuration.h index 79c9f6a808..d2eb5d3f10 100644 --- a/include/tool/ui/toolbar_configuration.h +++ b/include/tool/ui/toolbar_configuration.h @@ -25,7 +25,6 @@ #ifndef TOOLBAR_CONFIGURATION_H_ #define TOOLBAR_CONFIGURATION_H_ -#include #include #include @@ -35,7 +34,9 @@ class KICOMMON_API TOOLBAR_GROUP_CONFIG { - TOOLBAR_GROUP_CONFIG( const std::string& aName ) : +public: + + TOOLBAR_GROUP_CONFIG( std::string aName ) : m_groupName( aName ) { wxASSERT_MSG( aName.starts_with( "group" ), "Toolbar group names must start with \"group\"" ); @@ -43,17 +44,19 @@ class KICOMMON_API TOOLBAR_GROUP_CONFIG const std::string& GetName() const { - retrun m_groupName; + return m_groupName; } - void AddAction( std::string aActionName ) + TOOLBAR_GROUP_CONFIG& AddAction( std::string aActionName ) { - m_groupItems.append( aActionName ); + m_groupItems.push_back( aActionName ); + return *this; } - void AddAction( const TOOL_ACTION& aAction ) + TOOLBAR_GROUP_CONFIG& AddAction( const TOOL_ACTION& aAction ) { - m_groupItems.append( aAction.GetName() ); + m_groupItems.push_back( aAction.GetName() ); + return *this; } std::vector GetGroupItems() const @@ -68,30 +71,46 @@ private: class KICOMMON_API TOOLBAR_CONFIGURATION { +public: + TOOLBAR_CONFIGURATION() {} virtual ~TOOLBAR_CONFIGURATION() {} - void AppendAction( std::string aActionName ) + TOOLBAR_CONFIGURATION& AppendAction( std::string aActionName ) { - m_toolbarItems.append( aActionName ); + m_toolbarItems.push_back( aActionName ); + return *this; } - void AppendAction( const TOOL_ACTION& aAction ) + TOOLBAR_CONFIGURATION& AppendAction( const TOOL_ACTION& aAction ) { - m_toolbarItems.append( aAction.GetName() ); + m_toolbarItems.push_back( aAction.GetName() ); + return *this; } - void AppendSeparator() + TOOLBAR_CONFIGURATION& AppendSeparator() { - m_toolbarItems.append( "separator" ); + m_toolbarItems.push_back( "separator" ); + return *this; } - void AppendGroup( const TOOLBAR_GROUP_CONFIG& aGroup ) + TOOLBAR_CONFIGURATION& AppendSpacer( int aSize ) { - std::string& name = aGroup.GetName(); + m_toolbarItems.push_back( "spacer:" + std::to_string( aSize ) ); + return *this; + } - m_toolbarGroups[name] = aGroup; - m_toolbarItems.append( name ); + TOOLBAR_CONFIGURATION& AppendGroup( const TOOLBAR_GROUP_CONFIG& aGroup ) + { + m_toolbarGroups.push_back( aGroup ); + m_toolbarItems.push_back( aGroup.GetName() ); + return *this; + } + + TOOLBAR_CONFIGURATION& AppendControl( std::string aControlName ) + { + m_toolbarItems.push_back( aControlName ); + return *this; } std::vector GetToolbarItems() const @@ -99,15 +118,15 @@ class KICOMMON_API TOOLBAR_CONFIGURATION return m_toolbarItems; } - std::optional GetGroup( const std::string& aGroupName ) + const TOOLBAR_GROUP_CONFIG* GetGroup( const std::string& aGroupName ) const { - for( auto& group : m_toolbarGroups ) + for( const TOOLBAR_GROUP_CONFIG& group : m_toolbarGroups ) { if( group.GetName() == aGroupName ) - return group; + return &group; } - return std::nullopt; + return nullptr; } void Clear() @@ -121,4 +140,4 @@ private: std::vector m_toolbarGroups; }; -#endif /* TOOLBAR_CONFIGURATION_H_ */ \ No newline at end of file +#endif /* TOOLBAR_CONFIGURATION_H_ */ diff --git a/kicad/kicad_manager_frame.cpp b/kicad/kicad_manager_frame.cpp index b09b7143b6..98b23ccaa1 100644 --- a/kicad/kicad_manager_frame.cpp +++ b/kicad/kicad_manager_frame.cpp @@ -133,7 +133,6 @@ KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& titl KICAD_MANAGER_FRAME_NAME, &::Kiway, unityScale ), m_leftWin( nullptr ), m_launcher( nullptr ), - m_mainToolBar( nullptr ), m_lastToolbarIconSize( 0 ) { const int defaultLeftWinWidth = FromDIP( 250 ); @@ -205,14 +204,15 @@ KICAD_MANAGER_FRAME::KICAD_MANAGER_FRAME( wxWindow* parent, const wxString& titl setupTools(); setupUIConditions(); - RecreateBaseLeftToolbar(); + configureToolbars(); + RecreateToolbars(); ReCreateMenuBar(); m_auimgr.SetManagedWindow( this ); m_auimgr.SetFlags( wxAUI_MGR_LIVE_RESIZE ); - m_auimgr.AddPane( m_mainToolBar, - EDA_PANE().VToolbar().Name( "MainToolbar" ).Left().Layer( 2 ) ); + m_auimgr.AddPane( m_tbLeft, + EDA_PANE().VToolbar().Name( "TopMainToolbar" ).Left().Layer( 2 ) ); // BestSize() does not always set the actual pane size of m_leftWin to the required value. // It happens when m_leftWin is too large (roughly > 1/3 of the kicad manager frame width. @@ -984,7 +984,7 @@ void KICAD_MANAGER_FRAME::ShowChangedLanguage() EDA_BASE_FRAME::ShowChangedLanguage(); // tooltips in toolbars - RecreateBaseLeftToolbar(); + RecreateToolbars(); m_launcher->CreateLaunchers(); // update captions @@ -1213,11 +1213,11 @@ void KICAD_MANAGER_FRAME::onToolbarSizeChanged() { // No idea why, but the same mechanism used in EDA_DRAW_FRAME doesn't work here // the only thing that seems to work is to blow it all up and start from scratch. - m_auimgr.DetachPane( m_mainToolBar ); - delete m_mainToolBar; - m_mainToolBar = nullptr; - RecreateBaseLeftToolbar(); - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Left() + m_auimgr.DetachPane( m_tbLeft ); + delete m_tbLeft; + m_tbLeft = nullptr; + RecreateToolbars(); + m_auimgr.AddPane( m_tbLeft, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Left() .Layer( 2 ) ); m_auimgr.Update(); diff --git a/kicad/kicad_manager_frame.h b/kicad/kicad_manager_frame.h index c14925b5bf..615caa7b72 100644 --- a/kicad/kicad_manager_frame.h +++ b/kicad/kicad_manager_frame.h @@ -76,11 +76,6 @@ public: */ void HideTabsIfNeeded(); - /** - * (Re)Create the left vertical toolbar - */ - void RecreateBaseLeftToolbar(); - wxString GetCurrentFileName() const override { return GetProjectFileName(); @@ -201,6 +196,9 @@ public: // Used only on Windows: stores the info message about file watcher wxString m_FileWatcherInfo; + // Toolbar defaults + std::optional DefaultLeftToolbarConfig() override; + DECLARE_EVENT_TABLE() protected: @@ -239,7 +237,6 @@ private: PROJECT_TREE_PANE* m_leftWin; wxAuiNotebook* m_notebook; PANEL_KICAD_LAUNCHER* m_launcher; - ACTION_TOOLBAR* m_mainToolBar; int m_lastToolbarIconSize; std::shared_ptr m_pcm; diff --git a/kicad/menubar.cpp b/kicad/menubar.cpp index f68c2b61d9..d738110774 100644 --- a/kicad/menubar.cpp +++ b/kicad/menubar.cpp @@ -240,53 +240,44 @@ void KICAD_MANAGER_FRAME::doReCreateMenuBar() } -/** - * @brief (Re)Create the left vertical toolbar - */ -void KICAD_MANAGER_FRAME::RecreateBaseLeftToolbar() +std::optional KICAD_MANAGER_FRAME::DefaultLeftToolbarConfig() { - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - // New - m_mainToolBar->Add( KICAD_MANAGER_ACTIONS::newProject ); - m_mainToolBar->Add( KICAD_MANAGER_ACTIONS::openProject ); + // clang-format off + config.AppendAction( KICAD_MANAGER_ACTIONS::newProject ) + .AppendAction( KICAD_MANAGER_ACTIONS::openProject ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_SAVE_AND_ZIP_FILES, wxEmptyString, + config.AppendSeparator(); +/* TODO (ISM): Toolize this: + m_tbTopMain->AddTool( ID_SAVE_AND_ZIP_FILES, wxEmptyString, KiBitmapBundle( BITMAPS::zip ), KiDisabledBitmapBundle( BITMAPS::zip ), wxITEM_NORMAL, _( "Archive all project files" ), wxEmptyString, nullptr ); - m_mainToolBar->AddTool( ID_READ_ZIP_ARCHIVE, wxEmptyString, + m_tbTopMain->AddTool( ID_READ_ZIP_ARCHIVE, wxEmptyString, KiBitmapBundle( BITMAPS::unzip ), KiDisabledBitmapBundle( BITMAPS::unzip ), wxITEM_NORMAL, _( "Unarchive project files from zip archive" ), wxEmptyString, nullptr ); +*/ + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_BROWSE_IN_FILE_EXPLORER, wxEmptyString, + config.AppendSeparator(); +/* TODO (ISM): Toolize this: + m_tbTopMain->AddTool( ID_BROWSE_IN_FILE_EXPLORER, wxEmptyString, KiBitmapBundle( BITMAPS::directory_browser ), #ifdef __APPLE__ _( "Reveal project folder in Finder" ) ); #else _( "Open project directory in file explorer" ) ); #endif +*/ - // Create m_mainToolBar - m_mainToolBar->KiRealize(); + // clang-format on + return config; } diff --git a/pagelayout_editor/pl_editor_frame.cpp b/pagelayout_editor/pl_editor_frame.cpp index 2ba93499ab..deb04709b2 100644 --- a/pagelayout_editor/pl_editor_frame.cpp +++ b/pagelayout_editor/pl_editor_frame.cpp @@ -134,9 +134,9 @@ PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); + + configureToolbars(); + RecreateToolbars(); wxWindow* stsbar = GetStatusBar(); int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2; @@ -179,15 +179,15 @@ PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_propertiesPagelayout = new PROPERTIES_FRAME( this ); // Rows; layers 4 - 6 - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ) .Top().Layer( 6 ) ); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" ) + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" ) .Left().Layer( 3 ) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ) .Bottom().Layer( 6 ) ); // Columns; layers 1 - 3 - m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" ) + m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" ) .Right().Layer( 2 ) ); m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" ) diff --git a/pagelayout_editor/pl_editor_frame.h b/pagelayout_editor/pl_editor_frame.h index ddc809de4f..b9b5b47b58 100644 --- a/pagelayout_editor/pl_editor_frame.h +++ b/pagelayout_editor/pl_editor_frame.h @@ -98,8 +98,11 @@ public: // The Tool Framework initialization void setupTools(); - // Virtual basic functions: - void ReCreateHToolbar() override; + // Currently no top auxillary toolbar + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultRightToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; + void UpdateToolbarControlSizes() override; void SetPageSettings(const PAGE_INFO&) override; @@ -132,18 +135,6 @@ public: */ void OnNewDrawingSheet(); - /** - * Create or update the right vertical toolbar. - */ - void ReCreateVToolbar() override; - - /** - * Create or update the left vertical toolbar. - * - * @note This is currently not used. - */ - void ReCreateOptToolbar() override; - const PL_EDITOR_LAYOUT& GetPageLayout() const { return m_pageLayout; } PL_EDITOR_LAYOUT& GetPageLayout() { return m_pageLayout; } @@ -253,6 +244,8 @@ public: protected: bool saveCurrentPageLayout(); + void configureToolbars() override; + void setupUIConditions() override; void doReCreateMenuBar() override; @@ -283,6 +276,15 @@ private: VECTOR2I m_grid_origin; std::unique_ptr m_spaceMouse; + + wxString m_originChoiceList[5] = + { + _("Left Top paper corner"), + _("Right Bottom page corner"), + _("Left Bottom page corner"), + _("Right Top page corner"), + _("Left Top page corner") + }; }; #endif /* _PL_EDITOR_FRAME_H */ diff --git a/pagelayout_editor/toolbars_pl_editor.cpp b/pagelayout_editor/toolbars_pl_editor.cpp index 6f8c136cfe..8109241966 100644 --- a/pagelayout_editor/toolbars_pl_editor.cpp +++ b/pagelayout_editor/toolbars_pl_editor.cpp @@ -29,168 +29,155 @@ #include "pl_editor_id.h" #include "pl_editor_frame.h" -void PL_EDITOR_FRAME::ReCreateHToolbar() + +std::optional PL_EDITOR_FRAME::DefaultLeftToolbarConfig() { - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - m_mainToolBar->Add( ACTIONS::doNew ); - m_mainToolBar->Add( ACTIONS::open ); - m_mainToolBar->Add( ACTIONS::save ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::print ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::undo ); - m_mainToolBar->Add( ACTIONS::redo ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomTool ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PL_ACTIONS::showInspector ); - m_mainToolBar->Add( PL_ACTIONS::previewSettings ); - - // Display mode switch - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PL_ACTIONS::layoutNormalMode ); - m_mainToolBar->Add( PL_ACTIONS::layoutEditMode ); - m_mainToolBar->AddScaledSeparator( this ); - - wxString choiceList[5] = - { - _("Left Top paper corner"), - _("Right Bottom page corner"), - _("Left Bottom page corner"), - _("Right Top page corner"), - _("Left Top page corner") - }; - - if( !m_originSelectBox ) - { - m_originSelectBox = new wxChoice( m_mainToolBar, ID_SELECT_COORDINATE_ORIGIN, - wxDefaultPosition, wxDefaultSize, 5, choiceList ); - } - - - m_mainToolBar->AddControl( m_originSelectBox ); - m_originSelectBox->SetToolTip( _("Origin of coordinates displayed to the status bar") ); - - int minwidth = 0; - - for( int ii = 0; ii < 5; ii++ ) - { - int width = KIUI::GetTextSize( choiceList[ii], m_originSelectBox ).x; - minwidth = std::max( minwidth, width ); - } - - m_originSelectBox->SetMinSize( wxSize( minwidth, -1 ) ); - m_originSelectBox->SetSelection( m_originSelectChoice ); - - wxString pageList[5] = - { - _("Page 1"), - _("Other pages") - }; - - if( !m_pageSelectBox ) - { - m_pageSelectBox = new wxChoice( m_mainToolBar, ID_SELECT_PAGE_NUMBER, - wxDefaultPosition, wxDefaultSize, 2, pageList ); - } - - m_mainToolBar->AddControl( m_pageSelectBox ); - m_pageSelectBox->SetToolTip( _("Simulate page 1 or other pages to show how items\n"\ - "which are not on all page are displayed") ); - m_pageSelectBox->SetSelection( 0 ); - - - // Go through and ensure the comboboxes are the correct size, since the strings in the - // box could have changed widths. - m_mainToolBar->UpdateControlWidth( ID_SELECT_COORDINATE_ORIGIN ); - m_mainToolBar->UpdateControlWidth( ID_SELECT_PAGE_NUMBER ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->KiRealize(); -} - - -void PL_EDITOR_FRAME::ReCreateVToolbar() -{ - if( m_drawToolBar ) - { - m_drawToolBar->ClearToolbar(); - } - else - { - m_drawToolBar = new ACTION_TOOLBAR( this, ID_V_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_drawToolBar->SetAuiManager( &m_auimgr ); - } - - m_drawToolBar->Add( ACTIONS::selectionTool ); - - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( PL_ACTIONS::drawLine ); - m_drawToolBar->Add( PL_ACTIONS::drawRectangle ); - m_drawToolBar->Add( PL_ACTIONS::placeText ); - m_drawToolBar->Add( PL_ACTIONS::placeImage ); - m_drawToolBar->Add( PL_ACTIONS::appendImportedDrawingSheet ); - - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( ACTIONS::deleteTool ); - - m_drawToolBar->KiRealize(); -} - - -void PL_EDITOR_FRAME::ReCreateOptToolbar() -{ - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, - wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } + // clang-format off + config.AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ); + /* TODO: Implement context menus PL_SELECTION_TOOL* selTool = m_toolManager->GetTool(); std::unique_ptr gridMenu = std::make_unique( false, selTool ); gridMenu->Add( ACTIONS::gridProperties ); - m_optionsToolBar->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + m_tbLeft->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + */ - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); + // clang-format on + return config; +} - m_optionsToolBar->KiRealize(); + +std::optional PL_EDITOR_FRAME::DefaultRightToolbarConfig() +{ + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendAction( ACTIONS::selectionTool ); + + config.AppendSeparator() + .AppendAction( PL_ACTIONS::drawLine ) + .AppendAction( PL_ACTIONS::drawRectangle ) + .AppendAction( PL_ACTIONS::placeText ) + .AppendAction( PL_ACTIONS::placeImage ) + .AppendAction( PL_ACTIONS::appendImportedDrawingSheet ); + + config.AppendSeparator() + .AppendAction( ACTIONS::deleteTool ); + + // clang-format on + return config; +} + + +std::optional PL_EDITOR_FRAME::DefaultTopMainToolbarConfig() +{ + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendAction( ACTIONS::doNew ) + .AppendAction( ACTIONS::open ) + .AppendAction( ACTIONS::save ); + + config.AppendSeparator() + .AppendAction( ACTIONS::print ); + + config.AppendSeparator() + .AppendAction( ACTIONS::undo ) + .AppendAction( ACTIONS::redo ); + + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomTool ); + + config.AppendSeparator() + .AppendAction( PL_ACTIONS::showInspector ) + .AppendAction( PL_ACTIONS::previewSettings ); + + // Display mode switch + config.AppendSeparator() + .AppendAction( PL_ACTIONS::layoutNormalMode ) + .AppendAction( PL_ACTIONS::layoutEditMode ); + + config.AppendSeparator() + .AppendControl( "control.PLEditorOrigin" ) + .AppendControl( "control.PLEditorPageSelect" ); + + // clang-format on + return config; +} + + +void PL_EDITOR_FRAME::configureToolbars() +{ + EDA_DRAW_FRAME::configureToolbars(); + + auto originSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_originSelectBox ) + { + m_originSelectBox = new wxChoice( aToolbar, ID_SELECT_COORDINATE_ORIGIN, + wxDefaultPosition, wxDefaultSize, 5, m_originChoiceList ); + } + + m_originSelectBox->SetToolTip( _("Origin of coordinates displayed to the status bar") ); + m_originSelectBox->SetSelection( m_originSelectChoice ); + + aToolbar->Add( m_originSelectBox ); + }; + + RegisterCustomToolbarControlFactory( "control.PLEditorOrigin", _( "Origin Selector" ), + _( "Select the origin of the status bar coordinates" ), + originSelectorFactory ); + + + auto pageSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + wxString pageList[5] = + { + _("Page 1"), + _("Other pages") + }; + + if( !m_pageSelectBox ) + { + m_pageSelectBox = new wxChoice( aToolbar, ID_SELECT_PAGE_NUMBER, + wxDefaultPosition, wxDefaultSize, 2, pageList ); + } + + m_pageSelectBox->SetToolTip( _("Simulate page 1 or other pages to show how items\n"\ + "which are not on all page are displayed") ); + m_pageSelectBox->SetSelection( 0 ); + + aToolbar->Add( m_pageSelectBox ); + }; + + RegisterCustomToolbarControlFactory( "control.PLEditorPageSelect", _( "Page Selector" ), + _( "Select the page to simulate item displays" ), + pageSelectorFactory ); } void PL_EDITOR_FRAME::UpdateToolbarControlSizes() { - if( m_mainToolBar ) + // Ensure the origin selector is a minimum size + int minwidth = 0; + + for( int ii = 0; ii < 5; ii++ ) { - // Update the item widths - m_mainToolBar->UpdateControlWidth( ID_SELECT_COORDINATE_ORIGIN ); - m_mainToolBar->UpdateControlWidth( ID_SELECT_PAGE_NUMBER ); + int width = KIUI::GetTextSize( m_originChoiceList[ii], m_originSelectBox ).x; + minwidth = std::max( minwidth, width ); } + + m_originSelectBox->SetMinSize( wxSize( minwidth, -1 ) ); + + // Base class actually will go through and update the sizes of the controls + EDA_DRAW_FRAME::UpdateToolbarControlSizes(); } diff --git a/pcbnew/footprint_edit_frame.cpp b/pcbnew/footprint_edit_frame.cpp index 280d19a621..d306be2090 100644 --- a/pcbnew/footprint_edit_frame.cpp +++ b/pcbnew/footprint_edit_frame.cpp @@ -101,7 +101,6 @@ BEGIN_EVENT_TABLE( FOOTPRINT_EDIT_FRAME, PCB_BASE_FRAME ) FOOTPRINT_EDIT_FRAME::OnUpdateLoadFootprintFromBoard ) EVT_UPDATE_UI( ID_ADD_FOOTPRINT_TO_BOARD, FOOTPRINT_EDIT_FRAME::OnUpdateSaveFootprintToBoard ) - EVT_UPDATE_UI( ID_TOOLBARH_PCB_SELECT_LAYER, FOOTPRINT_EDIT_FRAME::OnUpdateLayerSelectBox ) // Drop files event EVT_DROP_FILES( FOOTPRINT_EDIT_FRAME::OnDropFiles ) @@ -117,7 +116,6 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : { m_showBorderAndTitleBlock = false; // true to show the frame references m_aboutTitle = _HKI( "KiCad Footprint Editor" ); - m_selLayerBox = nullptr; m_editorSettings = nullptr; // Give an icon @@ -178,10 +176,9 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : initLibraryTree(); m_treePane = new FOOTPRINT_TREE_PANE( this ); + configureToolbars(); + RecreateToolbars(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); m_selectionFilterPanel = new PANEL_SELECTION_FILTER( this ); m_appearancePanel = new APPEARANCE_CONTROLS( this, GetCanvas(), true ); @@ -228,7 +225,7 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_auimgr.SetFlags( auiFlags ); // Rows; layers 4 - 6 - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ) .Top().Layer( 6 ) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ) @@ -243,10 +240,10 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : .Left().Layer( 3 ) .Caption( _( "Properties" ) ).PaneBorder( false ) .MinSize( FromDIP( wxSize( 240, 60 ) ) ).BestSize( FromDIP( wxSize( 300, 200 ) ) ) ); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" ) + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" ) .Left().Layer( 2 ) ); - m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" ) + m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( "RightToolbar" ) .Right().Layer(2) ); m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( "LayersManager" ) .Right().Layer( 3 ) diff --git a/pcbnew/footprint_edit_frame.h b/pcbnew/footprint_edit_frame.h index 8153811381..fa03913fc4 100644 --- a/pcbnew/footprint_edit_frame.h +++ b/pcbnew/footprint_edit_frame.h @@ -114,14 +114,10 @@ public: */ void HardRedraw() override; - /** - * Create the main horizontal toolbar for the footprint editor. - */ - void ReCreateHToolbar() override; - - void ReCreateVToolbar() override; - void ReCreateOptToolbar() override; - void UpdateToolbarControlSizes() override; + // Default toolbar configuration + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultRightToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; /** * Re create the layer Box by clearing the old list, and building a new one from the new @@ -133,8 +129,6 @@ public: */ void ReCreateLayerBox( bool aForceResizeToolbar = true ); - void OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ); - void SelectLayer( wxCommandEvent& event ); // The Tool Framework initialization, for GAL mode @@ -360,7 +354,6 @@ protected: void centerItemIdleHandler( wxIdleEvent& aEvent ); protected: - PCB_LAYER_BOX_SELECTOR* m_selLayerBox; // a combo box to display and select active layer FOOTPRINT_EDITOR_SETTINGS* m_editorSettings; private: diff --git a/pcbnew/footprint_editor_utils.cpp b/pcbnew/footprint_editor_utils.cpp index 21adc87681..e8cf5e7707 100644 --- a/pcbnew/footprint_editor_utils.cpp +++ b/pcbnew/footprint_editor_utils.cpp @@ -118,7 +118,7 @@ void FOOTPRINT_EDIT_FRAME::centerItemIdleHandler( wxIdleEvent& aEvent ) void FOOTPRINT_EDIT_FRAME::SelectLayer( wxCommandEvent& event ) { - SetActiveLayer( ToLAYER_ID( m_selLayerBox->GetLayerSelection() ) ); + SetActiveLayer( ToLAYER_ID( m_SelLayerBox->GetLayerSelection() ) ); if( GetDisplayOptions().m_ContrastModeDisplay != HIGH_CONTRAST_MODE::NORMAL ) GetCanvas()->Refresh(); diff --git a/pcbnew/footprint_viewer_frame.cpp b/pcbnew/footprint_viewer_frame.cpp index 79cef3dba6..4a6320776f 100644 --- a/pcbnew/footprint_viewer_frame.cpp +++ b/pcbnew/footprint_viewer_frame.cpp @@ -229,10 +229,9 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent m_toolManager->InvokeTool( "pcbnew.InteractiveSelection" ); setupUIConditions(); + configureToolbars(); + RecreateToolbars(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); ReCreateLibraryList(); UpdateTitle(); @@ -262,8 +261,8 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent m_auimgr.SetManagedWindow( this ); // Horizontal items; layers 4 - 6 - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().VToolbar().Name( "MainToolbar" ).Top().Layer(6) ); - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" ).Left().Layer(3) ); + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().VToolbar().Name( "TopMainToolbar" ).Top().Layer(6) ); + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( "LeftToolbar" ).Left().Layer(3) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ).Bottom().Layer(6) ); // Vertical items; layers 1 - 3 @@ -293,7 +292,7 @@ FOOTPRINT_VIEWER_FRAME::FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent wxASSERT( cfg ); GetCanvas()->GetView()->SetScale( cfg->m_FootprintViewerZoom ); - wxAuiToolBarItem* toolOpt = m_mainToolBar->FindTool( ID_FPVIEWER_AUTOZOOM_TOOL ); + wxAuiToolBarItem* toolOpt = m_tbTopMain->FindTool( ID_FPVIEWER_AUTOZOOM_TOOL ); if( cfg->m_FootprintViewerAutoZoomOnSelect ) toolOpt->SetState( wxAUI_BUTTON_STATE_CHECKED ); @@ -387,7 +386,7 @@ void FOOTPRINT_VIEWER_FRAME::doCloseWindow() // A workaround to avoid flicker, in modal mode when modview frame is destroyed, // when the aui toolbar is not docked (i.e. shown in a miniframe) // (useful on windows only) - m_mainToolBar->SetFocus(); + m_tbTopMain->SetFocus(); GetCanvas()->StopDrawing(); @@ -844,7 +843,7 @@ void FOOTPRINT_VIEWER_FRAME::SaveSettings( APP_SETTINGS_BASE* aCfg ) if( GetCanvas() && GetCanvas()->GetView() ) cfg->m_FootprintViewerZoom = GetCanvas()->GetView()->GetScale(); - wxAuiToolBarItem* toolOpt = m_mainToolBar->FindTool( ID_FPVIEWER_AUTOZOOM_TOOL ); + wxAuiToolBarItem* toolOpt = m_tbTopMain->FindTool( ID_FPVIEWER_AUTOZOOM_TOOL ); cfg->m_FootprintViewerAutoZoomOnSelect = ( toolOpt->GetState() & wxAUI_BUTTON_STATE_CHECKED ); cfg->m_FootprintViewerLibListWidth = m_libList->GetSize().x; cfg->m_FootprintViewerFPListWidth = m_fpList->GetSize().x; @@ -1096,7 +1095,7 @@ void FOOTPRINT_VIEWER_FRAME::updateView() m_toolManager->ResetTools( TOOL_BASE::MODEL_RELOAD ); - wxAuiToolBarItem* toolOpt = m_mainToolBar->FindTool( ID_FPVIEWER_AUTOZOOM_TOOL ); + wxAuiToolBarItem* toolOpt = m_tbTopMain->FindTool( ID_FPVIEWER_AUTOZOOM_TOOL ); if( toolOpt->GetState() & wxAUI_BUTTON_STATE_CHECKED ) m_toolManager->RunAction( ACTIONS::zoomFitScreen ); diff --git a/pcbnew/footprint_viewer_frame.h b/pcbnew/footprint_viewer_frame.h index c117448033..ed50dc4ab4 100644 --- a/pcbnew/footprint_viewer_frame.h +++ b/pcbnew/footprint_viewer_frame.h @@ -87,6 +87,10 @@ public: void HardRedraw() override; + // Toolbar defaults + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; + protected: FOOTPRINT_VIEWER_FRAME( KIWAY* aKiway, wxWindow* aParent ); @@ -119,10 +123,6 @@ private: void CloseFootprintViewer( wxCommandEvent& event ); void OnExitKiCad( wxCommandEvent& event ); - void ReCreateHToolbar() override; - void ReCreateVToolbar() override; - void ReCreateOptToolbar() override; - void OnLibFilter( wxCommandEvent& aEvent ); void OnFPFilter( wxCommandEvent& aEvent ); void OnCharHook( wxKeyEvent& aEvent ) override; diff --git a/pcbnew/footprint_wizard_frame.cpp b/pcbnew/footprint_wizard_frame.cpp index cc17d18593..a4cafb24dc 100644 --- a/pcbnew/footprint_wizard_frame.cpp +++ b/pcbnew/footprint_wizard_frame.cpp @@ -151,8 +151,8 @@ FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( KIWAY* aKiway, wxWindow* aParent m_toolManager->InvokeTool( "pcbnew.InteractiveSelection" ); // Create the toolbars - ReCreateHToolbar(); - ReCreateVToolbar(); + configureToolbars(); + RecreateToolbars(); // Create the parameters panel m_parametersPanel = new wxPanel( this, wxID_ANY ); @@ -186,7 +186,7 @@ FOOTPRINT_WIZARD_FRAME::FOOTPRINT_WIZARD_FRAME( KIWAY* aKiway, wxWindow* aParent m_auimgr.SetManagedWindow( this ); - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" ).Top().Layer(6) ); + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( "TopMainToolbar" ).Top().Layer(6) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" ).Bottom().Layer(6) .BestSize( -1, m_msgFrameHeight ) ); @@ -569,57 +569,49 @@ void FOOTPRINT_WIZARD_FRAME::Update3DView( bool aMarkDirty, bool aRefresh, const } -void FOOTPRINT_WIZARD_FRAME::ReCreateHToolbar() +std::optional FOOTPRINT_WIZARD_FRAME::DefaultTopMainToolbarConfig() { - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - // Set up toolbar - m_mainToolBar->AddTool( ID_FOOTPRINT_WIZARD_SELECT_WIZARD, wxEmptyString, - KiBitmap( BITMAPS::module_wizard ), - _( "Select wizard script to run" ) ); + // clang-format off + /* TODO (ISM): Convert to action + m_tbTopMain->AddTool( ID_FOOTPRINT_WIZARD_SELECT_WIZARD, wxEmptyString, + KiBitmap( BITMAPS::module_wizard ), + _( "Select wizard script to run" ) ); +*/ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_FOOTPRINT_WIZARD_RESET_TO_DEFAULT, wxEmptyString, - KiBitmap( BITMAPS::reload ), - _( "Reset wizard parameters to default") ); + config.AppendSeparator(); + /* TODO (ISM): Convert to action + m_tbTopMain->AddTool( ID_FOOTPRINT_WIZARD_RESET_TO_DEFAULT, wxEmptyString, + KiBitmap( BITMAPS::reload ), + _( "Reset wizard parameters to default") ); +*/ + config.AppendSeparator(); + /* TODO (ISM): Convert to action + m_tbTopMain->AddTool( ID_FOOTPRINT_WIZARD_PREVIOUS, wxEmptyString, + KiBitmap( BITMAPS::lib_previous ), + _( "Select previous parameters page" ) ); + m_tbTopMain->AddTool( ID_FOOTPRINT_WIZARD_NEXT, wxEmptyString, + KiBitmap( BITMAPS::lib_next ), + _( "Select next parameters page" ) ); +*/ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_FOOTPRINT_WIZARD_PREVIOUS, wxEmptyString, - KiBitmap( BITMAPS::lib_previous ), - _( "Select previous parameters page" ) ); - m_mainToolBar->AddTool( ID_FOOTPRINT_WIZARD_NEXT, wxEmptyString, - KiBitmap( BITMAPS::lib_next ), - _( "Select next parameters page" ) ); - -#if 0 // Currently: the 3D viewer is not useful - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::show3DViewer ); -#endif - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ); // The footprint wizard always can export the current footprint - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_FOOTPRINT_WIZARD_DONE, - wxEmptyString, KiBitmap( BITMAPS::export_footprint_names ), - _( "Export footprint to editor" ) ); + config.AppendSeparator(); + /* TODO (ISM): Convert to action + m_tbTopMain->AddTool( ID_FOOTPRINT_WIZARD_DONE, + wxEmptyString, KiBitmap( BITMAPS::export_footprint_names ), + _( "Export footprint to editor" ) ); +*/ - // after adding the buttons to the toolbar, must call Realize() to - // reflect the changes - m_mainToolBar->Realize(); + // clang-format on + return config; } @@ -629,11 +621,6 @@ BOARD_ITEM_CONTAINER* FOOTPRINT_WIZARD_FRAME::GetModel() const } -void FOOTPRINT_WIZARD_FRAME::ReCreateVToolbar() -{ - // Currently, there is no vertical toolbar -} - void FOOTPRINT_WIZARD_FRAME::PythonPluginsReload() { // Reload the Python plugins diff --git a/pcbnew/footprint_wizard_frame.h b/pcbnew/footprint_wizard_frame.h index 212deeaaf5..db1ef7fea0 100644 --- a/pcbnew/footprint_wizard_frame.h +++ b/pcbnew/footprint_wizard_frame.h @@ -147,9 +147,10 @@ private: */ void DisplayWizardInfos(); + // Toolbar defaults + std::optional DefaultTopMainToolbarConfig() override; + void doCloseWindow() override; - void ReCreateHToolbar() override; - void ReCreateVToolbar() override; void ClickOnPageList( wxCommandEvent& event ); void LoadSettings( APP_SETTINGS_BASE* aCfg ) override; diff --git a/pcbnew/pcb_base_frame.cpp b/pcbnew/pcb_base_frame.cpp index f182f8acb9..13b9dbb97f 100644 --- a/pcbnew/pcb_base_frame.cpp +++ b/pcbnew/pcb_base_frame.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -83,6 +84,7 @@ PCB_BASE_FRAME::PCB_BASE_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrame m_pcb( nullptr ), m_originTransforms( *this ) { + m_SelLayerBox = nullptr; m_watcherDebounceTimer.Bind( wxEVT_TIMER, &PCB_BASE_FRAME::OnFpChangeDebounceTimer, this ); } @@ -1268,3 +1270,47 @@ void PCB_BASE_FRAME::OnFpChangeDebounceTimer( wxTimerEvent& aEvent ) } } } + + +void PCB_BASE_FRAME::configureToolbars() +{ + // Load the toolbar configuration and base controls + EDA_DRAW_FRAME::configureToolbars(); + + // Layer selector + auto layerSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelLayerBox ) + { + m_SelLayerBox = new PCB_LAYER_BOX_SELECTOR( aToolbar, + ID_TOOLBARH_PCB_SELECT_LAYER ); + m_SelLayerBox->SetBoardFrame( this ); + } + + // In the footprint editor, some layers cannot be select (they are shown in the layer + // manager only to set the color and visibility, but not for selection) + // Disable them in layer box + if( IsType( FRAME_FOOTPRINT_EDITOR ) ) + m_SelLayerBox->SetNotAllowedLayerSet( LSET::ForbiddenFootprintLayers() ); + + m_SelLayerBox->Resync(); + + aToolbar->Add( m_SelLayerBox ); + + // UI update handler for the control + aToolbar->Bind( wxEVT_UPDATE_UI, + [this]( wxUpdateUIEvent& aEvent ) + { + if( m_SelLayerBox->GetCount() ) + { + if( m_SelLayerBox->GetSelection() != GetActiveLayer() ) + m_SelLayerBox->SetSelection( GetActiveLayer() ); + } + }, + m_SelLayerBox->GetId() ); + }; + + RegisterCustomToolbarControlFactory( m_tbPcbLayerSelectorName, _( "Layer selector" ), + _( "Control to select the layer" ), + layerSelectorFactory ); +} \ No newline at end of file diff --git a/pcbnew/pcb_edit_frame.cpp b/pcbnew/pcb_edit_frame.cpp index f46476ddd0..3580190822 100644 --- a/pcbnew/pcb_edit_frame.cpp +++ b/pcbnew/pcb_edit_frame.cpp @@ -184,7 +184,6 @@ BEGIN_EVENT_TABLE( PCB_EDIT_FRAME, PCB_BASE_FRAME ) PCB_EDIT_FRAME::Tracks_and_Vias_Size_Event ) // User interface update event handlers. - EVT_UPDATE_UI( ID_TOOLBARH_PCB_SELECT_LAYER, PCB_EDIT_FRAME::OnUpdateLayerSelectBox ) EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, PCB_EDIT_FRAME::OnUpdateSelectTrackWidth ) EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_VIA_SIZE, PCB_EDIT_FRAME::OnUpdateSelectViaSize ) EVT_UPDATE_UI( ID_AUX_TOOLBAR_PCB_SELECT_AUTO_WIDTH, PCB_EDIT_FRAME::OnUpdateSelectAutoWidth ) @@ -215,7 +214,6 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_showBorderAndTitleBlock = true; // true to display sheet references m_SelTrackWidthBox = nullptr; m_SelViaSizeBox = nullptr; - m_SelLayerBox = nullptr; m_show_layer_manager_tools = true; m_supportsAutoSave = true; m_probingSchToPcb = false; @@ -271,12 +269,9 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : setupTools(); setupUIConditions(); - + configureToolbars(); + RecreateToolbars(); ReCreateMenuBar(); - ReCreateHToolbar(); - ReCreateAuxiliaryToolbar(); - ReCreateVToolbar(); - ReCreateOptToolbar(); #ifdef KICAD_IPC_API wxTheApp->Bind( EDA_EVT_PLUGIN_AVAILABILITY_CHANGED, @@ -309,18 +304,18 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) : m_auimgr.SetFlags( auiFlags ); // Rows; layers 4 - 6 - m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( wxS( "MainToolbar" ) ) + m_auimgr.AddPane( m_tbTopMain, EDA_PANE().HToolbar().Name( wxS( "TopMainToolbar" ) ) .Top().Layer( 6 ) ); - m_auimgr.AddPane( m_auxiliaryToolBar, EDA_PANE().HToolbar().Name( wxS( "AuxToolbar" ) ) + m_auimgr.AddPane( m_tbTopAux, EDA_PANE().HToolbar().Name( wxS( "TopAuxToolbar" ) ) .Top().Layer( 5 ) ); m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( wxS( "MsgPanel" ) ) .Bottom().Layer( 6 ) ); // Columns; layers 1 - 3 - m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( wxS( "OptToolbar" ) ) + m_auimgr.AddPane( m_tbLeft, EDA_PANE().VToolbar().Name( wxS( "LeftToolbar" ) ) .Left().Layer( 3 ) ); - m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( wxS( "ToolsToolbar" ) ) + m_auimgr.AddPane( m_tbRight, EDA_PANE().VToolbar().Name( wxS( "RightToolbar" ) ) .Right().Layer( 3 ) ); m_auimgr.AddPane( m_appearancePanel, EDA_PANE().Name( wxS( "LayersManager" ) ) diff --git a/pcbnew/pcb_edit_frame.h b/pcbnew/pcb_edit_frame.h index 4f373f81b3..4c976593ed 100644 --- a/pcbnew/pcb_edit_frame.h +++ b/pcbnew/pcb_edit_frame.h @@ -49,7 +49,6 @@ class GENERAL_COLLECTORS_GUIDE; class SELECTION; class PCB_MARKER; class BOARD_ITEM; -class PCB_LAYER_BOX_SELECTOR; class NETLIST; class REPORTER; struct PARSE_ERROR; @@ -159,9 +158,6 @@ public: */ void ToPlotter( int aID ); - // User interface update command event handlers. - void OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ); - bool LayerManagerShown(); bool PropertiesShown(); bool NetInspectorShown(); @@ -251,11 +247,7 @@ public: void Process_Special_Functions( wxCommandEvent& event ); void Tracks_and_Vias_Size_Event( wxCommandEvent& event ); - void ReCreateHToolbar() override; - void ReCreateAuxiliaryToolbar() override; - void ReCreateVToolbar() override; - void ReCreateOptToolbar() override; - void UpdateToolbarControlSizes() override; + /** * Recreate the layer box by clearing the old list and building a new one from the new @@ -734,6 +726,11 @@ public: DIALOG_BOOK_REPORTER* GetFootprintDiffDialog(); + std::optional DefaultLeftToolbarConfig() override; + std::optional DefaultRightToolbarConfig() override; + std::optional DefaultTopMainToolbarConfig() override; + std::optional DefaultTopAuxToolbarConfig() override; + DECLARE_EVENT_TABLE() protected: @@ -760,6 +757,8 @@ protected: void doReCreateMenuBar() override; + void configureToolbars() override; + // The Tool Framework initialization void setupTools(); void setupUIConditions() override; @@ -777,9 +776,9 @@ protected: void buildActionPluginMenus( ACTION_MENU* aActionMenu ); /** - * Append action plugin buttons to main toolbar + * Append action plugin buttons to given toolbar */ - void AddActionPluginTools(); + void addActionPluginTools( ACTION_TOOLBAR* aToolbar ); /** * Execute action plugin's Run() method and updates undo buffer. @@ -847,8 +846,6 @@ protected: #endif public: - PCB_LAYER_BOX_SELECTOR* m_SelLayerBox; // a combo box to display and select active layer - wxChoice* m_SelTrackWidthBox; // a choice box to display and select current track width wxChoice* m_SelViaSizeBox; // a choice box to display and select current via diameter diff --git a/pcbnew/python/scripting/pcbnew_action_plugins.cpp b/pcbnew/python/scripting/pcbnew_action_plugins.cpp index 158d3f5101..45b578263a 100644 --- a/pcbnew/python/scripting/pcbnew_action_plugins.cpp +++ b/pcbnew/python/scripting/pcbnew_action_plugins.cpp @@ -501,7 +501,7 @@ void PCB_EDIT_FRAME::buildActionPluginMenus( ACTION_MENU* actionMenu ) } -void PCB_EDIT_FRAME::AddActionPluginTools() +void PCB_EDIT_FRAME::addActionPluginTools( ACTION_TOOLBAR* aToolbar ) { bool need_separator = true; const std::vector& orderedPlugins = GetOrderedActionPlugins(); @@ -518,7 +518,7 @@ void PCB_EDIT_FRAME::AddActionPluginTools() { if( need_separator ) { - m_mainToolBar->AddScaledSeparator( this ); + aToolbar->AddScaledSeparator( this ); need_separator = false; } @@ -530,7 +530,7 @@ void PCB_EDIT_FRAME::AddActionPluginTools() else bitmap = KiScaledBitmap( BITMAPS::puzzle_piece, this ); - wxAuiToolBarItem* button = m_mainToolBar->AddTool( wxID_ANY, wxEmptyString, + wxAuiToolBarItem* button = aToolbar->AddTool( wxID_ANY, wxEmptyString, bitmap, ap->GetName() ); Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED, diff --git a/pcbnew/toolbars_footprint_editor.cpp b/pcbnew/toolbars_footprint_editor.cpp index 8a38c60ee4..34734a3b7d 100644 --- a/pcbnew/toolbars_footprint_editor.cpp +++ b/pcbnew/toolbars_footprint_editor.cpp @@ -34,173 +34,85 @@ #include #include -void FOOTPRINT_EDIT_FRAME::ReCreateHToolbar() +std::optional FOOTPRINT_EDIT_FRAME::DefaultLeftToolbarConfig() { - // Note: - // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) - // all wxAuiToolBarItems. - // However the wxAuiToolBarItems are not the owners of controls managed by - // them ( m_zoomSelectBox and m_gridSelectBox ), and therefore do not delete them - // So we do not recreate them after clearing the tools. + TOOLBAR_CONFIGURATION config; - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + // clang-format off + config.AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::toggleGridOverrides ) + .AppendAction( PCB_ACTIONS::togglePolarCoords ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); - // Set up toolbar - m_mainToolBar->Add( PCB_ACTIONS::newFootprint ); - m_mainToolBar->Add( PCB_ACTIONS::createFootprint ); - m_mainToolBar->Add( ACTIONS::save ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::toggleHV45Mode ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::print ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::padDisplayMode ) + .AppendAction( PCB_ACTIONS::graphicsOutlines ) + .AppendAction( PCB_ACTIONS::textOutlines ) + .AppendAction( ACTIONS::highContrastMode ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::undo ); - m_mainToolBar->Add( ACTIONS::redo ); + if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes ) + config.AppendAction( ACTIONS::toggleBoundingBoxes ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomTool ); + config.AppendSeparator() + .AppendAction( ACTIONS::showLibraryTree ) + .AppendAction( PCB_ACTIONS::showLayersManager ) + .AppendAction( ACTIONS::showProperties ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PCB_ACTIONS::rotateCcw ); - m_mainToolBar->Add( PCB_ACTIONS::rotateCw ); - m_mainToolBar->Add( PCB_ACTIONS::mirrorH ); - m_mainToolBar->Add( PCB_ACTIONS::mirrorV ); - m_mainToolBar->Add( PCB_ACTIONS::group ); - m_mainToolBar->Add( PCB_ACTIONS::ungroup ); + /* TODO (ISM): Implement context menus + PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool(); + std::unique_ptr gridMenu = std::make_unique( false, selTool ); + gridMenu->Add( ACTIONS::gridProperties ); + gridMenu->Add( ACTIONS::gridOrigin ); + m_tbLeft->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); +*/ - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PCB_ACTIONS::footprintProperties ); - m_mainToolBar->Add( PCB_ACTIONS::defaultPadProperties ); - m_mainToolBar->Add( ACTIONS::showDatasheet ); - m_mainToolBar->Add( PCB_ACTIONS::checkFootprint ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->AddTool( ID_LOAD_FOOTPRINT_FROM_BOARD, wxEmptyString, - KiScaledBitmap( BITMAPS::import_brd_file, this ), - _( "Load footprint from current board" ) ); - - m_mainToolBar->AddTool( ID_ADD_FOOTPRINT_TO_BOARD, wxEmptyString, - KiScaledBitmap( BITMAPS::insert_module_board, this ), - _( "Insert footprint into current board" ) ); - - m_mainToolBar->AddScaledSeparator( this ); - - // Grid selection choice box. - if( m_gridSelectBox == nullptr ) - m_gridSelectBox = new wxChoice( m_mainToolBar, ID_ON_GRID_SELECT, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); - - UpdateGridSelectBox(); - m_mainToolBar->AddControl( m_gridSelectBox ); - - m_mainToolBar->AddScaledSeparator( this ); - - // Zoom selection choice box. - if( m_zoomSelectBox == nullptr ) - m_zoomSelectBox = new wxChoice( m_mainToolBar, ID_ON_ZOOM_SELECT, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); - - UpdateZoomSelectBox(); - m_mainToolBar->AddControl( m_zoomSelectBox ); - - m_mainToolBar->AddScaledSeparator( this ); - - // Layer selection choice box. - if( m_selLayerBox == nullptr ) - { - m_selLayerBox = new PCB_LAYER_BOX_SELECTOR( m_mainToolBar, ID_TOOLBARH_PCB_SELECT_LAYER ); - m_selLayerBox->SetBoardFrame( this ); - - // Some layers cannot be select (they are shown in the layer manager - // only to set the color and visibility, but not for selection) - // Disable them in layer box - m_selLayerBox->SetNotAllowedLayerSet( LSET::ForbiddenFootprintLayers() ); - m_selLayerBox->Resync(); - } - - ReCreateLayerBox( false ); - m_mainToolBar->AddControl( m_selLayerBox ); - - // Go through and ensure the comboboxes are the correct size, since the strings in the - // box could have changed widths. - m_mainToolBar->UpdateControlWidth( ID_TOOLBARH_PCB_SELECT_LAYER ); - m_mainToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - m_mainToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->KiRealize(); + // clang-format on + return config; } -void FOOTPRINT_EDIT_FRAME::ReCreateVToolbar() +std::optional FOOTPRINT_EDIT_FRAME::DefaultRightToolbarConfig() { - wxWindowUpdateLocker dummy( this ); - - if( m_drawToolBar ) - { - m_drawToolBar->ClearToolbar(); - } - else - { - m_drawToolBar = new ACTION_TOOLBAR( this, ID_V_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_drawToolBar->SetAuiManager( &m_auimgr ); - } - - // Groups contained on this toolbar - static ACTION_GROUP* dimensionGroup = nullptr; - - if( !dimensionGroup ) - { - dimensionGroup = new ACTION_GROUP( "group.pcbDimensions", - { &PCB_ACTIONS::drawOrthogonalDimension, - &PCB_ACTIONS::drawAlignedDimension, - &PCB_ACTIONS::drawCenterDimension, - &PCB_ACTIONS::drawRadialDimension, - &PCB_ACTIONS::drawLeader } ); - } + TOOLBAR_CONFIGURATION config; // clang-format off - m_drawToolBar->Add( ACTIONS::selectionTool ); + config.AppendAction( ACTIONS::selectionTool ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( PCB_ACTIONS::placePad ); - m_drawToolBar->Add( PCB_ACTIONS::drawRuleArea ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::placePad ) + .AppendAction( PCB_ACTIONS::drawRuleArea ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( PCB_ACTIONS::drawLine ); - m_drawToolBar->Add( PCB_ACTIONS::drawArc ); - m_drawToolBar->Add( PCB_ACTIONS::drawRectangle ); - m_drawToolBar->Add( PCB_ACTIONS::drawCircle ); - m_drawToolBar->Add( PCB_ACTIONS::drawPolygon ); - m_drawToolBar->Add( PCB_ACTIONS::drawBezier ); - m_drawToolBar->Add( PCB_ACTIONS::placeReferenceImage ); - m_drawToolBar->Add( PCB_ACTIONS::placeText ); - m_drawToolBar->Add( PCB_ACTIONS::drawTextBox ); - m_drawToolBar->Add( PCB_ACTIONS::drawTable ); - m_drawToolBar->AddGroup( dimensionGroup, ACTION_TOOLBAR::TOGGLE ); - m_drawToolBar->Add( ACTIONS::deleteTool ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::drawLine ) + .AppendAction( PCB_ACTIONS::drawArc ) + .AppendAction( PCB_ACTIONS::drawRectangle ) + .AppendAction( PCB_ACTIONS::drawCircle ) + .AppendAction( PCB_ACTIONS::drawPolygon ) + .AppendAction( PCB_ACTIONS::drawBezier ) + .AppendAction( PCB_ACTIONS::placeReferenceImage ) + .AppendAction( PCB_ACTIONS::placeText ) + .AppendAction( PCB_ACTIONS::drawTextBox ) + .AppendAction( PCB_ACTIONS::drawTable ) + .AppendGroup( TOOLBAR_GROUP_CONFIG( "group.pcbDimensions" ) + .AddAction( PCB_ACTIONS::drawOrthogonalDimension ) + .AddAction( PCB_ACTIONS::drawAlignedDimension ) + .AddAction( PCB_ACTIONS::drawCenterDimension ) + .AddAction( PCB_ACTIONS::drawRadialDimension ) + .AddAction( PCB_ACTIONS::drawLeader ) ) + .AppendAction( ACTIONS::deleteTool ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( PCB_ACTIONS::setAnchor ); - m_drawToolBar->Add( ACTIONS::gridSetOrigin ); - m_drawToolBar->Add( ACTIONS::measureTool ); - // clang-format on + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::setAnchor ) + .AppendAction( ACTIONS::gridSetOrigin ) + .AppendAction( ACTIONS::measureTool ); + /* TODO (ISM): Implement context menus PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool(); auto makeArcMenu = [&]() @@ -213,87 +125,87 @@ void FOOTPRINT_EDIT_FRAME::ReCreateVToolbar() return arcMenu; }; - m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::drawArc, makeArcMenu() ); + m_tbRight->AddToolContextMenu( PCB_ACTIONS::drawArc, makeArcMenu() ); +*/ - m_drawToolBar->KiRealize(); + // clang-format on + return config; } -void FOOTPRINT_EDIT_FRAME::ReCreateOptToolbar() +std::optional FOOTPRINT_EDIT_FRAME::DefaultTopMainToolbarConfig() { - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, wxDefaultPosition, - wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::toggleGridOverrides ); - m_optionsToolBar->Add( PCB_ACTIONS::togglePolarCoords ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); + // clang-format off + config.AppendAction( PCB_ACTIONS::newFootprint ) + .AppendAction( PCB_ACTIONS::createFootprint ) + .AppendAction( ACTIONS::save ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::toggleHV45Mode ); + config.AppendSeparator() + .AppendAction( ACTIONS::print ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::padDisplayMode ); - m_optionsToolBar->Add( PCB_ACTIONS::graphicsOutlines ); - m_optionsToolBar->Add( PCB_ACTIONS::textOutlines ); - m_optionsToolBar->Add( ACTIONS::highContrastMode ); + config.AppendSeparator() + .AppendAction( ACTIONS::undo ) + .AppendAction( ACTIONS::redo ); - if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes ) - m_optionsToolBar->Add( ACTIONS::toggleBoundingBoxes ); + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomTool ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( ACTIONS::showLibraryTree ); - m_optionsToolBar->Add( PCB_ACTIONS::showLayersManager ); - m_optionsToolBar->Add( ACTIONS::showProperties ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::rotateCcw ) + .AppendAction( PCB_ACTIONS::rotateCw ) + .AppendAction( PCB_ACTIONS::mirrorH ) + .AppendAction( PCB_ACTIONS::mirrorV ) + .AppendAction( PCB_ACTIONS::group ) + .AppendAction( PCB_ACTIONS::ungroup ); - PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool(); - std::unique_ptr gridMenu = std::make_unique( false, selTool ); - gridMenu->Add( ACTIONS::gridProperties ); - gridMenu->Add( ACTIONS::gridOrigin ); - m_optionsToolBar->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::footprintProperties ) + .AppendAction( PCB_ACTIONS::defaultPadProperties ) + .AppendAction( ACTIONS::showDatasheet ) + .AppendAction( PCB_ACTIONS::checkFootprint ); - m_optionsToolBar->KiRealize(); -} + config.AppendSeparator(); + /* TODO (ISM): Implement these as actions + m_tbTopMain->AddTool( ID_LOAD_FOOTPRINT_FROM_BOARD, wxEmptyString, + KiScaledBitmap( BITMAPS::import_brd_file, this ), + _( "Load footprint from current board" ) ); -void FOOTPRINT_EDIT_FRAME::UpdateToolbarControlSizes() -{ - if( m_mainToolBar ) - { - // Update the item widths - m_mainToolBar->UpdateControlWidth( ID_TOOLBARH_PCB_SELECT_LAYER ); - m_mainToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - m_mainToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - } + m_tbTopMain->AddTool( ID_ADD_FOOTPRINT_TO_BOARD, wxEmptyString, + KiScaledBitmap( BITMAPS::insert_module_board, this ), + _( "Insert footprint into current board" ) ); +*/ + + config.AppendSeparator() + .AppendControl( m_tbGridSelectName ); + + config.AppendSeparator() + .AppendControl( m_tbZoomSelectName ); + + config.AppendSeparator() + .AppendControl( m_tbPcbLayerSelectorName ); + + ReCreateLayerBox( false ); + + // clang-format on + return config; } void FOOTPRINT_EDIT_FRAME::ReCreateLayerBox( bool aForceResizeToolbar ) { - if( m_selLayerBox == nullptr || m_mainToolBar == nullptr ) + if( !m_SelLayerBox ) return; - m_selLayerBox->SetToolTip( _( "+/- to switch" ) ); - m_selLayerBox->Resync(); + m_SelLayerBox->SetToolTip( _( "+/- to switch" ) ); + m_SelLayerBox->Resync(); if( aForceResizeToolbar ) UpdateToolbarControlSizes(); } - - -void FOOTPRINT_EDIT_FRAME::OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ) -{ - m_selLayerBox->SetLayerSelection( GetActiveLayer() ); -} diff --git a/pcbnew/toolbars_footprint_viewer.cpp b/pcbnew/toolbars_footprint_viewer.cpp index efe8c8852a..84e768a7c1 100644 --- a/pcbnew/toolbars_footprint_viewer.cpp +++ b/pcbnew/toolbars_footprint_viewer.cpp @@ -35,127 +35,82 @@ #include -void FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar() +std::optional FOOTPRINT_VIEWER_FRAME::DefaultTopMainToolbarConfig() { - // Note: - // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) - // all wxAuiToolBarItems. - // However the wxAuiToolBarItems are not the owners of controls managed by - // them ( m_zoomSelectBox and m_gridSelectBox ), and therefore do not delete them - // So we do not recreate them after clearing the tools. + TOOLBAR_CONFIGURATION config; - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + // clang-format off + /* TODO (ISM): Convert to actions + m_tbTopMain->AddTool( ID_MODVIEW_PREVIOUS, wxEmptyString, + KiScaledBitmap( BITMAPS::lib_previous, this ), + _( "Display previous footprint" ) ); + m_tbTopMain->AddTool( ID_MODVIEW_NEXT, wxEmptyString, + KiScaledBitmap( BITMAPS::lib_next, this ), + _( "Display next footprint" ) ); +*/ - // Set up toolbar - m_mainToolBar->AddTool( ID_MODVIEW_PREVIOUS, wxEmptyString, - KiScaledBitmap( BITMAPS::lib_previous, this ), - _( "Display previous footprint" ) ); - m_mainToolBar->AddTool( ID_MODVIEW_NEXT, wxEmptyString, - KiScaledBitmap( BITMAPS::lib_next, this ), - _( "Display next footprint" ) ); + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomTool ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomTool ); + config.AppendSeparator() + .AppendAction( ACTIONS::show3DViewer ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::show3DViewer ); - m_mainToolBar->AddTool( ID_ADD_FOOTPRINT_TO_BOARD, wxEmptyString, - KiScaledBitmap( BITMAPS::insert_module_board, this ), - _( "Insert footprint in board" ) ); + /* TODO (ISM): Convert to action + m_tbTopMain->AddTool( ID_ADD_FOOTPRINT_TO_BOARD, wxEmptyString, + KiScaledBitmap( BITMAPS::insert_module_board, this ), + _( "Insert footprint in board" ) ); +*/ - m_mainToolBar->AddScaledSeparator( this ); + config.AppendSeparator() + .AppendControl( m_tbGridSelectName ); - // Grid selection choice box. - if( m_gridSelectBox == nullptr ) - { - m_gridSelectBox = new wxChoice( m_mainToolBar, ID_ON_GRID_SELECT, wxDefaultPosition, - wxDefaultSize, 0, nullptr ); - } - - UpdateGridSelectBox(); - m_mainToolBar->AddControl( m_gridSelectBox ); - - m_mainToolBar->AddScaledSeparator( this ); - - // Zoom selection choice box. - if( m_zoomSelectBox == nullptr ) - { - m_zoomSelectBox = new wxChoice( m_mainToolBar, ID_ON_ZOOM_SELECT, wxDefaultPosition, - wxDefaultSize, 0, nullptr ); - } - - UpdateZoomSelectBox(); - m_mainToolBar->AddControl( m_zoomSelectBox ); + config.AppendSeparator() + .AppendControl( m_tbZoomSelectName ); // Option to run Zoom automatique on footprint selection change - m_mainToolBar->AddTool( ID_FPVIEWER_AUTOZOOM_TOOL, wxEmptyString, - KiScaledBitmap( BITMAPS::zoom_auto_fit_in_page, this ), - _( "Automatic Zoom on footprint change" ), - wxITEM_CHECK ); + /* TODO (ISM): Convert to action + m_tbTopMain->AddTool( ID_FPVIEWER_AUTOZOOM_TOOL, wxEmptyString, + KiScaledBitmap( BITMAPS::zoom_auto_fit_in_page, this ), + _( "Automatic Zoom on footprint change" ), + wxITEM_CHECK ); +*/ - m_mainToolBar->AddScaledSeparator( this ); - - // after adding the buttons to the toolbar, must call Realize() to - // reflect the changes - m_mainToolBar->KiRealize(); + // clang-format on + return config; } -void FOOTPRINT_VIEWER_FRAME::ReCreateOptToolbar() +std::optional FOOTPRINT_VIEWER_FRAME::DefaultLeftToolbarConfig() { - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, wxDefaultPosition, - wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } + TOOLBAR_CONFIGURATION config; - m_optionsToolBar->Add( ACTIONS::selectionTool ); - m_optionsToolBar->Add( ACTIONS::measureTool ); + // clang-format off + config.AppendAction( ACTIONS::selectionTool ) + .AppendAction( ACTIONS::measureTool ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::togglePolarCoords ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); + config.AppendSeparator() + .AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::togglePolarCoords ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::showPadNumbers ); - m_optionsToolBar->Add( PCB_ACTIONS::padDisplayMode ); - m_optionsToolBar->Add( PCB_ACTIONS::textOutlines ); - m_optionsToolBar->Add( PCB_ACTIONS::graphicsOutlines ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::showPadNumbers ) + .AppendAction( PCB_ACTIONS::padDisplayMode ) + .AppendAction( PCB_ACTIONS::textOutlines ) + .AppendAction( PCB_ACTIONS::graphicsOutlines ); if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes ) - m_optionsToolBar->Add( ACTIONS::toggleBoundingBoxes ); + config.AppendAction( ACTIONS::toggleBoundingBoxes ); - m_optionsToolBar->KiRealize(); -} - - -void FOOTPRINT_VIEWER_FRAME::ReCreateVToolbar() -{ - // This toolbar is not currently used + // clang-format on + return config; } diff --git a/pcbnew/toolbars_pcb_editor.cpp b/pcbnew/toolbars_pcb_editor.cpp index 599684b7b1..07e24b65b6 100644 --- a/pcbnew/toolbars_pcb_editor.cpp +++ b/pcbnew/toolbars_pcb_editor.cpp @@ -25,6 +25,7 @@ */ #include +#include #include #include @@ -108,286 +109,124 @@ void PCB_EDIT_FRAME::PrepareLayerIndicator( bool aForceRebuild ) LayerPairBitmap = LAYER_PRESENTATION::CreateLayerPairIcon( background_color, top_color, bottom_color, scale ); - if( m_auxiliaryToolBar ) + if( m_tbTopAux ) { - m_auxiliaryToolBar->SetToolBitmap( PCB_ACTIONS::selectLayerPair, *LayerPairBitmap ); - m_auxiliaryToolBar->Refresh(); + m_tbTopAux->SetToolBitmap( PCB_ACTIONS::selectLayerPair, *LayerPairBitmap ); + m_tbTopAux->Refresh(); } } } -void PCB_EDIT_FRAME::ReCreateHToolbar() +std::optional PCB_EDIT_FRAME::DefaultLeftToolbarConfig() { - // Note: - // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) - // all wxAuiToolBarItems. - // However the wxAuiToolBarItems are not the owners of controls managed by - // them and therefore do not delete them - // So we do not recreate them after clearing the tools. + TOOLBAR_CONFIGURATION config; - wxWindowUpdateLocker dummy( this ); + // clang-format off + config.AppendAction( ACTIONS::toggleGrid ) + .AppendAction( ACTIONS::toggleGridOverrides ) + .AppendAction( PCB_ACTIONS::togglePolarCoords ) + .AppendAction( ACTIONS::inchesUnits ) + .AppendAction( ACTIONS::milsUnits ) + .AppendAction( ACTIONS::millimetersUnits ) + .AppendAction( ACTIONS::toggleCursorStyle ); - if( m_mainToolBar ) - { - m_mainToolBar->ClearToolbar(); - } - else - { - m_mainToolBar = new ACTION_TOOLBAR( this, ID_H_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | - wxAUI_TB_HORIZONTAL ); - m_mainToolBar->SetAuiManager( &m_auimgr ); - } + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::toggleHV45Mode ); - // Set up toolbar - if( Kiface().IsSingle() ) - { - m_mainToolBar->Add( ACTIONS::doNew ); - m_mainToolBar->Add( ACTIONS::open ); - } + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::showRatsnest ) + .AppendAction( PCB_ACTIONS::ratsnestLineMode ); - m_mainToolBar->Add( ACTIONS::save ); + config.AppendSeparator() + .AppendAction( ACTIONS::highContrastMode ) + .AppendAction( PCB_ACTIONS::toggleNetHighlight ); - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PCB_ACTIONS::boardSetup ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::pageSettings ); - m_mainToolBar->Add( ACTIONS::print ); - m_mainToolBar->Add( ACTIONS::plot ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::undo ); - m_mainToolBar->Add( ACTIONS::redo ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::find ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::zoomRedraw ); - m_mainToolBar->Add( ACTIONS::zoomInCenter ); - m_mainToolBar->Add( ACTIONS::zoomOutCenter ); - m_mainToolBar->Add( ACTIONS::zoomFitScreen ); - m_mainToolBar->Add( ACTIONS::zoomFitObjects ); - m_mainToolBar->Add( ACTIONS::zoomTool ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PCB_ACTIONS::rotateCcw ); - m_mainToolBar->Add( PCB_ACTIONS::rotateCw ); - m_mainToolBar->Add( PCB_ACTIONS::mirrorV ); - m_mainToolBar->Add( PCB_ACTIONS::mirrorH ); - m_mainToolBar->Add( PCB_ACTIONS::group ); - m_mainToolBar->Add( PCB_ACTIONS::ungroup ); - m_mainToolBar->Add( PCB_ACTIONS::lock ); - m_mainToolBar->Add( PCB_ACTIONS::unlock ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( ACTIONS::showFootprintEditor ); - m_mainToolBar->Add( ACTIONS::showFootprintBrowser ); - m_mainToolBar->Add( ACTIONS::show3DViewer ); - - m_mainToolBar->AddScaledSeparator( this ); - - if( !Kiface().IsSingle() ) - m_mainToolBar->Add( ACTIONS::updatePcbFromSchematic ); - else - m_mainToolBar->Add( PCB_ACTIONS::importNetlist ); - - m_mainToolBar->Add( PCB_ACTIONS::runDRC ); - - m_mainToolBar->AddScaledSeparator( this ); - m_mainToolBar->Add( PCB_ACTIONS::showEeschema ); - - // Add SWIG and API plugins - bool scriptingAvailable = SCRIPTING::IsWxAvailable(); -#ifdef KICAD_IPC_API - bool haveApiPlugins = Pgm().GetCommonSettings()->m_Api.enable_server && - !Pgm().GetPluginManager().GetActionsForScope( PLUGIN_ACTION_SCOPE::PCB ).empty(); -#else - bool haveApiPlugins = false; -#endif - - if( scriptingAvailable || haveApiPlugins ) - { - m_mainToolBar->AddScaledSeparator( this ); - - if( scriptingAvailable ) - { - m_mainToolBar->Add( PCB_ACTIONS::showPythonConsole, ACTION_TOOLBAR::TOGGLE ); - AddActionPluginTools(); - } - - if( haveApiPlugins ) - addApiPluginTools(); - } - - // after adding the buttons to the toolbar, must call Realize() to reflect the changes - m_mainToolBar->KiRealize(); -} - - -void PCB_EDIT_FRAME::ReCreateOptToolbar() -{ - // Note: - // To rebuild the aui toolbar, the more easy way is to clear ( calling m_mainToolBar.Clear() ) - // all wxAuiToolBarItems. - // However the wxAuiToolBarItems are not the owners of controls managed by - // them and therefore do not delete them - // So we do not recreate them after clearing the tools. - - wxWindowUpdateLocker dummy( this ); - - if( m_optionsToolBar ) - { - m_optionsToolBar->ClearToolbar(); - } - else - { - m_optionsToolBar = new ACTION_TOOLBAR( this, ID_OPT_TOOLBAR, - wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_optionsToolBar->SetAuiManager( &m_auimgr ); - } - - m_optionsToolBar->Add( ACTIONS::toggleGrid ); - m_optionsToolBar->Add( ACTIONS::toggleGridOverrides ); - - m_optionsToolBar->Add( PCB_ACTIONS::togglePolarCoords ); - m_optionsToolBar->Add( ACTIONS::inchesUnits ); - m_optionsToolBar->Add( ACTIONS::milsUnits ); - m_optionsToolBar->Add( ACTIONS::millimetersUnits ); - m_optionsToolBar->Add( ACTIONS::toggleCursorStyle ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::toggleHV45Mode ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::showRatsnest ); - m_optionsToolBar->Add( PCB_ACTIONS::ratsnestLineMode ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( ACTIONS::highContrastMode ); - m_optionsToolBar->Add( PCB_ACTIONS::toggleNetHighlight ); - - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::zoneDisplayFilled ); - m_optionsToolBar->Add( PCB_ACTIONS::zoneDisplayOutline ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::zoneDisplayFilled ) + .AppendAction( PCB_ACTIONS::zoneDisplayOutline ); if( ADVANCED_CFG::GetCfg().m_ExtraZoneDisplayModes ) { - m_optionsToolBar->Add( PCB_ACTIONS::zoneDisplayFractured ); - m_optionsToolBar->Add( PCB_ACTIONS::zoneDisplayTriangulated ); + config.AppendAction( PCB_ACTIONS::zoneDisplayFractured ); + config.AppendAction( PCB_ACTIONS::zoneDisplayTriangulated ); } - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::padDisplayMode ); - m_optionsToolBar->Add( PCB_ACTIONS::viaDisplayMode ); - m_optionsToolBar->Add( PCB_ACTIONS::trackDisplayMode ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::padDisplayMode ) + .AppendAction( PCB_ACTIONS::viaDisplayMode ) + .AppendAction( PCB_ACTIONS::trackDisplayMode ); if( ADVANCED_CFG::GetCfg().m_DrawBoundingBoxes ) - m_optionsToolBar->Add( ACTIONS::toggleBoundingBoxes ); + config.AppendAction( ACTIONS::toggleBoundingBoxes ); // Tools to show/hide toolbars: - m_optionsToolBar->AddScaledSeparator( this ); - m_optionsToolBar->Add( PCB_ACTIONS::showLayersManager ); - m_optionsToolBar->Add( ACTIONS::showProperties ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::showLayersManager ) + .AppendAction( ACTIONS::showProperties ); + /* TODO (ISM): Support context menus in toolbars PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool(); std::unique_ptr gridMenu = std::make_unique( false, selTool ); gridMenu->Add( ACTIONS::gridProperties ); gridMenu->Add( ACTIONS::gridOrigin ); - m_optionsToolBar->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + m_tbLeft->AddToolContextMenu( ACTIONS::toggleGrid, std::move( gridMenu ) ); + */ - m_optionsToolBar->KiRealize(); + // clang-format on + return config; } -void PCB_EDIT_FRAME::ReCreateVToolbar() +std::optional PCB_EDIT_FRAME::DefaultRightToolbarConfig() { - wxWindowUpdateLocker dummy( this ); - - if( m_drawToolBar ) - { - m_drawToolBar->ClearToolbar(); - } - else - { - m_drawToolBar = new ACTION_TOOLBAR( this, ID_V_TOOLBAR, wxDefaultPosition, wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL ); - m_drawToolBar->SetAuiManager( &m_auimgr ); - } - - // Groups contained on this toolbar - static ACTION_GROUP* dimensionGroup = nullptr; - static ACTION_GROUP* originGroup = nullptr; - static ACTION_GROUP* routingGroup = nullptr; - static ACTION_GROUP* tuneGroup = nullptr; - - if( !dimensionGroup ) - { - dimensionGroup = new ACTION_GROUP( "group.pcbDimensions", - { &PCB_ACTIONS::drawOrthogonalDimension, - &PCB_ACTIONS::drawAlignedDimension, - &PCB_ACTIONS::drawCenterDimension, - &PCB_ACTIONS::drawRadialDimension, - &PCB_ACTIONS::drawLeader } ); - } - - if( !originGroup ) - { - originGroup = new ACTION_GROUP( "group.pcbOrigins", - { &ACTIONS::gridSetOrigin, - &PCB_ACTIONS::drillOrigin } ); - } - - if( !routingGroup ) - { - routingGroup = new ACTION_GROUP( "group.pcbRouting", - { &PCB_ACTIONS::routeSingleTrack, - &PCB_ACTIONS::routeDiffPair } ); - } - - if( !tuneGroup ) - { - tuneGroup = new ACTION_GROUP( "group.pcbTune", - { &PCB_ACTIONS::tuneSingleTrack, - &PCB_ACTIONS::tuneDiffPair, - &PCB_ACTIONS::tuneSkew } ); - } + TOOLBAR_CONFIGURATION config; // clang-format off - m_drawToolBar->Add( ACTIONS::selectionTool ); - m_drawToolBar->Add( PCB_ACTIONS::localRatsnestTool ); + config.AppendAction( ACTIONS::selectionTool ) + .AppendAction( PCB_ACTIONS::localRatsnestTool ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( PCB_ACTIONS::placeFootprint ); - m_drawToolBar->AddGroup( routingGroup, ACTION_TOOLBAR::TOGGLE ); - m_drawToolBar->AddGroup( tuneGroup, ACTION_TOOLBAR::TOGGLE ); - m_drawToolBar->Add( PCB_ACTIONS::drawVia ); - m_drawToolBar->Add( PCB_ACTIONS::drawZone ); - m_drawToolBar->Add( PCB_ACTIONS::drawRuleArea ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::placeFootprint ) + .AppendGroup( TOOLBAR_GROUP_CONFIG( "group.pcbRouting" ) + .AddAction( PCB_ACTIONS::routeSingleTrack ) + .AddAction( PCB_ACTIONS::routeDiffPair ) ) + .AppendGroup( TOOLBAR_GROUP_CONFIG( "group.pcbTune" ) + .AddAction( PCB_ACTIONS::tuneSingleTrack ) + .AddAction( PCB_ACTIONS::tuneDiffPair ) + .AddAction( PCB_ACTIONS::tuneSkew ) ) + .AppendAction( PCB_ACTIONS::drawVia ) + .AppendAction( PCB_ACTIONS::drawZone ) + .AppendAction( PCB_ACTIONS::drawRuleArea ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->Add( PCB_ACTIONS::drawLine ); - m_drawToolBar->Add( PCB_ACTIONS::drawArc ); - m_drawToolBar->Add( PCB_ACTIONS::drawRectangle ); - m_drawToolBar->Add( PCB_ACTIONS::drawCircle ); - m_drawToolBar->Add( PCB_ACTIONS::drawPolygon ); - m_drawToolBar->Add( PCB_ACTIONS::drawBezier ); - m_drawToolBar->Add( PCB_ACTIONS::placeReferenceImage ); - m_drawToolBar->Add( PCB_ACTIONS::placeText ); - m_drawToolBar->Add( PCB_ACTIONS::drawTextBox ); - m_drawToolBar->Add( PCB_ACTIONS::drawTable ); - m_drawToolBar->AddGroup( dimensionGroup, ACTION_TOOLBAR::TOGGLE ); - m_drawToolBar->Add( ACTIONS::deleteTool ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::drawLine ) + .AppendAction( PCB_ACTIONS::drawArc ) + .AppendAction( PCB_ACTIONS::drawRectangle ) + .AppendAction( PCB_ACTIONS::drawCircle ) + .AppendAction( PCB_ACTIONS::drawPolygon ) + .AppendAction( PCB_ACTIONS::drawBezier ) + .AppendAction( PCB_ACTIONS::placeReferenceImage ) + .AppendAction( PCB_ACTIONS::placeText ) + .AppendAction( PCB_ACTIONS::drawTextBox ) + .AppendAction( PCB_ACTIONS::drawTable ) + .AppendGroup( TOOLBAR_GROUP_CONFIG( "group.pcbDimensions" ) + .AddAction( PCB_ACTIONS::drawOrthogonalDimension ) + .AddAction( PCB_ACTIONS::drawAlignedDimension ) + .AddAction( PCB_ACTIONS::drawCenterDimension ) + .AddAction( PCB_ACTIONS::drawRadialDimension ) + .AddAction( PCB_ACTIONS::drawLeader ) ) + .AppendAction( ACTIONS::deleteTool ); - m_drawToolBar->AddScaledSeparator( this ); - m_drawToolBar->AddGroup( originGroup, ACTION_TOOLBAR::TOGGLE ); - m_drawToolBar->Add( ACTIONS::measureTool ); - // clang-format on + config.AppendSeparator() + .AppendGroup( TOOLBAR_GROUP_CONFIG( "group.pcbOrigins" ) + .AddAction( ACTIONS::gridSetOrigin ) + .AddAction( PCB_ACTIONS::tuneDiffPair ) + .AddAction( PCB_ACTIONS::drillOrigin ) ) + .AppendAction( ACTIONS::measureTool ); - PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool(); + /* TODO (ISM): Support context menus + PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool(); auto makeArcMenu = [&]() { @@ -399,7 +238,7 @@ void PCB_EDIT_FRAME::ReCreateVToolbar() return arcMenu; }; - m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::drawArc, makeArcMenu() ); + m_tbRight->AddToolContextMenu( PCB_ACTIONS::drawArc, makeArcMenu() ); auto makeRouteMenu = [&]() { @@ -415,132 +254,206 @@ void PCB_EDIT_FRAME::ReCreateVToolbar() return routeMenu; }; - m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::routeSingleTrack, makeRouteMenu() ); - m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::routeDiffPair, makeRouteMenu() ); + m_tbRight->AddToolContextMenu( PCB_ACTIONS::routeSingleTrack, makeRouteMenu() ); + m_tbRight->AddToolContextMenu( PCB_ACTIONS::routeDiffPair, makeRouteMenu() ); std::unique_ptr zoneMenu = std::make_unique( false, selTool ); zoneMenu->Add( PCB_ACTIONS::zoneFillAll ); zoneMenu->Add( PCB_ACTIONS::zoneUnfillAll ); - m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::drawZone, std::move( zoneMenu ) ); + m_tbRight->AddToolContextMenu( PCB_ACTIONS::drawZone, std::move( zoneMenu ) ); std::unique_ptr lineMenu = std::make_unique( false, selTool ); - m_drawToolBar->AddToolContextMenu( PCB_ACTIONS::drawLine, std::move( lineMenu ) ); + m_tbRight->AddToolContextMenu( PCB_ACTIONS::drawLine, std::move( lineMenu ) ); +*/ - m_drawToolBar->KiRealize(); + // clang-format on + return config; } -void PCB_EDIT_FRAME::ReCreateAuxiliaryToolbar() +std::optional PCB_EDIT_FRAME::DefaultTopMainToolbarConfig() { - wxWindowUpdateLocker dummy( this ); + TOOLBAR_CONFIGURATION config; - if( m_auxiliaryToolBar ) + // clang-format off + if( Kiface().IsSingle() ) { - m_auxiliaryToolBar->ClearToolbar(); + config.AppendAction( ACTIONS::doNew ); + config.AppendAction( ACTIONS::open ); } + + config.AppendAction( ACTIONS::save ); + + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::boardSetup ); + + config.AppendSeparator() + .AppendAction( ACTIONS::pageSettings ) + .AppendAction( ACTIONS::print ) + .AppendAction( ACTIONS::plot ); + + config.AppendSeparator() + .AppendAction( ACTIONS::undo ) + .AppendAction( ACTIONS::redo ); + + config.AppendSeparator() + .AppendAction( ACTIONS::find ); + + config.AppendSeparator() + .AppendAction( ACTIONS::zoomRedraw ) + .AppendAction( ACTIONS::zoomInCenter ) + .AppendAction( ACTIONS::zoomOutCenter ) + .AppendAction( ACTIONS::zoomFitScreen ) + .AppendAction( ACTIONS::zoomFitObjects ) + .AppendAction( ACTIONS::zoomTool ); + + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::rotateCcw ) + .AppendAction( PCB_ACTIONS::rotateCw ) + .AppendAction( PCB_ACTIONS::mirrorV ) + .AppendAction( PCB_ACTIONS::mirrorH ) + .AppendAction( PCB_ACTIONS::group ) + .AppendAction( PCB_ACTIONS::ungroup ) + .AppendAction( PCB_ACTIONS::lock ) + .AppendAction( PCB_ACTIONS::unlock ); + + config.AppendSeparator() + .AppendAction( ACTIONS::showFootprintEditor ) + .AppendAction( ACTIONS::showFootprintBrowser ) + .AppendAction( ACTIONS::show3DViewer ); + + config.AppendSeparator(); + + if( !Kiface().IsSingle() ) + config.AppendAction( ACTIONS::updatePcbFromSchematic ); else - { - m_auxiliaryToolBar = new ACTION_TOOLBAR( this, ID_AUX_TOOLBAR, wxDefaultPosition, - wxDefaultSize, - KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT ); - m_auxiliaryToolBar->SetAuiManager( &m_auimgr ); - } + config.AppendAction( PCB_ACTIONS::importNetlist ); - /* Set up toolbar items */ + config.AppendAction( PCB_ACTIONS::runDRC ); - // Creates box to display and choose tracks widths: - if( m_SelTrackWidthBox == nullptr ) - m_SelTrackWidthBox = new wxChoice( m_auxiliaryToolBar, ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); + config.AppendSeparator() + .AppendAction( PCB_ACTIONS::showEeschema ); - UpdateTrackWidthSelectBox( m_SelTrackWidthBox, true, true ); - m_auxiliaryToolBar->AddControl( m_SelTrackWidthBox ); - m_SelTrackWidthBox->SetToolTip( _( "Select the default width for new tracks. Note that this " - "width can be overridden by the board minimum width, or by " - "the width of an existing track if the 'Use Existing Track " - "Width' feature is enabled." ) ); + config.AppendControl( "control.PCBPlugin" ); - m_auxiliaryToolBar->AddTool( ID_AUX_TOOLBAR_PCB_SELECT_AUTO_WIDTH, wxEmptyString, + // clang-format on + return config; +} + + +std::optional PCB_EDIT_FRAME::DefaultTopAuxToolbarConfig() +{ + TOOLBAR_CONFIGURATION config; + + // clang-format off + config.AppendControl( "control.PCBTrackWidth" ); + + /* TODO (ISM): Turn this into an action + m_tbTopAux->AddTool( ID_AUX_TOOLBAR_PCB_SELECT_AUTO_WIDTH, wxEmptyString, KiBitmapBundle( BITMAPS::auto_track_width ), _( "When routing from an existing track use its width instead " "of the current width setting" ), wxITEM_CHECK ); +*/ + config.AppendSeparator() + .AppendControl( "control.PCBViaDia" ); - m_auxiliaryToolBar->AddScaledSeparator( this ); + config.AppendSeparator() + .AppendControl( m_tbPcbLayerSelectorName ) + .AppendAction( PCB_ACTIONS::selectLayerPair ); - // Creates box to display and choose vias diameters: - - if( m_SelViaSizeBox == nullptr ) - m_SelViaSizeBox = new wxChoice( m_auxiliaryToolBar, ID_AUX_TOOLBAR_PCB_VIA_SIZE, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); - - UpdateViaSizeSelectBox( m_SelViaSizeBox, true, true ); - m_auxiliaryToolBar->AddControl( m_SelViaSizeBox ); - - m_auxiliaryToolBar->AddScaledSeparator( this ); - - if( m_SelLayerBox == nullptr ) - { - m_SelLayerBox = new PCB_LAYER_BOX_SELECTOR( m_auxiliaryToolBar, ID_TOOLBARH_PCB_SELECT_LAYER ); - m_SelLayerBox->SetBoardFrame( this ); - } - - ReCreateLayerBox( false ); - m_auxiliaryToolBar->AddControl( m_SelLayerBox ); - - m_auxiliaryToolBar->Add( PCB_ACTIONS::selectLayerPair ); + // TODO (ISM): Figure out this part PrepareLayerIndicator( true ); // Force rebuild of the bitmap with the active layer colors - // Add the box to display and select the current grid size: - m_auxiliaryToolBar->AddScaledSeparator( this ); + config.AppendSeparator() + .AppendControl( m_tbGridSelectName ); - if( m_gridSelectBox == nullptr ) - m_gridSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_GRID_SELECT, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); + config.AppendSeparator() + .AppendControl( m_tbZoomSelectName ); - UpdateGridSelectBox(); - - m_auxiliaryToolBar->AddControl( m_gridSelectBox ); - - // Add the box to display and select the current Zoom - m_auxiliaryToolBar->AddScaledSeparator( this ); - - if( m_zoomSelectBox == nullptr ) - m_zoomSelectBox = new wxChoice( m_auxiliaryToolBar, ID_ON_ZOOM_SELECT, - wxDefaultPosition, wxDefaultSize, 0, nullptr ); - - UpdateZoomSelectBox(); - m_auxiliaryToolBar->AddControl( m_zoomSelectBox ); - - // Go through and ensure the comboboxes are the correct size, since the strings in the - // box could have changed widths. - m_auxiliaryToolBar->UpdateControlWidth( ID_AUX_TOOLBAR_PCB_TRACK_WIDTH ); - m_auxiliaryToolBar->UpdateControlWidth( ID_AUX_TOOLBAR_PCB_VIA_SIZE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - m_auxiliaryToolBar->UpdateControlWidth( ID_TOOLBARH_PCB_SELECT_LAYER ); - - // after adding the buttons to the toolbar, must call Realize() - m_auxiliaryToolBar->KiRealize(); + // clang-format on + return config; } -void PCB_EDIT_FRAME::UpdateToolbarControlSizes() +void PCB_EDIT_FRAME::configureToolbars() { - if( m_mainToolBar ) - { - // Update the item widths - } + PCB_BASE_FRAME::configureToolbars(); - if( m_auxiliaryToolBar ) - { - // Update the item widths - m_auxiliaryToolBar->UpdateControlWidth( ID_AUX_TOOLBAR_PCB_TRACK_WIDTH ); - m_auxiliaryToolBar->UpdateControlWidth( ID_AUX_TOOLBAR_PCB_VIA_SIZE ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_ZOOM_SELECT ); - m_auxiliaryToolBar->UpdateControlWidth( ID_ON_GRID_SELECT ); - m_auxiliaryToolBar->UpdateControlWidth( ID_TOOLBARH_PCB_SELECT_LAYER ); - } + // Box to display and choose track widths + auto trackWidthSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelTrackWidthBox ) + { + m_SelTrackWidthBox = new wxChoice( aToolbar, ID_AUX_TOOLBAR_PCB_TRACK_WIDTH, + wxDefaultPosition, wxDefaultSize, 0, nullptr ); + } + + m_SelTrackWidthBox->SetToolTip( _( "Select the default width for new tracks. Note that this " + "width can be overridden by the board minimum width, or by " + "the width of an existing track if the 'Use Existing Track " + "Width' feature is enabled." ) ); + + UpdateTrackWidthSelectBox( m_SelTrackWidthBox, true, true ); + + aToolbar->Add( m_SelTrackWidthBox ); + }; + + RegisterCustomToolbarControlFactory( "control.PCBTrackWidth", _( "Track width selector" ), + _( "Control to select the track width" ), + trackWidthSelectorFactory ); + + + // Box to display and choose vias diameters + auto viaDiaSelectorFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + if( !m_SelViaSizeBox ) + { + m_SelViaSizeBox = new wxChoice( aToolbar, ID_AUX_TOOLBAR_PCB_VIA_SIZE, + wxDefaultPosition, wxDefaultSize, 0, nullptr ); + } + + UpdateViaSizeSelectBox( m_SelViaSizeBox, true, true ); + aToolbar->Add( m_SelViaSizeBox ); + }; + + RegisterCustomToolbarControlFactory( "control.PCBViaDia", _( "Via diameter selector" ), + _( "Control to select the via diameter" ), + viaDiaSelectorFactory ); + + // IPC/Scripting plugin control + // TODO (ISM): Clean this up to make IPC actions just normal tool actions to get rid of this entire + // control + auto pluginControlFactory = [this]( ACTION_TOOLBAR* aToolbar ) + { + // Add scripting console and API plugins + bool scriptingAvailable = SCRIPTING::IsWxAvailable(); + + #ifdef KICAD_IPC_API + bool haveApiPlugins = Pgm().GetCommonSettings()->m_Api.enable_server && + !Pgm().GetPluginManager().GetActionsForScope( PluginActionScope() ).empty(); + #else + bool haveApiPlugins = false; + #endif + + if( scriptingAvailable || haveApiPlugins ) + { + aToolbar->AddScaledSeparator( aToolbar->GetParent() ); + + if( scriptingAvailable ) + { + aToolbar->Add( PCB_ACTIONS::showPythonConsole ); + addActionPluginTools( aToolbar ); + } + + if( haveApiPlugins ) + AddApiPluginTools( aToolbar ); + } + }; + + RegisterCustomToolbarControlFactory( "control.PCBPlugin", _( "IPC/Scripting plugins" ), + _( "Region to hold the IPC/Scripting action buttons" ), + pluginControlFactory ); } @@ -682,7 +595,7 @@ void PCB_EDIT_FRAME::UpdateViaSizeSelectBox( wxChoice* aViaSizeSelectBox, bool a void PCB_EDIT_FRAME::ReCreateLayerBox( bool aForceResizeToolbar ) { - if( m_SelLayerBox == nullptr || m_auxiliaryToolBar == nullptr ) + if( m_SelLayerBox == nullptr || m_tbTopAux == nullptr ) return; m_SelLayerBox->SetToolTip( _( "+/- to switch" ) ); @@ -828,10 +741,3 @@ void PCB_EDIT_FRAME::OnUpdateSelectAutoWidth( wxUpdateUIEvent& aEvent ) aEvent.Check( bds.m_UseConnectedTrackWidth ); } - - -void PCB_EDIT_FRAME::OnUpdateLayerSelectBox( wxUpdateUIEvent& aEvent ) -{ - if( m_SelLayerBox->GetLayerSelection() != GetActiveLayer() ) - m_SelLayerBox->SetLayerSelection( GetActiveLayer() ); -} diff --git a/pcbnew/tools/pcb_actions.cpp b/pcbnew/tools/pcb_actions.cpp index 975a59c9e8..29a51d8a3b 100644 --- a/pcbnew/tools/pcb_actions.cpp +++ b/pcbnew/tools/pcb_actions.cpp @@ -1351,7 +1351,8 @@ TOOL_ACTION PCB_ACTIONS::showPythonConsole( TOOL_ACTION_ARGS() .Scope( AS_GLOBAL ) .FriendlyName( _( "Scripting Console" ) ) .Tooltip( _( "Show the Python scripting console" ) ) - .Icon( BITMAPS::py_script ) ); + .Icon( BITMAPS::py_script ) + .ToolbarState( TOOLBAR_STATE::TOGGLE) ); TOOL_ACTION PCB_ACTIONS::showLayersManager( TOOL_ACTION_ARGS() .Name( "pcbnew.Control.showLayersManager" ) @@ -2294,6 +2295,7 @@ TOOL_ACTION PCB_ACTIONS::routeSingleTrack( TOOL_ACTION_ARGS() .FriendlyName( _( "Route Single Track" ) ) .Tooltip( _( "Route tracks" ) ) .Icon( BITMAPS::add_tracks ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_ACTIVATE ) .Parameter( PNS::PNS_MODE_ROUTE_SINGLE ) ); @@ -2306,6 +2308,7 @@ TOOL_ACTION PCB_ACTIONS::routeDiffPair( TOOL_ACTION_ARGS() .FriendlyName( _( "Route Differential Pair" ) ) .Tooltip( _( "Route differential pairs" ) ) .Icon( BITMAPS::ps_diff_pair ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_ACTIVATE ) .Parameter( PNS::PNS_MODE_ROUTE_DIFF_PAIR ) ); @@ -2371,6 +2374,7 @@ TOOL_ACTION PCB_ACTIONS::tuneSingleTrack( TOOL_ACTION_ARGS() .LegacyHotkeyName( "Tune Single Track (Modern Toolset only)" ) .FriendlyName( _( "Tune Length of a Single Track" ) ) .Icon( BITMAPS::ps_tune_length ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_ACTIVATE ) .Parameter( PNS::PNS_MODE_TUNE_SINGLE ) ); @@ -2382,6 +2386,7 @@ TOOL_ACTION PCB_ACTIONS::tuneDiffPair( TOOL_ACTION_ARGS() .LegacyHotkeyName( "Tune Differential Pair Length (Modern Toolset only)" ) .FriendlyName( _( "Tune Length of a Differential Pair" ) ) .Icon( BITMAPS::ps_diff_pair_tune_length ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_ACTIVATE ) .Parameter( PNS::PNS_MODE_TUNE_DIFF_PAIR ) ); @@ -2393,6 +2398,7 @@ TOOL_ACTION PCB_ACTIONS::tuneSkew( TOOL_ACTION_ARGS() .LegacyHotkeyName( "Tune Differential Pair Skew (Modern Toolset only)" ) .FriendlyName( _( "Tune Skew of a Differential Pair" ) ) .Icon( BITMAPS::ps_diff_pair_tune_phase ) + .ToolbarState( TOOLBAR_STATE::TOGGLE ) .Flags( AF_ACTIVATE ) .Parameter( PNS::PNS_MODE_TUNE_DIFF_PAIR_SKEW ) );