diff --git a/eeschema/bom_table_column.cpp b/eeschema/bom_table_column.cpp index ef270217ee..113b8a40e7 100644 --- a/eeschema/bom_table_column.cpp +++ b/eeschema/bom_table_column.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2017 Oliver Walters - * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors. + * Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License diff --git a/eeschema/bom_table_model.cpp b/eeschema/bom_table_model.cpp index 83885f6486..b1cd78c246 100644 --- a/eeschema/bom_table_model.cpp +++ b/eeschema/bom_table_model.cpp @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2017 Oliver Walters - * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors. + * Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -30,6 +30,7 @@ static const wxColor ROW_COLOUR_ITEM_CHANGED( 200, 0, 0 ); static const wxColor ROW_COLOUR_MULTIPLE_ITEMS( 60, 90, 200 ); + /** * Convert BOM_TABLE_ROW -> wxDataViewItem */ @@ -38,6 +39,7 @@ static wxDataViewItem RowToItem( BOM_TABLE_ROW const* aRow ) return wxDataViewItem( const_cast( static_cast( aRow ) ) ); } + /** * Convert wxDataViewItem -> BOM_TABEL_ROW */ @@ -53,15 +55,14 @@ static BOM_TABLE_ROW const* ItemToRow( wxDataViewItem aItem ) } } + BOM_FIELD_VALUES::BOM_FIELD_VALUES( wxString aRefDes, FIELD_VALUE_MAP* aTemplate ) : m_refDes( aRefDes ), m_templateValues( aTemplate ) { } -/** - * Return the current value for the provided field ID - */ + bool BOM_FIELD_VALUES::GetFieldValue( unsigned int aFieldId, wxString& aValue ) const { auto search = m_currentValues.find( aFieldId ); @@ -74,9 +75,7 @@ bool BOM_FIELD_VALUES::GetFieldValue( unsigned int aFieldId, wxString& aValue ) return true; } -/** - * Return the backup value for the provided field ID - */ + bool BOM_FIELD_VALUES::GetBackupValue( unsigned int aFieldId, wxString& aValue ) const { auto search = m_backupValues.find( aFieldId ); @@ -89,9 +88,7 @@ bool BOM_FIELD_VALUES::GetBackupValue( unsigned int aFieldId, wxString& aValue ) return true; } -/** - * Return the template value for a provided field ID (if it exists) - */ + bool BOM_FIELD_VALUES::GetTemplateValue( unsigned int aFieldId, wxString& aValue ) const { if( !m_templateValues ) @@ -107,21 +104,18 @@ bool BOM_FIELD_VALUES::GetTemplateValue( unsigned int aFieldId, wxString& aValue return true; } -/** - * Set the value for the provided field ID - * Field value is set under any of the following conditions: - * - param aOverwrite is true - * - There is no current value - * - The current value is empty - */ -void BOM_FIELD_VALUES::SetFieldValue( unsigned int aFieldId, wxString aValue, bool aOverwrite ) + +void BOM_FIELD_VALUES::SetFieldValue( unsigned int aFieldId, const wxString& aValue, + bool aOverwrite ) { - if( aOverwrite || m_currentValues.count( aFieldId ) == 0 || m_currentValues[aFieldId].IsEmpty() ) + if( aOverwrite || m_currentValues.count( aFieldId ) == 0 || + m_currentValues[aFieldId].IsEmpty() ) { m_currentValues[aFieldId] = aValue; } } + bool BOM_FIELD_VALUES::HasValueChanged( unsigned int aFieldId) const { wxString currentValue, backupValue; @@ -132,6 +126,7 @@ bool BOM_FIELD_VALUES::HasValueChanged( unsigned int aFieldId) const return currentValue.Cmp( backupValue ) != 0; } + void BOM_FIELD_VALUES::RevertChanges( unsigned int aFieldId ) { wxString backupValue; @@ -149,10 +144,12 @@ void BOM_FIELD_VALUES::SetBackupPoint() } } + BOM_TABLE_ROW::BOM_TABLE_ROW() : m_columnList( nullptr ) { } + /** * Update cell attributes based on parameters of the cell * Default implementation highlights cells that have been altered @@ -172,6 +169,7 @@ bool BOM_TABLE_ROW::GetAttr( unsigned int aFieldId, wxDataViewItemAttr& aAttr ) return false; } + bool BOM_TABLE_ROW::HasChanged() const { if( !m_columnList ) @@ -188,6 +186,7 @@ bool BOM_TABLE_ROW::HasChanged() const return false; } + /** * Create a new group (which contains one or more components) */ @@ -196,6 +195,7 @@ BOM_TABLE_GROUP::BOM_TABLE_GROUP( BOM_COLUMN_LIST* aColumnList ) m_columnList = aColumnList; } + bool BOM_TABLE_GROUP::GetAttr( unsigned int aFieldId, wxDataViewItemAttr& aAttr ) const { if( GetFieldValue( aFieldId ).Cmp( ROW_MULT_ITEMS ) == 0 ) @@ -208,6 +208,7 @@ bool BOM_TABLE_GROUP::GetAttr( unsigned int aFieldId, wxDataViewItemAttr& aAttr return BOM_TABLE_ROW::GetAttr( aFieldId, aAttr ); } + /** * Return the value associated with a given field in the group. * Some fields require special attention. @@ -223,10 +224,12 @@ wxString BOM_TABLE_GROUP::GetFieldValue( unsigned int aFieldId ) const case BOM_COL_ID_QUANTITY: value = wxString::Format( "%u", (unsigned int) GroupSize() ); break; + // REFERENCE field returns consolidated list of references case BOM_COL_ID_REFERENCE: value = wxJoin( GetReferences(), ' ' ); break; + // Otherwise, return component data default: if( Components.size() == 0 ) @@ -259,6 +262,7 @@ wxString BOM_TABLE_GROUP::GetFieldValue( unsigned int aFieldId ) const return value; } + /** * Set the value of a field in a group * The new value is pushed to all components that are children of this group @@ -275,6 +279,7 @@ bool BOM_TABLE_GROUP::SetFieldValue( unsigned int aFieldId, const wxString aValu return result; } + /** * Determines if a given component matches against a particular field. * @@ -302,11 +307,13 @@ bool BOM_TABLE_GROUP::TestField( BOM_COLUMN* aField, BOM_TABLE_COMPONENT* aCompo // These fields should NOT be compared (return True) case BOM_COL_ID_QUANTITY: return true; + // Reference matching is done only on prefix case BOM_COL_ID_REFERENCE: componentValue = aComponent->GetPrefix(); comparisonValue = Components[0]->GetPrefix(); break; + default: componentValue = aComponent->GetFieldValue( aField->Id() ); comparisonValue = Components[0]->GetFieldValue( aField->Id() ); @@ -318,6 +325,7 @@ bool BOM_TABLE_GROUP::TestField( BOM_COLUMN* aField, BOM_TABLE_COMPONENT* aCompo return result; } + /** * Add a new component to the group. * It is assumed at this stage that the component is a good match for the group. @@ -378,6 +386,7 @@ unsigned int BOM_TABLE_GROUP::GetChildren( wxDataViewItemArray& aChildren ) cons return aChildren.size(); } + /** * Test if any components in this group have a new value in the provided field * @param aField is the field to test @@ -409,6 +418,7 @@ bool BOM_TABLE_GROUP::HasValueChanged( BOM_COLUMN* aField ) const return changed; } + /** * Return a list of (ordered) references * for all the components in this group @@ -435,6 +445,7 @@ wxArrayString BOM_TABLE_GROUP::GetReferences( bool aSort ) const return refs; } + /** * Compare two references (e.g. "R100", "R19") and perform a 'natural' sort * This sorting must preserve numerical order rather than alphabetical @@ -488,6 +499,7 @@ int BOM_TABLE_GROUP::SortReferences( const wxString& aFirst, const wxString& aSe return (int) (numFirst - numSecond); } + /** * Compare two VALUE fields. * A value field can reasonably be expected to be one of: @@ -511,6 +523,7 @@ int BOM_TABLE_GROUP::SortValues( const wxString& aFirst, const wxString& aSecond return aFirst.CmpNoCase( aSecond ); } + /** * Create a new COMPONENT row * Each COMPONENT row is associated with a single component item. @@ -524,6 +537,7 @@ BOM_TABLE_COMPONENT::BOM_TABLE_COMPONENT( BOM_TABLE_GROUP* aParent, m_fieldValues = aFieldValues; } + /** * Try to add a unit to this component * If the references match, it will be added @@ -547,9 +561,11 @@ bool BOM_TABLE_COMPONENT::AddUnit( SCH_REFERENCE aUnit ) case BOM_COL_ID_QUANTITY: value = wxEmptyString; break; + case BOM_COL_ID_DESCRIPTION: value = cmp->GetAliasDescription(); break; + case BOM_COL_ID_DATASHEET: value = cmp->GetField( DATASHEET )->GetText(); if( value.IsEmpty() ) @@ -557,12 +573,15 @@ bool BOM_TABLE_COMPONENT::AddUnit( SCH_REFERENCE aUnit ) value = cmp->GetAliasDocumentation(); } break; + case BOM_COL_ID_REFERENCE: value = aUnit.GetRef(); break; + case BOM_COL_ID_VALUE: value = cmp->GetField( VALUE )->GetText(); break; + case BOM_COL_ID_FOOTPRINT: value = cmp->GetField( FOOTPRINT )->GetText(); break; @@ -595,8 +614,10 @@ wxString BOM_TABLE_COMPONENT::GetFieldValue( unsigned int aFieldId ) const { case BOM_COL_ID_QUANTITY: return wxEmptyString; + case BOM_COL_ID_REFERENCE: return GetReference(); + default: break; } @@ -614,6 +635,7 @@ wxString BOM_TABLE_COMPONENT::GetFieldValue( unsigned int aFieldId ) const return value; } + /** * Set the value of a field in the component * @param aFieldId is the unique ID of the field to update @@ -631,17 +653,17 @@ bool BOM_TABLE_COMPONENT::SetFieldValue( unsigned int aFieldId, const wxString a return false; } -/** - * Return the prefix of a component e.g. "R23" -> "R" - */ + wxString BOM_TABLE_COMPONENT::GetPrefix() const { + // Return the prefix of a component e.g. "R23" -> "R" if( Units.size() == 0 ) return wxEmptyString; return Units[0].GetComp()->GetPrefix(); } + /** * Return the reference of a component e.g. "R23" */ @@ -653,6 +675,7 @@ wxString BOM_TABLE_COMPONENT::GetReference() const return Units[0].GetRef(); } + /** * Determines if the given field has been changed for this component */ @@ -666,6 +689,7 @@ bool BOM_TABLE_COMPONENT::HasValueChanged( BOM_COLUMN* aField ) const return m_fieldValues->HasValueChanged( aField->Id() ); } + /** * If any changes have been made to this component, * they are now applied to the schematic component @@ -694,16 +718,19 @@ void BOM_TABLE_COMPONENT::ApplyFieldChanges() case BOM_COL_ID_REFERENCE: case BOM_COL_ID_QUANTITY: continue; + // Special field considerations case BOM_COL_ID_FOOTPRINT: field = cmp->GetField( FOOTPRINT ); break; + case BOM_COL_ID_VALUE: field = cmp->GetField( VALUE ); break; case BOM_COL_ID_DATASHEET: field = cmp->GetField( DATASHEET ); break; + default: // Find the field by name (but ignore default fields) field = cmp->FindField( column->Title(), false ); @@ -726,6 +753,7 @@ void BOM_TABLE_COMPONENT::ApplyFieldChanges() } } + /** * Revert the displayed fields for this component * to their original values (matching the schematic data) @@ -747,6 +775,7 @@ void BOM_TABLE_COMPONENT::RevertFieldChanges() } } + BOM_TABLE_MODEL::BOM_TABLE_MODEL() : m_widget( nullptr ), m_sortingColumn( BOM_COL_ID_REFERENCE ), @@ -755,6 +784,7 @@ BOM_TABLE_MODEL::BOM_TABLE_MODEL() : //TODO } + /** * Create a container for the BOM_TABLE_MODEL * This is required for reference counting by wxDataViewCtrl @@ -768,11 +798,13 @@ BOM_TABLE_MODEL::MODEL_PTR BOM_TABLE_MODEL::Create() return container; } + BOM_TABLE_MODEL::~BOM_TABLE_MODEL() { //TODO } + wxDataViewColumn* BOM_TABLE_MODEL::AddColumn( BOM_COLUMN* aColumn, int aPosition ) { static const unsigned int flags = wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_COL_SORTABLE; @@ -838,6 +870,7 @@ wxDataViewColumn* BOM_TABLE_MODEL::AddColumn( BOM_COLUMN* aColumn, int aPosition return column; } + /** * Gracefully remove the given column from the wxDataViewCtrl * Removing columns individually prevents bad redraw of entire table @@ -861,6 +894,7 @@ bool BOM_TABLE_MODEL::RemoveColumn( BOM_COLUMN* aColumn ) return false; } + /** * Attach the MODEL to a particular VIEW * This function causes the view to be updated appropriately @@ -891,6 +925,7 @@ void BOM_TABLE_MODEL::AttachTo( wxDataViewCtrl* aView ) aView->Update(); } + /** * Return the total number of components displayed by the model */ @@ -907,11 +942,13 @@ unsigned int BOM_TABLE_MODEL::ComponentCount() const return count; } + void BOM_TABLE_MODEL::ClearColumns() { ColumnList.Clear(); } + /** * Add default columns to the table * These columns are ALWAYS available in the table @@ -959,6 +996,7 @@ void BOM_TABLE_MODEL::AddDefaultColumns() true, true ) ); } + /** * Extract field data from all components * Compiles an inclusive list of all field names from all components @@ -1019,6 +1057,7 @@ void BOM_TABLE_MODEL::AddComponentFields( SCH_COMPONENT* aCmp ) } } + /** * Add a list of component items to the BOM manager * Creates consolidated groups of components as required @@ -1118,6 +1157,7 @@ void BOM_TABLE_MODEL::SetComponents( SCH_REFERENCE_LIST aRefs, const TEMPLATE_FI SetBackupPoint(); } + void BOM_TABLE_MODEL::SetBackupPoint() { // Mark backup locations for all values @@ -1127,6 +1167,7 @@ void BOM_TABLE_MODEL::SetBackupPoint() } } + /** * Recalculate grouping of components and reload table **/ @@ -1178,6 +1219,7 @@ void BOM_TABLE_MODEL::ReloadTable() } } + /** * Return a string array of data from a given row */ @@ -1209,13 +1251,12 @@ wxArrayString BOM_TABLE_MODEL::GetRowData( unsigned int aRow, std::vectorGetAttr( aFieldId, aAttr ); } - else - { - return false; - } + + return false; } + /** * Custom comparison function for improved column sorting * Alphanumeric sorting is not sufficient for correct ordering of some fields @@ -1383,9 +1425,11 @@ int BOM_TABLE_MODEL::Compare( const wxDataViewItem& aItem1, case BOM_COL_ID_REFERENCE: result = BOM_TABLE_GROUP::SortReferences( strVal1, strVal2 ); break; + case BOM_COL_ID_VALUE: result = BOM_TABLE_GROUP::SortValues( strVal1, strVal2 ); break; + // These columns are sorted numerically case BOM_COL_ID_QUANTITY: if( strVal1.ToLong( &numVal1 ) && strVal2.ToLong( &numVal2 ) ) @@ -1397,6 +1441,7 @@ int BOM_TABLE_MODEL::Compare( const wxDataViewItem& aItem1, result = strVal1.Cmp( strVal2 ); } break; + default: // Default comparison (no special case) result = strVal1.Cmp( strVal2 ); @@ -1427,6 +1472,7 @@ int BOM_TABLE_MODEL::Compare( const wxDataViewItem& aItem1, return result; } + /** * Revert all component data back to the original values. * The table view is updated accordingly @@ -1461,6 +1507,7 @@ void BOM_TABLE_MODEL::RevertFieldChanges() } } + /** * Apply all outstanding field changes. * This is performed only when the window is closed @@ -1485,6 +1532,7 @@ void BOM_TABLE_MODEL::ApplyFieldChanges() } } + /** * Tests if any component values in the table have been altered */ @@ -1510,6 +1558,7 @@ bool BOM_TABLE_MODEL::HaveFieldsChanged() const return false; } + /** * Returns a list of only those components that have been changed */ @@ -1540,6 +1589,7 @@ std::vector BOM_TABLE_MODEL::GetChangedComponents() return components; } + /** * Returns a count of the components that have been changed */ diff --git a/eeschema/bom_table_model.h b/eeschema/bom_table_model.h index e011b1eb8f..f3b9b19ce8 100644 --- a/eeschema/bom_table_model.h +++ b/eeschema/bom_table_model.h @@ -2,7 +2,7 @@ * This program source code file is part of KiCad, a free EDA CAD application. * * Copyright (C) 2017 Oliver Walters - * Copyright (C) 2017 KiCad Developers, see CHANGELOG.TXT for contributors. + * Copyright (C) 2017 KiCad Developers, see AUTHORS.txt for contributors. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -60,11 +60,38 @@ class BOM_FIELD_VALUES public: BOM_FIELD_VALUES( wxString aRefDes, FIELD_VALUE_MAP* aTemplate ); + /** + * Return the current value for the provided field ID + * @return true if the field exists + * @param aFieldId = the field index + * @param aValue = a string to return the field value + */ bool GetFieldValue( unsigned int aFieldId, wxString& aValue ) const; + + /** + * Return the backup value for the provided field ID + * @return true if the field exists + * @param aFieldId = the field index + * @param aValue = a string to return the field backup value + */ bool GetBackupValue( unsigned int aFieldId, wxString& aValue ) const; + + /** + * Return the template value for a provided field ID (if it exists) + * @return true if the field exists + * @param aFieldId = the field index + * @param aValue = a string to return the field template value + */ bool GetTemplateValue( unsigned int aFieldId, wxString& aValue ) const; - void SetFieldValue( unsigned int aFieldId, wxString aValue, bool aOverwrite = false ); + /** + * Set the value for the provided field ID + * Field value is set under any of the following conditions: + * - param aOverwrite is true + * - There is no current value + * - The current value is empty + */ + void SetFieldValue( unsigned int aFieldId, const wxString& aValue, bool aOverwrite = false ); wxString GetReference() const { return m_refDes; } @@ -139,47 +166,47 @@ protected: class BOM_TABLE_GROUP : public BOM_TABLE_ROW { public: - // List of components stored in this group + /// List of components stored in this group std::vector Components; BOM_TABLE_GROUP( BOM_COLUMN_LIST* aColumnList ); virtual ~BOM_TABLE_GROUP() {} - // Set display properties for a group row + /// Set display properties for a group row virtual bool GetAttr( unsigned int aFieldId, wxDataViewItemAttr& aAttr ) const override; - // Get group row value + /// Get group row value virtual wxString GetFieldValue( unsigned int aFieldId ) const override; - // Set group row value + /// Set group row value virtual bool SetFieldValue( unsigned int aFieldId, const wxString aValue, bool aOverwrite = false ) override; - // Attempt to add a new component to the group + /// Attempt to add a new component to the group bool AddComponent( BOM_TABLE_COMPONENT* aComponent ); - // Test if this group should display children + /// Test if this group should display children virtual bool HasChildren() const override { return Components.size() > 1; } - // Return a list of children items of this group + /// Return a list of children items of this group virtual unsigned int GetChildren( wxDataViewItemArray& aChildren ) const override; - // Test if any children have changed + /// Test if any children have changed virtual bool HasValueChanged( BOM_COLUMN* aField ) const override; - // Return the number of child items in this group + /// Return the number of child items in this group unsigned int GroupSize( void ) const { return Components.size(); } - // Return a sorted, concatenated list of references + /// Return a sorted, concatenated list of references wxArrayString GetReferences( bool aSort = true ) const; - // Function for sorting two reference strings + /// Function for sorting two reference strings static int SortReferences( const wxString& aFirst, const wxString& aSecond ); - // Function for sorting two value strings + /// Function for sorting two value strings static int SortValues( const wxString& aFirst, const wxString& aSecond ); protected: - // Test if a particular field matches against another component + /// Test if a particular field matches against another component bool TestField( BOM_COLUMN* aField, BOM_TABLE_COMPONENT* aComponent ) const; }; @@ -199,9 +226,12 @@ public: virtual bool HasValueChanged( BOM_COLUMN* aField ) const override; - // Return the reference of the first unit (all units must be the same + /// Return the reference of the first unit (all units must be the same wxString GetReference() const; + /** + * @return the prefix of a component e.g. "R23" returns "R" + */ wxString GetPrefix() const; void ApplyFieldChanges(); diff --git a/eeschema/dialogs/dialog_bom_editor.cpp b/eeschema/dialogs/dialog_bom_editor.cpp index f314dd6fcd..11eb185498 100644 --- a/eeschema/dialogs/dialog_bom_editor.cpp +++ b/eeschema/dialogs/dialog_bom_editor.cpp @@ -47,6 +47,7 @@ void InvokeDialogCreateBOMEditor( SCH_EDIT_FRAME* aCaller ) dlg.ShowQuasiModal(); } + DIALOG_BOM_EDITOR::DIALOG_BOM_EDITOR( SCH_EDIT_FRAME* parent ) : DIALOG_BOM_EDITOR_BASE( parent ), m_parent( parent ) @@ -342,7 +343,6 @@ void DIALOG_BOM_EDITOR::LoadColumnNames() void DIALOG_BOM_EDITOR::ReloadColumns() { m_bom->AttachTo( m_bomView ); - UpdateTitle(); } @@ -352,14 +352,15 @@ void DIALOG_BOM_EDITOR::OnColumnItemToggled( wxDataViewEvent& event ) wxDataViewItem item = event.GetItem(); int row = m_columnListCtrl->ItemToRow( item ); - int col = event.GetColumn(); - if( row == wxNOT_FOUND || row < 0 || row >= (int) m_bom->ColumnCount() ) return; + if( row == wxNOT_FOUND || row < 0 || row >= (int) m_bom->ColumnCount() ) + return; BOM_COLUMN* bomColumn = m_bom->ColumnList.GetColumnByIndex( row ); - if( nullptr == bomColumn ) return; + if( nullptr == bomColumn ) + return; bool bValue = m_columnListCtrl->GetToggleValue( row, col ); @@ -367,6 +368,7 @@ void DIALOG_BOM_EDITOR::OnColumnItemToggled( wxDataViewEvent& event ) { default: break; + case 1: // Column visibility bomColumn->SetVisible( bValue ); @@ -380,6 +382,7 @@ void DIALOG_BOM_EDITOR::OnColumnItemToggled( wxDataViewEvent& event ) m_bom->RemoveColumn( bomColumn ); } break; + case 2: // Column used to sort bomColumn->SetUsedToSort( bValue ); m_bom->ReloadTable(); @@ -427,6 +430,7 @@ void DIALOG_BOM_EDITOR::OnRegroupComponents( wxCommandEvent& event ) Update(); } + void DIALOG_BOM_EDITOR::OnApplyFieldChanges( wxCommandEvent& event ) { ApplyAllChanges(); @@ -446,6 +450,7 @@ void DIALOG_BOM_EDITOR::OnRevertFieldChanges( wxCommandEvent& event ) } } + // Called when a cell is left-clicked void DIALOG_BOM_EDITOR::OnTableItemActivated( wxDataViewEvent& event ) {