51#include <wx/textdlg.h>
52#include <wx/filedlg.h>
64#define COLUMN_MARGIN 3
66#define COLUMN_MARGIN 15
82 wxDataViewListCtrl* aFieldsCtrl,
96 _(
"Browse for footprint" ) );
97 menu.AppendSeparator();
102 _(
"Show datasheet in browser" ) );
103 menu.AppendSeparator();
119 if( frame->ShowModal( &fpid,
m_dlg ) )
127 wxString datasheet_uri =
m_grid->GetCellValue(
m_grid->GetGridCursorRow(),
149 for(
int row = 0; row <
m_fieldsCtrl->GetItemCount(); row++ )
176 m_currentBomPreset( nullptr ),
177 m_lastSelectedBomPreset( nullptr ),
179 m_schSettings( parent->Schematic().Settings() ),
199 m_fieldsCtrl->AppendTextColumn(
_(
"Field" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
200 m_fieldsCtrl->AppendTextColumn(
_(
"Label" ), wxDATAVIEW_CELL_EDITABLE, 0, wxALIGN_LEFT, 0 );
201 m_fieldsCtrl->AppendToggleColumn(
_(
"Show" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
203 m_fieldsCtrl->AppendToggleColumn(
_(
"Group By" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
208 m_fieldsCtrl->AppendTextColumn(
_(
"Name" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
224 m_filter->SetDescriptiveText(
_(
"Filter" ) );
236 for(
int row = 0; row <
m_fieldsCtrl->GetItemCount(); ++row )
259 m_grid->UseNativeColHeader(
true );
263 m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
270 m_grid->SetDefaultRowSize(
m_grid->GetDefaultRowSize() + 4 );
296 field.
name = fieldName;
297 field.
show = !fieldName.StartsWith( wxT(
"__" ), &field.
name );
366 case SCOPE::SCOPE_SHEET_RECURSIVE:
m_radioRecursive->SetValue(
true );
break;
381 m_grid->Connect( wxEVT_GRID_COL_SORT,
383 m_grid->Connect( wxEVT_GRID_COL_MOVE,
399 m_grid->EnableEditing(
false );
410 wxGridCellAttr* attr =
new wxGridCellAttr;
411 attr->SetReadOnly(
false );
417 m_grid->SetColAttr( aCol, attr );
422 m_grid->SetColAttr( aCol, attr );
429 m_grid->SetColAttr( aCol, attr );
434 m_grid->SetColAttr( aCol, attr );
435 m_grid->SetColFormatNumber( aCol );
439 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
440 m_grid->SetColAttr( aCol, attr );
441 m_grid->SetColFormatBool( aCol );
446 m_grid->SetColAttr( aCol, attr );
450 attr->SetEditor(
m_grid->GetDefaultEditor() );
451 m_grid->SetColAttr( aCol, attr );
452 m_grid->SetColFormatCustom( aCol, wxGRID_VALUE_STRING );
460 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
463 m_grid->AutoSizeColumns(
false );
465 bool sortAscending =
true;
467 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
504 int maxWidth = defaultDlgSize.x / 3;
506 m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
516 m_grid->SetSortingColumn( sortCol, sortAscending );
523 m_grid->Disconnect( wxEVT_GRID_COL_SORT,
526 m_grid->Disconnect( wxEVT_GRID_COL_SORT,
531 m_grid->PopEventHandler(
true );
539 if( !wxDialog::TransferDataFromWindow() )
549 if( selection.GetSize() == 1 )
568 if( ref.GetSymbol() == symbol )
593 m_grid->GoToCell( row, valueCol );
595 m_grid->GoToCell( row, refCol );
596 else if( anyCol != -1 )
597 m_grid->GoToCell( row, anyCol );
618 if( !wxDialog::TransferDataFromWindow() )
638 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
652 bool show,
bool groupBy,
bool addedByUser )
664 wxVector<wxVariant> fieldsCtrlRow;
665 std::string key( aFieldName.ToUTF8() );
668 fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
669 fieldsCtrlRow.push_back( wxVariant( aLabelValue ) );
670 fieldsCtrlRow.push_back( wxVariant( show ) );
671 fieldsCtrlRow.push_back( wxVariant( groupBy ) );
672 fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
676 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
677 m_grid->ProcessTableMessage( msg );
687 bool groupBy =
false;
712 std::set<wxString> userFieldNames;
720 if( !symbol->
GetFields()[j].IsPrivate() )
721 userFieldNames.insert( symbol->
GetFields()[j].GetName() );
725 for(
const wxString& fieldName : userFieldNames )
732 if( userFieldNames.count( templateFieldname.m_Name ) == 0 )
743 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
745 if( dlg.ShowModal() != wxID_OK )
748 wxString fieldName = dlg.GetValue();
750 if( fieldName.IsEmpty() )
760 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ),
782 wxCHECK_RET( row != -1, wxS(
"Some user defined field must be selected first" ) );
783 wxCHECK_RET( row >=
MANDATORY_FIELDS, wxS(
"Mandatory fields cannot be removed" ) );
788 wxString confirm_msg = wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ),
791 if( !
IsOK(
this, confirm_msg ) )
814 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_DELETED, col, 1 );
816 m_grid->ProcessTableMessage( msg );
830 wxCHECK_RET( row != -1, wxS(
"Some user defined field must be selected first" ) );
831 wxCHECK_RET( row >=
MANDATORY_FIELDS, wxS(
"Mandatory fields cannot be renamed" ) );
832 wxCHECK_RET( !fieldName.IsEmpty(), wxS(
"Field must have a name" ) );
835 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
837 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ) );
839 if( dlg.ShowModal() != wxID_OK )
842 wxString newFieldName = dlg.GetValue();
845 if( newFieldName == fieldName )
851 wxString confirm_msg = wxString::Format(
_(
"Field name %s already exists." ),
879 wxPoint pos = aEvent.GetPosition();
880 wxRect ctrlRect =
m_filter->GetScreenRect();
881 int buttonWidth = ctrlRect.GetHeight();
884 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
885 SetCursor( wxCURSOR_ARROW );
886 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
887 SetCursor( wxCURSOR_ARROW );
889 SetCursor( wxCURSOR_IBEAM );
912 wxDataViewItem item =
event.GetItem();
914 int col =
event.GetColumn();
929 m_grid->ShowCol( dataCol );
931 m_grid->HideCol( dataCol );
945 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
953 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
1007 int sortCol = aEvent.GetCol();
1020 if(
m_grid->IsSortingBy( sortCol ) )
1023 ascending = !
m_grid->IsSortOrderAscending();
1041 int origPos = aEvent.GetCol();
1046 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1048 if(
m_grid->IsColShown( i ) )
1058 int newPos =
m_grid->GetColPos( origPos );
1077 wxDataViewItem item = aEvent.GetItem();
1103 int col = aEvent.GetRowOrCol();
1144 m_grid->ClearSelection();
1147 m_grid->SetGridCursor( event.GetRow(), event.GetCol() );
1164 std::set<SCH_REFERENCE> refs;
1165 std::set<SCH_ITEM*> symbols;
1168 if( aEvent.Selecting() )
1170 for(
int i = aEvent.GetTopRow(); i <= aEvent.GetBottomRow(); i++ )
1177 symbols.insert( ref.GetSymbol() );
1184 if( refs.size() > 0 )
1188 wxString symbol_path = refs.begin()->GetFullPath();
1203 std::vector<SCH_ITEM*> items( symbols.begin(), symbols.end() );
1205 if( refs.size() > 0 )
1206 selTool->
SyncSelection( refs.begin()->GetSheetPath(),
nullptr, items );
1319 wxFileDialog saveDlg(
this,
_(
"Bill of Materials Output File" ),
path, fn.GetFullName(),
1322 if( saveDlg.ShowModal() == wxID_CANCEL )
1326 wxFileName file = wxFileName( saveDlg.GetPath() );
1327 wxString defaultPath = fn.GetPathWithSep();
1329 msg.Printf(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath );
1331 wxMessageDialog dialog(
this, msg,
_(
"BOM Output File" ),
1332 wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT );
1334 if( dialog.ShowModal() == wxID_YES )
1336 if( !file.MakeRelativeTo( defaultPath ) )
1338 wxMessageBox(
_(
"Cannot make path relative (target volume different from schematic "
1340 _(
"BOM Output File" ), wxOK | wxICON_ERROR );
1353 _(
"Changes have not yet been saved. Export unsaved data?" ),
"",
1354 _(
"OK" ),
_(
"Cancel" ) )
1364 std::function<bool( wxString* )> textResolver =
1365 [&]( wxString* token ) ->
bool
1375 if(
path.IsEmpty() )
1377 DisplayError(
this,
_(
"No output file specified in Export tab." ) );
1384 wxFileName outputFile = wxFileName::FileName(
path );
1391 msg.Printf(
_(
"Could not open/create path '%s'." ), outputFile.GetPath() );
1396 wxFFile out( outputFile.GetFullPath(),
"wb" );
1398 if( !out.IsOpened() )
1400 msg.Printf(
_(
"Could not create BOM output '%s'." ), outputFile.GetFullPath() );
1409 msg.Printf(
_(
"Could not write BOM output '%s'." ), outputFile.GetFullPath() );
1416 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1424 EndModal( wxID_CANCEL );
1469 if( modelField.show )
1476 if( modelField.groupBy )
1480 EndModal( wxID_OK );
1540 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1542 if(
m_grid->IsColShown( i ) )
1551 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1553 if( wxWindow* parent = GetParent() )
1554 wxQueueEvent( parent, evt );
1560 std::vector<BOM_PRESET> ret;
1562 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1564 if( !pair.second.readOnly )
1565 ret.emplace_back( pair.second );
1577 for(
const BOM_PRESET& preset : aPresetList )
1595 wxCommandEvent
dummy;
1640 int default_idx = 0;
1642 for( std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1645 static_cast<void*
>( &pair.second ) );
1671 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1673 const BOM_PRESET& preset = aPair.second;
1676 if( !( preset.sortAsc == current.sortAsc
1677 && preset.filterString == current.filterString
1678 && preset.groupSymbols == current.groupSymbols
1679 && preset.excludeDNP == current.excludeDNP
1680 && preset.includeExcludedFromBOM
1681 == current.includeExcludedFromBOM ) )
1695 if( preset.sortField != wxGetTranslation( current.
sortField ) )
1699 std::vector<BOM_FIELD>
A,
B;
1701 for(
const BOM_FIELD& field : preset.fieldsOrdered )
1703 if( field.show || field.groupBy )
1704 A.emplace_back( field );
1709 if( field.show || field.groupBy )
1710 B.emplace_back( field );
1716 if( it != m_bomPresets.end() )
1720 bool do_translate = it->second.
readOnly;
1721 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1722 m_cbBomPresets->SetStringSelection(
text );
1726 m_cbBomPresets->SetSelection( m_cbBomPresets->GetCount() - 3 );
1729 m_currentBomPreset =
static_cast<BOM_PRESET*
>(
1730 m_cbBomPresets->GetClientData( m_cbBomPresets->GetSelection() ) );
1740 wxString ui_label = aName;
1742 for( std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1744 if( pair.first != aName )
1747 if( pair.second.readOnly ==
true )
1748 ui_label = wxGetTranslation( aName );
1772 auto resetSelection =
1781 if( index == count - 3 )
1787 else if( index == count - 2 )
1795 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1797 if( dlg.ShowModal() != wxID_OK )
1803 name = dlg.GetValue();
1821 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1822 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1829 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1848 else if( index == count - 1 )
1851 wxArrayString headers;
1852 std::vector<wxArrayString> items;
1854 headers.Add(
_(
"Presets" ) );
1856 for( std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1858 if( !pair.second.readOnly )
1861 item.Add( pair.first );
1862 items.emplace_back( item );
1874 if( idx != wxNOT_FOUND )
1921 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1926 for(
int j = 0; j <
m_fieldsCtrl->GetItemCount(); j++ )
1941 for(
int i = 0; i <
m_fieldsCtrl->GetItemCount(); i++ )
1948 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
1953 std::string fieldNameStr( fieldName.ToUTF8() );
1958 m_grid->SetColLabelValue( col, label );
1995 std::vector<BOM_FMT_PRESET> ret;
1997 for(
const std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
1999 if( !pair.second.readOnly )
2000 ret.emplace_back( pair.second );
2030 wxCommandEvent
dummy;
2074 int default_idx = 0;
2076 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2079 static_cast<void*
>( &pair.second ) );
2106 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
2108 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
2109 && aPair.second.stringDelimiter == current.stringDelimiter
2110 && aPair.second.refDelimiter == current.refDelimiter
2111 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
2112 && aPair.second.keepTabs == current.keepTabs
2113 && aPair.second.keepLineBreaks == current.keepLineBreaks );
2120 bool do_translate = it->second.readOnly;
2121 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
2141 wxString ui_label = aName;
2143 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2145 if( pair.first != aName )
2148 if( pair.second.readOnly ==
true )
2149 ui_label = wxGetTranslation( aName );
2174 auto resetSelection =
2183 if( index == count - 3 )
2189 else if( index == count - 2 )
2197 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
2199 if( dlg.ShowModal() != wxID_OK )
2205 name = dlg.GetValue();
2223 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2224 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2231 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2250 else if( index == count - 1 )
2253 wxArrayString headers;
2254 std::vector<wxArrayString> items;
2256 headers.Add(
_(
"Presets" ) );
2258 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2260 if( !pair.second.readOnly )
2263 item.Add( pair.first );
2264 items.emplace_back( item );
2276 if( idx != wxNOT_FOUND )
2329 bool modified =
false;
2332 std::vector<BOM_PRESET> presets;
2334 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
2336 if( !pair.second.readOnly )
2337 presets.emplace_back( pair.second );
2353 std::vector<BOM_FMT_PRESET> fmts;
2355 for(
const std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2357 if( !pair.second.readOnly )
2358 fmts.emplace_back( pair.second );
2379 std::vector<SCH_ITEM*>& aSchItem )
2396 AddField( field.GetCanonicalName(), field.GetName(),
true,
false, true );
2402 std::set<SCH_SYMBOL*> symbols;
2406 symbols.insert( ref.GetSymbol() );
2411 for(
SCH_FIELD& field : symbol->GetFields() )
2412 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2426 std::vector<SCH_ITEM*>& aSchItem )
2448 std::vector<SCH_ITEM*>& aSchItem )
2465 AddField( field.GetCanonicalName(), field.GetName(),
true,
false, true );
2471 std::set<SCH_SYMBOL*> symbols;
2475 symbols.insert( ref.GetSymbol() );
2480 for(
SCH_FIELD& field : symbol->GetFields() )
2481 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2510 wxEVT_GRID_RANGE_SELECTED,
2519 wxEVT_GRID_RANGE_SELECTED,
2531 for(
size_t i = 0; i < aCachedRefs.
GetCount(); i++ )
2558 if( basePath.Path() == instance.m_Path )
2566 subSheets.push_back( sheetPath );
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Modify a given item in the model.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
int vertPixelsFromDU(int y) const
Convert an integer number of dialog units to pixels, vertically.
void SetInitialFocus(wxWindow *aWindow)
Sets the window (usually a wxTextCtrl) that should be focused when the dialog is shown.
void SetupStandardButtons(std::map< int, wxString > aLabels={})
int horizPixelsFromDU(int x) const
Convert an integer number of dialog units to pixels, horizontally.
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
Class DIALOG_SYMBOL_FIELDS_TABLE_BASE.
wxRadioButton * m_radioRecursive
wxCheckBox * m_checkShowExcluded
wxCheckBox * m_checkKeepLineBreaks
STD_BITMAP_BUTTON * m_bRefreshPreview
wxRadioButton * m_radioOff
wxStaticText * m_bomPresetsLabel
wxCheckBox * m_checkKeepTabs
wxButton * m_buttonExport
STD_BITMAP_BUTTON * m_removeFieldButton
STD_BITMAP_BUTTON * m_browseButton
wxRadioButton * m_radioSelect
wxTextCtrl * m_textOutput
STD_BITMAP_BUTTON * m_bRefresh
STD_BITMAP_BUTTON * m_renameFieldButton
STD_BITMAP_BUTTON * m_addFieldButton
wxTextCtrl * m_textStringDelimiter
wxChoice * m_cbBomPresets
wxTextCtrl * m_outputFileName
wxSplitterWindow * m_splitterMainWindow
wxDataViewListCtrl * m_fieldsCtrl
wxCheckBox * m_checkExcludeDNP
wxRadioButton * m_radioCurrentSheet
wxTextCtrl * m_textFieldDelimiter
wxCheckBox * m_groupSymbolsBox
wxRadioButton * m_radioHighlight
wxStaticText * m_labelBomExportPresets
wxTextCtrl * m_textRefRangeDelimiter
wxRadioButton * m_radioProject
wxChoice * m_cbBomFmtPresets
wxTextCtrl * m_textRefDelimiter
void OnTableColSize(wxGridSizeEvent &event) override
void OnSaveAndContinue(wxCommandEvent &aEvent) override
void OnSchItemsRemoved(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem) override
BOM_FMT_PRESET * m_currentBomFmtPreset
void OnPreviewRefresh(wxCommandEvent &event) override
void OnAddField(wxCommandEvent &event) override
SCH_REFERENCE_LIST getSheetSymbolReferences(SCH_SHEET &aSheet)
void SetUserBomPresets(std::vector< BOM_PRESET > &aPresetList)
void OnOk(wxCommandEvent &aEvent) override
void OnGroupSymbolsToggled(wxCommandEvent &event) override
void OnColumnItemToggled(wxDataViewEvent &event) override
void OnColMove(wxGridEvent &aEvent)
void OnSchItemsAdded(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem) override
void loadDefaultBomFmtPresets()
std::map< wxString, BOM_PRESET > m_bomPresets
void OnSchItemsChanged(SCHEMATIC &aSch, std::vector< SCH_ITEM * > &aSchItem) override
void ApplyBomFmtPreset(const wxString &aPresetName)
SCH_EDIT_FRAME * m_parent
bool TransferDataFromWindow() override
SCH_REFERENCE_LIST m_symbolsList
void SetupColumnProperties(int aCol)
FIELDS_EDITOR_GRID_DATA_MODEL * m_dataModel
void updateBomPresetSelection(const wxString &aName)
void OnTableItemContextMenu(wxGridEvent &event) override
void updateBomFmtPresetSelection(const wxString &aName)
void OnFilterText(wxCommandEvent &aEvent) override
void OnScopeChanged(wxCommandEvent &aEvent) override
void OnRemoveField(wxCommandEvent &event) override
void OnTableCellClick(wxGridEvent &event) override
void OnShowExcludedToggled(wxCommandEvent &event) override
wxArrayString m_bomPresetMRU
void OnColLabelChange(wxDataViewEvent &aEvent)
void doApplyBomFmtPreset(const BOM_FMT_PRESET &aPreset)
void loadDefaultBomPresets()
void onBomPresetChanged(wxCommandEvent &aEvent)
void OnTableValueChanged(wxGridEvent &event) override
void OnExport(wxCommandEvent &aEvent) override
void OnClose(wxCloseEvent &aEvent) override
void OnSchSheetChanged(SCHEMATIC &aSch) override
void syncBomFmtPresetSelection()
void OnFieldsCtrlSelectionChanged(wxDataViewEvent &event) override
void DisableSelectionEvents()
bool TransferDataToWindow() override
void OnTableRangeSelected(wxGridRangeSelectEvent &aEvent)
void EnableSelectionEvents()
std::vector< BOM_FMT_PRESET > GetUserBomFmtPresets() const
wxArrayString m_bomFmtPresetMRU
void OnCancel(wxCommandEvent &aEvent) override
void OnFilterMouseMoved(wxMouseEvent &event) override
std::map< wxString, BOM_FMT_PRESET > m_bomFmtPresets
DIALOG_SYMBOL_FIELDS_TABLE(SCH_EDIT_FRAME *parent, JOB_EXPORT_SCH_BOM *aJob=nullptr)
BOM_FMT_PRESET GetCurrentBomFmtSettings()
Returns a formatting configuration corresponding to the values in the UI controls of the dialog.
void savePresetsToSchematic()
void SetupAllColumnProperties()
void AddField(const wxString &displayName, const wxString &aCanonicalName, bool show, bool groupBy, bool addedByUser=false)
SCH_REFERENCE_LIST getSymbolReferences(SCH_SYMBOL *aSymbol, SCH_REFERENCE_LIST &aCachedRefs)
SCHEMATIC_SETTINGS & m_schSettings
void syncBomPresetSelection()
void OnSizeFieldList(wxSizeEvent &event) override
void doApplyBomPreset(const BOM_PRESET &aPreset)
void OnPageChanged(wxNotebookEvent &event) override
void SetUserBomFmtPresets(std::vector< BOM_FMT_PRESET > &aPresetList)
void OnRegroupSymbols(wxCommandEvent &aEvent) override
void OnColSort(wxGridEvent &aEvent)
JOB_EXPORT_SCH_BOM * m_job
virtual ~DIALOG_SYMBOL_FIELDS_TABLE()
std::vector< BOM_PRESET > GetUserBomPresets() const
void OnOutputFileBrowseClicked(wxCommandEvent &event) override
void LoadFieldNames()
Construct the rows of m_fieldsCtrl and the columns of m_dataModel from a union of all field names in ...
void onBomFmtPresetChanged(wxCommandEvent &aEvent)
void ApplyBomPreset(const wxString &aPresetName)
void OnExcludeDNPToggled(wxCommandEvent &event) override
void rebuildBomFmtPresetsWidget()
BOM_PRESET * m_lastSelectedBomPreset
void rebuildBomPresetsWidget()
BOM_PRESET * m_currentBomPreset
BOM_FMT_PRESET * m_lastSelectedBomFmtPreset
void OnRenameField(wxCommandEvent &event) override
A base class for most all the KiCad significant classes used in schematics and boards.
KICAD_T Type() const
Returns the type of object.
EDA_ITEM * GetParent() const
wxString GetTextSelection(int aColumn=0)
Return the selected text from aColumn in the wxListCtrl in the dialog.
void SetListLabel(const wxString &aLabel)
PANEL_FIELD_EDITOR m_FieldEditorPanel
wxString GetColFieldName(int aCol)
int GetFieldNameCol(wxString aFieldName)
void ApplyBomPreset(const BOM_PRESET &preset)
std::vector< SCH_REFERENCE > GetRowReferences(int aRow) const
void SetGroupingEnabled(bool group)
bool ColIsItemNumber(int aCol)
int GetNumberCols() override
bool ColIsQuantity(int aCol)
bool GetGroupColumn(int aCol)
wxString GetColLabelValue(int aCol) override
BOM_PRESET GetBomSettings()
void SetScope(SCOPE aScope)
bool ColIsReference(int aCol)
bool GetGroupingEnabled()
void SetPath(const SCH_SHEET_PATH &aPath)
int GetNumberRows() override
void RenameColumn(int aCol, const wxString &newName)
wxString Export(const BOM_FMT_PRESET &settings)
void AddColumn(const wxString &aFieldName, const wxString &aLabel, bool aAddedByUser)
void SetSorting(int aCol, bool ascending)
void ExpandCollapseRow(int aRow)
void SetFilter(const wxString &aFilter)
static const wxString ITEM_NUMBER_VARIABLE
void SetIncludeExcludedFromBOM(bool include)
int GetDataWidth(int aCol)
void UpdateReferences(const SCH_REFERENCE_LIST &aRefs)
void ApplyData(std::function< void(SCH_SYMBOL &, SCH_SHEET_PATH &)> symbolChangeHandler)
void RemoveColumn(int aCol)
const wxString & GetFilter()
static const wxString QUANTITY_VARIABLE
bool ColIsValue(int aCol)
void SetGroupColumn(int aCol, bool group)
void SetExcludeDNP(bool exclude)
void RemoveSymbol(const SCH_SYMBOL &aSymbol)
bool ColIsAttribute(int aCol)
bool GetShowColumn(int aCol)
void SetColLabelValue(int aCol, const wxString &aLabel) override
void MoveColumn(int aCol, int aNewPos)
void RemoveReferences(const SCH_REFERENCE_LIST &aRefs)
bool GetIncludeExcludedFromBOM()
void SetShowColumn(int aCol, bool show)
void AddReferences(const SCH_REFERENCE_LIST &aRefs)
const std::vector< BOM_FIELD > GetFieldsOrdered()
wxDataViewListCtrl * m_fieldsCtrl
void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent) override
FIELDS_EDITOR_GRID_TRICKS(DIALOG_SHIM *aParent, WX_GRID *aGrid, wxDataViewListCtrl *aFieldsCtrl, FIELDS_EDITOR_GRID_DATA_MODEL *aDataModel)
void doPopupSelection(wxCommandEvent &event) override
FIELDS_EDITOR_GRID_DATA_MODEL * m_dataModel
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
virtual void doPopupSelection(wxCommandEvent &event)
virtual void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent)
WX_GRID * m_grid
I don't own the grid, but he owns me.
bool m_includeExcludedFromBOM
std::vector< wxString > m_fieldsLabels
std::vector< wxString > m_fieldsOrdered
wxString GetSettingsDialogTitle() const override
wxString m_refRangeDelimiter
std::vector< wxString > m_fieldsGroupBy
wxString m_stringDelimiter
wxString m_fieldDelimiter
wxString m_bomFmtPresetName
void SetConfiguredOutputPath(const wxString &aPath)
Sets the configured output path for the job, this path is always saved to file.
wxString GetConfiguredOutputPath() const
Returns the configured output path for the job.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
static REPORTER & GetInstance()
static SEARCH_STACK * SchSearchS(PROJECT *aProject)
Accessor for Eeschema search stack.
virtual const wxString AbsolutePath(const wxString &aFileName) const
Fix up aFileName if it is relative to the project's directory to be an absolute path and filename.
wxString m_BomExportFileName
BOM_FMT_PRESET m_BomFmtSettings
List of stored BOM format presets.
TEMPLATES m_TemplateFieldNames
std::vector< BOM_PRESET > m_BomPresets
std::vector< BOM_FMT_PRESET > m_BomFmtPresets
BOM_PRESET m_BomSettings
List of stored BOM presets.
Holds all the data relating to one schematic.
SCH_SHEET_PATH & CurrentSheet() const override
void RemoveListener(SCHEMATIC_LISTENER *aListener)
Remove the specified listener.
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
SCH_SHEET_LIST Hierarchy() const override
Return the full schematic flattened hierarchical sheet list.
void AddListener(SCHEMATIC_LISTENER *aListener)
Add a listener to the schematic to receive calls whenever something on the schematic has been modifie...
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
void SyncView()
Mark all items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Execute the changes.
Handle actions specific to the schematic editor.
Schematic editor (Eeschema) main window.
void OnModify() override
Must be called after a schematic change in order to set the "modify" flag and update other data struc...
SCH_SHEET_PATH & GetCurrentSheet() const
SCHEMATIC & Schematic() const
void SetCurrentSheet(const SCH_SHEET_PATH &aSheet)
bool SaveProject(bool aSaveAs=false)
Save the currently-open schematic (including its hierarchy) and associated project.
void FocusOnItem(SCH_ITEM *aItem)
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
Base class for any item which can be embedded within the SCHEMATIC container class,...
Container to create a flattened list of symbols because in a complex hierarchy, a symbol can be used ...
void AddItem(const SCH_REFERENCE &aItem)
A helper to define a symbol's reference designator in a schematic.
void Split()
Attempt to split the reference designator into a name (U) and number (1).
SCH_SYMBOL * GetSymbol() const
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void GetSymbols(SCH_REFERENCE_LIST &aReferences, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets.
void GetSheetsWithinPath(std::vector< SCH_SHEET_PATH > &aSheets, const SCH_SHEET_PATH &aSheetPath) const
Add a SCH_SHEET_PATH object to aSheets for each sheet in the list that are contained within aSheetPat...
void GetSymbolsWithinPath(SCH_REFERENCE_LIST &aReferences, const SCH_SHEET_PATH &aSheetPath, bool aIncludePowerSymbols=true, bool aForceIncludeOrphanSymbols=false) const
Add a SCH_REFERENCE object to aReferences for each symbol in the list of sheets that are contained wi...
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
SCH_SCREEN * LastScreen()
void push_back(SCH_SHEET *aSheet)
Forwarded method from std::vector.
Sheet symbol placed in a schematic, and is the entry point for a sub schematic.
const std::vector< SCH_SHEET_INSTANCE > & GetInstances() const
int GetFieldCount() const
Return the number of fields in this symbol.
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) override
Populate a std::vector with SCH_FIELDs.
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
bool IsPower() const override
const TEMPLATE_FIELDNAMES & GetTemplateFieldNames()
Return a template field name list for read only access.
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
wxString ExpandTextVars(const wxString &aSource, const PROJECT *aProject, int aFlags)
bool EnsureFileDirectoryExists(wxFileName *aTargetFullFileName, const wxString &aBaseFilename, REPORTER *aReporter)
Make aTargetFullFileName absolute and create the path of this file if it doesn't yet exist.
bool IsTextVar(const wxString &aSource)
Returns true if the string is a text var, e.g starts with ${.
wxString GetTextVars(const wxString &aSource)
Returns any variables unexpanded, e.g.
int OKOrCancelDialog(wxWindow *aParent, const wxString &aWarning, const wxString &aMessage, const wxString &aDetailedMessage, const wxString &aOKLabel, const wxString &aCancelLabel, bool *aApplyToAll)
Display a warning dialog with aMessage and returns the user response.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
void DisplayInfoMessage(wxWindow *aParent, const wxString &aMessage, const wxString &aExtraInfo)
Display an informational message box with aMessage.
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
This file is part of the common library.
wxDEFINE_EVENT(EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxCommandEvent)
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, PROJECT *aProject, SEARCH_STACK *aPaths, EMBEDDED_FILES *aFiles)
Open a document (file) with the suitable browser.
This file is part of the common library.
#define DISPLAY_NAME_COLUMN
#define FIELD_NAME_COLUMN
#define SHOW_FIELD_COLUMN
@ FRAME_FOOTPRINT_CHOOSER
@ GRIDTRICKS_FIRST_SHOWHIDE
@ GRIDTRICKS_FIRST_CLIENT_ID
static const std::string CsvFileExtension
static wxString CsvFileWildcard()
KICOMMON_API wxFont GetInfoFont(wxWindow *aWindow)
KICOMMON_API wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
std::vector< FAB_LAYER_COLOR > dummy
#define TO_UTF8(wxstring)
Convert a wxString to a UTF8 encoded C string for all wxWidgets build modes.
static BOM_FMT_PRESET CSV()
static std::vector< BOM_FMT_PRESET > BuiltInPresets()
wxString refRangeDelimiter
static BOM_PRESET DefaultEditing()
std::vector< BOM_FIELD > fieldsOrdered
bool includeExcludedFromBOM
static std::vector< BOM_PRESET > BuiltInPresets()
std::map< std::string, int > field_widths
A simple container for sheet instance information.
Hold a name of a symbol's field, field value, and default visibility.
Definition for symbol library class.
wxString GetDefaultFieldName(int aFieldNdx, bool aTranslateForHI)
Return a default symbol field name for field aFieldNdx for all components.
wxString GetCanonicalFieldName(int idx)
@ DATASHEET_FIELD
name of datasheet
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT, LIB_PART, and FOOTPRINT constru...
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
Definition of file extensions used in Kicad.