Browse Source

Dirty symbols when modified.

Also show changes in library tree and canvas when
"Apply" button is clicked.

Fixes https://gitlab.com/kicad/code/kicad/-/issues/21659
master
Jeff Young 2 months ago
parent
commit
fef84a2c6a
  1. 43
      eeschema/dialogs/dialog_lib_fields_table.cpp
  2. 6
      eeschema/lib_fields_data_model.cpp

43
eeschema/dialogs/dialog_lib_fields_table.cpp

@ -540,18 +540,20 @@ void DIALOG_LIB_FIELDS_TABLE::loadSymbols( const wxArrayString& aSymbolNames )
return;
}
try
// Load each symbol from the library manager and add it to our list
for( const wxString& symbolName : aSymbolNames )
{
// Load each symbol from the library manager and add it to our list
for( const wxString& symbolName : aSymbolNames )
{
LIB_SYMBOL* symbol = nullptr;
LIB_SYMBOL* canvasSymbol = m_parent->GetCurSymbol();
if( canvasSymbol && canvasSymbol->GetLibraryName() == libName && canvasSymbol->GetName() == symbolName )
{
m_symbolsList.push_back( canvasSymbol );
}
else
{
try
{
symbol = m_parent->GetLibManager().GetSymbol( symbolName, libName );
if( symbol )
if( LIB_SYMBOL* symbol = m_parent->GetLibManager().GetSymbol( symbolName, libName ) )
m_symbolsList.push_back( symbol );
}
catch( const IO_ERROR& ioe )
@ -561,13 +563,6 @@ void DIALOG_LIB_FIELDS_TABLE::loadSymbols( const wxArrayString& aSymbolNames )
}
}
}
catch( const IO_ERROR& ioe )
{
DisplayErrorMessage( this, wxString::Format( _( "Error accessing library '%s'.\n\n%s" ),
libName,
ioe.What() ) );
return;
}
if( m_symbolsList.empty() )
{
@ -589,10 +584,15 @@ bool DIALOG_LIB_FIELDS_TABLE::TransferDataFromWindow()
if( !wxDialog::TransferDataFromWindow() )
return false;
bool updateCanvas = false;
m_dataModel->ApplyData(
[&]( LIB_SYMBOL* )
[&]( LIB_SYMBOL* symbol )
{
m_parent->OnModify();
m_parent->GetLibManager().UpdateSymbol( symbol, symbol->GetLibNickname() );
if( m_parent->GetCurSymbol() == symbol )
updateCanvas = true;
},
[&]()
{
@ -656,6 +656,15 @@ bool DIALOG_LIB_FIELDS_TABLE::TransferDataFromWindow()
wxLogTrace( traceLibFieldTable, "About to rebuild grid rows to include new symbols" );
RegroupSymbols();
wxLogTrace( traceLibFieldTable, "Grid rebuild completed" );
m_parent->RefreshLibraryTree();
if( updateCanvas )
{
m_parent->OnModify();
m_parent->HardRedraw();
}
return true;
}

6
eeschema/lib_fields_data_model.cpp

@ -931,8 +931,6 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ApplyData( std::function<void( LIB_SYMBO
{
for( LIB_SYMBOL* symbol : m_symbolsList )
{
symbolChangeHandler( symbol );
std::map<wxString, LIB_DATA_ELEMENT>& fieldStore = m_dataStore[symbol->m_Uuid];
for( auto& srcData : fieldStore )
@ -942,6 +940,9 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ApplyData( std::function<void( LIB_SYMBO
const wxString& srcValue = dataElement.m_currentData;
int col = GetFieldNameCol( srcName );
if( dataElement.m_isModified )
symbolChangeHandler( symbol );
// Attributes bypass the field logic, so handle them first
if( col != -1 && ColIsCheck( col ) )
{
@ -1022,6 +1023,7 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ApplyData( std::function<void( LIB_SYMBO
// Remove any fields that are not in the fieldStore
if( !fieldStore.contains( field->GetName() ) )
{
symbolChangeHandler( symbol );
symbol->RemoveField( field );
delete field;
}

Loading…
Cancel
Save