Dialog Symbol Fields Table: allow re-labeling columns
This commit is contained in:
parent
d117d4e8f5
commit
a39ce5bf9e
|
@ -51,10 +51,14 @@
|
||||||
#include "dialog_symbol_fields_table.h"
|
#include "dialog_symbol_fields_table.h"
|
||||||
#include "eda_list_dialog.h"
|
#include "eda_list_dialog.h"
|
||||||
|
|
||||||
|
// The field name in the data model (translated)
|
||||||
#define DISPLAY_NAME_COLUMN 0
|
#define DISPLAY_NAME_COLUMN 0
|
||||||
#define SHOW_FIELD_COLUMN 1
|
// The field name's label for exporting (CSV, etc.)
|
||||||
#define GROUP_BY_COLUMN 2
|
#define LABEL_COLUMN 1
|
||||||
#define FIELD_NAME_COLUMN 3
|
#define SHOW_FIELD_COLUMN 2
|
||||||
|
#define GROUP_BY_COLUMN 3
|
||||||
|
// The internal field name (untranslated)
|
||||||
|
#define FIELD_NAME_COLUMN 4
|
||||||
|
|
||||||
#ifdef __WXMAC__
|
#ifdef __WXMAC__
|
||||||
#define COLUMN_MARGIN 5
|
#define COLUMN_MARGIN 5
|
||||||
|
@ -207,6 +211,14 @@ struct DATA_MODEL_ROW
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct DATA_MODEL_COL
|
||||||
|
{
|
||||||
|
wxString m_fieldName;
|
||||||
|
wxString m_label;
|
||||||
|
bool m_userAdded;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class FIELDS_EDITOR_GRID_DATA_MODEL : public wxGridTableBase
|
class FIELDS_EDITOR_GRID_DATA_MODEL : public wxGridTableBase
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
|
@ -215,10 +227,9 @@ protected:
|
||||||
SCH_EDIT_FRAME* m_frame;
|
SCH_EDIT_FRAME* m_frame;
|
||||||
SCH_REFERENCE_LIST m_symbolsList;
|
SCH_REFERENCE_LIST m_symbolsList;
|
||||||
bool m_edited;
|
bool m_edited;
|
||||||
std::vector<wxString> m_fieldNames;
|
|
||||||
int m_sortColumn;
|
int m_sortColumn;
|
||||||
bool m_sortAscending;
|
bool m_sortAscending;
|
||||||
std::vector<wxString> m_userAddedFields;
|
std::vector<DATA_MODEL_COL> m_cols;
|
||||||
|
|
||||||
// However, the grid view can vary in two ways:
|
// However, the grid view can vary in two ways:
|
||||||
// 1) the componentRefs can be grouped into fewer rows
|
// 1) the componentRefs can be grouped into fewer rows
|
||||||
|
@ -245,12 +256,12 @@ public:
|
||||||
m_symbolsList.SplitReferences();
|
m_symbolsList.SplitReferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddColumn( const wxString& aFieldName, bool aAddedByUser )
|
void AddColumn( const wxString& aFieldName, const wxString& aLabel, bool aAddedByUser )
|
||||||
{
|
{
|
||||||
m_fieldNames.push_back( aFieldName );
|
m_cols.push_back((struct DATA_MODEL_COL) {
|
||||||
|
.m_fieldName = aFieldName,
|
||||||
if( aAddedByUser )
|
.m_label = aLabel,
|
||||||
m_userAddedFields.push_back( aFieldName );
|
.m_userAdded = aAddedByUser });
|
||||||
|
|
||||||
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
||||||
{
|
{
|
||||||
|
@ -271,58 +282,66 @@ public:
|
||||||
|
|
||||||
void RemoveColumn( int aCol )
|
void RemoveColumn( int aCol )
|
||||||
{
|
{
|
||||||
wxString fieldName = m_fieldNames[ aCol ];
|
|
||||||
|
|
||||||
m_fieldNames.erase( m_fieldNames.begin() + aCol );
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
||||||
{
|
{
|
||||||
SCH_SYMBOL* symbol = m_symbolsList[ i ].GetSymbol();
|
SCH_SYMBOL* symbol = m_symbolsList[ i ].GetSymbol();
|
||||||
m_dataStore[ symbol->m_Uuid ].erase( fieldName );
|
m_dataStore[symbol->m_Uuid].erase( m_cols[aCol].m_fieldName );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_cols.erase( m_cols.begin() + aCol );
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenameColumn( int aCol, const wxString& newName )
|
void RenameColumn( int aCol, const wxString& newName )
|
||||||
{
|
{
|
||||||
wxString fieldName = m_fieldNames[aCol];
|
|
||||||
|
|
||||||
m_fieldNames[aCol] = newName;
|
|
||||||
|
|
||||||
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
||||||
{
|
{
|
||||||
SCH_SYMBOL* symbol = m_symbolsList[i].GetSymbol();
|
SCH_SYMBOL* symbol = m_symbolsList[i].GetSymbol();
|
||||||
|
|
||||||
auto node = m_dataStore[symbol->m_Uuid].extract( fieldName );
|
auto node = m_dataStore[symbol->m_Uuid].extract( m_cols[aCol].m_fieldName );
|
||||||
node.key() = newName;
|
node.key() = newName;
|
||||||
m_dataStore[symbol->m_Uuid].insert( std::move( node ) );
|
m_dataStore[symbol->m_Uuid].insert( std::move( node ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_cols[aCol].m_fieldName = newName;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MoveColumn( int aCol, int aNewPos )
|
void MoveColumn( int aCol, int aNewPos ) { std::swap( m_cols[aCol], m_cols[aNewPos] ); }
|
||||||
{
|
|
||||||
std::swap( m_fieldNames[aCol], m_fieldNames[aNewPos] );
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetNumberRows() override { return (int) m_rows.size(); }
|
int GetNumberRows() override { return (int) m_rows.size(); }
|
||||||
|
|
||||||
int GetNumberCols() override { return (int) m_fieldNames.size(); }
|
int GetNumberCols() override { return (int) m_cols.size(); }
|
||||||
|
|
||||||
wxString GetColLabelValue( int aCol ) override { return m_fieldNames[aCol]; }
|
void SetColLabelValue( int aCol, const wxString& aLabel ) override
|
||||||
|
{
|
||||||
|
m_cols[aCol].m_label = aLabel;
|
||||||
|
}
|
||||||
|
|
||||||
wxString GetColFieldName( int aCol ) { return m_fieldNames[aCol]; }
|
wxString GetColLabelValue( int aCol ) override { return m_cols[aCol].m_label; }
|
||||||
|
|
||||||
|
wxString GetColFieldName( int aCol ) { return m_cols[aCol].m_fieldName; }
|
||||||
|
|
||||||
int GetFieldNameCol( wxString aFieldName )
|
int GetFieldNameCol( wxString aFieldName )
|
||||||
{
|
{
|
||||||
for( size_t i = 0; i < m_fieldNames.size(); i++ )
|
for( size_t i = 0; i < m_cols.size(); i++ )
|
||||||
{
|
{
|
||||||
if( m_fieldNames[i] == aFieldName )
|
if( m_cols[i].m_fieldName == aFieldName )
|
||||||
return (int) i;
|
return (int) i;
|
||||||
}
|
}
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
const std::vector<wxString>& GetFieldsOrder() { return m_fieldNames; }
|
const std::vector<wxString> GetFieldsOrder()
|
||||||
|
{
|
||||||
|
std::vector<wxString> fields;
|
||||||
|
|
||||||
|
for( auto col : m_cols )
|
||||||
|
{
|
||||||
|
fields.emplace_back( col.m_fieldName );
|
||||||
|
}
|
||||||
|
|
||||||
|
return fields;
|
||||||
|
}
|
||||||
|
|
||||||
void SetFieldsOrder( const std::vector<wxString>& aNewOrder )
|
void SetFieldsOrder( const std::vector<wxString>& aNewOrder )
|
||||||
{
|
{
|
||||||
|
@ -330,11 +349,11 @@ public:
|
||||||
|
|
||||||
for( const wxString& newField : aNewOrder )
|
for( const wxString& newField : aNewOrder )
|
||||||
{
|
{
|
||||||
for( wxString& currentField : m_fieldNames )
|
for( size_t i = 0; i < m_cols.size(); i++ )
|
||||||
{
|
{
|
||||||
if( currentField == newField )
|
if( m_cols[i].m_fieldName == newField )
|
||||||
{
|
{
|
||||||
std::swap( m_fieldNames[foundCount], currentField );
|
std::swap( m_cols[foundCount], m_cols[i] );
|
||||||
foundCount++;
|
foundCount++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -384,12 +403,12 @@ public:
|
||||||
|
|
||||||
bool ColIsReference( int aCol )
|
bool ColIsReference( int aCol )
|
||||||
{
|
{
|
||||||
return ( aCol < (int) m_fieldNames.size() ) && m_fieldNames[aCol] == _( "Reference" );
|
return ( aCol < (int) m_cols.size() ) && m_cols[aCol].m_fieldName == _( "Reference" );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ColIsQuantity( int aCol )
|
bool ColIsQuantity( int aCol )
|
||||||
{
|
{
|
||||||
return ( aCol < (int) m_fieldNames.size() ) && m_fieldNames[aCol] == _( "Qty" );
|
return ( aCol < (int) m_cols.size() ) && m_cols[aCol].m_fieldName == _( "Qty" );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxString GetValue( const DATA_MODEL_ROW& group, int aCol )
|
wxString GetValue( const DATA_MODEL_ROW& group, int aCol )
|
||||||
|
@ -408,14 +427,14 @@ public:
|
||||||
const KIID& symbolID = ref.GetSymbol()->m_Uuid;
|
const KIID& symbolID = ref.GetSymbol()->m_Uuid;
|
||||||
|
|
||||||
if( !m_dataStore.count( symbolID )
|
if( !m_dataStore.count( symbolID )
|
||||||
|| !m_dataStore[ symbolID ].count( m_fieldNames[ aCol ] ) )
|
|| !m_dataStore[symbolID].count( m_cols[aCol].m_fieldName ) )
|
||||||
{
|
{
|
||||||
return INDETERMINATE_STATE;
|
return INDETERMINATE_STATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( &ref == &group.m_Refs.front() )
|
if( &ref == &group.m_Refs.front() )
|
||||||
fieldValue = m_dataStore[ symbolID ][ m_fieldNames[ aCol ] ];
|
fieldValue = m_dataStore[symbolID][m_cols[aCol].m_fieldName];
|
||||||
else if ( fieldValue != m_dataStore[ symbolID ][ m_fieldNames[ aCol ] ] )
|
else if( fieldValue != m_dataStore[symbolID][m_cols[aCol].m_fieldName] )
|
||||||
return INDETERMINATE_STATE;
|
return INDETERMINATE_STATE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -460,11 +479,10 @@ public:
|
||||||
if( ColIsReference( aCol ) || ColIsQuantity( aCol ) )
|
if( ColIsReference( aCol ) || ColIsQuantity( aCol ) )
|
||||||
return; // Can't modify references or quantity
|
return; // Can't modify references or quantity
|
||||||
|
|
||||||
DATA_MODEL_ROW& rowGroup = m_rows[ aRow ];
|
DATA_MODEL_ROW& rowGroup = m_rows[aRow];
|
||||||
wxString fieldName = m_fieldNames[ aCol ];
|
|
||||||
|
|
||||||
for( const SCH_REFERENCE& ref : rowGroup.m_Refs )
|
for( const SCH_REFERENCE& ref : rowGroup.m_Refs )
|
||||||
m_dataStore[ ref.GetSymbol()->m_Uuid ][ fieldName ] = aValue;
|
m_dataStore[ref.GetSymbol()->m_Uuid][m_cols[aCol].m_fieldName] = aValue;
|
||||||
|
|
||||||
m_edited = true;
|
m_edited = true;
|
||||||
}
|
}
|
||||||
|
@ -753,11 +771,11 @@ public:
|
||||||
const wxString& srcName = srcData.first;
|
const wxString& srcName = srcData.first;
|
||||||
const wxString& srcValue = srcData.second;
|
const wxString& srcValue = srcData.second;
|
||||||
SCH_FIELD* destField = symbol.FindField( srcName );
|
SCH_FIELD* destField = symbol.FindField( srcName );
|
||||||
|
int col = GetFieldNameCol( srcName );
|
||||||
|
bool userAdded = ( col != -1 && m_cols[col].m_userAdded );
|
||||||
|
|
||||||
// Add a not existing field if it has a value for this symbol
|
// Add a not existing field if it has a value for this symbol
|
||||||
bool createField =
|
bool createField = !destField && ( !srcValue.IsEmpty() || userAdded );
|
||||||
!destField
|
|
||||||
&& ( !srcValue.IsEmpty() || alg::contains( m_userAddedFields, srcName ) );
|
|
||||||
|
|
||||||
if( createField )
|
if( createField )
|
||||||
{
|
{
|
||||||
|
@ -847,6 +865,7 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
|
||||||
m_bRefresh->SetBitmap( KiBitmap( BITMAPS::small_refresh ) );
|
m_bRefresh->SetBitmap( KiBitmap( BITMAPS::small_refresh ) );
|
||||||
|
|
||||||
m_fieldsCtrl->AppendTextColumn( _( "Field" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
|
m_fieldsCtrl->AppendTextColumn( _( "Field" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
|
||||||
|
m_fieldsCtrl->AppendTextColumn( _( "Label" ), wxDATAVIEW_CELL_EDITABLE, 0, wxALIGN_LEFT, 0 );
|
||||||
m_fieldsCtrl->AppendToggleColumn( _( "Show" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
|
m_fieldsCtrl->AppendToggleColumn( _( "Show" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
|
||||||
wxALIGN_CENTER, 0 );
|
wxALIGN_CENTER, 0 );
|
||||||
m_fieldsCtrl->AppendToggleColumn( _( "Group By" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
|
m_fieldsCtrl->AppendToggleColumn( _( "Group By" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
|
||||||
|
@ -877,19 +896,26 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
|
||||||
|
|
||||||
// Now that the fields are loaded we can set the initial location of the splitter
|
// 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.
|
// based on the list width. Again, SetWidth( wxCOL_WIDTH_AUTOSIZE ) fails us on GTK.
|
||||||
int nameColWidth = 0;
|
m_fieldNameColWidth = 0;
|
||||||
|
m_labelColWidth = 0;
|
||||||
|
|
||||||
for( int row = 0; row < m_fieldsCtrl->GetItemCount(); ++row )
|
for( int row = 0; row < m_fieldsCtrl->GetItemCount(); ++row )
|
||||||
{
|
{
|
||||||
const wxString& displayName = m_fieldsCtrl->GetTextValue( row, DISPLAY_NAME_COLUMN );
|
const wxString& displayName = m_fieldsCtrl->GetTextValue( row, DISPLAY_NAME_COLUMN );
|
||||||
nameColWidth = std::max( nameColWidth, KIUI::GetTextSize( displayName, m_fieldsCtrl ).x );
|
m_fieldNameColWidth =
|
||||||
|
std::max( m_fieldNameColWidth, KIUI::GetTextSize( displayName, m_fieldsCtrl ).x );
|
||||||
|
|
||||||
|
const wxString& label = m_fieldsCtrl->GetTextValue( row, LABEL_COLUMN );
|
||||||
|
m_labelColWidth = std::max( m_labelColWidth, KIUI::GetTextSize( label, m_fieldsCtrl ).x );
|
||||||
}
|
}
|
||||||
|
|
||||||
nameColWidth += nameColWidthMargin;
|
m_fieldNameColWidth += nameColWidthMargin;
|
||||||
|
m_labelColWidth += nameColWidthMargin;
|
||||||
|
|
||||||
int fieldsMinWidth = nameColWidth + m_groupByColWidth + m_showColWidth;
|
int fieldsMinWidth = m_fieldNameColWidth + m_labelColWidth + m_groupByColWidth + m_showColWidth;
|
||||||
|
|
||||||
m_fieldsCtrl->GetColumn( DISPLAY_NAME_COLUMN )->SetWidth( nameColWidth );
|
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.
|
// This is used for data only. Don't show it to the user.
|
||||||
m_fieldsCtrl->GetColumn( FIELD_NAME_COLUMN )->SetHidden( true );
|
m_fieldsCtrl->GetColumn( FIELD_NAME_COLUMN )->SetHidden( true );
|
||||||
|
@ -897,11 +923,6 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
|
||||||
m_splitterMainWindow->SetMinimumPaneSize( fieldsMinWidth );
|
m_splitterMainWindow->SetMinimumPaneSize( fieldsMinWidth );
|
||||||
m_splitterMainWindow->SetSashPosition( fieldsMinWidth + 40 );
|
m_splitterMainWindow->SetSashPosition( fieldsMinWidth + 40 );
|
||||||
|
|
||||||
// Load our BOM view presets
|
|
||||||
SetUserBomPresets( m_schSettings.m_BomPresets );
|
|
||||||
ApplyBomPreset( m_schSettings.m_BomSettings );
|
|
||||||
syncBomPresetSelection();
|
|
||||||
|
|
||||||
m_cbBomPresets->SetToolTip( wxString::Format(
|
m_cbBomPresets->SetToolTip( wxString::Format(
|
||||||
_( "Save and restore layer visibility combinations.\n"
|
_( "Save and restore layer visibility combinations.\n"
|
||||||
"Use %s+Tab to activate selector.\n"
|
"Use %s+Tab to activate selector.\n"
|
||||||
|
@ -918,12 +939,16 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
|
||||||
m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
|
m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
|
||||||
|
|
||||||
// add Cut, Copy, and Paste to wxGrid
|
// add Cut, Copy, and Paste to wxGrid
|
||||||
m_grid->PushEventHandler(
|
m_grid->PushEventHandler( new FIELDS_EDITOR_GRID_TRICKS( this, m_grid, m_fieldsCtrl ) );
|
||||||
new FIELDS_EDITOR_GRID_TRICKS( this, m_grid, m_fieldsCtrl, m_dataModel ) );
|
|
||||||
|
|
||||||
// give a bit more room for comboboxes
|
// give a bit more room for comboboxes
|
||||||
m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
|
m_grid->SetDefaultRowSize( m_grid->GetDefaultRowSize() + 4 );
|
||||||
|
|
||||||
|
// Load our BOM view presets
|
||||||
|
SetUserBomPresets( m_schSettings.m_BomPresets );
|
||||||
|
ApplyBomPreset( m_schSettings.m_BomSettings );
|
||||||
|
syncBomPresetSelection();
|
||||||
|
|
||||||
SetupColumnProperties();
|
SetupColumnProperties();
|
||||||
|
|
||||||
m_grid->SelectRow( 0 );
|
m_grid->SelectRow( 0 );
|
||||||
|
@ -942,6 +967,8 @@ DIALOG_SYMBOL_FIELDS_TABLE::DIALOG_SYMBOL_FIELDS_TABLE( SCH_EDIT_FRAME* parent )
|
||||||
m_grid->Connect( wxEVT_GRID_COL_MOVE,
|
m_grid->Connect( wxEVT_GRID_COL_MOVE,
|
||||||
wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColMove ), nullptr, this );
|
wxGridEventHandler( DIALOG_SYMBOL_FIELDS_TABLE::OnColMove ), nullptr, this );
|
||||||
m_cbBomPresets->Bind( wxEVT_CHOICE, &DIALOG_SYMBOL_FIELDS_TABLE::onBomPresetChanged, this );
|
m_cbBomPresets->Bind( wxEVT_CHOICE, &DIALOG_SYMBOL_FIELDS_TABLE::onBomPresetChanged, this );
|
||||||
|
m_fieldsCtrl->Bind( wxEVT_DATAVIEW_ITEM_VALUE_CHANGED,
|
||||||
|
&DIALOG_SYMBOL_FIELDS_TABLE::OnColLabelChange, this );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1023,12 +1050,15 @@ void DIALOG_SYMBOL_FIELDS_TABLE::SetupColumnProperties()
|
||||||
// sync m_grid's column visibilities to Show checkboxes in m_fieldsCtrl
|
// sync m_grid's column visibilities to Show checkboxes in m_fieldsCtrl
|
||||||
for( int i = 0; i < m_fieldsCtrl->GetItemCount(); ++i )
|
for( int i = 0; i < m_fieldsCtrl->GetItemCount(); ++i )
|
||||||
{
|
{
|
||||||
const wxString& fieldName = m_fieldsCtrl->GetTextValue( i, FIELD_NAME_COLUMN );
|
int col = m_dataModel->GetFieldNameCol( m_fieldsCtrl->GetTextValue( i, FIELD_NAME_COLUMN ) );
|
||||||
|
|
||||||
if( m_fieldsCtrl->GetToggleValue( i, 1 ) )
|
if( col == -1 )
|
||||||
m_grid->ShowCol( m_dataModel->GetFieldNameCol( fieldName ) );
|
continue;
|
||||||
|
|
||||||
|
if( m_fieldsCtrl->GetToggleValue( i, SHOW_FIELD_COLUMN ) )
|
||||||
|
m_grid->ShowCol( col );
|
||||||
else
|
else
|
||||||
m_grid->HideCol( m_dataModel->GetFieldNameCol( fieldName ) );
|
m_grid->HideCol( col );
|
||||||
}
|
}
|
||||||
|
|
||||||
m_dataModel->Sort( sortCol, sortAscending );
|
m_dataModel->Sort( sortCol, sortAscending );
|
||||||
|
@ -1128,7 +1158,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::AddField( const wxString& aFieldName,
|
||||||
const wxString& aLabelValue,
|
const wxString& aLabelValue,
|
||||||
bool defaultShow, bool defaultSortBy, bool addedByUser )
|
bool defaultShow, bool defaultSortBy, bool addedByUser )
|
||||||
{
|
{
|
||||||
m_dataModel->AddColumn( aFieldName, addedByUser );
|
m_dataModel->AddColumn( aFieldName, aLabelValue, addedByUser );
|
||||||
|
|
||||||
wxVector<wxVariant> fieldsCtrlRow;
|
wxVector<wxVariant> fieldsCtrlRow;
|
||||||
bool show = defaultShow;
|
bool show = defaultShow;
|
||||||
|
@ -1144,9 +1174,10 @@ void DIALOG_SYMBOL_FIELDS_TABLE::AddField( const wxString& aFieldName,
|
||||||
|
|
||||||
// Don't change these to emplace_back: some versions of wxWidgets don't support it
|
// Don't change these to emplace_back: some versions of wxWidgets don't support it
|
||||||
fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
|
fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
|
||||||
|
fieldsCtrlRow.push_back( wxVariant( aLabelValue ) );
|
||||||
fieldsCtrlRow.push_back( wxVariant( show ) );
|
fieldsCtrlRow.push_back( wxVariant( show ) );
|
||||||
fieldsCtrlRow.push_back( wxVariant( sort_by ) );
|
fieldsCtrlRow.push_back( wxVariant( sort_by ) );
|
||||||
fieldsCtrlRow.push_back( wxVariant( aLabelValue ) );
|
fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
|
||||||
|
|
||||||
m_fieldsCtrl->AppendItem( fieldsCtrlRow );
|
m_fieldsCtrl->AppendItem( fieldsCtrlRow );
|
||||||
}
|
}
|
||||||
|
@ -1169,7 +1200,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::LoadFieldNames()
|
||||||
AddField( _( "Value" ), wxT( "Value" ), true, true );
|
AddField( _( "Value" ), wxT( "Value" ), true, true );
|
||||||
AddField( _( "Footprint" ), wxT( "Footprint" ), true, true );
|
AddField( _( "Footprint" ), wxT( "Footprint" ), true, true );
|
||||||
AddField( _( "Datasheet" ), wxT( "Datasheet" ), true, false );
|
AddField( _( "Datasheet" ), wxT( "Datasheet" ), true, false );
|
||||||
AddField( _( "Qty" ), wxT( "Quantity" ), true, false );
|
AddField( _( "Quantity" ), wxT( "Qty" ), true, false );
|
||||||
|
|
||||||
for( const wxString& fieldName : userFieldNames )
|
for( const wxString& fieldName : userFieldNames )
|
||||||
AddField( fieldName, fieldName, true, false );
|
AddField( fieldName, fieldName, true, false );
|
||||||
|
@ -1399,10 +1430,15 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnColumnItemToggled( wxDataViewEvent& event )
|
||||||
std::string fieldName( m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN ).ToUTF8() );
|
std::string fieldName( m_fieldsCtrl->GetTextValue( row, FIELD_NAME_COLUMN ).ToUTF8() );
|
||||||
m_schSettings.m_BomSettings.fields_show[fieldName] = value;
|
m_schSettings.m_BomSettings.fields_show[fieldName] = value;
|
||||||
|
|
||||||
if( value )
|
int dataCol = m_dataModel->GetFieldNameCol( fieldName );
|
||||||
m_grid->ShowCol( m_dataModel->GetFieldNameCol( fieldName ) );
|
|
||||||
else
|
if( dataCol != -1 )
|
||||||
m_grid->HideCol( m_dataModel->GetFieldNameCol( fieldName ) );
|
{
|
||||||
|
if( value )
|
||||||
|
m_grid->ShowCol( dataCol );
|
||||||
|
else
|
||||||
|
m_grid->HideCol( dataCol );
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1503,6 +1539,24 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnColMove( wxGridEvent& aEvent )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void DIALOG_SYMBOL_FIELDS_TABLE::OnColLabelChange( wxDataViewEvent& aEvent )
|
||||||
|
{
|
||||||
|
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( col != -1 )
|
||||||
|
m_dataModel->SetColLabelValue( col, label );
|
||||||
|
|
||||||
|
syncBomPresetSelection();
|
||||||
|
|
||||||
|
aEvent.Skip();
|
||||||
|
|
||||||
|
m_grid->ForceRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
void DIALOG_SYMBOL_FIELDS_TABLE::OnTableValueChanged( wxGridEvent& aEvent )
|
void DIALOG_SYMBOL_FIELDS_TABLE::OnTableValueChanged( wxGridEvent& aEvent )
|
||||||
{
|
{
|
||||||
m_grid->ForceRefresh();
|
m_grid->ForceRefresh();
|
||||||
|
@ -1518,6 +1572,8 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnTableColSize( wxGridSizeEvent& aEvent )
|
||||||
m_schSettings.m_BomSettings.column_widths[key] = m_grid->GetColSize( col );
|
m_schSettings.m_BomSettings.column_widths[key] = m_grid->GetColSize( col );
|
||||||
|
|
||||||
aEvent.Skip();
|
aEvent.Skip();
|
||||||
|
|
||||||
|
m_grid->ForceRefresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1589,13 +1645,13 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnTableItemContextMenu( wxGridEvent& event )
|
||||||
|
|
||||||
void DIALOG_SYMBOL_FIELDS_TABLE::OnSizeFieldList( wxSizeEvent& event )
|
void DIALOG_SYMBOL_FIELDS_TABLE::OnSizeFieldList( wxSizeEvent& event )
|
||||||
{
|
{
|
||||||
int nameColWidth = KIPLATFORM::UI::GetUnobscuredSize( m_fieldsCtrl ).x;
|
m_labelColWidth = KIPLATFORM::UI::GetUnobscuredSize( m_fieldsCtrl ).x;
|
||||||
nameColWidth -= m_showColWidth + m_groupByColWidth;
|
m_labelColWidth -= m_fieldNameColWidth + m_showColWidth + m_groupByColWidth;
|
||||||
#ifdef __WXMAC__
|
#ifdef __WXMAC__
|
||||||
// TODO: something in wxWidgets 3.1.x pads checkbox columns with extra space. (It used to
|
// 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
|
// also be that the width of the column would get set too wide (to 30), but that's patched in
|
||||||
// our local wxWidgets fork.)
|
// our local wxWidgets fork.)
|
||||||
nameColWidth -= 30;
|
m_labelColWidth -= 30;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// GTK loses its head and messes these up when resizing the splitter bar:
|
// GTK loses its head and messes these up when resizing the splitter bar:
|
||||||
|
@ -1603,7 +1659,8 @@ void DIALOG_SYMBOL_FIELDS_TABLE::OnSizeFieldList( wxSizeEvent& event )
|
||||||
m_fieldsCtrl->GetColumn( GROUP_BY_COLUMN )->SetWidth( m_groupByColWidth );
|
m_fieldsCtrl->GetColumn( GROUP_BY_COLUMN )->SetWidth( m_groupByColWidth );
|
||||||
|
|
||||||
m_fieldsCtrl->GetColumn( FIELD_NAME_COLUMN )->SetHidden( true );
|
m_fieldsCtrl->GetColumn( FIELD_NAME_COLUMN )->SetHidden( true );
|
||||||
m_fieldsCtrl->GetColumn( DISPLAY_NAME_COLUMN )->SetWidth( nameColWidth );
|
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.
|
m_fieldsCtrl->Refresh(); // To refresh checkboxes on Windows.
|
||||||
|
|
||||||
|
@ -2062,7 +2119,7 @@ void DIALOG_SYMBOL_FIELDS_TABLE::doApplyBomPreset( const BOM_PRESET& aPreset )
|
||||||
m_fieldsCtrl->SetToggleValue( groupBy, i, GROUP_BY_COLUMN );
|
m_fieldsCtrl->SetToggleValue( groupBy, i, GROUP_BY_COLUMN );
|
||||||
|
|
||||||
if( aPreset.column_sorts.count( fieldName ) )
|
if( aPreset.column_sorts.count( fieldName ) )
|
||||||
m_dataModel->Sort( m_dataModel->GetFieldNameCol( fieldName ), false );
|
m_dataModel->Sort( col, false );
|
||||||
|
|
||||||
if( width != -1 )
|
if( width != -1 )
|
||||||
m_grid->SetColSize( col, width );
|
m_grid->SetColSize( col, width );
|
||||||
|
|
|
@ -58,6 +58,7 @@ private:
|
||||||
|
|
||||||
void OnColSort( wxGridEvent& aEvent );
|
void OnColSort( wxGridEvent& aEvent );
|
||||||
void OnColMove( wxGridEvent& aEvent );
|
void OnColMove( wxGridEvent& aEvent );
|
||||||
|
void OnColLabelChange( wxDataViewEvent& aEvent );
|
||||||
|
|
||||||
void OnColumnItemToggled( wxDataViewEvent& event ) override;
|
void OnColumnItemToggled( wxDataViewEvent& event ) override;
|
||||||
void OnGroupSymbolsToggled( wxCommandEvent& event ) override;
|
void OnGroupSymbolsToggled( wxCommandEvent& event ) override;
|
||||||
|
@ -102,6 +103,8 @@ private:
|
||||||
static BOM_PRESET bomPresetGroupedByValueFootprint;
|
static BOM_PRESET bomPresetGroupedByValueFootprint;
|
||||||
|
|
||||||
SCH_EDIT_FRAME* m_parent;
|
SCH_EDIT_FRAME* m_parent;
|
||||||
|
int m_fieldNameColWidth;
|
||||||
|
int m_labelColWidth;
|
||||||
int m_showColWidth;
|
int m_showColWidth;
|
||||||
int m_groupByColWidth;
|
int m_groupByColWidth;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue