Fields Table: convert special strings like Quantity to named variables
Before, we did not actually prevent users from adding a field also named Quantity to their symbols. This of course does not play nicely with the assumptions that Quantity is a special column in the fields editor. By making it a named variable, the user can safely add it to a symbol and it will not be editable, and will also work in the fields table editor as expected.
This commit is contained in:
parent
3a82374719
commit
25e391719e
|
@ -124,6 +124,12 @@ wxString GetTextVars( const wxString& aSource )
|
|||
}
|
||||
|
||||
|
||||
bool IsTextVar( const wxString& aSource )
|
||||
{
|
||||
return aSource.StartsWith( wxS( "${" ) );
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Stolen from wxExpandEnvVars and then heavily optimized
|
||||
//
|
||||
|
|
|
@ -136,7 +136,7 @@ BOM_PRESET BOM_PRESET::GroupedByValue()
|
|||
{ "Value", "Value", true, true },
|
||||
{ "Datasheet", "Datasheet", true, false },
|
||||
{ "Footprint", "Footprint", true, false },
|
||||
{ "Quantity", "Qty", true, false },
|
||||
{ "${QUANTITY}", "Qty", true, false },
|
||||
{ "${DNP}", "DNP", true, true },
|
||||
};
|
||||
|
||||
|
@ -155,7 +155,7 @@ BOM_PRESET BOM_PRESET::GroupedByValueFootprint()
|
|||
{ "Value", "Value", true, true },
|
||||
{ "Datasheet", "Datasheet", true, false },
|
||||
{ "Footprint", "Footprint", true, true },
|
||||
{ "Quantity", "Qty", true, false },
|
||||
{ "${QUANTITY}", "Qty", true, false },
|
||||
{ "${DNP}", "DNP", true, true },
|
||||
};
|
||||
|
||||
|
|
|
@ -335,14 +335,13 @@ void DIALOG_SYMBOL_FIELDS_TABLE::SetupColumnProperties()
|
|||
attr->SetEditor( new GRID_CELL_URL_EDITOR( this, Prj().SchSearchS() ) );
|
||||
m_grid->SetColAttr( col, attr );
|
||||
}
|
||||
else if( m_dataModel->GetColFieldName( col ) == wxS( "Quantity" )
|
||||
|| m_dataModel->GetColFieldName( col ) == wxS( "Item Number" ) )
|
||||
else if( m_dataModel->ColIsQuantity( col ) || m_dataModel->ColIsItemNumber( col ) )
|
||||
{
|
||||
attr->SetReadOnly();
|
||||
m_grid->SetColAttr( col, attr );
|
||||
m_grid->SetColFormatNumber( col );
|
||||
}
|
||||
else if( m_dataModel->GetColFieldName( col ).StartsWith( wxS( "${" ) ) )
|
||||
else if( IsTextVar( m_dataModel->GetColFieldName( col ) ) )
|
||||
{
|
||||
attr->SetReadOnly();
|
||||
m_grid->SetColAttr( col, attr );
|
||||
|
@ -519,6 +518,12 @@ bool DIALOG_SYMBOL_FIELDS_TABLE::TransferDataFromWindow()
|
|||
void DIALOG_SYMBOL_FIELDS_TABLE::AddField( const wxString& aFieldName, const wxString& aLabelValue,
|
||||
bool show, bool groupBy, bool addedByUser )
|
||||
{
|
||||
// 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++ )
|
||||
if( m_fieldsCtrl->GetTextValue( i, FIELD_NAME_COLUMN ) == aFieldName )
|
||||
return;
|
||||
|
||||
m_dataModel->AddColumn( aFieldName, aLabelValue, addedByUser );
|
||||
|
||||
wxVector<wxVariant> fieldsCtrlRow;
|
||||
|
@ -565,11 +570,11 @@ void DIALOG_SYMBOL_FIELDS_TABLE::LoadFieldNames()
|
|||
TEMPLATE_FIELDNAME::GetDefaultFieldName( i, true ), show, groupBy );
|
||||
}
|
||||
|
||||
// Generated field that isn't in any symbol
|
||||
AddField( wxS( "Quantity" ), _( "Qty" ), true, false );
|
||||
AddField( wxS( "Item Number" ), _( "#" ), true, false );
|
||||
// Generated fields present only in the fields table
|
||||
AddField( FIELDS_EDITOR_GRID_DATA_MODEL::QUANTITY_VARIABLE, _( "Qty" ), true, false );
|
||||
AddField( FIELDS_EDITOR_GRID_DATA_MODEL::ITEM_NUMBER_VARIABLE, _( "#" ), true, false );
|
||||
|
||||
// User fields second
|
||||
// User fields next
|
||||
std::set<wxString> userFieldNames;
|
||||
|
||||
for( unsigned i = 0; i < m_symbolsList.GetCount(); ++i )
|
||||
|
|
|
@ -288,8 +288,6 @@ int EESCHEMA_JOBS_HANDLER::JobExportBom( JOB* aJob )
|
|||
dataModel.AddColumn( TEMPLATE_FIELDNAME::GetDefaultFieldName( i ),
|
||||
TEMPLATE_FIELDNAME::GetDefaultFieldName( i, true ), false );
|
||||
|
||||
dataModel.AddColumn( wxS( "Quantity" ), _( "Qty" ), false );
|
||||
|
||||
// User field names in symbols second
|
||||
std::set<wxString> userFieldNames;
|
||||
|
||||
|
|
|
@ -9,6 +9,8 @@
|
|||
|
||||
#include "fields_data_model.h"
|
||||
|
||||
const wxString FIELDS_EDITOR_GRID_DATA_MODEL::QUANTITY_VARIABLE = wxS( "${QUANTITY}" );
|
||||
const wxString FIELDS_EDITOR_GRID_DATA_MODEL::ITEM_NUMBER_VARIABLE = wxS( "${ITEM_NUMBER}" );
|
||||
|
||||
void FIELDS_EDITOR_GRID_DATA_MODEL::AddColumn( const wxString& aFieldName, const wxString& aLabel,
|
||||
bool aAddedByUser )
|
||||
|
@ -27,7 +29,7 @@ void FIELDS_EDITOR_GRID_DATA_MODEL::AddColumn( const wxString& aFieldName, const
|
|||
m_dataStore[symbol->m_Uuid][aFieldName] = field->GetText();
|
||||
// Handle fields with variables as names that are not present in the symbol
|
||||
// by giving them the correct value
|
||||
else if( aFieldName.StartsWith( wxT( "${" ) ) )
|
||||
else if( IsTextVar( aFieldName ) )
|
||||
m_dataStore[symbol->m_Uuid][aFieldName] = aFieldName;
|
||||
else
|
||||
m_dataStore[symbol->m_Uuid][aFieldName] = wxEmptyString;
|
||||
|
@ -203,8 +205,11 @@ wxString FIELDS_EDITOR_GRID_DATA_MODEL::GetValue( const DATA_MODEL_ROW& group, i
|
|||
|
||||
void FIELDS_EDITOR_GRID_DATA_MODEL::SetValue( int aRow, int aCol, const wxString& aValue )
|
||||
{
|
||||
if( ColIsReference( aCol ) || ColIsQuantity( aCol ) )
|
||||
return; // Can't modify references or quantity
|
||||
wxCHECK_RET( aCol >= 0 && aCol < (int) m_cols.size(), wxS( "Invalid column number" ) );
|
||||
|
||||
// Can't modify references or text variables column, e.g. ${QUANTITY}
|
||||
if( ColIsReference( aCol ) || IsTextVar( m_cols[aCol].m_fieldName ) )
|
||||
return;
|
||||
|
||||
DATA_MODEL_ROW& rowGroup = m_rows[aRow];
|
||||
|
||||
|
@ -224,13 +229,13 @@ bool FIELDS_EDITOR_GRID_DATA_MODEL::ColIsReference( int aCol )
|
|||
bool FIELDS_EDITOR_GRID_DATA_MODEL::ColIsQuantity( int aCol )
|
||||
{
|
||||
wxCHECK( aCol >= 0 && aCol < (int) m_cols.size(), false );
|
||||
return m_cols[aCol].m_fieldName == wxS( "Quantity" );
|
||||
return m_cols[aCol].m_fieldName == QUANTITY_VARIABLE;
|
||||
}
|
||||
|
||||
bool FIELDS_EDITOR_GRID_DATA_MODEL::ColIsItemNumber( int aCol )
|
||||
{
|
||||
wxCHECK( aCol >= 0 && aCol < (int) m_cols.size(), false );
|
||||
return m_cols[aCol].m_fieldName == wxS( "Item Number" );
|
||||
return m_cols[aCol].m_fieldName == ITEM_NUMBER_VARIABLE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -373,7 +378,7 @@ wxString FIELDS_EDITOR_GRID_DATA_MODEL::getFieldShownText( const SCH_REFERENCE&
|
|||
|
||||
// Handle fields with variables as names that are not present in the symbol
|
||||
// by giving them the correct value by resolving against the symbol
|
||||
if( aFieldName.StartsWith( wxT( "${" ) ) )
|
||||
if( IsTextVar( aFieldName ) )
|
||||
{
|
||||
int depth = 0;
|
||||
const SCH_SHEET_PATH& path = aRef.GetSheetPath();
|
||||
|
@ -584,7 +589,8 @@ void FIELDS_EDITOR_GRID_DATA_MODEL::ApplyData(
|
|||
|
||||
for( const std::pair<wxString, wxString> srcData : fieldStore )
|
||||
{
|
||||
if( srcData.first == _( "Quantity" ) )
|
||||
// Skip special fields with variables as names (e.g. ${QUANTITY})
|
||||
if( IsTextVar( srcData.first ) )
|
||||
continue;
|
||||
|
||||
const wxString& srcName = srcData.first;
|
||||
|
@ -680,7 +686,7 @@ void FIELDS_EDITOR_GRID_DATA_MODEL::ApplyBomPreset( const BOM_PRESET& aPreset )
|
|||
int col = GetFieldNameCol( field.name );
|
||||
|
||||
// Add any missing fields, if the user doesn't add any data
|
||||
// they won't be saved to the symbols anywa
|
||||
// they won't be saved to the symbols anyway
|
||||
if( col == -1 )
|
||||
{
|
||||
AddColumn( field.name, field.label, true );
|
||||
|
|
|
@ -59,6 +59,9 @@ public:
|
|||
m_symbolsList.SplitReferences();
|
||||
}
|
||||
|
||||
static const wxString QUANTITY_VARIABLE;
|
||||
static const wxString ITEM_NUMBER_VARIABLE;
|
||||
|
||||
void AddColumn( const wxString& aFieldName, const wxString& aLabel, bool aAddedByUser );
|
||||
void RemoveColumn( int aCol );
|
||||
void RenameColumn( int aCol, const wxString& newName );
|
||||
|
|
|
@ -96,6 +96,11 @@ wxString ExpandTextVars( const wxString& aSource, const PROJECT* aProject );
|
|||
*/
|
||||
wxString GetTextVars( const wxString& aSource );
|
||||
|
||||
/**
|
||||
* Returns true if the string is a text var, e.g starts with ${
|
||||
*/
|
||||
bool IsTextVar( const wxString& aSource );
|
||||
|
||||
/**
|
||||
* Replace any environment and/or text variables in file-path uris (leaving network-path URIs
|
||||
* alone).
|
||||
|
|
|
@ -34,7 +34,7 @@ CLI::EXPORT_SCH_BOM_COMMAND::EXPORT_SCH_BOM_COMMAND() : EXPORT_PCB_BASE_COMMAND(
|
|||
// Field output options
|
||||
m_argParser.add_argument( ARG_FIELDS )
|
||||
.help( UTF8STDSTR( _( ARG_FIELDS_DESC ) ) )
|
||||
.default_value( std::string( "Reference,Value,Footprint,Quantity,${DNP}" ) );
|
||||
.default_value( std::string( "Reference,Value,Footprint,${QUANTITY},${DNP}" ) );
|
||||
|
||||
m_argParser.add_argument( ARG_LABELS )
|
||||
.help( UTF8STDSTR( _( ARG_LABELS_DESC ) ) )
|
||||
|
|
Loading…
Reference in New Issue