From 2b96161d0e83db87b4a09f2b518f1bd15717da44 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Fri, 24 Feb 2023 22:41:04 +0000 Subject: [PATCH] Log new undo record at the start of Change Symbols. Also fixes a bug where the "screen" variable was used with stale data. Fixes https://gitlab.com/kicad/code/kicad/issues/14061 --- eeschema/dialogs/dialog_change_symbols.cpp | 24 +++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/eeschema/dialogs/dialog_change_symbols.cpp b/eeschema/dialogs/dialog_change_symbols.cpp index 921f9da968..b31a40c3a7 100644 --- a/eeschema/dialogs/dialog_change_symbols.cpp +++ b/eeschema/dialogs/dialog_change_symbols.cpp @@ -512,21 +512,18 @@ int DIALOG_CHANGE_SYMBOLS::processMatchingSymbols() int DIALOG_CHANGE_SYMBOLS::processSymbols( const std::map& aSymbols ) + SYMBOL_CHANGE_INFO>& aSymbols ) { wxCHECK( !aSymbols.empty(), 0 ); int matchesProcessed = 0; SCH_EDIT_FRAME* frame = dynamic_cast( GetParent() ); - SCH_SCREEN* screen = nullptr; - LIB_SYMBOL* libSymbol = nullptr; - std::map symbols = aSymbols; + wxString msg; wxCHECK( frame, 0 ); - wxString msg; - - auto it = symbols.begin(); + std::map symbols = aSymbols; + std::map::iterator it = symbols.begin(); // Remove all symbols that don't have a valid library symbol link or enough units to // satify the library symbol update. @@ -536,7 +533,7 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( const std::mapsecond.m_LibId.IsValid(), continue ); - libSymbol = frame->GetLibSymbol( it->second.m_LibId ); + LIB_SYMBOL* libSymbol = frame->GetLibSymbol( it->second.m_LibId ); if( !libSymbol ) { @@ -562,18 +559,21 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( const std::mapRemove( symbol ); - frame->SaveCopyInUndoList( screen, symbol, UNDO_REDO::CHANGED, true ); + frame->SaveCopyInUndoList( screen, symbol, UNDO_REDO::CHANGED, appendUndo ); + appendUndo = true; } for( const auto& [ symbol, symbol_change_info ] : symbols ) @@ -581,8 +581,9 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( const std::mapGetLibId() ) symbol->SetLibId( symbol_change_info.m_LibId ); - libSymbol = frame->GetLibSymbol( symbol_change_info.m_LibId ); + LIB_SYMBOL* libSymbol = frame->GetLibSymbol( symbol_change_info.m_LibId ); std::unique_ptr flattenedSymbol = libSymbol->Flatten(); + SCH_SCREEN* screen = symbol_change_info.m_Instances[0].LastScreen(); symbol->SetLibSymbol( flattenedSymbol.release() ); @@ -696,7 +697,6 @@ int DIALOG_CHANGE_SYMBOLS::processSymbols( const std::mapSetSchSymbolLibraryName( wxEmptyString ); - screen = symbol_change_info.m_Instances[0].LastScreen(); screen->Append( symbol ); frame->GetCanvas()->GetView()->Update( symbol );