51#include <wx/textdlg.h>
52#include <wx/filedlg.h>
62#define COLUMN_MARGIN 3
64#define COLUMN_MARGIN 15
80 wxDataViewListCtrl* aFieldsCtrl,
94 _(
"Browse for footprint" ) );
95 menu.AppendSeparator();
100 _(
"Show datasheet in browser" ) );
101 menu.AppendSeparator();
112 wxString fpid =
m_grid->GetCellValue(
m_grid->GetGridCursorRow(),
123 wxString datasheet_uri =
m_grid->GetCellValue(
m_grid->GetGridCursorRow(),
145 for(
int row = 0; row <
m_fieldsCtrl->GetItemCount(); row++ )
167 m_lastSelectedBomPreset( nullptr ), m_parent( parent ),
168 m_schSettings( parent->Schematic().Settings() )
190 m_fieldsCtrl->AppendTextColumn(
_(
"Field" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
191 m_fieldsCtrl->AppendTextColumn(
_(
"Label" ), wxDATAVIEW_CELL_EDITABLE, 0, wxALIGN_LEFT, 0 );
192 m_fieldsCtrl->AppendToggleColumn(
_(
"Show" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
194 m_fieldsCtrl->AppendToggleColumn(
_(
"Group By" ), wxDATAVIEW_CELL_ACTIVATABLE, 0,
199 m_fieldsCtrl->AppendTextColumn(
_(
"Name" ), wxDATAVIEW_CELL_INERT, 0, wxALIGN_LEFT, 0 );
215 m_filter->SetDescriptiveText(
_(
"Filter" ) );
231 for(
int row = 0; row <
m_fieldsCtrl->GetItemCount(); ++row )
254 m_grid->UseNativeColHeader(
true );
258 m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
265 m_grid->SetDefaultRowSize(
m_grid->GetDefaultRowSize() + 4 );
304 case SCOPE::SCOPE_SHEET_RECURSIVE:
m_radioRecursive->SetValue(
true );
break;
312 m_grid->Connect( wxEVT_GRID_COL_SORT,
314 m_grid->Connect( wxEVT_GRID_COL_MOVE,
328 wxGridCellAttr* attr =
new wxGridCellAttr;
329 attr->SetReadOnly(
false );
335 m_grid->SetColAttr( aCol, attr );
341 m_grid->SetColAttr( aCol, attr );
349 m_grid->SetColAttr( aCol, attr );
354 m_grid->SetColAttr( aCol, attr );
355 m_grid->SetColFormatNumber( aCol );
359 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
360 m_grid->SetColAttr( aCol, attr );
361 m_grid->SetColFormatBool( aCol );
366 m_grid->SetColAttr( aCol, attr );
370 attr->SetEditor(
m_grid->GetDefaultEditor() );
371 m_grid->SetColAttr( aCol, attr );
372 m_grid->SetColFormatCustom( aCol, wxGRID_VALUE_STRING );
380 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
383 m_grid->AutoSizeColumns(
false );
385 bool sortAscending =
true;
387 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
423 int maxWidth = defaultDlgSize.x / 3;
425 m_grid->SetColSize( col,
Clamp( 100, textWidth, maxWidth ) );
435 m_grid->SetSortingColumn( sortCol, sortAscending );
442 m_grid->Disconnect( wxEVT_GRID_COL_SORT,
445 m_grid->Disconnect( wxEVT_GRID_COL_SORT,
450 m_grid->PopEventHandler(
true );
458 if( !wxDialog::TransferDataFromWindow() )
468 if( selection.GetSize() == 1 )
487 if( ref.GetSymbol() == symbol )
512 m_grid->GoToCell( row, valueCol );
514 m_grid->GoToCell( row, refCol );
515 else if( anyCol != -1 )
516 m_grid->GoToCell( row, anyCol );
537 if( !wxDialog::TransferDataFromWindow() )
551 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
565 bool show,
bool groupBy,
bool addedByUser )
575 wxVector<wxVariant> fieldsCtrlRow;
577 std::string key( aFieldName.ToUTF8() );
580 fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
581 fieldsCtrlRow.push_back( wxVariant( aLabelValue ) );
582 fieldsCtrlRow.push_back( wxVariant( show ) );
583 fieldsCtrlRow.push_back( wxVariant( groupBy ) );
584 fieldsCtrlRow.push_back( wxVariant( aFieldName ) );
588 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
589 m_grid->ProcessTableMessage( msg );
599 bool groupBy =
false;
624 std::set<wxString> userFieldNames;
631 userFieldNames.insert( symbol->
GetFields()[j].GetName() );
634 for(
const wxString& fieldName : userFieldNames )
641 if( userFieldNames.count( templateFieldname.m_Name ) == 0 )
650 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
652 if( dlg.ShowModal() != wxID_OK )
655 wxString fieldName = dlg.GetValue();
657 if( fieldName.IsEmpty() )
667 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ),
688 wxCHECK_RET( row != -1, wxS(
"Some user defined field must be selected first" ) );
689 wxCHECK_RET( row >=
MANDATORY_FIELDS, wxS(
"Mandatory fields cannot be removed" ) );
694 wxString confirm_msg =
695 wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ), displayName );
697 if( !
IsOK(
this, confirm_msg ) )
719 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_DELETED, col, 1 );
721 m_grid->ProcessTableMessage( msg );
734 wxCHECK_RET( row != -1, wxS(
"Some user defined field must be selected first" ) );
735 wxCHECK_RET( row >=
MANDATORY_FIELDS, wxS(
"Mandatory fields cannot be renamed" ) );
736 wxCHECK_RET( !fieldName.IsEmpty(), wxS(
"Field must have a name" ) );
739 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
741 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ) );
743 if( dlg.ShowModal() != wxID_OK )
746 wxString newFieldName = dlg.GetValue();
749 if( newFieldName == fieldName )
755 wxString confirm_msg = wxString::Format(
756 _(
"Field name %s already exists. Cannot rename over existing field." ),
782 wxPoint pos = aEvent.GetPosition();
783 wxRect ctrlRect =
m_filter->GetScreenRect();
784 int buttonWidth = ctrlRect.GetHeight();
786 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
787 SetCursor( wxCURSOR_ARROW );
788 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
789 SetCursor( wxCURSOR_ARROW );
791 SetCursor( wxCURSOR_IBEAM );
813 wxDataViewItem item =
event.GetItem();
815 int col =
event.GetColumn();
830 m_grid->ShowCol( dataCol );
832 m_grid->HideCol( dataCol );
846 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
854 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
898 int sortCol = aEvent.GetCol();
911 if(
m_grid->IsSortingBy( sortCol ) )
914 ascending = !
m_grid->IsSortOrderAscending();
932 int origPos = aEvent.GetCol();
937 int newPos =
m_grid->GetColPos( origPos );
956 wxDataViewItem item = aEvent.GetItem();
980 int col = aEvent.GetRowOrCol();
1018 m_grid->ClearSelection();
1021 m_grid->SetGridCursor( event.GetRow(), event.GetCol() );
1033 std::set<SCH_REFERENCE> refs;
1034 std::set<SCH_ITEM*> symbols;
1037 if( aEvent.Selecting() )
1039 for(
int i = aEvent.GetTopRow(); i <= aEvent.GetBottomRow(); i++ )
1046 symbols.insert( ref.GetSymbol() );
1053 if( refs.size() > 0 )
1056 wxString symbol_path = refs.begin()->GetFullPath();
1071 std::vector<SCH_ITEM*> items( symbols.begin(), symbols.end() );
1073 if( refs.size() > 0 )
1074 selTool->
SyncSelection( refs.begin()->GetSheetPath(),
nullptr, items );
1189 wxFileDialog saveDlg(
this,
_(
"Selected Output Filename" ),
path, fn.GetFullName(),
1192 if( saveDlg.ShowModal() == wxID_CANCEL )
1196 wxFileName file = wxFileName( saveDlg.GetPath() );
1197 wxString defaultPath = fn.GetPathWithSep();
1199 msg.Printf(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath );
1201 wxMessageDialog dialog(
this, msg,
_(
"BOM Output File" ),
1202 wxYES_NO | wxICON_QUESTION | wxYES_DEFAULT );
1204 if( dialog.ShowModal() == wxID_YES )
1206 if( !file.MakeRelativeTo( defaultPath ) )
1208 wxMessageBox(
_(
"Cannot make path relative (target volume different from schematic "
1210 _(
"BOM Output File" ), wxOK | wxICON_ERROR );
1222 _(
"Changes are unsaved. Export unsaved data?" ),
"",
_(
"OK" ),
1230 std::function<bool( wxString* )> textResolver = [&]( wxString* token ) ->
bool
1240 wxFileName outputFile = wxFileName::FileName(
path );
1242 auto displayErr = [&]()
1245 msg.Printf(
_(
"Could not write BOM output to '%s'." ), outputFile.GetPath() );
1257 wxFFile out( outputFile.GetFullPath(),
"wb" );
1259 if( !out.IsOpened() )
1274 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1336 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1338 if(
m_grid->IsColShown( i ) )
1347 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1349 wxWindow* parent = GetParent();
1352 wxQueueEvent( parent, evt );
1358 std::vector<BOM_PRESET> ret;
1360 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1362 if( !pair.second.readOnly )
1363 ret.emplace_back( pair.second );
1375 for(
const BOM_PRESET& preset : aPresetList )
1393 wxCommandEvent
dummy;
1436 int default_idx = 0;
1438 for( std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1441 static_cast<void*
>( &pair.second ) );
1467 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1469 const BOM_PRESET& preset = aPair.second;
1472 if( !( preset.sortField == current.sortField
1473 && preset.sortAsc == current.sortAsc
1474 && preset.filterString == current.filterString
1475 && preset.groupSymbols == current.groupSymbols
1476 && preset.excludeDNP == current.excludeDNP ) )
1480 std::vector<BOM_FIELD> A, B;
1482 for( const BOM_FIELD& field : preset.fieldsOrdered )
1483 if( field.show || field.groupBy )
1484 A.emplace_back( field );
1486 for( const BOM_FIELD& field : current.fieldsOrdered )
1487 if( field.show || field.groupBy )
1488 B.emplace_back( field );
1497 bool do_translate = it->second.readOnly;
1498 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1518 wxString ui_label = aName;
1520 for( std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1522 if( pair.first != aName )
1525 if( pair.second.readOnly ==
true )
1526 ui_label = wxGetTranslation( aName );
1550 auto resetSelection =
1559 if( index == count - 3 )
1565 else if( index == count - 2 )
1573 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1575 if( dlg.ShowModal() != wxID_OK )
1581 name = dlg.GetValue();
1599 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1600 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1607 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1626 else if( index == count - 1 )
1629 wxArrayString headers;
1630 std::vector<wxArrayString> items;
1632 headers.Add(
_(
"Presets" ) );
1634 for( std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1636 if( !pair.second.readOnly )
1639 item.Add( pair.first );
1640 items.emplace_back( item );
1647 if( dlg.ShowModal() == wxID_OK )
1652 if( idx != wxNOT_FOUND )
1699 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1704 for(
int j = 0; j <
m_fieldsCtrl->GetItemCount(); j++ )
1719 for(
int i = 0; i <
m_fieldsCtrl->GetItemCount(); i++ )
1726 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
1731 std::string fieldNameStr( fieldName.ToUTF8() );
1736 m_grid->SetColLabelValue( col, label );
1772 std::vector<BOM_FMT_PRESET> ret;
1774 for(
const std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
1776 if( !pair.second.readOnly )
1777 ret.emplace_back( pair.second );
1807 wxCommandEvent
dummy;
1851 int default_idx = 0;
1853 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
1856 static_cast<void*
>( &pair.second ) );
1883 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
1885 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
1886 && aPair.second.stringDelimiter == current.stringDelimiter
1887 && aPair.second.refDelimiter == current.refDelimiter
1888 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
1889 && aPair.second.keepTabs == current.keepTabs
1890 && aPair.second.keepLineBreaks == current.keepLineBreaks );
1897 bool do_translate = it->second.readOnly;
1898 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1918 wxString ui_label = aName;
1920 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
1922 if( pair.first != aName )
1925 if( pair.second.readOnly ==
true )
1926 ui_label = wxGetTranslation( aName );
1951 auto resetSelection =
1960 if( index == count - 3 )
1966 else if( index == count - 2 )
1974 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1976 if( dlg.ShowModal() != wxID_OK )
1982 name = dlg.GetValue();
2000 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2001 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2008 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2027 else if( index == count - 1 )
2030 wxArrayString headers;
2031 std::vector<wxArrayString> items;
2033 headers.Add(
_(
"Presets" ) );
2035 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2037 if( !pair.second.readOnly )
2040 item.Add( pair.first );
2041 items.emplace_back( item );
2048 if( dlg.ShowModal() == wxID_OK )
2053 if( idx != wxNOT_FOUND )
2108 std::vector<BOM_PRESET> presets;
2110 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
2112 if( !pair.second.readOnly )
2113 presets.emplace_back( pair.second );
2120 std::vector<BOM_FMT_PRESET> fmts;
2122 for(
const std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2124 if( !pair.second.readOnly )
2125 fmts.emplace_back( pair.second );
2134 std::vector<SCH_ITEM*>& aSchItem )
2144 AddField( field.GetCanonicalName(), field.GetName(),
true,
false, true );
2150 std::set<SCH_SYMBOL*> symbols;
2154 symbols.insert( ref.GetSymbol() );
2159 for(
SCH_FIELD& field : symbol->GetFields() )
2160 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2174 std::vector<SCH_ITEM*>& aSchItem )
2192 std::vector<SCH_ITEM*>& aSchItem )
2202 AddField( field.GetCanonicalName(), field.GetName(),
true,
false, true );
2208 std::set<SCH_SYMBOL*> symbols;
2212 symbols.insert( ref.GetSymbol() );
2217 for(
SCH_FIELD& field : symbol->GetFields() )
2218 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2247 wxEVT_GRID_RANGE_SELECTED,
2256 wxEVT_GRID_RANGE_SELECTED,
2270 for(
size_t i = 0; i < allRefs.
GetCount(); i++ )
2297 if( basePath.Path() == instance.m_Path )
2305 subSheets.push_back( sheetPath );
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
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_checkKeepLineBreaks
STD_BITMAP_BUTTON * m_bRefreshPreview
wxRadioButton * m_radioOff
wxStaticText * m_bomPresetsLabel
wxCheckBox * m_checkKeepTabs
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
BITMAP_BUTTON * m_separator1
wxSplitterWindow * m_splitterMainWindow
wxDataViewListCtrl * m_fieldsCtrl
wxCheckBox * m_checkExcludeDNP
wxRadioButton * m_radioCurrentSheet
wxTextCtrl * m_textFieldDelimiter
wxCheckBox * m_groupSymbolsBox
BITMAP_BUTTON * m_separator2
wxRadioButton * m_radioHighlight
wxStaticText * m_labelBomExportPresets
wxTextCtrl * m_textRefRangeDelimiter
wxRadioButton * m_radioProject
BITMAP_BUTTON * m_separator11
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
DIALOG_SYMBOL_FIELDS_TABLE(SCH_EDIT_FRAME *parent)
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()
SCH_REFERENCE_LIST getSymbolReferences(SCH_SYMBOL *aSymbol)
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
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)
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)
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)
void SetShowColumn(int aCol, bool show)
void AddReferences(const SCH_REFERENCE_LIST &aRefs)
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.
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 bool ShowModal(wxString *aResult=nullptr, wxWindow *aResultantFocusWindow=nullptr)
Show this wxFrame as if it were a modal dialog, with all other instantiated wxFrames disabled until t...
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
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.
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.
bool ResolveTextVar(wxString *token, int aDepth) const
wxString GetFileName() const override
Helper to retrieve the filename from the root sheet screen.
SCH_SHEET_LIST GetSheets() const override
Builds and returns an updated schematic hierarchy TODO: can this be cached?
void AddListener(SCHEMATIC_LISTENER *aListener)
Add a listener to the schematic to receive calls whenever something on the schematic has been modifie...
void SyncView()
Mark all items for refresh.
EESCHEMA_SETTINGS * eeconfig() const
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
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 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...
void GetSheetsWithinPath(SCH_SHEET_PATHS &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...
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)
Populate a std::vector with SCH_FIELDs.
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.
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 ExpandTextVars(const wxString &aSource, const PROJECT *aProject)
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)
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
const std::string CsvFileExtension
wxString CsvFileWildcard()
wxFont GetInfoFont(wxWindow *aWindow)
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
static BOM_FMT_PRESET CSV()
static std::vector< BOM_FMT_PRESET > BuiltInPresets()
wxString refRangeDelimiter
static BOM_PRESET GroupedByValue()
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.
static const wxString GetDefaultFieldName(int aFieldNdx, bool aTranslateForHI=false)
Return a default symbol field name for field aFieldNdx for all components.
Definition for symbol library class.
@ 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 and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".
constexpr T Clamp(const T &lower, const T &value, const T &upper)
Limit value within the range lower <= value <= upper.
Definition of file extensions used in Kicad.