Browse Source

Enable grouping in library symbol fields table.

This also necessitates showing the Symbol Name in
a column, as the Value will show "<-- mixed -->"
when multiple values are selected.  (And, in some
cases the symbol name and the value are not the
same.)
master
Jeff Young 3 days ago
parent
commit
60aad25def
  1. 20
      eeschema/dialogs/dialog_lib_fields_table.cpp
  2. 1
      eeschema/dialogs/dialog_lib_fields_table.h
  3. 8
      eeschema/dialogs/dialog_lib_fields_table_base.cpp
  4. 66
      eeschema/dialogs/dialog_lib_fields_table_base.fbp
  5. 3
      eeschema/dialogs/dialog_lib_fields_table_base.h
  6. 4
      eeschema/fields_data_model.cpp
  7. 89
      eeschema/lib_fields_data_model.cpp
  8. 9
      eeschema/lib_fields_data_model.h

20
eeschema/dialogs/dialog_lib_fields_table.cpp

@ -469,13 +469,13 @@ void DIALOG_LIB_FIELDS_TABLE::SetupAllColumnProperties()
int sortCol = 0;
bool sortAscending = true;
// Find the VALUE column for initial sorting
int valueCol = m_dataModel->GetFieldNameCol( GetCanonicalFieldName( FIELD_T::VALUE ) );
// Find the symbol name column for initial sorting
int nameCol = m_dataModel->GetFieldNameCol( LIB_FIELDS_EDITOR_GRID_DATA_MODEL::SYMBOL_NAME );
// Set initial sort to VALUE field (ascending) if no previous sort preference exists
if( m_dataModel->GetSortCol() == 0 && valueCol != -1 )
if( m_dataModel->GetSortCol() == 0 && nameCol != -1 )
{
sortCol = valueCol;
sortCol = nameCol;
sortAscending = true;
m_dataModel->SetSorting( sortCol, sortAscending );
}
@ -534,6 +534,8 @@ void DIALOG_LIB_FIELDS_TABLE::SetupAllColumnProperties()
bool DIALOG_LIB_FIELDS_TABLE::TransferDataToWindow()
{
m_dataModel->SetGroupingEnabled( m_groupSymbolsBox->GetValue() );
switch( m_scope )
{
case SCOPE::SCOPE_LIBRARY: m_choiceScope->SetSelection( 0 ); break;
@ -909,6 +911,14 @@ void DIALOG_LIB_FIELDS_TABLE::OnTableItemContextMenu( wxGridEvent& event )
}
void DIALOG_LIB_FIELDS_TABLE::OnGroupSymbolsToggled( wxCommandEvent& event )
{
m_dataModel->SetGroupingEnabled( m_groupSymbolsBox->GetValue() );
m_dataModel->RebuildRows();
m_grid->ForceRefresh();
}
void DIALOG_LIB_FIELDS_TABLE::OnTableColSize(wxGridSizeEvent& aEvent)
{
aEvent.Skip();
@ -1027,6 +1037,8 @@ void DIALOG_LIB_FIELDS_TABLE::UpdateFieldList()
GetDefaultFieldName( fieldId, DO_TRANSLATE ), show, groupBy );
};
AddField( LIB_FIELDS_EDITOR_GRID_DATA_MODEL::SYMBOL_NAME, _( "Symbol Name" ), true, false );
// Add mandatory fields first show groupBy
addMandatoryField( FIELD_T::REFERENCE, false, false );
addMandatoryField( FIELD_T::VALUE, true, false );

1
eeschema/dialogs/dialog_lib_fields_table.h

@ -71,6 +71,7 @@ private:
void OnFilterMouseMoved( wxMouseEvent& event ) override;
void OnFilterText( wxCommandEvent& event ) override;
void OnScope( wxCommandEvent& event ) override;
void OnGroupSymbolsToggled( wxCommandEvent& event ) override;
void OnRegroupSymbols( wxCommandEvent& event ) override;
void OnTableValueChanged( wxGridEvent& event ) override;

8
eeschema/dialogs/dialog_lib_fields_table_base.cpp

@ -116,6 +116,12 @@ DIALOG_LIB_FIELDS_TABLE_BASE::DIALOG_LIB_FIELDS_TABLE_BASE( wxWindow* parent, wx
m_staticline311 = new wxStaticLine( m_rightPanel, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_VERTICAL );
bControls->Add( m_staticline311, 0, wxEXPAND | wxALL, 5 );
m_groupSymbolsBox = new wxCheckBox( m_rightPanel, wxID_ANY, _("Group symbols"), wxDefaultPosition, wxDefaultSize, 0 );
m_groupSymbolsBox->SetValue(true);
m_groupSymbolsBox->SetToolTip( _("Group symbols together based on common properties") );
bControls->Add( m_groupSymbolsBox, 0, wxALL|wxALIGN_CENTER_VERTICAL, 5 );
m_bRefresh = new STD_BITMAP_BUTTON( m_rightPanel, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxDefaultSize, wxBU_AUTODRAW|0 );
m_bRefresh->SetMinSize( wxSize( 30,30 ) );
@ -202,6 +208,7 @@ DIALOG_LIB_FIELDS_TABLE_BASE::DIALOG_LIB_FIELDS_TABLE_BASE( wxWindow* parent, wx
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_groupSymbolsBox->Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnGroupSymbolsToggled ), 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 );
@ -230,6 +237,7 @@ DIALOG_LIB_FIELDS_TABLE_BASE::~DIALOG_LIB_FIELDS_TABLE_BASE()
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_groupSymbolsBox->Disconnect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( DIALOG_LIB_FIELDS_TABLE_BASE::OnGroupSymbolsToggled ), 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 );

66
eeschema/dialogs/dialog_lib_fields_table_base.fbp

@ -853,6 +853,72 @@
<property name="window_style"></property>
</object>
</object>
<object class="sizeritem" expanded="true">
<property name="border">5</property>
<property name="flag">wxALL|wxALIGN_CENTER_VERTICAL</property>
<property name="proportion">0</property>
<object class="wxCheckBox" expanded="true">
<property name="BottomDockable">1</property>
<property name="LeftDockable">1</property>
<property name="RightDockable">1</property>
<property name="TopDockable">1</property>
<property name="aui_layer">0</property>
<property name="aui_name"></property>
<property name="aui_position">0</property>
<property name="aui_row">0</property>
<property name="best_size"></property>
<property name="bg"></property>
<property name="caption"></property>
<property name="caption_visible">1</property>
<property name="center_pane">0</property>
<property name="checked">1</property>
<property name="close_button">1</property>
<property name="context_help"></property>
<property name="context_menu">1</property>
<property name="default_pane">0</property>
<property name="dock">Dock</property>
<property name="dock_fixed">0</property>
<property name="docking">Left</property>
<property name="drag_accept_files">0</property>
<property name="enabled">1</property>
<property name="fg"></property>
<property name="floatable">1</property>
<property name="font"></property>
<property name="gripper">0</property>
<property name="hidden">0</property>
<property name="id">wxID_ANY</property>
<property name="label">Group symbols</property>
<property name="max_size"></property>
<property name="maximize_button">0</property>
<property name="maximum_size"></property>
<property name="min_size"></property>
<property name="minimize_button">0</property>
<property name="minimum_size"></property>
<property name="moveable">1</property>
<property name="name">m_groupSymbolsBox</property>
<property name="pane_border">1</property>
<property name="pane_position"></property>
<property name="pane_size"></property>
<property name="permission">protected</property>
<property name="pin_button">1</property>
<property name="pos"></property>
<property name="resize">Resizable</property>
<property name="show">1</property>
<property name="size"></property>
<property name="style"></property>
<property name="subclass"></property>
<property name="toolbar_pane">0</property>
<property name="tooltip">Group symbols together based on common properties</property>
<property name="validator_data_type"></property>
<property name="validator_style">wxFILTER_NONE</property>
<property name="validator_type">wxDefaultValidator</property>
<property name="validator_variable"></property>
<property name="window_extra_style"></property>
<property name="window_name"></property>
<property name="window_style"></property>
<event name="OnCheckBox">OnGroupSymbolsToggled</event>
</object>
</object>
<object class="sizeritem" expanded="false">
<property name="border">5</property>
<property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</property>

3
eeschema/dialogs/dialog_lib_fields_table_base.h

@ -30,6 +30,7 @@ class WX_GRID;
#include <wx/srchctrl.h>
#include <wx/statline.h>
#include <wx/choice.h>
#include <wx/checkbox.h>
#include <wx/splitter.h>
#include <wx/dialog.h>
@ -54,6 +55,7 @@ class DIALOG_LIB_FIELDS_TABLE_BASE : public DIALOG_SHIM
wxStaticLine* m_staticline31;
wxChoice* m_choiceScope;
wxStaticLine* m_staticline311;
wxCheckBox* m_groupSymbolsBox;
STD_BITMAP_BUTTON* m_bRefresh;
WX_GRID* m_grid;
STD_BITMAP_BUTTON* m_sidebarButton;
@ -72,6 +74,7 @@ class DIALOG_LIB_FIELDS_TABLE_BASE : public DIALOG_SHIM
virtual void OnFilterMouseMoved( wxMouseEvent& event ) { event.Skip(); }
virtual void OnFilterText( wxCommandEvent& event ) { event.Skip(); }
virtual void OnScope( wxCommandEvent& event ) { event.Skip(); }
virtual void OnGroupSymbolsToggled( wxCommandEvent& event ) { event.Skip(); }
virtual void OnRegroupSymbols( wxCommandEvent& event ) { event.Skip(); }
virtual void OnTableValueChanged( wxGridEvent& event ) { event.Skip(); }
virtual void OnTableCellClick( wxGridEvent& event ) { event.Skip(); }

4
eeschema/fields_data_model.cpp

@ -365,7 +365,11 @@ wxString FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( int aRow, int aCol )
}
else
{
#ifdef __WXMAC__
return wxT( "" ) + GetValue( m_rows[aRow], aCol );
#else
return wxT( " " ) + GetValue( m_rows[aRow], aCol );
#endif
}
}
else

89
eeschema/lib_fields_data_model.cpp

@ -33,6 +33,7 @@
const wxString LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ITEM_NUMBER_VARIABLE = wxS( "${ITEM_NUMBER}" );
const wxString LIB_FIELDS_EDITOR_GRID_DATA_MODEL::SYMBOL_NAME = wxS( "Symbol Name" );
void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::AddColumn( const wxString& aFieldName, const wxString& aLabel,
@ -79,6 +80,14 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::updateDataStoreSymbolField( const LIB_SY
dataElement.m_currentlyEmpty = false;
dataElement.m_isModified = false;
}
else if( ColIsSymbolName( col ) )
{
dataElement.m_originalData = aSymbol->GetName();
dataElement.m_currentData = aSymbol->GetName();
dataElement.m_originallyEmpty = false;
dataElement.m_currentlyEmpty = false;
dataElement.m_isModified = false;
}
else
{
m_dataStore[aSymbol->m_Uuid][aFieldName].m_originalData = wxEmptyString;
@ -98,6 +107,7 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::RemoveColumn( int aCol )
{
std::map<wxString, LIB_DATA_ELEMENT>& fieldStore = m_dataStore[symbol->m_Uuid];
auto it = fieldStore.find( fieldName );
if( it != fieldStore.end() )
{
it->second.m_currentData = wxEmptyString;
@ -194,6 +204,7 @@ wxString LIB_FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( int aRow, int aCol )
if( IsExpanderColumn( aCol ) )
{
// Poor-man's tree controls
if( m_rows[aRow].m_Flag == GROUP_COLLAPSED )
{
GetView()->SetReadOnly( aRow, aCol, true );
@ -210,17 +221,23 @@ wxString LIB_FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( int aRow, int aCol )
}
else
{
#ifdef __WXMAC__
return wxT( "" ) + GetValue( m_rows[aRow], aCol );
#else
return wxT( " " ) + GetValue( m_rows[aRow], aCol );
#endif
}
}
return GetValue(m_rows[aRow], aCol);
return GetValue( m_rows[aRow], aCol );
}
wxString LIB_FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( const LIB_DATA_MODEL_ROW& group, int aCol )
{
wxString fieldValue = INDETERMINATE_STATE;
std::set<wxString> mixedValues;
bool listMixedValues = ColIsSymbolName( aCol );
wxString fieldValue = INDETERMINATE_STATE;
wxCHECK( aCol >= 0 && aCol < (int) m_cols.size(), fieldValue );
LIB_DATA_MODEL_COL& col = m_cols[aCol];
@ -229,20 +246,34 @@ wxString LIB_FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( const LIB_DATA_MODEL_ROW&
{
const KIID& symbolID = ref->m_Uuid;
if( !m_dataStore.contains( symbolID )
|| !m_dataStore[symbolID].contains( col.m_fieldName ) )
{
if( !m_dataStore.contains( symbolID ) || !m_dataStore[symbolID].contains( col.m_fieldName ) )
return INDETERMINATE_STATE;
}
wxString refFieldValue = m_dataStore[symbolID][col.m_fieldName].m_currentData;
if( ref == group.m_Refs.front() )
if( listMixedValues )
mixedValues.insert( refFieldValue );
else if( ref == group.m_Refs.front() )
fieldValue = refFieldValue;
else if( fieldValue != refFieldValue )
return INDETERMINATE_STATE;
}
if( listMixedValues )
{
fieldValue = wxEmptyString;
for( const wxString& value : mixedValues )
{
if( value.IsEmpty() )
continue;
else if( fieldValue.IsEmpty() )
fieldValue = value;
else
fieldValue += "," + value;
}
}
return fieldValue;
}
@ -251,6 +282,9 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::SetValue( int aRow, int aCol, const wxSt
{
wxCHECK_RET( aCol >= 0 && aCol < (int) m_cols.size(), wxS( "Invalid column number" ) );
if( ColIsSymbolName( aCol ) )
return;
LIB_DATA_MODEL_ROW& rowGroup = m_rows[aRow];
for( const LIB_SYMBOL* ref : rowGroup.m_Refs )
@ -264,6 +298,21 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::SetValue( int aRow, int aCol, const wxSt
m_edited = true;
}
bool LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ColIsSymbolName( int aCol )
{
wxCHECK( aCol >= 0 && aCol < static_cast<int>( m_cols.size() ), false );
return m_cols[aCol].m_fieldName == LIB_FIELDS_EDITOR_GRID_DATA_MODEL::SYMBOL_NAME;
}
bool LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ColIsCheck( int aCol )
{
wxCHECK( aCol >= 0 && aCol < static_cast<int>( m_cols.size() ), false );
return m_cols[aCol].m_isCheckbox;
}
wxGridCellAttr* LIB_FIELDS_EDITOR_GRID_DATA_MODEL::GetAttr( int aRow, int aCol, wxGridCellAttr::wxAttrKind aKind )
{
wxGridCellAttr* attr = wxGridTableBase::GetAttr( aRow, aCol, aKind );
@ -408,17 +457,11 @@ wxGridCellAttr* LIB_FIELDS_EDITOR_GRID_DATA_MODEL::GetAttr( int aRow, int aCol,
wxFont font;
if( attr->HasFont() )
{
font = attr->GetFont();
}
else if( GetView() )
{
font = GetView()->GetDefaultCellFont();
}
else
{
font = wxFont();
}
if( font.IsOk() )
{
@ -591,20 +634,6 @@ void LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ClearCell( int aRow, int aCol )
}
bool LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ColIsValue( int aCol )
{
wxCHECK( aCol >= 0 && aCol < static_cast<int>( m_cols.size() ), false );
return m_cols[aCol].m_fieldName == GetCanonicalFieldName( FIELD_T::VALUE );
}
bool LIB_FIELDS_EDITOR_GRID_DATA_MODEL::ColIsCheck( int aCol )
{
wxCHECK( aCol >= 0 && aCol < static_cast<int>( m_cols.size() ), false );
return m_cols[aCol].m_isCheckbox;
}
bool LIB_FIELDS_EDITOR_GRID_DATA_MODEL::cmp( const LIB_DATA_MODEL_ROW& lhGroup,
const LIB_DATA_MODEL_ROW& rhGroup,
LIB_FIELDS_EDITOR_GRID_DATA_MODEL* dataModel, int sortCol,
@ -627,14 +656,14 @@ bool LIB_FIELDS_EDITOR_GRID_DATA_MODEL::cmp( const LIB_DATA_MODEL_ROW&
return a > b;
};
// Primary sort key is sortCol; secondary is always VALUE (column 1)
// Primary sort key is sortCol; secondary is always the symbol name (column 0)
wxString lhs = dataModel->GetValue( lhGroup, sortCol ).Trim( true ).Trim( false );
wxString rhs = dataModel->GetValue( rhGroup, sortCol ).Trim( true ).Trim( false );
if( lhs == rhs && lhGroup.m_Refs.size() > 1 && rhGroup.m_Refs.size() > 1 )
{
wxString lhRef = lhGroup.m_Refs[1]->GetRef( nullptr );
wxString rhRef = rhGroup.m_Refs[1]->GetRef( nullptr );
wxString lhRef = lhGroup.m_Refs[1]->GetName();
wxString rhRef = rhGroup.m_Refs[1]->GetName();
return local_cmp( lhRef, rhRef );
}
else

9
eeschema/lib_fields_data_model.h

@ -98,8 +98,8 @@ public:
m_stripedRenderers.clear();
}
static const wxString QUANTITY_VARIABLE;
static const wxString ITEM_NUMBER_VARIABLE;
static const wxString SYMBOL_NAME;
void CreateDerivedSymbol( int aRow, int aCol, wxString& aNewSymbolName );
void CreateDerivedSymbolImmediate( int aRow, int aCol, wxString& aNewSymbolName );
@ -158,8 +158,6 @@ public:
return false; // don't allow adjacent cell overflow, even if we are actually empty
}
bool IsExpanderColumn( int aCol ) const;
wxString GetValue( int aRow, int aCol ) override;
wxString GetTypeName( int row, int col ) override;
wxString GetValue( const LIB_DATA_MODEL_ROW& group, int aCol );
@ -169,9 +167,11 @@ public:
void RevertRow( int aRow );
void ClearCell( int aRow, int aCol );
bool ColIsValue( int aCol );
bool ColIsSymbolName( int aCol );
bool ColIsCheck( int aCol );
bool IsExpanderColumn( int aCol ) const;
void SetSorting( int aCol, bool ascending )
{
wxCHECK_RET( aCol >= 0 && aCol < (int) m_cols.size(), "Invalid Column Number" );
@ -181,6 +181,7 @@ public:
int GetSortCol() { return m_sortColumn; }
bool GetSortAsc() { return m_sortAscending; }
const LIB_SYMBOL* GetSymbolForRow( int aRow )
{
wxCHECK( aRow >= 0 && aRow < (int) m_rows.size(), nullptr );

Loading…
Cancel
Save