Move toolbars to a serializable storage format

This commit is contained in:
Ian McInerney 2025-02-20 02:53:15 +00:00
parent df15db3236
commit 7ad1103f55
60 changed files with 2233 additions and 2218 deletions

View File

@ -35,73 +35,66 @@
#include <tools/eda_3d_actions.h>
#include <3d_viewer_id.h>
void EDA_3D_VIEWER_FRAME::ReCreateMainToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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;
}

View File

@ -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 )
{

View File

@ -123,6 +123,8 @@ public:
void OnDarkModeToggle();
std::optional<TOOLBAR_CONFIGURATION> 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;

View File

@ -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 ) );

View File

@ -70,6 +70,7 @@
#include <wx/stdpaths.h>
#include <wx/string.h>
#include <wx/msgdlg.h>
#include <wx/wupdlock.h>
#include <kiplatform/app.h>
#include <kiplatform/io.h>
#include <kiplatform/ui.h>
@ -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()
{
/**

View File

@ -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<const PLUGIN_ACTION*> 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,

View File

@ -33,6 +33,7 @@
#include <memory>
#include <pgm_base.h>
#include <settings/common_settings.h>
#include <trace_helpers.h>
#include <tool/action_toolbar.h>
#include <tool/actions.h>
#include <tool/tool_action.h>
@ -42,27 +43,46 @@
#include <tool/ui/toolbar_configuration.h>
#include <widgets/bitmap_button.h>
#include <widgets/wx_aui_art_providers.h>
#include <wx/log.h>
#include <wx/popupwin.h>
#include <wx/renderer.h>
#include <wx/sizer.h>
#include <wx/dcclient.h>
#include <wx/settings.h>
// Needed to handle adding the plugins to the toolbar
// TODO (ISM): This should be better abstracted away from the toolbars
#include <python_scripting.h>
#include <api/api_plugin_manager.h>
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<const TOOL_ACTION*>& aActions )
{
m_name = aName;
m_id = ACTION_MANAGER::MakeActionId( m_name );
SetActions( aActions );
}
void ACTION_GROUP::SetActions( const std::vector<const TOOL_ACTION*>& 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<std::string> 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<TOOLBAR_GROUP_CONFIG&> 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<const TOOL_ACTION*> 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<ACTION_GROUP>( 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<EDA_BASE_FRAME*>( 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<ACTION_MENU> 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<ACTION_GROUP> 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 );

View File

@ -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();
}

View File

@ -139,10 +139,7 @@ public:
*/
void OnSelectComponent( wxListEvent& event );
/*
* Functions to rebuild the toolbars and menubars
*/
void ReCreateHToolbar();
std::optional<TOOLBAR_CONFIGURATION> 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;

View File

@ -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<CVPCB_SETTINGS*>( 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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();
}

View File

@ -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<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultTopMainToolbarConfig() override;
/**
* Refresh the full display for this frame.

View File

@ -28,71 +28,79 @@
#include <wx/stattext.h>
void CVPCB_MAINFRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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( "<b>" + msg_bold + "</b>" );
#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( "<b>" + msg_bold + "</b>" );
#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 );
}

View File

@ -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 ) );

View File

@ -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();
}
}

View File

@ -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<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultRightToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultTopMainToolbarConfig() override;
void setupUIConditions() override;
@ -975,6 +977,8 @@ protected:
*/
bool doAutoSave() override;
void configureToolbars() override;
void doReCreateMenuBar() override;
/**

View File

@ -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,

View File

@ -150,7 +150,7 @@ public:
void ShowChangedLanguage() override;
void ReCreateHToolbar();
std::optional<TOOLBAR_CONFIGURATION> DefaultTopMainToolbarConfig() override;
/**
* Load plot, signal, cursor, measurement, etc. settings from a file.

View File

@ -27,55 +27,41 @@
#include <widgets/wx_menubar.h>
void SIMULATOR_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> SIMULATOR_FRAME::DefaultTopMainToolbarConfig()
{
if( m_toolBar )
{
m_toolBar->ClearToolbar();
m_toolBar->SetToolManager( GetToolManager() );
}
else
{
EDA_BASE_FRAME* parent = dynamic_cast<EDA_BASE_FRAME*>( 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;
}

View File

@ -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)

View File

@ -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;

View File

@ -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();

View File

@ -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<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultRightToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> 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;

View File

@ -303,7 +303,7 @@ bool SYMBOL_EDIT_FRAME::LoadOneLibrarySymbolAux( LIB_SYMBOL* aEntry, const wxStr
if( rebuildMenuAndToolbar )
{
ReCreateMenuBar();
ReCreateHToolbar();
RecreateToolbars();
GetInfoBar()->Dismiss();
}

View File

@ -44,174 +44,141 @@
#endif
void SYMBOL_EDIT_FRAME::ReCreateVToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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<EE_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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 );
}

View File

@ -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)

View File

@ -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<TOOLBAR_CONFIGURATION> 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;

View File

@ -43,358 +43,195 @@
#include <widgets/sch_properties_panel.h>
#include <widgets/sch_search_pane.h>
/* Create the main Horizontal Toolbar for the schematic editor
*/
void SCH_EDIT_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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<EE_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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();
}
}
}

View File

@ -33,64 +33,68 @@
#include <widgets/wx_menubar.h>
void SYMBOL_VIEWER_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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 );
}

View File

@ -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 )

View File

@ -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

View File

@ -76,22 +76,12 @@ public:
bool LoadListOfGerberAndDrillFiles( const wxString& aPath, const wxArrayString& aFilenameList,
std::vector<int>* 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<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultTopMainToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> 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;

View File

@ -36,256 +36,243 @@
#include "widgets/dcode_selection_box.h"
void GERBVIEW_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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() );
}
}

View File

@ -33,15 +33,18 @@
#define EDA_BASE_FRAME_H_
#include <vector>
#include <map>
#include <optional>
#include <vector>
#include <wx/aui/aui.h>
#include <layer_ids.h>
#include <frame_type.h>
#include <hotkeys_basic.h>
#include <kiway_holder.h>
#include <tool/action_toolbar.h>
#include <tool/tools_holder.h>
#include <tool/ui/toolbar_configuration.h>
#include <widgets/ui_common.h>
#include <widgets/wx_infobar.h>
#include <undo_redo_container.h>
@ -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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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<const wxString, TOOL_ACTION*> m_acceptedExts;
// Current toolbar configuration
std::optional<TOOLBAR_CONFIGURATION> m_tbConfigLeft;
std::optional<TOOLBAR_CONFIGURATION> m_tbConfigRight;
std::optional<TOOLBAR_CONFIGURATION> m_tbConfigTopAux;
std::optional<TOOLBAR_CONFIGURATION> 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<ACTION_TOOLBAR_CONTROL> m_toolbarControlFactories;
};

View File

@ -36,6 +36,7 @@
#include <class_draw_panel_gal.h>
#include <kiid.h>
#include <hotkeys_basic.h>
#include <tool/ui/toolbar_configuration.h>
#include <widgets/lib_tree.h>
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<const PLUGIN_ACTION*> 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<EDA_SEARCH_DATA> 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;

View File

@ -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,

View File

@ -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<NL_PCBNEW_PLUGIN> m_spaceMouse;

View File

@ -166,13 +166,6 @@ public:
std::vector<std::pair<wxString, bool>> 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;

View File

@ -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<const TOOL_ACTION*>& aActions );
ACTION_GROUP(const std::string_view& aName );
ACTION_GROUP( const std::string_view& aName, const std::vector<const TOOL_ACTION*>& 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<const TOOL_ACTION*>& 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<ACTION_GROUP> 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<int, bool> m_toolKinds;
std::map<int, bool> m_toolCancellable;
std::map<int, const TOOL_ACTION*> m_toolActions;
std::map<int, ACTION_GROUP*> m_actionGroups;
std::map<int, std::unique_ptr<ACTION_MENU>> m_toolMenus;
/// IDs for all the control items in this toolbar
std::vector<int> m_controlIDs;
std::map<int, std::unique_ptr<ACTION_GROUP>> m_actionGroups;
std::map<int, std::unique_ptr<ACTION_MENU>> 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<void ( ACTION_TOOLBAR* )> 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

View File

@ -25,7 +25,6 @@
#ifndef TOOLBAR_CONFIGURATION_H_
#define TOOLBAR_CONFIGURATION_H_
#include <optional>
#include <string>
#include <vector>
@ -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<std::string> 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<std::string> GetToolbarItems() const
@ -99,15 +118,15 @@ class KICOMMON_API TOOLBAR_CONFIGURATION
return m_toolbarItems;
}
std::optional<TOOLBAR_GROUP_CONFIG&> 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<TOOLBAR_GROUP_CONFIG> m_toolbarGroups;
};
#endif /* TOOLBAR_CONFIGURATION_H_ */
#endif /* TOOLBAR_CONFIGURATION_H_ */

View File

@ -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();

View File

@ -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<TOOLBAR_CONFIGURATION> 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<PLUGIN_CONTENT_MANAGER> m_pcm;

View File

@ -240,53 +240,44 @@ void KICAD_MANAGER_FRAME::doReCreateMenuBar()
}
/**
* @brief (Re)Create the left vertical toolbar
*/
void KICAD_MANAGER_FRAME::RecreateBaseLeftToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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;
}

View File

@ -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" )

View File

@ -98,8 +98,11 @@ public:
// The Tool Framework initialization
void setupTools();
// Virtual basic functions:
void ReCreateHToolbar() override;
// Currently no top auxillary toolbar
std::optional<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultRightToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> 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<NL_PL_EDITOR_PLUGIN> 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 */

View File

@ -29,168 +29,155 @@
#include "pl_editor_id.h"
#include "pl_editor_frame.h"
void PL_EDITOR_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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<PL_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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();
}

View File

@ -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 )

View File

@ -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<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultRightToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> 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:

View File

@ -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();

View File

@ -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 );

View File

@ -87,6 +87,10 @@ public:
void HardRedraw() override;
// Toolbar defaults
std::optional<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> 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;

View File

@ -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<TOOLBAR_CONFIGURATION> 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

View File

@ -147,9 +147,10 @@ private:
*/
void DisplayWizardInfos();
// Toolbar defaults
std::optional<TOOLBAR_CONFIGURATION> DefaultTopMainToolbarConfig() override;
void doCloseWindow() override;
void ReCreateHToolbar() override;
void ReCreateVToolbar() override;
void ClickOnPageList( wxCommandEvent& event );
void LoadSettings( APP_SETTINGS_BASE* aCfg ) override;

View File

@ -54,6 +54,7 @@
#include <project_pcb.h>
#include <wildcards_and_files_ext.h>
#include <zoom_defines.h>
#include <pcb_layer_box_selector.h>
#include <math/vector2d.h>
#include <math/vector2wx.h>
@ -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 );
}

View File

@ -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" ) )

View File

@ -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<TOOLBAR_CONFIGURATION> DefaultLeftToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultRightToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> DefaultTopMainToolbarConfig() override;
std::optional<TOOLBAR_CONFIGURATION> 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

View File

@ -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<LEGACY_OR_API_PLUGIN>& 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,

View File

@ -34,173 +34,85 @@
#include <wx/wupdlock.h>
#include <advanced_config.h>
void FOOTPRINT_EDIT_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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<PCB_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( 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<TOOLBAR_CONFIGURATION> 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<PCB_SELECTION_TOOL>();
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<TOOLBAR_CONFIGURATION> 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<PCB_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( 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() );
}

View File

@ -35,127 +35,82 @@
#include <wx/choice.h>
void FOOTPRINT_VIEWER_FRAME::ReCreateHToolbar()
std::optional<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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;
}

View File

@ -25,6 +25,7 @@
*/
#include <memory>
#include <string>
#include <advanced_config.h>
#include <api/api_plugin_manager.h>
@ -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<TOOLBAR_CONFIGURATION> 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<PCB_SELECTION_TOOL>();
std::unique_ptr<ACTION_MENU> gridMenu = std::make_unique<ACTION_MENU>( 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<TOOLBAR_CONFIGURATION> 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<PCB_SELECTION_TOOL>();
/* TODO (ISM): Support context menus
PCB_SELECTION_TOOL* selTool = m_toolManager->GetTool<PCB_SELECTION_TOOL>();
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<ACTION_MENU> zoneMenu = std::make_unique<ACTION_MENU>( 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<ACTION_MENU> lineMenu = std::make_unique<ACTION_MENU>( 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<TOOLBAR_CONFIGURATION> 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<TOOLBAR_CONFIGURATION> 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() );
}

View File

@ -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 ) );