Symbol Fields Table: save current table properties

Fixes: https://gitlab.com/kicad/code/kicad/-/issues/5006
This commit is contained in:
Mike Williams 2023-01-30 12:16:33 -05:00
parent e53ee9df4b
commit 1982c1af80
4 changed files with 80 additions and 5 deletions

View File

@ -768,6 +768,7 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
DIALOG_SYMBOL_FIELDS_TABLE_BASE( parent ), DIALOG_SYMBOL_FIELDS_TABLE_BASE( parent ),
m_parent( parent ) m_parent( parent )
{ {
EESCHEMA_SETTINGS* cfg = static_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) ); wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
int nameColWidthMargin = 44; int nameColWidthMargin = 44;
@ -803,6 +804,9 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
m_fieldsCtrl->SetIndent( 0 ); m_fieldsCtrl->SetIndent( 0 );
m_filter->SetDescriptiveText( _( "Filter" ) ); m_filter->SetDescriptiveText( _( "Filter" ) );
m_filter->ChangeValue( cfg->m_FieldEditorPanel.filter_string );
m_groupSymbolsBox->SetValue( cfg->m_FieldEditorPanel.group_symbols );
m_dataModel = new FIELDS_EDITOR_GRID_DATA_MODEL( m_parent, m_symbolsList ); m_dataModel = new FIELDS_EDITOR_GRID_DATA_MODEL( m_parent, m_symbolsList );
@ -831,7 +835,6 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
m_splitterMainWindow->SetSashPosition( fieldsMinWidth + 40 ); m_splitterMainWindow->SetSashPosition( fieldsMinWidth + 40 );
m_dataModel->RebuildRows( m_filter, m_groupSymbolsBox, m_fieldsCtrl ); m_dataModel->RebuildRows( m_filter, m_groupSymbolsBox, m_fieldsCtrl );
m_dataModel->Sort( 0, true );
m_grid->UseNativeColHeader( true ); m_grid->UseNativeColHeader( true );
m_grid->SetTable( m_dataModel, true ); m_grid->SetTable( m_dataModel, true );
@ -876,13 +879,16 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
m_grid->SetColFormatNumber( m_dataModel->GetColsCount() - 1 ); m_grid->SetColFormatNumber( m_dataModel->GetColsCount() - 1 );
m_grid->AutoSizeColumns( false ); m_grid->AutoSizeColumns( false );
// Restore column sorting order and widths
int sortCol = 0;
bool sortAscending = true;
for( int col = 0; col < m_grid->GetNumberCols(); ++col ) for( int col = 0; col < m_grid->GetNumberCols(); ++col )
{ {
// Columns are hidden by setting their width to 0 so if we resize them they will // Columns are hidden by setting their width to 0 so if we resize them they will
// become unhidden. // become unhidden.
if( m_grid->IsColShown( col ) ) if( m_grid->IsColShown( col ) )
{ {
EESCHEMA_SETTINGS* cfg = static_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
std::string key( m_dataModel->GetCanonicalColLabel( col ).ToUTF8() ); std::string key( m_dataModel->GetCanonicalColLabel( col ).ToUTF8() );
if( cfg->m_FieldEditorPanel.column_widths.count( key ) ) if( cfg->m_FieldEditorPanel.column_widths.count( key ) )
@ -900,8 +906,28 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
else else
m_grid->SetColSize( col, Clamp( 100, textWidth, maxWidth ) ); m_grid->SetColSize( col, Clamp( 100, textWidth, maxWidth ) );
} }
if( cfg->m_FieldEditorPanel.column_sorts.count( key ) )
{
sortCol = col;
sortAscending = cfg->m_FieldEditorPanel.column_sorts[key];
} }
} }
}
m_dataModel->Sort( sortCol, sortAscending );
m_grid->SetSortingColumn( sortCol, sortAscending );
// Restore user column order
for( int col = 0; col < (int) cfg->m_FieldEditorPanel.column_order.size(); col++ )
{
int pos = cfg->m_FieldEditorPanel.column_order[col];
if( col >= m_grid->GetNumberCols() || pos >= m_grid->GetNumberCols() )
break;
m_grid->SetColPos( col, pos );
}
m_grid->SelectRow( 0 ); m_grid->SelectRow( 0 );
m_grid->SetGridCursor( 0, 1 ); m_grid->SetGridCursor( 0, 1 );
@ -916,6 +942,8 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
// Connect Events // Connect Events
m_grid->Connect( wxEVT_GRID_COL_SORT, m_grid->Connect( wxEVT_GRID_COL_SORT,
wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColSort ), nullptr, this ); wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColSort ), nullptr, this );
m_grid->Connect( wxEVT_GRID_COL_MOVE,
wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColMove ), nullptr, this );
} }
@ -925,6 +953,9 @@ DIALOG_SYMBOL_FIELDS_TABLE::~DIALOG_SYMBOL_FIELDS_TABLE()
m_grid->Disconnect( wxEVT_GRID_COL_SORT, m_grid->Disconnect( wxEVT_GRID_COL_SORT,
wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColSort ), nullptr, wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColSort ), nullptr,
this ); this );
m_grid->Disconnect( wxEVT_GRID_COL_SORT,
wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColMove ), nullptr,
this );
// Delete the GRID_TRICKS. // Delete the GRID_TRICKS.
m_grid->PopEventHandler( true ); m_grid->PopEventHandler( true );
@ -1237,6 +1268,9 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnRenameField( wxCommandEvent& event )
void DIALOG_SYMBOL_FIELDS_TABLE::OnFilterText( wxCommandEvent& aEvent ) void DIALOG_SYMBOL_FIELDS_TABLE::OnFilterText( wxCommandEvent& aEvent )
{ {
EESCHEMA_SETTINGS* cfg = static_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
cfg->m_FieldEditorPanel.filter_string = m_filter->GetValue();
m_dataModel->RebuildRows( m_filter, m_groupSymbolsBox, m_fieldsCtrl ); m_dataModel->RebuildRows( m_filter, m_groupSymbolsBox, m_fieldsCtrl );
m_dataModel->Sort( m_grid->GetSortingColumn(), m_grid->IsSortOrderAscending() ); m_dataModel->Sort( m_grid->GetSortingColumn(), m_grid->IsSortOrderAscending() );
m_grid->ForceRefresh(); m_grid->ForceRefresh();
@ -1327,6 +1361,9 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnColumnItemToggled( wxDataViewEvent& event )
void DIALOG_SYMBOL_FIELDS_TABLE::OnGroupSymbolsToggled( wxCommandEvent& event ) void DIALOG_SYMBOL_FIELDS_TABLE::OnGroupSymbolsToggled( wxCommandEvent& event )
{ {
EESCHEMA_SETTINGS* cfg = static_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
cfg->m_FieldEditorPanel.group_symbols = m_groupSymbolsBox->GetValue();
m_dataModel->RebuildRows( m_filter, m_groupSymbolsBox, m_fieldsCtrl ); m_dataModel->RebuildRows( m_filter, m_groupSymbolsBox, m_fieldsCtrl );
m_dataModel->Sort( m_grid->GetSortingColumn(), m_grid->IsSortOrderAscending() ); m_dataModel->Sort( m_grid->GetSortingColumn(), m_grid->IsSortOrderAscending() );
m_grid->ForceRefresh(); m_grid->ForceRefresh();
@ -1335,7 +1372,9 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnGroupSymbolsToggled( wxCommandEvent& event )
void DIALOG_SYMBOL_FIELDS_TABLE::OnColSort( wxGridEvent& aEvent ) void DIALOG_SYMBOL_FIELDS_TABLE::OnColSort( wxGridEvent& aEvent )
{ {
EESCHEMA_SETTINGS* cfg = static_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
int sortCol = aEvent.GetCol(); int sortCol = aEvent.GetCol();
std::string key( m_dataModel->GetCanonicalColLabel( sortCol ).ToUTF8() );
bool ascending; bool ascending;
// This is bonkers, but wxWidgets doesn't tell us ascending/descending in the event, and // This is bonkers, but wxWidgets doesn't tell us ascending/descending in the event, and
@ -1351,11 +1390,30 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnColSort( wxGridEvent& aEvent )
ascending = true; ascending = true;
} }
// We only support sorting on one column at this time
cfg->m_FieldEditorPanel.column_sorts.clear();
cfg->m_FieldEditorPanel.column_sorts[key] = ascending;
m_dataModel->Sort( sortCol, ascending ); m_dataModel->Sort( sortCol, ascending );
m_grid->ForceRefresh(); m_grid->ForceRefresh();
} }
void DIALOG_SYMBOL_FIELDS_TABLE::OnColMove( wxGridEvent& aEvent )
{
CallAfter(
[this]()
{
EESCHEMA_SETTINGS* cfg =
static_cast<EESCHEMA_SETTINGS*>( Kiface().KifaceSettings() );
cfg->m_FieldEditorPanel.column_order.clear();
for( int i = 0; i < m_grid->GetNumberCols(); i++ )
cfg->m_FieldEditorPanel.column_order.emplace_back( m_grid->GetColPos( i ) );
} );
}
void DIALOG_SYMBOL_FIELDS_TABLE::OnTableValueChanged( wxGridEvent& aEvent ) void DIALOG_SYMBOL_FIELDS_TABLE::OnTableValueChanged( wxGridEvent& aEvent )
{ {
m_grid->ForceRefresh(); m_grid->ForceRefresh();

View File

@ -54,6 +54,7 @@ private:
void LoadFieldNames(); void LoadFieldNames();
void OnColSort( wxGridEvent& aEvent ); void OnColSort( wxGridEvent& aEvent );
void OnColMove( wxGridEvent& aEvent );
void OnColumnItemToggled( wxDataViewEvent& event ) override; void OnColumnItemToggled( wxDataViewEvent& event ) override;
void OnGroupSymbolsToggled( wxCommandEvent& event ) override; void OnGroupSymbolsToggled( wxCommandEvent& event ) override;

View File

@ -365,6 +365,18 @@ EESCHEMA_SETTINGS::EESCHEMA_SETTINGS() :
m_params.emplace_back( new PARAM_MAP<int>( "field_editor.column_widths", m_params.emplace_back( new PARAM_MAP<int>( "field_editor.column_widths",
&m_FieldEditorPanel.column_widths, {} ) ); &m_FieldEditorPanel.column_widths, {} ) );
m_params.emplace_back( new PARAM_MAP<bool>( "field_editor.column_sorts",
&m_FieldEditorPanel.column_sorts, {} ) );
m_params.emplace_back( new PARAM_LIST<int>( "field_editor.column_order",
&m_FieldEditorPanel.column_order, {} ) );
m_params.emplace_back( new PARAM<wxString>( "field_editor.filter_string",
&m_FieldEditorPanel.filter_string, {} ) );
m_params.emplace_back( new PARAM<bool>( "field_editor.group_symbols",
&m_FieldEditorPanel.group_symbols, true ) );
m_params.emplace_back( new PARAM<bool>( "plot.background_color", m_params.emplace_back( new PARAM<bool>( "plot.background_color",
&m_PlotPanel.background_color, false ) ); &m_PlotPanel.background_color, false ) );

View File

@ -197,6 +197,10 @@ public:
std::map<std::string, bool> fields_show; std::map<std::string, bool> fields_show;
std::map<std::string, bool> fields_group_by; std::map<std::string, bool> fields_group_by;
std::map<std::string, int> column_widths; std::map<std::string, int> column_widths;
std::map<std::string, bool> column_sorts;
std::vector<int> column_order;
wxString filter_string;
bool group_symbols;
}; };
struct PANEL_LIB_VIEW struct PANEL_LIB_VIEW