diff --git a/common/tool/actions.cpp b/common/tool/actions.cpp
index 5e97a82b43..e585dfdd8d 100644
--- a/common/tool/actions.cpp
+++ b/common/tool/actions.cpp
@@ -953,17 +953,17 @@ TOOL_ACTION ACTIONS::unpinLibrary( TOOL_ACTION_ARGS()
.FriendlyName( _( "Unpin Library" ) )
.Tooltip( _( "No longer keep the library at the top of the list" ) ) );
-TOOL_ACTION ACTIONS::showLibraryTable( TOOL_ACTION_ARGS()
- .Name( "common.Control.showLibraryTable" )
+TOOL_ACTION ACTIONS::showLibraryFieldsTable( TOOL_ACTION_ARGS()
+ .Name( "common.Control.showLibraryFieldsTable" )
.Scope( AS_GLOBAL )
- .FriendlyName( _( "Library Table" ) )
+ .FriendlyName( _( "Library Fields Table" ) )
.Icon( BITMAPS::table ) );
-TOOL_ACTION ACTIONS::showRelatedLibraryTable( TOOL_ACTION_ARGS()
- .Name( "common.Control.showRelatedLibraryTable" )
+TOOL_ACTION ACTIONS::showRelatedLibraryFieldsTable( TOOL_ACTION_ARGS()
+ .Name( "common.Control.showRelatedLibraryFieldsTable" )
.Scope( AS_GLOBAL )
- .FriendlyName( _( "Edit Related Symbols as Table" ) )
- .Tooltip( _( "Edit all symbols related to the selected symbol in a table" ) )
+ .FriendlyName( _( "Library Fields Table of Related Symbols" ) )
+ .Tooltip( _( "Edit a table of fields of all symbols related to the selected symbol" ) )
.Icon( BITMAPS::table ) );
TOOL_ACTION ACTIONS::showLibraryTree( TOOL_ACTION_ARGS()
diff --git a/eeschema/CMakeLists.txt b/eeschema/CMakeLists.txt
index faa0e2a809..7f20fdd11f 100644
--- a/eeschema/CMakeLists.txt
+++ b/eeschema/CMakeLists.txt
@@ -122,8 +122,8 @@ set( EESCHEMA_DLGS
dialogs/dialog_label_properties_base.cpp
dialogs/dialog_lib_edit_pin_table.cpp
dialogs/dialog_lib_edit_pin_table_base.cpp
- dialogs/dialog_lib_fields_base.cpp
- dialogs/dialog_lib_fields.cpp
+ dialogs/dialog_lib_fields_table_base.cpp
+ dialogs/dialog_lib_fields_table.cpp
dialogs/dialog_lib_new_symbol.cpp
dialogs/dialog_lib_new_symbol_base.cpp
dialogs/dialog_lib_symbol_properties.cpp
diff --git a/eeschema/dialogs/dialog_lib_fields.cpp b/eeschema/dialogs/dialog_lib_fields_table.cpp
similarity index 60%
rename from eeschema/dialogs/dialog_lib_fields.cpp
rename to eeschema/dialogs/dialog_lib_fields_table.cpp
index d033176e6e..924f35ccda 100644
--- a/eeschema/dialogs/dialog_lib_fields.cpp
+++ b/eeschema/dialogs/dialog_lib_fields_table.cpp
@@ -17,7 +17,7 @@
* with this program. If not, see .
*/
-#include
+#include
#include
#include
@@ -40,7 +40,7 @@
#include
#include
#include
-
+#include
#include
#include
#include
@@ -57,6 +57,24 @@ using DIALOG_NEW_SYMBOL = DIALOG_LIB_NEW_SYMBOL;
#endif
+class VIEW_CONTROLS_GRID_TRICKS : public GRID_TRICKS
+{
+public:
+ VIEW_CONTROLS_GRID_TRICKS( WX_GRID* aGrid ) :
+ GRID_TRICKS( aGrid )
+ {}
+
+protected:
+ void doPopupSelection( wxCommandEvent& event ) override
+ {
+ if( event.GetId() >= GRIDTRICKS_FIRST_SHOWHIDE )
+ m_grid->PostSizeEvent();
+
+ GRID_TRICKS::doPopupSelection( event );
+ }
+};
+
+
enum
{
MYID_SELECT_FOOTPRINT = GRIDTRICKS_FIRST_CLIENT_ID,
@@ -65,16 +83,17 @@ enum
MYID_CLEAR_CELL,
MYID_CREATE_DERIVED_SYMBOL
};
+
+
class LIB_FIELDS_EDITOR_GRID_TRICKS : public GRID_TRICKS
{
public:
- LIB_FIELDS_EDITOR_GRID_TRICKS( DIALOG_SHIM* aParent,
- WX_GRID* aGrid,
- wxDataViewListCtrl* aFieldsCtrl,
+ LIB_FIELDS_EDITOR_GRID_TRICKS( DIALOG_LIB_FIELDS_TABLE* aParent, WX_GRID* aGrid,
+ VIEW_CONTROLS_GRID_DATA_MODEL* aViewFieldsData,
LIB_FIELDS_EDITOR_GRID_DATA_MODEL* aDataModel ) :
GRID_TRICKS( aGrid ),
m_dlg( aParent ),
- m_fieldsCtrl( aFieldsCtrl ),
+ m_viewControlsDataModel( aViewFieldsData ),
m_dataModel( aDataModel )
{}
@@ -106,14 +125,12 @@ protected:
if( m_dataModel->GetColFieldName( col ) == GetCanonicalFieldName( FIELD_T::FOOTPRINT ) )
{
- menu.Append( MYID_SELECT_FOOTPRINT, _( "Select Footprint..." ),
- _( "Browse for footprint" ) );
+ menu.Append( MYID_SELECT_FOOTPRINT, _( "Select Footprint..." ), _( "Browse for footprint" ) );
menu.AppendSeparator();
}
else if( m_dataModel->GetColFieldName( col ) == GetCanonicalFieldName( FIELD_T::DATASHEET ) )
{
- menu.Append( MYID_SHOW_DATASHEET, _( "Show Datasheet" ),
- _( "Show datasheet in browser" ) );
+ menu.Append( MYID_SHOW_DATASHEET, _( "Show Datasheet" ), _( "Show datasheet in browser" ) );
menu.AppendSeparator();
}
@@ -156,10 +173,11 @@ protected:
wxArrayString symbolNames;
m_dataModel->GetSymbolNames( symbolNames );
- auto validator = [&]( wxString newName ) -> bool
- {
- return symbolNames.Index( newName ) == wxNOT_FOUND;
- };
+ auto validator =
+ [&]( wxString newName ) -> bool
+ {
+ return symbolNames.Index( newName ) == wxNOT_FOUND;
+ };
EDA_DRAW_FRAME* frame = dynamic_cast( m_dlg->GetParent() );
DIALOG_NEW_SYMBOL dlg( frame, symbolNames, parentSymbol->GetName(), validator );
@@ -181,8 +199,7 @@ protected:
// pick a footprint using the footprint picker.
wxString fpid = m_grid->GetCellValue( row, col );
- if( KIWAY_PLAYER* frame = m_dlg->Kiway().Player( FRAME_FOOTPRINT_CHOOSER, true,
- m_dlg ) )
+ if( KIWAY_PLAYER* frame = m_dlg->Kiway().Player( FRAME_FOOTPRINT_CHOOSER, true, m_dlg ) )
{
if( frame->ShowModal( &fpid, m_dlg ) )
m_grid->SetCellValue( row, col, fpid );
@@ -193,127 +210,89 @@ protected:
else if (event.GetId() == MYID_SHOW_DATASHEET )
{
wxString datasheet_uri = m_grid->GetCellValue( row, col );
- GetAssociatedDocument( m_dlg, datasheet_uri, &m_dlg->Prj(),
- PROJECT_SCH::SchSearchS( &m_dlg->Prj() ) );
+ GetAssociatedDocument( m_dlg, datasheet_uri, &m_dlg->Prj(), PROJECT_SCH::SchSearchS( &m_dlg->Prj() ) );
+ }
+ else if( event.GetId() >= GRIDTRICKS_FIRST_SHOWHIDE )
+ {
+ if( !m_grid->CommitPendingChanges( false ) )
+ return;
+
+ // Pop-up column order is the order of the shown fields, not the viewControls order
+ col = event.GetId() - GRIDTRICKS_FIRST_SHOWHIDE;
+
+ bool show = !m_dataModel->GetShowColumn( col );
+
+ m_dlg->ShowHideColumn( col, show );
+
+ wxString fieldName = m_dataModel->GetColFieldName( col );
+
+ for( row = 0; row < m_viewControlsDataModel->GetNumberRows(); row++ )
+ {
+ if( m_viewControlsDataModel->GetCanonicalFieldName( row ) == fieldName )
+ m_viewControlsDataModel->SetValueAsBool( row, SHOW_FIELD_COLUMN, show );
+ }
+
+ if( m_viewControlsDataModel->GetView() )
+ m_viewControlsDataModel->GetView()->ForceRefresh();
}
else
{
- // We have grid tricks events to show/hide the columns from the popup menu
- // and we need to make sure the data model is updated to match the grid,
- // so do it through our code instead
- if( event.GetId() >= GRIDTRICKS_FIRST_SHOWHIDE )
- {
- // Pop-up column order is the order of the shown fields, not the
- // fieldsCtrl order
- col = event.GetId() - GRIDTRICKS_FIRST_SHOWHIDE;
-
- bool show = !m_dataModel->GetShowColumn( col );
-
- // Convert data model column to by iterating over m_fieldsCtrl rows
- // and finding the matching field name
- wxString fieldName = m_dataModel->GetColFieldName( col );
-
- for( row = 0; row < m_fieldsCtrl->GetItemCount(); row++ )
- {
- if( m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN ) == fieldName )
- {
- if( m_grid->CommitPendingChanges( false ) )
- m_fieldsCtrl->SetToggleValue( show, row, SHOW_FIELD_COLUMN );
-
- break;
- }
- }
- }
- else
- {
- GRID_TRICKS::doPopupSelection( event );
- }
+ GRID_TRICKS::doPopupSelection( event );
}
}
- DIALOG_SHIM* m_dlg;
- wxDataViewListCtrl* m_fieldsCtrl;
+ DIALOG_LIB_FIELDS_TABLE* m_dlg;
+ VIEW_CONTROLS_GRID_DATA_MODEL* m_viewControlsDataModel;
LIB_FIELDS_EDITOR_GRID_DATA_MODEL* m_dataModel;
};
-DIALOG_LIB_FIELDS::DIALOG_LIB_FIELDS( SYMBOL_EDIT_FRAME* parent, wxString libId, const wxArrayString& aSymbolNames ) :
- DIALOG_LIB_FIELDS_BASE( parent, wxID_ANY, wxString::Format( _( "Symbol Library Fields: %s" ), libId ) ),
- m_libId( libId ),
- m_parent( parent )
+DIALOG_LIB_FIELDS_TABLE::DIALOG_LIB_FIELDS_TABLE( SYMBOL_EDIT_FRAME* parent, DIALOG_LIB_FIELDS_TABLE::SCOPE aScope ) :
+ DIALOG_LIB_FIELDS_TABLE_BASE( parent, wxID_ANY ),
+ m_parent( parent ),
+ m_scope( aScope ),
+ m_viewControlsDataModel( nullptr ),
+ m_dataModel( nullptr )
{
- // Get all symbols from the library
- loadSymbols( aSymbolNames );
-
m_bRefresh->SetBitmap( KiBitmapBundle( BITMAPS::small_refresh ) );
m_addFieldButton->SetBitmap( KiBitmapBundle( BITMAPS::small_plus ) );
m_removeFieldButton->SetBitmap( KiBitmapBundle( BITMAPS::small_trash ) );
m_renameFieldButton->SetBitmap( KiBitmapBundle( BITMAPS::small_edit ) );
- m_removeFieldButton->Enable( false );
- m_renameFieldButton->Enable( false );
+ m_viewControlsDataModel = new VIEW_CONTROLS_GRID_DATA_MODEL( false );
- m_fieldsCtrl->AppendTextColumn( _( "Field" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, wxCOL_HIDDEN );
- m_fieldsCtrl->AppendTextColumn( _( "Label" ), wxDATAVIEW_CELL_EDITABLE, 0, wxALIGN_LEFT, 0 );
- m_fieldsCtrl->AppendToggleColumn( _( "Show" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
- wxALIGN_CENTER, 0 );
- m_fieldsCtrl->AppendToggleColumn( _( "Group By" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
- wxALIGN_CENTER, 0 );
+ m_viewControlsGrid->UseNativeColHeader( true );
+ m_viewControlsGrid->SetTable( m_viewControlsDataModel, true );
- // GTK asserts if the number of columns doesn't match the data, but we still don't want
- // to display the canonical names. So we'll insert a column for them, but keep it 0 width.
- m_fieldsCtrl->AppendTextColumn( _( "Name" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
+ // must be done after SetTable(), which appears to re-set it
+ m_viewControlsGrid->SetSelectionMode( wxGrid::wxGridSelectCells );
- // SetWidth( wxCOL_WIDTH_AUTOSIZE ) fails here on GTK, so we calculate the title sizes and
- // set the column widths ourselves.
- wxDataViewColumn* column = m_fieldsCtrl->GetColumn( SHOW_FIELD_COLUMN );
- m_showColWidth = KIUI::GetTextSize( column->GetTitle(), m_fieldsCtrl ).x + COLUMN_MARGIN;
- column->SetMinWidth( m_showColWidth );
+ // add Cut, Copy, and Paste to wxGrid
+ m_viewControlsGrid->PushEventHandler( new VIEW_CONTROLS_GRID_TRICKS( m_viewControlsGrid ) );
- column = m_fieldsCtrl->GetColumn( GROUP_BY_COLUMN );
- m_groupByColWidth = KIUI::GetTextSize( column->GetTitle(), m_fieldsCtrl ).x + COLUMN_MARGIN;
- column->SetMinWidth( m_groupByColWidth );
+ wxGridCellAttr* attr = new wxGridCellAttr;
+ attr->SetReadOnly( true );
+ m_viewControlsDataModel->SetColAttr( attr, DISPLAY_NAME_COLUMN );
- // The fact that we're a list should keep the control from reserving space for the
- // expander buttons... but it doesn't. Fix by forcing the indent to 0.
- m_fieldsCtrl->SetIndent( 0 );
+ attr = new wxGridCellAttr;
+ attr->SetRenderer( new wxGridCellBoolRenderer() );
+ attr->SetReadOnly(); // not really; we delegate interactivity to GRID_TRICKS
+ attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
+ m_viewControlsDataModel->SetColAttr( attr, SHOW_FIELD_COLUMN );
+
+ attr = new wxGridCellAttr;
+ attr->SetRenderer( new wxGridCellBoolRenderer() );
+ attr->SetReadOnly(); // not really; we delegate interactivity to GRID_TRICKS
+ attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
+ m_viewControlsDataModel->SetColAttr( attr, GROUP_BY_COLUMN );
+
+ // Compress the view controls grid. (We want it to look different from the fields grid.)
+ m_viewControlsGrid->SetDefaultRowSize( m_viewControlsGrid->GetDefaultRowSize() - FromDIP( 4 ) );
m_filter->SetDescriptiveText( _( "Filter" ) );
- wxGridCellAttr* attr = new wxGridCellAttr;
- attr->SetEditor( new GRID_CELL_URL_EDITOR( this, PROJECT_SCH::SchSearchS( &Prj() ) ) );
- m_dataModel = new LIB_FIELDS_EDITOR_GRID_DATA_MODEL( m_symbolsList );
-
- // Now that the fields are loaded we can set the initial location of the splitter
- // based on the list width. Again, SetWidth( wxCOL_WIDTH_AUTOSIZE ) fails us on GTK.
- m_fieldNameColWidth = 0;
- m_labelColWidth = 0;
-
- int colWidth = 0;
-
- for( int row = 0; row < m_fieldsCtrl->GetItemCount(); ++row )
- {
- const wxString& displayName = m_fieldsCtrl->GetTextValue( row, DISPLAY_NAME_COLUMN );
- colWidth = std::max( colWidth, KIUI::GetTextSize( displayName, m_fieldsCtrl ).x );
-
- const wxString& label = m_fieldsCtrl->GetTextValue( row, LABEL_COLUMN );
- colWidth = std::max( colWidth, KIUI::GetTextSize( label, m_fieldsCtrl ).x );
- }
-
- m_fieldNameColWidth = colWidth + 20;
- m_labelColWidth = colWidth + 20;
-
- int fieldsMinWidth = m_fieldNameColWidth + m_labelColWidth + m_groupByColWidth + m_showColWidth;
-
- m_fieldsCtrl->GetColumn( DISPLAY_NAME_COLUMN )->SetWidth( m_fieldNameColWidth );
- m_fieldsCtrl->GetColumn( LABEL_COLUMN )->SetWidth( m_labelColWidth );
-
- // This is used for data only. Don't show it to the user.
- m_fieldsCtrl->GetColumn( FIELD_NAME_COLUMN )->SetHidden( true );
-
- m_splitterMainWindow->SetMinimumPaneSize( fieldsMinWidth );
- m_splitterMainWindow->SetSashPosition( fieldsMinWidth + 40 );
+ m_dataModel = new LIB_FIELDS_EDITOR_GRID_DATA_MODEL();
m_grid->UseNativeColHeader( true );
m_grid->SetTable( m_dataModel, true );
@@ -322,12 +301,8 @@ DIALOG_LIB_FIELDS::DIALOG_LIB_FIELDS( SYMBOL_EDIT_FRAME* parent, wxString libId,
m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
// add Cut, Copy, and Paste to wxGrid
- m_grid->PushEventHandler( new LIB_FIELDS_EDITOR_GRID_TRICKS( this, m_grid, m_fieldsCtrl,
- m_dataModel ) );
-
- // give a bit more room for comboboxes
- m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
-
+ m_grid->PushEventHandler( new LIB_FIELDS_EDITOR_GRID_TRICKS( this, m_grid, m_viewControlsDataModel,
+ m_dataModel ) );
SetInitialFocus( m_grid );
m_grid->ClearSelection();
@@ -338,75 +313,221 @@ DIALOG_LIB_FIELDS::DIALOG_LIB_FIELDS( SYMBOL_EDIT_FRAME* parent, wxString libId,
SetSize( wxSize( horizPixelsFromDU( 600 ), vertPixelsFromDU( 300 ) ) );
+ SYMBOL_EDITOR_SETTINGS::PANEL_LIB_FIELDS_TABLE& cfg = m_parent->libeditconfig()->m_LibFieldEditor;
+
+ m_viewControlsGrid->ShowHideColumns( cfg.view_controls_visible_columns );
+
+ CallAfter( [this, cfg]()
+ {
+ m_splitterMainWindow->SetSashPosition( cfg.sash_pos );
+ } );
+
Center();
// Connect Events
- m_grid->Bind( wxEVT_GRID_COL_SORT, &DIALOG_LIB_FIELDS::OnColSort, this );
- m_grid->Bind( wxEVT_GRID_COL_MOVE, &DIALOG_LIB_FIELDS::OnColMove, this );
- m_grid->Bind( wxEVT_GRID_CELL_LEFT_CLICK, &DIALOG_LIB_FIELDS::OnTableCellClick, this );
- m_fieldsCtrl->Bind( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &DIALOG_LIB_FIELDS::OnColLabelChange, this );
-
- OnInit();
+ m_grid->Bind( wxEVT_GRID_COL_SORT, &DIALOG_LIB_FIELDS_TABLE::OnColSort, this );
+ m_grid->Bind( wxEVT_GRID_COL_MOVE, &DIALOG_LIB_FIELDS_TABLE::OnColMove, this );
+ m_grid->Bind( wxEVT_GRID_CELL_LEFT_CLICK, &DIALOG_LIB_FIELDS_TABLE::OnTableCellClick, this );
+ m_viewControlsGrid->Bind( wxEVT_GRID_CELL_CHANGED, &DIALOG_LIB_FIELDS_TABLE::OnViewControlsCellChanged, this );
}
-DIALOG_LIB_FIELDS::~DIALOG_LIB_FIELDS()
+DIALOG_LIB_FIELDS_TABLE::~DIALOG_LIB_FIELDS_TABLE()
{
- // Disconnect Events
- m_grid->Unbind( wxEVT_GRID_COL_SORT, &DIALOG_LIB_FIELDS::OnColSort, this );
- m_grid->Unbind( wxEVT_GRID_COL_MOVE, &DIALOG_LIB_FIELDS::OnColMove, this );
- m_grid->Unbind( wxEVT_GRID_CELL_LEFT_CLICK, &DIALOG_LIB_FIELDS::OnTableCellClick, this );
- m_fieldsCtrl->Unbind( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &DIALOG_LIB_FIELDS::OnColLabelChange, this );
+ SYMBOL_EDITOR_SETTINGS::PANEL_LIB_FIELDS_TABLE& cfg = m_parent->libeditconfig()->m_LibFieldEditor;
- // Delete the GRID_TRICKS.
- m_grid->PopEventHandler( true );
-}
+ cfg.view_controls_visible_columns = m_viewControlsGrid->GetShownColumnsAsString();
+ cfg.sash_pos = m_splitterMainWindow->GetSashPosition();
-void DIALOG_LIB_FIELDS::OnInit()
-{
- // Update the field list and refresh the grid
- UpdateFieldList();
-
- int colWidth = 0;
-
- for( int row = 0; row < m_fieldsCtrl->GetItemCount(); ++row )
+ for( int i = 0; i < m_grid->GetNumberCols(); i++ )
{
- const wxString& displayName = m_fieldsCtrl->GetTextValue( row, DISPLAY_NAME_COLUMN );
- colWidth = std::max( colWidth, KIUI::GetTextSize( displayName, m_fieldsCtrl ).x );
-
- const wxString& label = m_fieldsCtrl->GetTextValue( row, LABEL_COLUMN );
- colWidth = std::max( colWidth, KIUI::GetTextSize( label, m_fieldsCtrl ).x );
+ if( m_grid->IsColShown( i ) )
+ {
+ std::string fieldName( m_dataModel->GetColFieldName( i ).ToUTF8() );
+ cfg.field_widths[fieldName] = m_grid->GetColSize( i );
+ }
}
- m_fieldNameColWidth = colWidth + 20;
- m_labelColWidth = colWidth + 20;
+ // Disconnect Events
+ m_grid->Unbind( wxEVT_GRID_COL_SORT, &DIALOG_LIB_FIELDS_TABLE::OnColSort, this );
+ m_grid->Unbind( wxEVT_GRID_COL_MOVE, &DIALOG_LIB_FIELDS_TABLE::OnColMove, this );
+ m_grid->Unbind( wxEVT_GRID_CELL_LEFT_CLICK, &DIALOG_LIB_FIELDS_TABLE::OnTableCellClick, this );
+ m_viewControlsGrid->Unbind( wxEVT_GRID_CELL_CHANGED, &DIALOG_LIB_FIELDS_TABLE::OnViewControlsCellChanged, this );
- int fieldsMinWidth = m_fieldNameColWidth + m_labelColWidth + m_groupByColWidth + m_showColWidth;
+ // Delete the GRID_TRICKS.
+ m_viewControlsGrid->PopEventHandler( true );
+ m_grid->PopEventHandler( true );
- m_fieldsCtrl->GetColumn( DISPLAY_NAME_COLUMN )->SetWidth( m_fieldNameColWidth );
- m_fieldsCtrl->GetColumn( LABEL_COLUMN )->SetWidth( m_labelColWidth );
-
- m_splitterMainWindow->SetMinimumPaneSize( fieldsMinWidth );
- m_splitterMainWindow->SetSashPosition( fieldsMinWidth + 40 );
-
- SetupAllColumnProperties();
- RegroupSymbols();
+ // we gave ownership of m_viewControlsDataModel & m_dataModel to the wxGrids...
}
-void DIALOG_LIB_FIELDS::loadSymbols( const wxArrayString& aSymbolNames )
+void DIALOG_LIB_FIELDS_TABLE::SetupColumnProperties( int aCol )
+{
+ wxGridCellAttr* attr = new wxGridCellAttr;
+ attr->SetReadOnly( false );
+
+ // Set some column types to specific editors
+ if( m_dataModel->GetColFieldName( aCol ) == GetCanonicalFieldName( FIELD_T::FOOTPRINT ) )
+ {
+ // Create symbol netlist for footprint picker
+ wxString symbolNetlist;
+
+ if( !m_symbolsList.empty() )
+ {
+ // Use the first symbol's netlist (all symbols in lib should have similar pin structure)
+ LIB_SYMBOL* symbol = m_symbolsList[0];
+ wxArrayString pins;
+
+ for( SCH_PIN* pin : symbol->GetPins( 0 /* all units */, 1 /* single bodyStyle */ ) )
+ pins.push_back( pin->GetNumber() + ' ' + pin->GetShownName() );
+
+ if( !pins.IsEmpty() )
+ symbolNetlist << EscapeString( wxJoin( pins, '\t' ), CTX_LINE );
+
+ symbolNetlist << wxS( "\r" );
+
+ wxArrayString fpFilters = symbol->GetFPFilters();
+ if( !fpFilters.IsEmpty() )
+ symbolNetlist << EscapeString( wxJoin( fpFilters, ' ' ), CTX_LINE );
+
+ symbolNetlist << wxS( "\r" );
+ }
+
+ attr->SetEditor( new GRID_CELL_FPID_EDITOR( this, symbolNetlist ) );
+ m_dataModel->SetColAttr( attr, aCol );
+ }
+ else if( m_dataModel->GetColFieldName( aCol ) == GetCanonicalFieldName( FIELD_T::DATASHEET ) )
+ {
+ // set datasheet column viewer button
+ attr->SetEditor( new GRID_CELL_URL_EDITOR( this, PROJECT_SCH::SchSearchS( &Prj() ) ) );
+ m_dataModel->SetColAttr( attr, aCol );
+ }
+ else if( m_dataModel->ColIsCheck( aCol ) )
+ {
+ attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
+ attr->SetRenderer( new GRID_CELL_CHECKBOX_RENDERER() );
+ m_dataModel->SetColAttr( attr, aCol );
+ }
+ else if( IsGeneratedField( m_dataModel->GetColFieldName( aCol ) ) )
+ {
+ attr->SetReadOnly();
+ m_dataModel->SetColAttr( attr, aCol );
+ }
+ else
+ {
+ attr->SetEditor( m_grid->GetDefaultEditor() );
+ m_dataModel->SetColAttr( attr, aCol );
+ }
+}
+
+
+void DIALOG_LIB_FIELDS_TABLE::SetupAllColumnProperties()
+{
+ SYMBOL_EDITOR_SETTINGS* cfg = m_parent->GetSettings();
+ wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
+
+ // Restore column sorting order and widths
+ m_grid->AutoSizeColumns( false );
+ int sortCol = 0;
+ bool sortAscending = true;
+
+ // Find the VALUE column for initial sorting
+ int valueCol = m_dataModel->GetFieldNameCol( GetCanonicalFieldName( FIELD_T::VALUE ) );
+
+ // Set initial sort to VALUE field (ascending) if no previous sort preference exists
+ if( m_dataModel->GetSortCol() == 0 && valueCol != -1 )
+ {
+ sortCol = valueCol;
+ sortAscending = true;
+ m_dataModel->SetSorting( sortCol, sortAscending );
+ }
+
+ for( int col = 0; col < m_grid->GetNumberCols(); ++col )
+ {
+ SetupColumnProperties( col );
+
+ if( col == m_dataModel->GetSortCol() )
+ {
+ sortCol = col;
+ sortAscending = m_dataModel->GetSortAsc();
+ }
+ }
+
+ // sync m_grid's column visibilities to Show checkboxes in m_viewControlsGrid
+ for( int i = 0; i < m_viewControlsDataModel->GetNumberRows(); ++i )
+ {
+ int col = m_dataModel->GetFieldNameCol( m_viewControlsDataModel->GetCanonicalFieldName( i ) );
+
+ if( col == -1 )
+ continue;
+
+ bool show = m_viewControlsDataModel->GetValueAsBool( i, SHOW_FIELD_COLUMN );
+ m_dataModel->SetShowColumn( col, show );
+
+ if( show )
+ {
+ m_grid->ShowCol( col );
+
+ std::string key( m_dataModel->GetColFieldName( col ).ToUTF8() );
+
+ if( cfg->m_LibFieldEditor.field_widths.count( key )
+ && ( cfg->m_LibFieldEditor.field_widths.at( key ) > 0 ) )
+ {
+ m_grid->SetColSize( col, cfg->m_LibFieldEditor.field_widths.at( key ) );
+ }
+ else
+ {
+ int textWidth = m_dataModel->GetDataWidth( col ) + COLUMN_MARGIN;
+ int maxWidth = defaultDlgSize.x / 3;
+
+ m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
+ }
+ }
+ else
+ {
+ m_grid->HideCol( col );
+ }
+ }
+
+ m_dataModel->SetSorting( sortCol, sortAscending );
+ m_grid->SetSortingColumn( sortCol, sortAscending );
+}
+
+
+bool DIALOG_LIB_FIELDS_TABLE::TransferDataToWindow()
+{
+ switch( m_scope )
+ {
+ case SCOPE::SCOPE_LIBRARY: m_choiceScope->SetSelection( 0 ); break;
+ case SCOPE::SCOPE_RELATED_SYMBOLS: m_choiceScope->SetSelection( 1 ); break;
+ }
+
+ setScope( m_scope );
+
+ return true;
+}
+
+
+void DIALOG_LIB_FIELDS_TABLE::loadSymbols( const wxArrayString& aSymbolNames )
{
// Clear any existing data
m_symbolsList.clear();
+ wxString libName = m_parent->GetTreeLIBID().GetLibNickname();
+
+ if( aSymbolNames.IsEmpty() )
+ {
+ if( m_scope == SCOPE_RELATED_SYMBOLS )
+ wxMessageBox( wxString::Format( _( "No related symbols found in library '%s'." ), libName ) );
+ else
+ wxMessageBox( wxString::Format( _( "No symbols found in library '%s'." ), libName ) );
+
+ return;
+ }
+
try
{
- if( aSymbolNames.IsEmpty() )
- {
- wxMessageBox( wxString::Format( _( "No symbols found in library %s." ), m_libId ) );
- return;
- }
-
// Load each symbol from the library manager and add it to our list
for( const wxString& symbolName : aSymbolNames )
{
@@ -414,7 +535,7 @@ void DIALOG_LIB_FIELDS::loadSymbols( const wxArrayString& aSymbolNames )
try
{
- symbol = m_parent->GetLibManager().GetSymbol( symbolName, m_libId );
+ symbol = m_parent->GetLibManager().GetSymbol( symbolName, libName );
if( symbol )
m_symbolsList.push_back( symbol );
@@ -422,61 +543,31 @@ void DIALOG_LIB_FIELDS::loadSymbols( const wxArrayString& aSymbolNames )
catch( const IO_ERROR& ioe )
{
// Log the error and continue
- wxLogWarning( wxString::Format( _( "Error loading symbol %s: %s" ), symbolName, ioe.What() ) );
+ wxLogWarning( wxString::Format( _( "Error loading symbol '%s': %s" ), symbolName, ioe.What() ) );
}
}
}
catch( const IO_ERROR& ioe )
{
- wxString msg = wxString::Format( _( "Error accessing library %s.\n\n%s" ), m_libId, ioe.What() );
- DisplayErrorMessage( this, msg );
+ DisplayErrorMessage( this, wxString::Format( _( "Error accessing library '%s'.\n\n%s" ),
+ libName,
+ ioe.What() ) );
return;
}
if( m_symbolsList.empty() )
{
- wxMessageBox( _( "No symbols could be loaded from the library." ) );
- return;
+ if( m_scope == SCOPE_RELATED_SYMBOLS )
+ wxMessageBox( _( "No related symbols could be loaded from the library." ) );
+ else
+ wxMessageBox( _( "No symbols could be loaded from the library." ) );
}
+
+ m_dataModel->SetSymbols( m_symbolsList );
}
-void DIALOG_LIB_FIELDS::OnClose(wxCloseEvent& aEvent)
-{
- // This is a cancel, so commit quietly as we're going to throw the results away anyway.
- m_grid->CommitPendingChanges( true );
- if( m_dataModel->IsEdited() )
- {
- if( !HandleUnsavedChanges( this, _( "Save changes?" ),
- [&]() -> bool
- {
- return TransferDataFromWindow();
- } ) )
- {
- aEvent.Veto();
- return;
- }
- }
-
- // Save all our settings since we're really closing
- SYMBOL_EDITOR_SETTINGS* cfg = m_parent->GetSettings();
-
- cfg->m_LibFieldEditor.width = GetSize().x;
- cfg->m_LibFieldEditor.height = GetSize().y;
-
- for( int i = 0; i < m_grid->GetNumberCols(); i++ )
- {
- if( m_grid->IsColShown( i ) )
- {
- std::string fieldName( m_dataModel->GetColFieldName( i ).ToUTF8() );
- cfg->m_LibFieldEditor.field_widths[fieldName] = m_grid->GetColSize( i );
- }
- }
-
- aEvent.Skip();
-}
-
-bool DIALOG_LIB_FIELDS::TransferDataFromWindow()
+bool DIALOG_LIB_FIELDS_TABLE::TransferDataFromWindow()
{
if( !m_grid->CommitPendingChanges() )
return false;
@@ -554,117 +645,8 @@ bool DIALOG_LIB_FIELDS::TransferDataFromWindow()
return true;
}
-void DIALOG_LIB_FIELDS::OnColumnItemToggled(wxDataViewEvent& event)
-{
- wxDataViewItem item = event.GetItem();
- int row = m_fieldsCtrl->ItemToRow( item );
- int col = event.GetColumn();
- switch ( col )
- {
- case SHOW_FIELD_COLUMN:
- {
- wxString name = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
- bool value = m_fieldsCtrl->GetToggleValue( row, col );
- int dataCol = m_dataModel->GetFieldNameCol( name );
-
- m_dataModel->SetShowColumn( dataCol, value );
-
- if( dataCol != -1 )
- {
- if( value )
- m_grid->ShowCol( dataCol );
- else
- m_grid->HideCol( dataCol );
- }
-
- break;
- }
-
- case GROUP_BY_COLUMN:
- {
- m_dataModel->SetGroupingEnabled( false );
- // Check if any columns are grouped. We don't keep a separate UI state for this
- // so check all rows anytime we change a grouping column.
-
- for( int i = 0; i < m_fieldsCtrl->GetItemCount(); ++i )
- {
- if( m_fieldsCtrl->GetToggleValue( i, GROUP_BY_COLUMN ) )
- {
- m_dataModel->SetGroupingEnabled( true );
- break;
- }
- }
-
- wxString name = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
- bool value = m_fieldsCtrl->GetToggleValue( row, GROUP_BY_COLUMN );
-
- wxString fieldName = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
-
- m_dataModel->SetGroupColumn( m_dataModel->GetFieldNameCol( fieldName ), value );
- RegroupSymbols();
- break;
- }
-
- default:
- break;
- }
-}
-
-void DIALOG_LIB_FIELDS::OnFieldsCtrlSelectionChanged(wxDataViewEvent& event)
-{
- // Enable/disable Rename/Remove buttons based on selection
- int row = m_fieldsCtrl->GetSelectedRow();
- bool enable = ( row != -1 ); // Basic check, could add mandatory field check later
-
- // Check if the selected field is mandatory (cannot be removed/renamed)
- if( enable )
- {
- wxString fieldName = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
- if( fieldName == GetCanonicalFieldName( FIELD_T::REFERENCE ) ||
- fieldName == GetCanonicalFieldName( FIELD_T::VALUE ) ||
- fieldName == GetCanonicalFieldName( FIELD_T::FOOTPRINT ) ||
- fieldName == GetCanonicalFieldName( FIELD_T::DATASHEET ) )
- {
- enable = false;
- }
- }
-
- m_removeFieldButton->Enable( enable );
- m_renameFieldButton->Enable( enable );
-
- event.Skip(); // Allow default processing
-}
-
-void DIALOG_LIB_FIELDS::OnSizeFieldList(wxSizeEvent& event)
-{
- int width = KIPLATFORM::UI::GetUnobscuredSize( m_fieldsCtrl ).x
- - m_showColWidth
- - m_groupByColWidth;
-#ifdef __WXMAC__
- // TODO: something in wxWidgets 3.1.x pads checkbox columns with extra space. (It used to
- // also be that the width of the column would get set too wide (to 30), but that's patched in
- // our local wxWidgets fork.)
- width -= 50;
-#endif
-
- m_fieldNameColWidth = width / 2;
- m_labelColWidth = width = m_fieldNameColWidth;
-
- // GTK loses its head and messes these up when resizing the splitter bar:
- m_fieldsCtrl->GetColumn( SHOW_FIELD_COLUMN )->SetWidth( m_showColWidth );
- m_fieldsCtrl->GetColumn( GROUP_BY_COLUMN )->SetWidth( m_groupByColWidth );
-
- m_fieldsCtrl->GetColumn( FIELD_NAME_COLUMN )->SetHidden( true );
- m_fieldsCtrl->GetColumn( DISPLAY_NAME_COLUMN )->SetWidth( m_fieldNameColWidth );
- m_fieldsCtrl->GetColumn( LABEL_COLUMN )->SetWidth( m_labelColWidth );
-
- m_fieldsCtrl->Refresh(); // To refresh checkboxes on Windows.
-
- event.Skip();
-}
-
-void DIALOG_LIB_FIELDS::OnAddField(wxCommandEvent& event)
+void DIALOG_LIB_FIELDS_TABLE::OnAddField(wxCommandEvent& event)
{
wxTextEntryDialog dlg( this, _( "New field name:" ), _( "Add Field" ) );
@@ -683,8 +665,7 @@ void DIALOG_LIB_FIELDS::OnAddField(wxCommandEvent& event)
{
if( fieldName == m_dataModel->GetColFieldName( i ) )
{
- DisplayError( this, wxString::Format( _( "Field name '%s' already in use." ),
- fieldName ) );
+ DisplayError( this, wxString::Format( _( "Field name '%s' already in use." ), fieldName ) );
return;
}
}
@@ -696,17 +677,40 @@ void DIALOG_LIB_FIELDS::OnAddField(wxCommandEvent& event)
OnModify();
}
-void DIALOG_LIB_FIELDS::OnRenameField(wxCommandEvent& event)
+
+void DIALOG_LIB_FIELDS_TABLE::OnRemoveField(wxCommandEvent& event)
{
- int row = m_fieldsCtrl->GetSelectedRow();
+ m_viewControlsGrid->OnDeleteRows(
+ [&]( int row )
+ {
+ return IsOK( this, wxString::Format( _( "Are you sure you want to remove the field '%s'?" ),
+ m_viewControlsDataModel->GetValue( row, DISPLAY_NAME_COLUMN ) ) );
+ },
+ [&]( int row )
+ {
+ wxString fieldName = m_viewControlsDataModel->GetCanonicalFieldName( row );
- if( row == -1 )
- {
- wxBell();
+ RemoveField( fieldName );
+
+ m_viewControlsDataModel->DeleteRow( row );
+ OnModify();
+ } );
+}
+
+
+void DIALOG_LIB_FIELDS_TABLE::OnRenameField(wxCommandEvent& event)
+{
+ wxArrayInt selectedRows = m_viewControlsGrid->GetSelectedRows();
+
+ if( selectedRows.empty() && m_viewControlsGrid->GetGridCursorRow() >= 0 )
+ selectedRows.push_back( m_viewControlsGrid->GetGridCursorRow() );
+
+ if( selectedRows.empty() )
return;
- }
- wxString fieldName = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
+ int row = selectedRows[0];
+
+ wxString fieldName = m_viewControlsDataModel->GetCanonicalFieldName( row );
int col = m_dataModel->GetFieldNameCol( fieldName );
wxCHECK_RET( col != -1, wxS( "Existing field name missing from data model" ) );
@@ -729,49 +733,23 @@ void DIALOG_LIB_FIELDS::OnRenameField(wxCommandEvent& event)
RenameField( fieldName, newFieldName );
- m_fieldsCtrl->SetTextValue( newFieldName, row, DISPLAY_NAME_COLUMN );
- m_fieldsCtrl->SetTextValue( newFieldName, row, FIELD_NAME_COLUMN );
- m_fieldsCtrl->SetTextValue( newFieldName, row, LABEL_COLUMN );
+ m_viewControlsDataModel->SetCanonicalFieldName( row, newFieldName );
+ m_viewControlsDataModel->SetValue( row, DISPLAY_NAME_COLUMN, newFieldName );
+ m_viewControlsDataModel->SetValue( row, LABEL_COLUMN, GetGeneratedFieldDisplayName( newFieldName ) );
SetupColumnProperties( col );
OnModify();
}
-void DIALOG_LIB_FIELDS::OnRemoveField(wxCommandEvent& event)
+
+void DIALOG_LIB_FIELDS_TABLE::OnFilterText( wxCommandEvent& event )
{
- int row = m_fieldsCtrl->GetSelectedRow();
-
- if( row == -1 )
- {
- wxBell();
- return;
- }
-
- wxString fieldName = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
- wxString displayName = m_fieldsCtrl->GetTextValue( row, DISPLAY_NAME_COLUMN );
-
- wxString confirm_msg = wxString::Format( _( "Are you sure you want to remove the field '%s'?" ),
- displayName );
-
- if( !IsOK( this, confirm_msg ) )
- return;
-
- int col = m_dataModel->GetFieldNameCol( fieldName );
-
- RemoveField( fieldName );
-
- m_fieldsCtrl->DeleteItem( row );
-
- if( row > 0 )
- m_fieldsCtrl->SelectRow( row - 1 );
-
- wxGridTableMessage msg( m_dataModel, wxGRIDTABLE_NOTIFY_COLS_DELETED, col, 1 );
- m_grid->ProcessTableMessage( msg );
-
- OnModify();
+ m_dataModel->SetFilter( m_filter->GetValue() );
+ RegroupSymbols();
}
-void DIALOG_LIB_FIELDS::OnFilterMouseMoved(wxMouseEvent& aEvent)
+
+void DIALOG_LIB_FIELDS_TABLE::OnFilterMouseMoved(wxMouseEvent& aEvent)
{
wxPoint pos = aEvent.GetPosition();
wxRect ctrlRect = m_filter->GetScreenRect();
@@ -786,24 +764,71 @@ void DIALOG_LIB_FIELDS::OnFilterMouseMoved(wxMouseEvent& aEvent)
SetCursor( wxCURSOR_IBEAM );
}
-void DIALOG_LIB_FIELDS::OnFilterText( wxCommandEvent& event )
+
+void DIALOG_LIB_FIELDS_TABLE::setScope( SCOPE aScope )
{
- m_dataModel->SetFilter( m_filter->GetValue() );
+ LIB_SYMBOL_LIBRARY_MANAGER& libMgr = m_parent->GetLibManager();
+ wxString targetLib = m_parent->GetTargetLibId().GetLibNickname();
+ wxString targetSymbol = m_parent->GetTargetLibId().GetLibItemName();
+ wxArrayString symbolNames;
+
+ SetTitle( wxString::Format( _( "Library Fields Table (%s)" ), targetLib ) );
+
+ m_scope = aScope;
+
+ if( m_scope == SCOPE::SCOPE_RELATED_SYMBOLS )
+ {
+ const LIB_SYMBOL* symbol = libMgr.GetBufferedSymbol( targetSymbol, targetLib );
+ LIB_SYMBOL_SPTR root = symbol ? symbol->GetRootSymbol() : nullptr;
+
+ if( root )
+ {
+ symbolNames.Add( root->GetName() );
+
+ // Now we have the root symbol, collect all its derived symbols
+ libMgr.GetDerivedSymbolNames( root->GetName(), targetLib, symbolNames );
+ }
+ }
+ else
+ {
+ // Get all symbol names from the library manager
+ libMgr.GetSymbolNames( targetLib, symbolNames );
+ }
+
+ // Get all symbols from the library
+ loadSymbols( symbolNames );
+
+ // Update the field list and refresh the grid
+ UpdateFieldList();
+ SetupAllColumnProperties();
RegroupSymbols();
}
-void DIALOG_LIB_FIELDS::OnRegroupSymbols( wxCommandEvent& event )
+
+void DIALOG_LIB_FIELDS_TABLE::OnScope( wxCommandEvent& aEvent )
+{
+ switch( aEvent.GetSelection() )
+ {
+ case 0: setScope( SCOPE::SCOPE_LIBRARY ); break;
+ case 1: setScope( SCOPE::SCOPE_RELATED_SYMBOLS ); break;
+ }
+}
+
+
+void DIALOG_LIB_FIELDS_TABLE::OnRegroupSymbols( wxCommandEvent& event )
{
RegroupSymbols();
}
-void DIALOG_LIB_FIELDS::OnTableValueChanged( wxGridEvent& event )
+
+void DIALOG_LIB_FIELDS_TABLE::OnTableValueChanged( wxGridEvent& event )
{
m_grid->ForceRefresh();
OnModify();
}
-void DIALOG_LIB_FIELDS::OnTableCellClick( wxGridEvent& event )
+
+void DIALOG_LIB_FIELDS_TABLE::OnTableCellClick( wxGridEvent& event )
{
wxString cellValue = m_grid->GetCellValue( event.GetRow(), event.GetCol() );
@@ -820,40 +845,70 @@ void DIALOG_LIB_FIELDS::OnTableCellClick( wxGridEvent& event )
}
}
-void DIALOG_LIB_FIELDS::OnTableItemContextMenu( wxGridEvent& event )
-{
- // Try to use the mouse position to determine the actual cell under the cursor.
- // Fall back to the event's row/col if mapping fails.
- int col = event.GetCol();
- int row = event.GetRow();
- if ( m_grid )
+void DIALOG_LIB_FIELDS_TABLE::OnTableItemContextMenu( wxGridEvent& event )
+{
+ if( m_grid )
{
// Get global mouse position and convert to grid client coords
wxPoint mousePos = wxGetMousePosition();
wxPoint gridPt = m_grid->ScreenToClient( mousePos );
- row = m_grid->YToRow( gridPt.y );
- col = m_grid->XToCol( gridPt.x );
- }
+ int row = m_grid->YToRow( gridPt.y );
+ int col = m_grid->XToCol( gridPt.x );
- if ( row != -1 && col != -1 )
- m_grid->SetGridCursor( row, col );
+ if ( row != -1 && col != -1 )
+ m_grid->SetGridCursor( row, col );
+ }
event.Skip();
}
-void DIALOG_LIB_FIELDS::OnTableColSize(wxGridSizeEvent& aEvent)
-{
- int col = aEvent.GetRowOrCol();
- std::string key( m_dataModel->GetColFieldName( col ).ToUTF8() );
+void DIALOG_LIB_FIELDS_TABLE::OnTableColSize(wxGridSizeEvent& aEvent)
+{
aEvent.Skip();
m_grid->ForceRefresh();
}
-void DIALOG_LIB_FIELDS::OnCancel(wxCommandEvent& event)
+
+void DIALOG_LIB_FIELDS_TABLE::OnSizeViewControlsGrid( wxSizeEvent& event )
+{
+ const wxString& showColLabel = m_viewControlsGrid->GetColLabelValue( SHOW_FIELD_COLUMN );
+ const wxString& groupByColLabel = m_viewControlsGrid->GetColLabelValue( GROUP_BY_COLUMN );
+ int showColWidth = KIUI::GetTextSize( showColLabel, m_viewControlsGrid ).x + COLUMN_MARGIN;
+ int groupByColWidth = KIUI::GetTextSize( groupByColLabel, m_viewControlsGrid ).x + COLUMN_MARGIN;
+ int remainingWidth = m_viewControlsGrid->GetSize().GetX() - showColWidth - groupByColWidth;
+
+ m_viewControlsGrid->SetColSize( showColWidth, SHOW_FIELD_COLUMN );
+ m_viewControlsGrid->SetColSize( groupByColWidth, GROUP_BY_COLUMN );
+
+ if( m_viewControlsGrid->IsColShown( DISPLAY_NAME_COLUMN ) && m_viewControlsGrid->IsColShown( LABEL_COLUMN ) )
+ {
+ m_viewControlsGrid->SetColSize( DISPLAY_NAME_COLUMN, std::max( remainingWidth / 2, 60 ) );
+ m_viewControlsGrid->SetColSize( LABEL_COLUMN, std::max( remainingWidth - ( remainingWidth / 2 ), 60 ) );
+ }
+ else if( m_viewControlsGrid->IsColShown( DISPLAY_NAME_COLUMN ) )
+ {
+ m_viewControlsGrid->SetColSize( DISPLAY_NAME_COLUMN, std::max( remainingWidth, 60 ) );
+ }
+ else if( m_viewControlsGrid->IsColShown( LABEL_COLUMN ) )
+ {
+ m_viewControlsGrid->SetColSize( LABEL_COLUMN, std::max( remainingWidth, 60 ) );
+ }
+
+ event.Skip();
+}
+
+
+void DIALOG_LIB_FIELDS_TABLE::OnApply(wxCommandEvent& event)
+{
+ TransferDataFromWindow();
+}
+
+
+void DIALOG_LIB_FIELDS_TABLE::OnCancel(wxCommandEvent& event)
{
m_grid->CommitPendingChanges( true );
@@ -870,27 +925,43 @@ void DIALOG_LIB_FIELDS::OnCancel(wxCommandEvent& event)
EndModal( wxID_CANCEL );
}
-void DIALOG_LIB_FIELDS::OnOk(wxCommandEvent& event)
+
+void DIALOG_LIB_FIELDS_TABLE::OnOk(wxCommandEvent& event)
{
if( TransferDataFromWindow() )
- {
EndModal( wxID_OK );
- }
}
-void DIALOG_LIB_FIELDS::OnApply(wxCommandEvent& event)
+
+void DIALOG_LIB_FIELDS_TABLE::OnClose( wxCloseEvent& aEvent )
{
- TransferDataFromWindow();
+ m_grid->CommitPendingChanges( true );
+
+ if( m_dataModel->IsEdited() )
+ {
+ if( !HandleUnsavedChanges( this, _( "Save changes?" ),
+ [&]() -> bool
+ {
+ return TransferDataFromWindow();
+ } ) )
+ {
+ aEvent.Veto();
+ return;
+ }
+ }
+
+ aEvent.Skip();
}
-void DIALOG_LIB_FIELDS::UpdateFieldList()
+
+void DIALOG_LIB_FIELDS_TABLE::UpdateFieldList()
{
auto addMandatoryField =
- [&]( FIELD_T fieldId, bool show, bool groupBy )
- {
- AddField( GetCanonicalFieldName( fieldId ),
- GetDefaultFieldName( fieldId, DO_TRANSLATE ), show, groupBy );
- };
+ [&]( FIELD_T fieldId, bool show, bool groupBy )
+ {
+ AddField( GetCanonicalFieldName( fieldId ),
+ GetDefaultFieldName( fieldId, DO_TRANSLATE ), show, groupBy );
+ };
// Add mandatory fields first show groupBy
addMandatoryField( FIELD_T::REFERENCE, false, false );
@@ -928,36 +999,34 @@ void DIALOG_LIB_FIELDS::UpdateFieldList()
AddField( fieldName, GetGeneratedFieldDisplayName( fieldName ), true, false );
}
-void DIALOG_LIB_FIELDS::AddField( const wxString& aFieldName, const wxString& aLabelValue,
- bool show, bool groupBy, bool addedByUser, bool aIsCheckbox )
+
+void DIALOG_LIB_FIELDS_TABLE::AddField( const wxString& aFieldName, const wxString& aLabelValue, bool show,
+ bool groupBy, bool addedByUser, bool aIsCheckbox )
{
// Users can add fields with variable names that match the special names in the grid,
// e.g. ${QUANTITY} so make sure we don't add them twice
- for( int i = 0; i < m_fieldsCtrl->GetItemCount(); i++ )
+ for( int row = 0; row < m_viewControlsDataModel->GetNumberRows(); row++ )
{
- if( m_fieldsCtrl->GetTextValue( i, FIELD_NAME_COLUMN ) == aFieldName )
+ if( m_viewControlsDataModel->GetCanonicalFieldName( row ) == aFieldName )
return;
}
m_dataModel->AddColumn( aFieldName, aLabelValue, addedByUser, aIsCheckbox );
- wxVector fieldsCtrlRow;
- std::string key( aFieldName.ToUTF8() );
-
- // Don't change these to emplace_back: some versions of wxWidgets don't support it
- fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
- fieldsCtrlRow.push_back( wxVariant( aLabelValue ) );
- fieldsCtrlRow.push_back( wxVariant( show ) );
- fieldsCtrlRow.push_back( wxVariant( groupBy ) );
- fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
-
- m_fieldsCtrl->AppendItem( fieldsCtrlRow );
-
wxGridTableMessage msg( m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
m_grid->ProcessTableMessage( msg );
+
+ m_viewControlsGrid->OnAddRow(
+ [&]() -> std::pair
+ {
+ m_viewControlsDataModel->AppendRow( aFieldName, aLabelValue, show, groupBy );
+
+ return { m_viewControlsDataModel->GetNumberRows() - 1, -1 };
+ } );
}
-void DIALOG_LIB_FIELDS::RemoveField(const wxString& fieldName)
+
+void DIALOG_LIB_FIELDS_TABLE::RemoveField(const wxString& fieldName)
{
int col = m_dataModel->GetFieldNameCol( fieldName );
wxCHECK_RET( col != -1, wxS( "Field name not found" ) );
@@ -965,7 +1034,8 @@ void DIALOG_LIB_FIELDS::RemoveField(const wxString& fieldName)
m_dataModel->RemoveColumn( col );
}
-void DIALOG_LIB_FIELDS::RenameField(const wxString& oldName, const wxString& newName)
+
+void DIALOG_LIB_FIELDS_TABLE::RenameField(const wxString& oldName, const wxString& newName)
{
int col = m_dataModel->GetFieldNameCol( oldName );
wxCHECK_RET( col != -1, wxS( "Existing field name missing from data model" ) );
@@ -973,13 +1043,15 @@ void DIALOG_LIB_FIELDS::RenameField(const wxString& oldName, const wxString& new
m_dataModel->RenameColumn( col, newName );
}
-void DIALOG_LIB_FIELDS::RegroupSymbols()
+
+void DIALOG_LIB_FIELDS_TABLE::RegroupSymbols()
{
m_dataModel->RebuildRows();
m_grid->ForceRefresh();
}
-void DIALOG_LIB_FIELDS::OnColSort(wxGridEvent& aEvent)
+
+void DIALOG_LIB_FIELDS_TABLE::OnColSort(wxGridEvent& aEvent)
{
int sortCol = aEvent.GetCol();
std::string key( m_dataModel->GetColFieldName( sortCol ).ToUTF8() );
@@ -1002,7 +1074,8 @@ void DIALOG_LIB_FIELDS::OnColSort(wxGridEvent& aEvent)
RegroupSymbols();
}
-void DIALOG_LIB_FIELDS::OnColMove(wxGridEvent& aEvent)
+
+void DIALOG_LIB_FIELDS_TABLE::OnColMove(wxGridEvent& aEvent)
{
int origPos = aEvent.GetCol();
@@ -1040,151 +1113,76 @@ void DIALOG_LIB_FIELDS::OnColMove(wxGridEvent& aEvent)
} );
}
-void DIALOG_LIB_FIELDS::OnColLabelChange(wxDataViewEvent& aEvent)
+
+void DIALOG_LIB_FIELDS_TABLE::ShowHideColumn( int aCol, bool aShow )
{
- wxDataViewItem item = aEvent.GetItem();
- int row = m_fieldsCtrl->ItemToRow( item );
- wxString label = m_fieldsCtrl->GetTextValue( row, LABEL_COLUMN );
- wxString fieldName = m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN );
- int col = m_dataModel->GetFieldNameCol( fieldName );
+ if( aShow )
+ m_grid->ShowCol( aCol );
+ else
+ m_grid->HideCol( aCol );
- if( col != -1 )
- m_dataModel->SetColLabelValue( col, label );
-
- aEvent.Skip();
+ m_dataModel->SetShowColumn( aCol, aShow );
m_grid->ForceRefresh();
+ OnModify();
}
-void DIALOG_LIB_FIELDS::SetupColumnProperties( int aCol )
+void DIALOG_LIB_FIELDS_TABLE::OnViewControlsCellChanged( wxGridEvent& aEvent )
{
- wxGridCellAttr* attr = new wxGridCellAttr;
- attr->SetReadOnly( false );
+ int row = aEvent.GetRow();
- // Set some column types to specific editors
- if( m_dataModel->GetColFieldName( aCol ) == GetCanonicalFieldName( FIELD_T::FOOTPRINT ) )
+ wxCHECK( row < m_viewControlsGrid->GetNumberRows(), /* void */ );
+
+ switch( aEvent.GetCol() )
{
- // Create symbol netlist for footprint picker
- wxString symbolNetlist;
- if( !m_symbolsList.empty() )
+ case DISPLAY_NAME_COLUMN:
+ {
+ wxString label = m_viewControlsDataModel->GetValue( row, DISPLAY_NAME_COLUMN );
+ wxString fieldName = m_viewControlsDataModel->GetCanonicalFieldName( row );
+ int dataCol = m_dataModel->GetFieldNameCol( fieldName );
+
+ if( dataCol != -1 )
{
- // Use the first symbol's netlist (all symbols in lib should have similar pin structure)
- LIB_SYMBOL* symbol = m_symbolsList[0];
- wxArrayString pins;
+ m_dataModel->SetColLabelValue( dataCol, label );
+ m_grid->SetColLabelValue( dataCol, label );
- for( SCH_PIN* pin : symbol->GetPins( 0 /* all units */, 1 /* single bodyStyle */ ) )
- pins.push_back( pin->GetNumber() + ' ' + pin->GetShownName() );
-
- if( !pins.IsEmpty() )
- symbolNetlist << EscapeString( wxJoin( pins, '\t' ), CTX_LINE );
-
- symbolNetlist << wxS( "\r" );
-
- wxArrayString fpFilters = symbol->GetFPFilters();
- if( !fpFilters.IsEmpty() )
- symbolNetlist << EscapeString( wxJoin( fpFilters, ' ' ), CTX_LINE );
-
- symbolNetlist << wxS( "\r" );
+ m_grid->ForceRefresh();
+ OnModify();
}
- attr->SetEditor( new GRID_CELL_FPID_EDITOR( this, symbolNetlist ) );
- m_dataModel->SetColAttr( attr, aCol );
+ break;
}
- else if( m_dataModel->GetColFieldName( aCol ) == GetCanonicalFieldName( FIELD_T::DATASHEET ) )
+
+ case SHOW_FIELD_COLUMN:
{
- // set datasheet column viewer button
- attr->SetEditor( new GRID_CELL_URL_EDITOR( this, PROJECT_SCH::SchSearchS( &Prj() ) ) );
- m_dataModel->SetColAttr( attr, aCol );
+ wxString fieldName = m_viewControlsDataModel->GetCanonicalFieldName( row );
+ bool value = m_viewControlsDataModel->GetValueAsBool( row, SHOW_FIELD_COLUMN );
+ int dataCol = m_dataModel->GetFieldNameCol( fieldName );
+
+ if( dataCol != -1 )
+ ShowHideColumn( dataCol, value );
+
+ break;
}
- else if( m_dataModel->ColIsCheck( aCol ) )
+
+ case GROUP_BY_COLUMN:
{
- attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
- attr->SetRenderer( new GRID_CELL_CHECKBOX_RENDERER() );
- m_dataModel->SetColAttr( attr, aCol );
+ wxString fieldName = m_viewControlsDataModel->GetCanonicalFieldName( row );
+ bool value = m_viewControlsDataModel->GetValueAsBool( row, GROUP_BY_COLUMN );
+ int dataCol = m_dataModel->GetFieldNameCol( fieldName );
+
+ m_dataModel->SetGroupColumn( dataCol, value );
+ m_dataModel->RebuildRows();
+
+ m_grid->ForceRefresh();
+ OnModify();
+ break;
}
- else if( IsGeneratedField( m_dataModel->GetColFieldName( aCol ) ) )
- {
- attr->SetReadOnly();
- m_dataModel->SetColAttr( attr, aCol );
- }
- else
- {
- attr->SetEditor( m_grid->GetDefaultEditor() );
- m_dataModel->SetColAttr( attr, aCol );
+
+ default:
+ break;
}
}
-void DIALOG_LIB_FIELDS::SetupAllColumnProperties()
-{
- SYMBOL_EDITOR_SETTINGS* cfg = m_parent->GetSettings();
- wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
-
- // Restore column sorting order and widths
- m_grid->AutoSizeColumns( false );
- int sortCol = 0;
- bool sortAscending = true;
-
- // Find the VALUE column for initial sorting
- int valueCol = m_dataModel->GetFieldNameCol( GetCanonicalFieldName( FIELD_T::VALUE ) );
-
- // Set initial sort to VALUE field (ascending) if no previous sort preference exists
- if( m_dataModel->GetSortCol() == 0 && valueCol != -1 )
- {
- sortCol = valueCol;
- sortAscending = true;
- m_dataModel->SetSorting( sortCol, sortAscending );
- }
-
- for( int col = 0; col < m_grid->GetNumberCols(); ++col )
- {
- SetupColumnProperties( col );
-
- if( col == m_dataModel->GetSortCol() )
- {
- sortCol = col;
- sortAscending = m_dataModel->GetSortAsc();
- }
- }
-
- // sync m_grid's column visibilities to Show checkboxes in m_fieldsCtrl
- for( int i = 0; i < m_fieldsCtrl->GetItemCount(); ++i )
- {
- int col = m_dataModel->GetFieldNameCol( m_fieldsCtrl->GetTextValue( i, FIELD_NAME_COLUMN ) );
-
- if( col == -1 )
- continue;
-
- bool show = m_fieldsCtrl->GetToggleValue( i, SHOW_FIELD_COLUMN );
- m_dataModel->SetShowColumn( col, show );
-
- if( show )
- {
- m_grid->ShowCol( col );
-
- std::string key( m_dataModel->GetColFieldName( col ).ToUTF8() );
-
- if( cfg->m_LibFieldEditor.field_widths.count( key )
- && ( cfg->m_LibFieldEditor.field_widths.at( key ) > 0 ) )
- {
- m_grid->SetColSize( col, cfg->m_LibFieldEditor.field_widths.at( key ) );
- }
- else
- {
- int textWidth = m_dataModel->GetDataWidth( col ) + COLUMN_MARGIN;
- int maxWidth = defaultDlgSize.x / 3;
-
- m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
- }
- }
- else
- {
- m_grid->HideCol( col );
- }
- }
-
- m_dataModel->SetSorting( sortCol, sortAscending );
- m_grid->SetSortingColumn( sortCol, sortAscending );
-}
-
diff --git a/eeschema/dialogs/dialog_lib_fields.h b/eeschema/dialogs/dialog_lib_fields_table.h
similarity index 69%
rename from eeschema/dialogs/dialog_lib_fields.h
rename to eeschema/dialogs/dialog_lib_fields_table.h
index 128e89fb2a..3d00f2abe9 100644
--- a/eeschema/dialogs/dialog_lib_fields.h
+++ b/eeschema/dialogs/dialog_lib_fields_table.h
@@ -17,71 +17,76 @@
* with this program. If not, see .
*/
-#ifndef DIALOG_LIB_FIELDS_H
-#define DIALOG_LIB_FIELDS_H
+#pragma once
-#include
+#include
#include
-#include
+#include
class SYMBOL_EDIT_FRAME;
-class LIB_FIELDS_EDITOR_GRID_DATA_MODEL;
class LIB_SYMBOL;
-class DIALOG_LIB_FIELDS : public DIALOG_LIB_FIELDS_BASE
+
+class DIALOG_LIB_FIELDS_TABLE : public DIALOG_LIB_FIELDS_TABLE_BASE
{
public:
- DIALOG_LIB_FIELDS( SYMBOL_EDIT_FRAME* parent, wxString libId, const wxArrayString& aSymbolNames );
- ~DIALOG_LIB_FIELDS() override;
+ enum SCOPE : int
+ {
+ SCOPE_LIBRARY = 0,
+ SCOPE_RELATED_SYMBOLS
+ };
- void OnInit();
+ DIALOG_LIB_FIELDS_TABLE( SYMBOL_EDIT_FRAME* parent, DIALOG_LIB_FIELDS_TABLE::SCOPE aScope );
+ ~DIALOG_LIB_FIELDS_TABLE() override;
-protected:
- void OnClose( wxCloseEvent& event ) override;
- void OnColumnItemToggled( wxDataViewEvent& event ) override;
- void OnFieldsCtrlSelectionChanged( wxDataViewEvent& event ) override;
- void OnSizeFieldList( wxSizeEvent& event ) override;
- void OnAddField( wxCommandEvent& event ) override;
- void OnRenameField( wxCommandEvent& event ) override;
- void OnRemoveField( wxCommandEvent& event ) override;
- void OnFilterMouseMoved( wxMouseEvent& event ) override;
- void OnFilterText( wxCommandEvent& event ) override;
- void OnRegroupSymbols( wxCommandEvent& event ) override;
- void OnTableValueChanged( wxGridEvent& event ) override;
- void OnTableCellClick( wxGridEvent& event ) override;
- void OnTableItemContextMenu( wxGridEvent& event ) override;
- void OnTableColSize( wxGridSizeEvent& event ) override;
- void OnCancel( wxCommandEvent& event ) override;
- void OnOk( wxCommandEvent& event ) override;
- void OnApply( wxCommandEvent& event ) override;
+ bool TransferDataToWindow() override;
bool TransferDataFromWindow() override;
+ void ShowHideColumn( int aCol, bool aShow );
+
private:
void UpdateFieldList();
- void AddField( const wxString& aFieldName, const wxString& aLabelValue, bool show, bool groupBy, bool addedByUser = false, bool aIsCheckbox = false );
+ void AddField( const wxString& aFieldName, const wxString& aLabelValue, bool show, bool groupBy,
+ bool addedByUser = false, bool aIsCheckbox = false );
void RemoveField( const wxString& fieldName );
void RenameField( const wxString& oldName, const wxString& newName );
void RegroupSymbols();
void OnColSort( wxGridEvent& aEvent );
void OnColMove( wxGridEvent& aEvent );
- void OnColLabelChange( wxDataViewEvent& aEvent );
void SetupColumnProperties( int aCol );
void SetupAllColumnProperties();
+ void setScope( SCOPE aScope );
void loadSymbols( const wxArrayString& aSymbolNames );
- wxString m_libId;
- SYMBOL_EDIT_FRAME* m_parent;
+ void OnViewControlsCellChanged( wxGridEvent& aEvent ) override;
+ void OnSizeViewControlsGrid( wxSizeEvent& event ) override;
+ void OnAddField( wxCommandEvent& event ) override;
+ void OnRenameField( wxCommandEvent& event ) override;
+ void OnRemoveField( wxCommandEvent& event ) override;
- int m_fieldNameColWidth;
- int m_labelColWidth;
- int m_showColWidth;
- int m_groupByColWidth;
+ void OnFilterMouseMoved( wxMouseEvent& event ) override;
+ void OnFilterText( wxCommandEvent& event ) override;
+ void OnScope( wxCommandEvent& event ) override;
+ void OnRegroupSymbols( wxCommandEvent& event ) override;
+
+ void OnTableValueChanged( wxGridEvent& event ) override;
+ void OnTableCellClick( wxGridEvent& event ) override;
+ void OnTableItemContextMenu( wxGridEvent& event ) override;
+ void OnTableColSize( wxGridSizeEvent& event ) override;
+
+ void OnCancel( wxCommandEvent& event ) override;
+ void OnOk( wxCommandEvent& event ) override;
+ void OnApply( wxCommandEvent& event ) override;
+ void OnClose( wxCloseEvent& event ) override;
+
+private:
+ SYMBOL_EDIT_FRAME* m_parent;
+ SCOPE m_scope;
+
+ VIEW_CONTROLS_GRID_DATA_MODEL* m_viewControlsDataModel;
LIB_FIELDS_EDITOR_GRID_DATA_MODEL* m_dataModel;
std::vector m_symbolsList;
};
-
-
-#endif // DIALOG_LIB_FIELDS_H
diff --git a/eeschema/dialogs/dialog_lib_fields_base.cpp b/eeschema/dialogs/dialog_lib_fields_table_base.cpp
similarity index 56%
rename from eeschema/dialogs/dialog_lib_fields_base.cpp
rename to eeschema/dialogs/dialog_lib_fields_table_base.cpp
index 6ce7a19fc4..e3308473cd 100644
--- a/eeschema/dialogs/dialog_lib_fields_base.cpp
+++ b/eeschema/dialogs/dialog_lib_fields_table_base.cpp
@@ -1,5 +1,5 @@
///////////////////////////////////////////////////////////////////////////
-// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6a-dirty)
+// C++ code generated with wxFormBuilder (version 4.2.1-0-g80c4cb6)
// http://www.wxformbuilder.org/
//
// PLEASE DO *NOT* EDIT THIS FILE!
@@ -8,11 +8,11 @@
#include "widgets/std_bitmap_button.h"
#include "widgets/wx_grid.h"
-#include "dialog_lib_fields_base.h"
+#include "dialog_lib_fields_table_base.h"
///////////////////////////////////////////////////////////////////////////
-DIALOG_LIB_FIELDS_BASE::DIALOG_LIB_FIELDS_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
+DIALOG_LIB_FIELDS_TABLE_BASE::DIALOG_LIB_FIELDS_TABLE_BASE( wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style ) : DIALOG_SHIM( parent, id, title, pos, size, style )
{
this->SetSizeHints( wxSize( -1,-1 ), wxDefaultSize );
@@ -29,10 +29,41 @@ DIALOG_LIB_FIELDS_BASE::DIALOG_LIB_FIELDS_BASE( wxWindow* parent, wxWindowID id,
wxBoxSizer* bLeftSizer;
bLeftSizer = new wxBoxSizer( wxVERTICAL );
- m_fieldsCtrl = new wxDataViewListCtrl( m_leftPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- m_fieldsCtrl->SetMinSize( wxSize( -1,250 ) );
+ m_viewControlsGrid = new WX_GRID( m_leftPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
- bLeftSizer->Add( m_fieldsCtrl, 1, wxBOTTOM|wxEXPAND|wxLEFT|wxRIGHT|wxTOP, 5 );
+ // Grid
+ m_viewControlsGrid->CreateGrid( 1, 4 );
+ m_viewControlsGrid->EnableEditing( true );
+ m_viewControlsGrid->EnableGridLines( false );
+ m_viewControlsGrid->EnableDragGridSize( false );
+ m_viewControlsGrid->SetMargins( 0, 0 );
+
+ // Columns
+ m_viewControlsGrid->SetColSize( 0, 60 );
+ m_viewControlsGrid->SetColSize( 1, 60 );
+ m_viewControlsGrid->SetColSize( 2, 46 );
+ m_viewControlsGrid->SetColSize( 3, 56 );
+ m_viewControlsGrid->EnableDragColMove( false );
+ m_viewControlsGrid->EnableDragColSize( false );
+ m_viewControlsGrid->SetColLabelValue( 0, _("Field") );
+ m_viewControlsGrid->SetColLabelValue( 1, _("BOM Name") );
+ m_viewControlsGrid->SetColLabelValue( 2, _("Include") );
+ m_viewControlsGrid->SetColLabelValue( 3, _("Group By") );
+ m_viewControlsGrid->SetColLabelSize( 24 );
+ m_viewControlsGrid->SetColLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
+
+ // Rows
+ m_viewControlsGrid->EnableDragRowSize( false );
+ m_viewControlsGrid->SetRowLabelSize( 0 );
+ m_viewControlsGrid->SetRowLabelAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
+
+ // Label Appearance
+
+ // Cell Defaults
+ m_viewControlsGrid->SetDefaultCellAlignment( wxALIGN_LEFT, wxALIGN_TOP );
+ m_viewControlsGrid->SetMinSize( wxSize( -1,250 ) );
+
+ bLeftSizer->Add( m_viewControlsGrid, 1, wxALL|wxEXPAND, 5 );
wxBoxSizer* bFieldsButtons;
bFieldsButtons = new wxBoxSizer( wxHORIZONTAL );
@@ -76,6 +107,15 @@ DIALOG_LIB_FIELDS_BASE::DIALOG_LIB_FIELDS_BASE( wxWindow* parent, wxWindowID id,
m_staticline31 = new wxStaticLine( m_rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
bControls->Add( m_staticline31, 0, wxEXPAND | wxALL, 3 );
+ wxString m_choiceScopeChoices[] = { _("Whole Library"), _("Related Symbols Only") };
+ int m_choiceScopeNChoices = sizeof( m_choiceScopeChoices ) / sizeof( wxString );
+ m_choiceScope = new wxChoice( m_rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_choiceScopeNChoices, m_choiceScopeChoices, 0 );
+ m_choiceScope->SetSelection( 0 );
+ bControls->Add( m_choiceScope, 0, wxALL, 5 );
+
+ m_staticline311 = new wxStaticLine( m_rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
+ bControls->Add( m_staticline311, 0, wxEXPAND | wxALL, 5 );
+
m_bRefresh = new STD_BITMAP_BUTTON( m_rightPanel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
m_bRefresh->SetMinSize( wxSize( 30,30 ) );
@@ -117,7 +157,7 @@ DIALOG_LIB_FIELDS_BASE::DIALOG_LIB_FIELDS_BASE( wxWindow* parent, wxWindowID id,
m_rightPanel->Layout();
bRightSizer->Fit( m_rightPanel );
m_splitterMainWindow->SplitVertically( m_leftPanel, m_rightPanel, -1 );
- bEditSizer->Add( m_splitterMainWindow, 1, wxEXPAND|wxTOP|wxBOTTOM, 5 );
+ bEditSizer->Add( m_splitterMainWindow, 1, wxEXPAND|wxALL, 5 );
bMainSizer->Add( bEditSizer, 1, wxEXPAND, 5 );
@@ -150,54 +190,54 @@ DIALOG_LIB_FIELDS_BASE::DIALOG_LIB_FIELDS_BASE( wxWindow* parent, wxWindowID id,
this->Centre( wxBOTH );
// Connect Events
- this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_LIB_FIELDS_BASE::OnClose ) );
- m_fieldsCtrl->Connect( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEventHandler( DIALOG_LIB_FIELDS_BASE::OnColumnItemToggled ), NULL, this );
- m_fieldsCtrl->Connect( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler( DIALOG_LIB_FIELDS_BASE::OnFieldsCtrlSelectionChanged ), NULL, this );
- m_fieldsCtrl->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_LIB_FIELDS_BASE::OnSizeFieldList ), NULL, this );
- m_addFieldButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnAddField ), NULL, this );
- m_renameFieldButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnRenameField ), NULL, this );
- m_removeFieldButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnRemoveField ), NULL, this );
- m_filter->Connect( wxEVT_MOTION, wxMouseEventHandler( DIALOG_LIB_FIELDS_BASE::OnFilterMouseMoved ), NULL, this );
- m_filter->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnFilterText ), NULL, this );
- m_bRefresh->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnRegroupSymbols ), NULL, this );
- m_grid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableValueChanged ), NULL, this );
- m_grid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCellClick ), NULL, this );
- m_grid->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCellClick ), NULL, this );
- m_grid->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableItemContextMenu ), NULL, this );
- m_grid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCmdCellClick ), NULL, this );
- m_grid->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCmdCellClick ), NULL, this );
- m_grid->Connect( wxEVT_GRID_COL_SIZE, wxGridSizeEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableColSize ), NULL, this );
- m_grid->Connect( wxEVT_GRID_EDITOR_SHOWN, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnEditorShown ), NULL, this );
- m_grid->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableSelectCell ), NULL, this );
- m_sdbSizerApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnApply ), NULL, this );
- m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnCancel ), NULL, this );
- m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnOk ), NULL, this );
+ this->Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnClose ) );
+ m_viewControlsGrid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnViewControlsCellChanged ), NULL, this );
+ m_viewControlsGrid->Connect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnSizeViewControlsGrid ), NULL, this );
+ m_addFieldButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnAddField ), NULL, this );
+ m_renameFieldButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnRenameField ), NULL, this );
+ m_removeFieldButton->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnRemoveField ), NULL, this );
+ m_filter->Connect( wxEVT_MOTION, wxMouseEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnFilterMouseMoved ), NULL, this );
+ m_filter->Connect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnFilterText ), NULL, this );
+ m_choiceScope->Connect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnScope ), NULL, this );
+ m_bRefresh->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnRegroupSymbols ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableValueChanged ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCellClick ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCellClick ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableItemContextMenu ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCmdCellClick ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCmdCellClick ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_COL_SIZE, wxGridSizeEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableColSize ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_EDITOR_SHOWN, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnEditorShown ), NULL, this );
+ m_grid->Connect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableSelectCell ), NULL, this );
+ m_sdbSizerApply->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnApply ), NULL, this );
+ m_sdbSizerCancel->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnCancel ), NULL, this );
+ m_sdbSizerOK->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnOk ), NULL, this );
}
-DIALOG_LIB_FIELDS_BASE::~DIALOG_LIB_FIELDS_BASE()
+DIALOG_LIB_FIELDS_TABLE_BASE::~DIALOG_LIB_FIELDS_TABLE_BASE()
{
// Disconnect Events
- this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_LIB_FIELDS_BASE::OnClose ) );
- m_fieldsCtrl->Disconnect( wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED, wxDataViewEventHandler( DIALOG_LIB_FIELDS_BASE::OnColumnItemToggled ), NULL, this );
- m_fieldsCtrl->Disconnect( wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED, wxDataViewEventHandler( DIALOG_LIB_FIELDS_BASE::OnFieldsCtrlSelectionChanged ), NULL, this );
- m_fieldsCtrl->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_LIB_FIELDS_BASE::OnSizeFieldList ), NULL, this );
- m_addFieldButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnAddField ), NULL, this );
- m_renameFieldButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnRenameField ), NULL, this );
- m_removeFieldButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnRemoveField ), NULL, this );
- m_filter->Disconnect( wxEVT_MOTION, wxMouseEventHandler( DIALOG_LIB_FIELDS_BASE::OnFilterMouseMoved ), NULL, this );
- m_filter->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnFilterText ), NULL, this );
- m_bRefresh->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnRegroupSymbols ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableValueChanged ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCellClick ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCellClick ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableItemContextMenu ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCmdCellClick ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableCmdCellClick ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_COL_SIZE, wxGridSizeEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableColSize ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_EDITOR_SHOWN, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnEditorShown ), NULL, this );
- m_grid->Disconnect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_LIB_FIELDS_BASE::OnTableSelectCell ), NULL, this );
- m_sdbSizerApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnApply ), NULL, this );
- m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnCancel ), NULL, this );
- m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_BASE::OnOk ), NULL, this );
+ this->Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnClose ) );
+ m_viewControlsGrid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnViewControlsCellChanged ), NULL, this );
+ m_viewControlsGrid->Disconnect( wxEVT_SIZE, wxSizeEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnSizeViewControlsGrid ), NULL, this );
+ m_addFieldButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnAddField ), NULL, this );
+ m_renameFieldButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnRenameField ), NULL, this );
+ m_removeFieldButton->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnRemoveField ), NULL, this );
+ m_filter->Disconnect( wxEVT_MOTION, wxMouseEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnFilterMouseMoved ), NULL, this );
+ m_filter->Disconnect( wxEVT_COMMAND_TEXT_UPDATED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnFilterText ), NULL, this );
+ m_choiceScope->Disconnect( wxEVT_COMMAND_CHOICE_SELECTED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnScope ), NULL, this );
+ m_bRefresh->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnRegroupSymbols ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_CELL_CHANGED, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableValueChanged ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCellClick ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCellClick ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_CELL_RIGHT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableItemContextMenu ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_CLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCmdCellClick ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_CELL_LEFT_DCLICK, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableCmdCellClick ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_COL_SIZE, wxGridSizeEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableColSize ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_EDITOR_SHOWN, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnEditorShown ), NULL, this );
+ m_grid->Disconnect( wxEVT_GRID_SELECT_CELL, wxGridEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnTableSelectCell ), NULL, this );
+ m_sdbSizerApply->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnApply ), NULL, this );
+ m_sdbSizerCancel->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnCancel ), NULL, this );
+ m_sdbSizerOK->Disconnect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnOk ), NULL, this );
}
diff --git a/eeschema/dialogs/dialog_lib_fields_base.fbp b/eeschema/dialogs/dialog_lib_fields_table_base.fbp
similarity index 80%
rename from eeschema/dialogs/dialog_lib_fields_base.fbp
rename to eeschema/dialogs/dialog_lib_fields_table_base.fbp
index 91427a49ab..5635ae0c51 100644
--- a/eeschema/dialogs/dialog_lib_fields_base.fbp
+++ b/eeschema/dialogs/dialog_lib_fields_table_base.fbp
@@ -13,12 +13,12 @@
0
res
UTF-8
- dialog_lib_fields_base
+ dialog_lib_fields_table_base
1000
1
1
UI
- dialog_lib_fields_base
+ dialog_lib_fields_table_base
.
0
source_name
@@ -48,12 +48,12 @@
wxID_ANY
-1,-1
- DIALOG_LIB_FIELDS_BASE
+ DIALOG_LIB_FIELDS_TABLE_BASE
-1,-1
wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER
DIALOG_SHIM; dialog_shim.h
- Library Fields Editor
+ Library Fields Table (%s)
0
@@ -76,7 +76,7 @@
none