From 781d293b60e079db87c6e467674e64f4f32c39b3 Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Mon, 22 Feb 2021 00:35:37 +0000 Subject: [PATCH] Add option for text updating to Update Symbol. Fixes https://gitlab.com/kicad/code/kicad/issues/6420 --- eeschema/dialogs/dialog_change_symbols.cpp | 28 +++++--- .../dialogs/dialog_change_symbols_base.cpp | 7 +- .../dialogs/dialog_change_symbols_base.fbp | 68 ++++++++++++++++++- eeschema/dialogs/dialog_change_symbols_base.h | 1 + .../dialogs/dialog_update_symbol_fields.cpp | 9 ++- .../dialog_update_symbol_fields_base.cpp | 3 + .../dialog_update_symbol_fields_base.fbp | 64 +++++++++++++++++ .../dialog_update_symbol_fields_base.h | 1 + eeschema/tools/ee_selection_tool.cpp | 11 ++- 9 files changed, 172 insertions(+), 20 deletions(-) diff --git a/eeschema/dialogs/dialog_change_symbols.cpp b/eeschema/dialogs/dialog_change_symbols.cpp index d74a279cbf..1f4cc01565 100644 --- a/eeschema/dialogs/dialog_change_symbols.cpp +++ b/eeschema/dialogs/dialog_change_symbols.cpp @@ -42,6 +42,7 @@ bool g_selectValue = false; // { change, update } bool g_removeExtraFields[2] = { false, false }; bool g_resetEmptyFields[2] = { false, false }; +bool g_resetFieldText[2] = { true, true }; bool g_resetFieldVisibilities[2] = { true, false }; bool g_resetFieldEffects[2] = { true, false }; bool g_resetFieldPositions[2] = { true, false }; @@ -130,13 +131,16 @@ DIALOG_CHANGE_SYMBOLS::DIALOG_CHANGE_SYMBOLS( SCH_EDIT_FRAME* aParent, SCH_COMPO m_updateFieldsSizer->GetStaticBox()->SetLabel( _( "Update Fields" ) ); m_removeExtraBox->SetLabel( _( "Remove fields if not in new symbol" ) ); m_resetEmptyFields->SetLabel( _( "Reset fields if empty in new symbol" ) ); + m_resetFieldText->SetLabel( _( "Update field text" ) ); m_resetFieldVisibilities->SetLabel( _( "Update field visibilities" ) ); m_resetFieldEffects->SetLabel( _( "Update field sizes and styles" ) ); m_resetFieldPositions->SetLabel( _( "Update field positions" ) ); + m_resetAttributes->SetLabel( _( "Update symbol attributes" ) ); } m_removeExtraBox->SetValue( g_removeExtraFields[ (int) m_mode ] ); m_resetEmptyFields->SetValue( g_resetEmptyFields[ (int) m_mode ] ); + m_resetFieldText->SetValue( g_resetFieldText[ (int) m_mode ] ); m_resetFieldVisibilities->SetValue( g_resetFieldVisibilities[ (int) m_mode ] ); m_resetFieldEffects->SetValue( g_resetFieldEffects[ (int) m_mode ] ); m_resetFieldPositions->SetValue( g_resetFieldPositions[ (int) m_mode ] ); @@ -208,6 +212,7 @@ DIALOG_CHANGE_SYMBOLS::~DIALOG_CHANGE_SYMBOLS() g_removeExtraFields[ (int) m_mode ] = m_removeExtraBox->GetValue(); g_resetEmptyFields[ (int) m_mode ] = m_resetEmptyFields->GetValue(); + g_resetFieldText[ (int) m_mode ] = m_resetFieldText->GetValue(); g_resetFieldVisibilities[ (int) m_mode ] = m_resetFieldVisibilities->GetValue(); g_resetFieldEffects[ (int) m_mode ] = m_resetFieldEffects->GetValue(); g_resetFieldPositions[ (int) m_mode ] = m_resetFieldPositions->GetValue(); @@ -281,16 +286,21 @@ void DIALOG_CHANGE_SYMBOLS::updateFieldsList() for( unsigned i = MANDATORY_FIELDS; i < fields.size(); ++i ) fieldNames.insert( fields[i]->GetName() ); - if( m_mode == MODE::UPDATE && symbol->GetPartRef() ) + if( m_mode == MODE::UPDATE && symbol->GetLibId().IsValid() ) { - std::unique_ptr flattenedPart = symbol->GetPartRef()->Flatten(); + LIB_PART* libSymbol = frame->GetLibPart( symbol->GetLibId() ); - flattenedPart->GetFields( libFields ); + if( libSymbol ) + { + std::unique_ptr flattenedPart = libSymbol->Flatten(); - for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i ) - fieldNames.insert( libFields[i]->GetName() ); + flattenedPart->GetFields( libFields ); - libFields.clear(); // flattenedPart is about to go out of scope... + for( unsigned i = MANDATORY_FIELDS; i < libFields.size(); ++i ) + fieldNames.insert( libFields[i]->GetName() ); + + libFields.clear(); // flattenedPart is about to go out of scope... + } } } } @@ -556,7 +566,6 @@ bool DIALOG_CHANGE_SYMBOLS::processSymbol( SCH_COMPONENT* aSymbol, const SCH_SHE } bool removeExtras = m_removeExtraBox->GetValue(); - bool resetEmpty = m_resetEmptyFields->GetValue(); bool resetVis = m_resetFieldVisibilities->GetValue(); bool resetEffects = m_resetFieldEffects->GetValue(); bool resetPositions = m_resetFieldPositions->GetValue(); @@ -576,7 +585,10 @@ bool DIALOG_CHANGE_SYMBOLS::processSymbol( SCH_COMPONENT* aSymbol, const SCH_SHE if( libField ) { - if( !libField->GetText().IsEmpty() || resetEmpty ) + bool resetText = libField->GetText().IsEmpty() ? m_resetEmptyFields->GetValue() + : m_resetFieldText->GetValue(); + + if( resetText ) { if( i == REFERENCE_FIELD ) aSymbol->SetRef( aInstance, libField->GetText() ); diff --git a/eeschema/dialogs/dialog_change_symbols_base.cpp b/eeschema/dialogs/dialog_change_symbols_base.cpp index 02c393638b..a91cdae16b 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.cpp +++ b/eeschema/dialogs/dialog_change_symbols_base.cpp @@ -125,7 +125,10 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind m_updateOptionsSizer->Add( m_resetEmptyFields, 0, wxBOTTOM|wxRIGHT, 4 ); - m_updateOptionsSizer->Add( 0, 15, 0, wxEXPAND, 5 ); + m_updateOptionsSizer->Add( 0, 10, 0, wxEXPAND, 5 ); + + m_resetFieldText = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Update/reset field text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_updateOptionsSizer->Add( m_resetFieldText, 0, wxBOTTOM|wxRIGHT, 4 ); m_resetFieldVisibilities = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Update/reset field visibilities"), wxDefaultPosition, wxDefaultSize, 0 ); m_updateOptionsSizer->Add( m_resetFieldVisibilities, 0, wxBOTTOM|wxRIGHT, 4 ); @@ -137,7 +140,7 @@ DIALOG_CHANGE_SYMBOLS_BASE::DIALOG_CHANGE_SYMBOLS_BASE( wxWindow* parent, wxWind m_updateOptionsSizer->Add( m_resetFieldPositions, 0, wxBOTTOM|wxRIGHT, 4 ); - m_updateOptionsSizer->Add( 0, 15, 1, wxEXPAND, 5 ); + m_updateOptionsSizer->Add( 0, 10, 1, wxEXPAND, 5 ); m_resetAttributes = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Update/reset symbol attributes"), wxDefaultPosition, wxDefaultSize, 0 ); m_updateOptionsSizer->Add( m_resetAttributes, 0, wxBOTTOM|wxRIGHT, 5 ); diff --git a/eeschema/dialogs/dialog_change_symbols_base.fbp b/eeschema/dialogs/dialog_change_symbols_base.fbp index 3bceb3de61..ba103654a5 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.fbp +++ b/eeschema/dialogs/dialog_change_symbols_base.fbp @@ -1382,11 +1382,75 @@ wxEXPAND 0 - 15 + 10 protected 0 + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Update/reset field text + + 0 + + + 0 + + 1 + m_resetFieldText + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + 4 wxBOTTOM|wxRIGHT @@ -1584,7 +1648,7 @@ wxEXPAND 1 - 15 + 10 protected 0 diff --git a/eeschema/dialogs/dialog_change_symbols_base.h b/eeschema/dialogs/dialog_change_symbols_base.h index 65263b76d3..e10b332517 100644 --- a/eeschema/dialogs/dialog_change_symbols_base.h +++ b/eeschema/dialogs/dialog_change_symbols_base.h @@ -68,6 +68,7 @@ class DIALOG_CHANGE_SYMBOLS_BASE : public DIALOG_SHIM wxStaticBoxSizer* m_updateOptionsSizer; wxCheckBox* m_removeExtraBox; wxCheckBox* m_resetEmptyFields; + wxCheckBox* m_resetFieldText; wxCheckBox* m_resetFieldVisibilities; wxCheckBox* m_resetFieldEffects; wxCheckBox* m_resetFieldPositions; diff --git a/eeschema/dialogs/dialog_update_symbol_fields.cpp b/eeschema/dialogs/dialog_update_symbol_fields.cpp index 1ec212af0a..73703b3eee 100644 --- a/eeschema/dialogs/dialog_update_symbol_fields.cpp +++ b/eeschema/dialogs/dialog_update_symbol_fields.cpp @@ -29,6 +29,7 @@ bool g_removeExtraLibFields = false; bool g_resetEmptyLibFields = false; +bool g_resetLibFieldText = true; bool g_resetLibFieldVisibilities = true; bool g_resetLibFieldEffects = true; bool g_resetLibFieldPositions = true; @@ -55,6 +56,7 @@ DIALOG_UPDATE_SYMBOL_FIELDS::DIALOG_UPDATE_SYMBOL_FIELDS( SYMBOL_EDIT_FRAME* aPa m_removeExtraBox->SetValue( g_removeExtraLibFields ); m_resetEmptyFields->SetValue( g_resetEmptyLibFields ); + m_resetFieldText->SetValue( g_resetLibFieldText ); m_resetFieldVisibilities->SetValue( g_resetLibFieldVisibilities ); m_resetFieldEffects->SetValue( g_resetLibFieldEffects ); m_resetFieldPositions->SetValue( g_resetLibFieldPositions ); @@ -70,6 +72,7 @@ DIALOG_UPDATE_SYMBOL_FIELDS::~DIALOG_UPDATE_SYMBOL_FIELDS() { g_removeExtraLibFields = m_removeExtraBox->GetValue(); g_resetEmptyLibFields = m_resetEmptyFields->GetValue(); + g_resetLibFieldText = m_resetFieldText->GetValue(); g_resetLibFieldVisibilities = m_resetFieldVisibilities->GetValue(); g_resetLibFieldEffects = m_resetFieldEffects->GetValue(); g_resetLibFieldPositions = m_resetFieldPositions->GetValue(); @@ -135,7 +138,6 @@ void DIALOG_UPDATE_SYMBOL_FIELDS::onOkButtonClicked( wxCommandEvent& aEvent ) std::unique_ptr flattenedParent = m_symbol->GetParent().lock()->Flatten(); bool removeExtras = m_removeExtraBox->GetValue(); - bool resetEmpty = m_resetEmptyFields->GetValue(); bool resetVis = m_resetFieldVisibilities->GetValue(); bool resetEffects = m_resetFieldEffects->GetValue(); bool resetPositions = m_resetFieldPositions->GetValue(); @@ -155,7 +157,10 @@ void DIALOG_UPDATE_SYMBOL_FIELDS::onOkButtonClicked( wxCommandEvent& aEvent ) if( parentField ) { - if( !parentField->GetText().IsEmpty() || resetEmpty ) + bool resetText = parentField->GetText().IsEmpty() ? m_resetEmptyFields->GetValue() + : m_resetFieldText->GetValue(); + + if( resetText ) field.SetText( parentField->GetText() ); if( resetVis ) diff --git a/eeschema/dialogs/dialog_update_symbol_fields_base.cpp b/eeschema/dialogs/dialog_update_symbol_fields_base.cpp index a80d729072..34a7bbb11d 100644 --- a/eeschema/dialogs/dialog_update_symbol_fields_base.cpp +++ b/eeschema/dialogs/dialog_update_symbol_fields_base.cpp @@ -69,6 +69,9 @@ DIALOG_UPDATE_SYMBOL_FIELDS_BASE::DIALOG_UPDATE_SYMBOL_FIELDS_BASE( wxWindow* pa m_updateOptionsSizer->Add( 0, 15, 0, wxEXPAND, 5 ); + m_resetFieldText = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Update/reset field text"), wxDefaultPosition, wxDefaultSize, 0 ); + m_updateOptionsSizer->Add( m_resetFieldText, 0, wxBOTTOM|wxRIGHT, 4 ); + m_resetFieldVisibilities = new wxCheckBox( m_updateOptionsSizer->GetStaticBox(), wxID_ANY, _("Update/reset field visibilities"), wxDefaultPosition, wxDefaultSize, 0 ); m_updateOptionsSizer->Add( m_resetFieldVisibilities, 0, wxBOTTOM|wxRIGHT, 4 ); diff --git a/eeschema/dialogs/dialog_update_symbol_fields_base.fbp b/eeschema/dialogs/dialog_update_symbol_fields_base.fbp index 9ea7c236eb..347005c7c7 100644 --- a/eeschema/dialogs/dialog_update_symbol_fields_base.fbp +++ b/eeschema/dialogs/dialog_update_symbol_fields_base.fbp @@ -587,6 +587,70 @@ 0 + + 4 + wxBOTTOM|wxRIGHT + 0 + + 1 + 1 + 1 + 1 + + + + + + + + 1 + 0 + 0 + 1 + + 1 + 0 + Dock + 0 + Left + 1 + + 1 + + 0 + 0 + wxID_ANY + Update/reset field text + + 0 + + + 0 + + 1 + m_resetFieldText + 1 + + + protected + 1 + + Resizable + 1 + + + ; ; forward_declare + 0 + + + wxFILTER_NONE + wxDefaultValidator + + + + + + 4 wxBOTTOM|wxRIGHT diff --git a/eeschema/dialogs/dialog_update_symbol_fields_base.h b/eeschema/dialogs/dialog_update_symbol_fields_base.h index 007e095527..84afa255a5 100644 --- a/eeschema/dialogs/dialog_update_symbol_fields_base.h +++ b/eeschema/dialogs/dialog_update_symbol_fields_base.h @@ -49,6 +49,7 @@ class DIALOG_UPDATE_SYMBOL_FIELDS_BASE : public DIALOG_SHIM wxStaticBoxSizer* m_updateOptionsSizer; wxCheckBox* m_removeExtraBox; wxCheckBox* m_resetEmptyFields; + wxCheckBox* m_resetFieldText; wxCheckBox* m_resetFieldVisibilities; wxCheckBox* m_resetFieldEffects; wxCheckBox* m_resetFieldPositions; diff --git a/eeschema/tools/ee_selection_tool.cpp b/eeschema/tools/ee_selection_tool.cpp index 6579bdb7ba..3686502b00 100644 --- a/eeschema/tools/ee_selection_tool.cpp +++ b/eeschema/tools/ee_selection_tool.cpp @@ -52,7 +52,7 @@ #include -SELECTION_CONDITION EE_CONDITIONS::SingleSymbol = [] (const SELECTION& aSel ) +SELECTION_CONDITION EE_CONDITIONS::SingleSymbol = []( const SELECTION& aSel ) { if( aSel.GetSize() == 1 ) { @@ -66,14 +66,13 @@ SELECTION_CONDITION EE_CONDITIONS::SingleSymbol = [] (const SELECTION& aSel ) }; -SELECTION_CONDITION EE_CONDITIONS::SingleSymbolOrPower = [] (const SELECTION& aSel ) +SELECTION_CONDITION EE_CONDITIONS::SingleSymbolOrPower = []( const SELECTION& aSel ) { - if( aSel.GetSize() == 1 ) - return dynamic_cast( aSel.Front() ) != nullptr; + return aSel.GetSize() == 1 && aSel.Front()->Type() == SCH_COMPONENT_T; }; -SELECTION_CONDITION EE_CONDITIONS::SingleDeMorganSymbol = [] ( const SELECTION& aSel ) +SELECTION_CONDITION EE_CONDITIONS::SingleDeMorganSymbol = []( const SELECTION& aSel ) { if( aSel.GetSize() == 1 ) { @@ -87,7 +86,7 @@ SELECTION_CONDITION EE_CONDITIONS::SingleDeMorganSymbol = [] ( const SELECTION& }; -SELECTION_CONDITION EE_CONDITIONS::SingleMultiUnitSymbol = [] ( const SELECTION& aSel ) +SELECTION_CONDITION EE_CONDITIONS::SingleMultiUnitSymbol = []( const SELECTION& aSel ) { if( aSel.GetSize() == 1 ) {