From e54075264018c8ba6a5222b288c8656fea0ce9cb Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Thu, 17 Jun 2021 23:34:19 +0100 Subject: [PATCH] Allow all selected footprints/symbols to be changed. Fixes https://gitlab.com/kicad/code/kicad/issues/7389 --- eeschema/dialogs/dialog_change_symbols.cpp | 4 ++-- eeschema/dialogs/dialog_change_symbols_base.cpp | 2 +- eeschema/dialogs/dialog_change_symbols_base.fbp | 2 +- pcbnew/dialogs/dialog_exchange_footprints.cpp | 4 ++-- pcbnew/dialogs/dialog_exchange_footprints_base.cpp | 2 +- pcbnew/dialogs/dialog_exchange_footprints_base.fbp | 2 +- pcbnew/tools/global_edit_tool.cpp | 4 ---- 7 files changed, 8 insertions(+), 12 deletions(-) diff --git a/eeschema/dialogs/dialog_change_symbols.cpp b/eeschema/dialogs/dialog_change_symbols.cpp index 4d6870cb78..d24a86728e 100644 --- a/eeschema/dialogs/dialog_change_symbols.cpp +++ b/eeschema/dialogs/dialog_change_symbols.cpp @@ -73,7 +73,7 @@ DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS( SCH_EDIT_FRAME* aParent, SCH_SYMBO SCH_SHEET_PATH* currentSheet = &aParent->Schematic().CurrentSheet(); if( m_mode == MODE::CHANGE ) - m_matchBySelection->SetLabel( _( "Change selected Symbol" ) ); + m_matchBySelection->SetLabel( _( "Change selected symbol(s)" ) ); m_newId->AppendText( FROM_UTF8( m_symbol->GetLibId().Format().c_str() ) ); m_specifiedReference->ChangeValue( m_symbol->GetRef( currentSheet ) ); @@ -395,7 +395,7 @@ bool DIALOG_CHANGE_SYMBOLS::isMatch( SCH_SYMBOL* aSymbol, SCH_SHEET_PATH* aInsta } else if( m_matchBySelection->GetValue() ) { - return aSymbol == m_symbol; + return aSymbol == m_symbol || aSymbol->IsSelected(); } else if( m_matchByReference->GetValue() ) { diff --git a/eeschema/dialogs/dialog_change_symbols_base.cpp b/eeschema/dialogs/dialog_change_symbols_base.cpp index a91cdae16b..96fd2e1d55 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.cpp +++ b/eeschema/dialogs/dialog_change_symbols_base.cpp @@ -27,7 +27,7 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind m_matchAll = new wxRadioButton( this, wxID_ANY, _("Update all symbols in schematic"), wxDefaultPosition, wxDefaultSize, 0 ); m_matchSizer->Add( m_matchAll, wxGBPosition( 0, 0 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); - m_matchBySelection = new wxRadioButton( this, wxID_ANY, _("Update selected symbol"), wxDefaultPosition, wxDefaultSize, 0 ); + m_matchBySelection = new wxRadioButton( this, wxID_ANY, _("Update selected symbol(s)"), wxDefaultPosition, wxDefaultSize, 0 ); m_matchSizer->Add( m_matchBySelection, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxBOTTOM, 5 ); m_matchByReference = new wxRadioButton( this, wxID_ANY, _("Update symbols matching reference designator:"), wxDefaultPosition, wxDefaultSize, 0 ); diff --git a/eeschema/dialogs/dialog_change_symbols_base.fbp b/eeschema/dialogs/dialog_change_symbols_base.fbp index ba103654a5..1c8ed59daa 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.fbp +++ b/eeschema/dialogs/dialog_change_symbols_base.fbp @@ -185,7 +185,7 @@ 0 0 wxID_ANY - Update selected symbol + Update selected symbol(s) 0 diff --git a/pcbnew/dialogs/dialog_exchange_footprints.cpp b/pcbnew/dialogs/dialog_exchange_footprints.cpp index 6af3c21deb..76e33f671d 100644 --- a/pcbnew/dialogs/dialog_exchange_footprints.cpp +++ b/pcbnew/dialogs/dialog_exchange_footprints.cpp @@ -73,7 +73,7 @@ DIALOG_EXCHANGE_FOOTPRINTS::DIALOG_EXCHANGE_FOOTPRINTS( PCB_EDIT_FRAME* aParent, { SetTitle( _( "Change Footprints" ) ); m_matchAll->SetLabel( _( "Change all footprints on board" ) ); - m_matchSelected->SetLabel( _( "Change selected footprint" ) ); + m_matchSelected->SetLabel( _( "Change selected footprint(s)" ) ); m_matchSpecifiedRef->SetLabel( _( "Change footprints matching reference designator:" ) ); m_matchSpecifiedValue->SetLabel( _( "Change footprints matching value:" ) ); m_matchSpecifiedID->SetLabel( _( "Change footprints with library id:" ) ); @@ -190,7 +190,7 @@ bool DIALOG_EXCHANGE_FOOTPRINTS::isMatch( FOOTPRINT* aFootprint ) case ID_MATCH_FP_ALL: return true; case ID_MATCH_FP_SELECTED: - return aFootprint == m_currentFootprint; + return aFootprint == m_currentFootprint || aFootprint->IsSelected(); case ID_MATCH_FP_REF: return WildCompareString( m_specifiedRef->GetValue(), aFootprint->GetReference(), false ); case ID_MATCH_FP_VAL: diff --git a/pcbnew/dialogs/dialog_exchange_footprints_base.cpp b/pcbnew/dialogs/dialog_exchange_footprints_base.cpp index 8a3fb65271..5974427738 100644 --- a/pcbnew/dialogs/dialog_exchange_footprints_base.cpp +++ b/pcbnew/dialogs/dialog_exchange_footprints_base.cpp @@ -24,7 +24,7 @@ DIALOG_EXCHANGE_FOOTPRINTS_BASE::DIALOG_EXCHANGE_FOOTPRINTS_BASE( wxWindow* pare m_matchAll = new wxRadioButton( this, wxID_ANY, _("Update all footprints on board"), wxDefaultPosition, wxDefaultSize, 0 ); m_upperSizer->Add( m_matchAll, wxGBPosition( 0, 0 ), wxGBSpan( 1, 2 ), wxEXPAND|wxALL, 5 ); - m_matchSelected = new wxRadioButton( this, wxID_ANY, _("Update selected footprint"), wxDefaultPosition, wxDefaultSize, 0 ); + m_matchSelected = new wxRadioButton( this, wxID_ANY, _("Update selected footprint(s)"), wxDefaultPosition, wxDefaultSize, 0 ); m_upperSizer->Add( m_matchSelected, wxGBPosition( 1, 0 ), wxGBSpan( 1, 1 ), wxALL, 5 ); m_matchSpecifiedRef = new wxRadioButton( this, wxID_ANY, _("Update footprints matching reference designator:"), wxDefaultPosition, wxDefaultSize, 0 ); diff --git a/pcbnew/dialogs/dialog_exchange_footprints_base.fbp b/pcbnew/dialogs/dialog_exchange_footprints_base.fbp index fc68ab8b40..af9142b667 100644 --- a/pcbnew/dialogs/dialog_exchange_footprints_base.fbp +++ b/pcbnew/dialogs/dialog_exchange_footprints_base.fbp @@ -177,7 +177,7 @@ 0 0 wxID_ANY - Update selected footprint + Update selected footprint(s) 0 diff --git a/pcbnew/tools/global_edit_tool.cpp b/pcbnew/tools/global_edit_tool.cpp index dde81fd7b2..b4586cea30 100644 --- a/pcbnew/tools/global_edit_tool.cpp +++ b/pcbnew/tools/global_edit_tool.cpp @@ -94,10 +94,6 @@ int GLOBAL_EDIT_TOOL::ExchangeFootprints( const TOOL_EVENT& aEvent ) else wxFAIL_MSG( "ExchangeFootprints: unexpected action" ); - // Footprint exchange could remove footprints, so they have to be - // removed from the selection first - m_toolMgr->RunAction( PCB_ACTIONS::selectionClear, true ); - // invoke the exchange dialog process { PCB_EDIT_FRAME* editFrame = getEditFrame();