50#include <wx/textdlg.h>
51#include <wx/filedlg.h>
63#define COLUMN_MARGIN 3
65#define COLUMN_MARGIN 15
111 int col =
m_grid->GetGridCursorCol();
116 menu.AppendSeparator();
121 menu.AppendSeparator();
129 int row =
m_grid->GetGridCursorRow();
130 int col =
m_grid->GetGridCursorCol();
135 wxString fpid =
m_grid->GetCellValue( row, col );
139 if( frame->ShowModal( &fpid,
m_dlg ) )
140 m_grid->SetCellValue( row, col, fpid );
147 wxString datasheet_uri =
m_grid->GetCellValue( row, col );
153 if( !
m_grid->CommitPendingChanges(
false ) )
161 m_dlg->ShowHideColumn( col, show );
163 wxString fieldName =
m_dataModel->GetColFieldName( col );
227 wxGridCellAttr* attr =
new wxGridCellAttr;
228 attr->SetReadOnly(
true );
231 attr =
new wxGridCellAttr;
232 attr->SetRenderer(
new wxGridCellBoolRenderer() );
234 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
237 attr =
new wxGridCellAttr;
238 attr->SetRenderer(
new wxGridCellBoolRenderer() );
240 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
246 m_filter->SetDescriptiveText(
_(
"Filter" ) );
248 attr =
new wxGridCellAttr;
254 m_grid->UseNativeColHeader(
true );
258 m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
276 SetTitle(
m_job->GetSettingsDialogTitle() );
289 for(
const wxString& fieldName :
m_job->m_fieldsOrdered )
292 field.
name = fieldName;
293 field.
show = !fieldName.StartsWith( wxT(
"__" ), &field.
name );
296 if( (
m_job->m_fieldsLabels.size() > i ) && !
m_job->m_fieldsLabels[i].IsEmpty() )
321 fmtPreset.
name =
m_job->m_bomFmtPresetName;
346 CallAfter( [
this, cfg]()
373 m_parent->Schematic().AddListener(
this );
378 m_grid->EnableEditing(
false );
395 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
397 if(
m_grid->IsColShown( i ) )
399 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
413 m_grid->PopEventHandler(
true );
423 if( aIsLeftPanelCollapsed )
438 wxGridCellAttr* attr =
new wxGridCellAttr;
439 attr->SetReadOnly(
false );
463 attr->SetAlignment( wxALIGN_RIGHT, wxALIGN_CENTER );
464 attr->SetRenderer(
new wxGridCellNumberRenderer() );
469 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
482 attr->SetEditor(
m_grid->GetDefaultEditor() );
491 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
494 m_grid->AutoSizeColumns(
false );
496 bool sortAscending =
true;
498 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
524 std::string key(
m_dataModel->GetColFieldName( col ).ToUTF8() );
534 int maxWidth = defaultDlgSize.x / 3;
536 m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
546 m_grid->SetSortingColumn( sortCol, sortAscending );
552 if( !wxDialog::TransferDataFromWindow() )
562 wxCommandEvent
dummy;
565 if( selection.GetSize() == 1 )
577 for(
int row = 0; row <
m_dataModel->GetNumberRows(); ++row )
579 std::vector<SCH_REFERENCE> references =
m_dataModel->GetRowReferences( row );
584 if( ref.GetSymbol() == symbol )
598 for(
int col = 0; col <
m_dataModel->GetNumberCols(); col++ )
604 else if( anyCol == -1 &&
m_dataModel->GetShowColumn( col ) )
608 if( valueCol != -1 &&
m_dataModel->GetShowColumn( valueCol ) )
609 m_grid->GoToCell( row, valueCol );
610 else if( refCol != -1 &&
m_dataModel->GetShowColumn( refCol ) )
611 m_grid->GoToCell( row, refCol );
612 else if( anyCol != -1 )
613 m_grid->GoToCell( row, anyCol );
631 if( !
m_grid->CommitPendingChanges() )
634 if( !wxDialog::TransferDataFromWindow() )
643 std::set<wxString> selectedVariantNames;
649 if( !commit.
Empty() )
651 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
656 m_parent->SetCurrentSheet( currentSheet );
665 bool show,
bool groupBy,
bool addedByUser )
677 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
678 m_grid->ProcessTableMessage( msg );
681 [&]() -> std::pair<int, int>
692 auto addMandatoryField =
693 [&](
FIELD_T fieldId,
bool show,
bool groupBy )
713 std::set<wxString> userFieldNames;
721 if( !field.IsMandatory() && !field.IsPrivate() )
722 userFieldNames.insert( field.GetName() );
726 for(
const wxString& fieldName : userFieldNames )
732 if( userFieldNames.count( tfn.m_Name ) == 0 )
740 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
742 if( dlg.ShowModal() != wxID_OK )
745 wxString fieldName = dlg.GetValue();
747 if( fieldName.IsEmpty() )
753 for(
int i = 0; i <
m_dataModel->GetNumberCols(); ++i )
755 if( fieldName ==
m_dataModel->GetColFieldName( i ) )
757 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), fieldName ) );
780 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
786 return IsOK(
this, wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ),
792 int col =
m_dataModel->GetFieldNameCol( fieldName );
812 if( selectedRows.empty() )
815 int row = selectedRows[0];
821 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory and names cannot be changed." ),
829 int col =
m_dataModel->GetFieldNameCol( fieldName );
830 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
832 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ), fieldName );
834 if( dlg.ShowModal() != wxID_OK )
837 wxString newFieldName = dlg.GetValue();
840 if( newFieldName == fieldName )
844 if(
m_dataModel->GetFieldNameCol( newFieldName ) != -1 )
846 wxString confirm_msg = wxString::Format(
_(
"Field name %s already exists." ), newFieldName );
873#if defined( __WXOSX__ ) || wxCHECK_VERSION( 3, 3, 0 )
874 wxPoint pos = aEvent.GetPosition();
875 wxRect ctrlRect =
m_filter->GetScreenRect();
876 int buttonWidth = ctrlRect.GetHeight();
879 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
880 SetCursor( wxCURSOR_ARROW );
881 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
882 SetCursor( wxCURSOR_ARROW );
884 SetCursor( wxCURSOR_IBEAM );
899 switch( aEvent.GetSelection() )
901 case 0:
setScope( SCOPE::SCOPE_ALL );
break;
902 case 1:
setScope( SCOPE::SCOPE_SHEET );
break;
903 case 2:
setScope( SCOPE::SCOPE_SHEET_RECURSIVE );
break;
925 menu.Append( 4204,
_(
"Include 'DNP' Symbols" ),
926 _(
"Show symbols marked 'DNP' in the table. This setting also controls whether or not 'DNP' "
927 "symbols are included on export." ),
931 menu.Append( 4205,
_(
"Include 'Exclude from BOM' Symbols" ),
932 _(
"Show symbols marked 'Exclude from BOM' in the table. Symbols marked 'Exclude from BOM' "
933 "are never included on export." ),
935 menu.Check( 4205,
m_dataModel->GetIncludeExcludedFromBOM() );
937 menu.AppendSeparator();
939 menu.Append( 4206,
_(
"Highlight on Cross-probe" ),
940 _(
"Highlight corresponding item on canvas when it is selected in the table" ),
944 menu.Append( 4207,
_(
"Select on Cross-probe" ),
945 _(
"Select corresponding item on canvas when it is selected in the table" ),
950 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
952 if( menu_id == 0 || menu_id == 4204 )
960 else if( menu_id == 1 || menu_id == 4205 )
968 else if( menu_id == 3 || menu_id == 4206 )
975 else if( menu_id == 4 || menu_id == 4207 )
987 int sortCol = aEvent.GetCol();
988 std::string key(
m_dataModel->GetColFieldName( sortCol ).ToUTF8() );
1000 if(
m_grid->IsSortingBy( sortCol ) )
1003 ascending = !
m_grid->IsSortOrderAscending();
1021 int origPos = aEvent.GetCol();
1026 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1028 if(
m_grid->IsColShown( i ) )
1030 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
1038 int newPos =
m_grid->GetColPos( origPos );
1041 if( newPos < origPos )
1082 int row = aEvent.GetRow();
1084 wxCHECK( row < m_viewControlsGrid->GetNumberRows(), );
1086 switch( aEvent.GetCol() )
1092 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1097 m_grid->SetColLabelValue( dataCol, label );
1115 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1127 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1129 if(
m_dataModel->ColIsQuantity( dataCol ) && value )
1131 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
1138 if(
m_dataModel->ColIsItemNumber( dataCol ) && value )
1140 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
1189 if(
m_dataModel->IsExpanderColumn( event.GetCol() ) )
1191 m_grid->ClearSelection();
1194 m_grid->SetGridCursor( event.GetRow(), event.GetCol() );
1213 std::set<SCH_REFERENCE> refs;
1214 std::set<SCH_ITEM*> symbols;
1217 if( aEvent.Selecting() )
1219 for(
int i = aEvent.GetTopRow(); i <= aEvent.GetBottomRow(); i++ )
1226 symbols.insert( ref.GetSymbol() );
1233 if( refs.size() > 0 )
1237 wxString symbol_path = refs.begin()->GetFullPath();
1250 std::vector<SCH_ITEM*> items( symbols.begin(), symbols.end() );
1252 if( refs.size() > 0 )
1253 selTool->
SyncSelection( refs.begin()->GetSheetPath(),
nullptr, items );
1266 int remainingWidth =
m_viewControlsGrid->GetSize().GetX() - showColWidth - groupByColWidth;
1314 bool saveIncludeExcudedFromBOM =
m_dataModel->GetIncludeExcludedFromBOM();
1321 if( saveIncludeExcudedFromBOM )
1365 wxFileName fn(
Prj().AbsolutePath(
m_parent->Schematic().GetFileName() ) );
1368 wxFileDialog saveDlg(
this,
_(
"Bill of Materials Output File" ),
path, fn.GetFullName(),
1371 if( saveDlg.ShowModal() == wxID_CANCEL )
1375 wxFileName file = wxFileName( saveDlg.GetPath() );
1376 wxString defaultPath = fn.GetPathWithSep();
1378 if(
IsOK(
this, wxString::Format(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath ) ) )
1380 if( !file.MakeRelativeTo( defaultPath ) )
1382 DisplayErrorMessage(
this,
_(
"Cannot make path relative (target volume different from schematic "
1383 "file volume)!" ) );
1417 _(
"Changes have not yet been saved. Export unsaved data?" ),
"",
1418 _(
"OK" ),
_(
"Cancel" ) )
1428 std::function<bool( wxString* )> textResolver =
1429 [&]( wxString* token ) ->
bool
1439 if(
path.IsEmpty() )
1441 DisplayError(
this,
_(
"No output file specified in Export tab." ) );
1448 wxFileName outputFile = wxFileName::FileName(
path );
1454 msg.Printf(
_(
"Could not open/create path '%s'." ), outputFile.GetPath() );
1459 wxFFile out( outputFile.GetFullPath(),
"wb" );
1461 if( !out.IsOpened() )
1463 msg.Printf(
_(
"Could not create BOM output '%s'." ), outputFile.GetFullPath() );
1472 msg.Printf(
_(
"Could not write BOM output '%s'." ), outputFile.GetFullPath() );
1479 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1487 EndModal( wxID_CANCEL );
1504 m_job->m_bomFmtPresetName = wxEmptyString;
1509 m_job->m_bomPresetName = wxEmptyString;
1525 m_job->m_fieldsOrdered.clear();
1526 m_job->m_fieldsLabels.clear();
1527 m_job->m_fieldsGroupBy.clear();
1531 if( modelField.show )
1532 m_job->m_fieldsOrdered.emplace_back( modelField.name );
1534 m_job->m_fieldsOrdered.emplace_back( wxT(
"__" ) + modelField.name );
1536 m_job->m_fieldsLabels.emplace_back( modelField.label );
1538 if( modelField.groupBy )
1539 m_job->m_fieldsGroupBy.emplace_back( modelField.name );
1542 EndModal( wxID_OK );
1559 m_grid->CommitPendingChanges(
true );
1575 m_parent->Schematic().RemoveListener(
this );
1578 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1580 if( wxWindow* parent = GetParent() )
1581 wxQueueEvent( parent, evt );
1587 std::vector<BOM_PRESET> ret;
1589 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1591 if( !pair.second.readOnly )
1592 ret.emplace_back( pair.second );
1604 for(
const BOM_PRESET& preset : aPresetList )
1622 wxCommandEvent
dummy;
1665 int default_idx = 0;
1669 m_cbBomPresets->Append( wxGetTranslation( presetName ), (
void*) &preset );
1694 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1696 const BOM_PRESET& preset = aPair.second;
1699 if( !( preset.sortAsc == current.sortAsc
1700 && preset.filterString == current.filterString
1701 && preset.groupSymbols == current.groupSymbols
1702 && preset.excludeDNP == current.excludeDNP
1703 && preset.includeExcludedFromBOM == current.includeExcludedFromBOM ) )
1714 if( preset.sortField != wxGetTranslation( current.
sortField ) )
1718 std::vector<BOM_FIELD>
A,
B;
1720 for(
const BOM_FIELD& field : preset.fieldsOrdered )
1722 if( field.show || field.groupBy )
1723 A.emplace_back( field );
1728 if( field.show || field.groupBy )
1729 B.emplace_back( field );
1735 if( it != m_bomPresets.end() )
1739 bool do_translate = it->second.readOnly;
1740 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1741 m_cbBomPresets->SetStringSelection(
text );
1745 m_cbBomPresets->SetSelection( m_cbBomPresets->GetCount() - 3 );
1748 m_currentBomPreset =
static_cast<BOM_PRESET*
>( m_cbBomPresets->GetClientData( m_cbBomPresets->GetSelection() ) );
1757 wxString ui_label = aName;
1761 if( presetName == aName )
1763 if( preset.readOnly ==
true )
1764 ui_label = wxGetTranslation( aName );
1789 auto resetSelection =
1798 if(
index == count - 3 )
1804 else if(
index == count - 2 )
1812 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1814 if( dlg.ShowModal() != wxID_OK )
1820 name = dlg.GetValue();
1838 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1839 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1846 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1867 else if(
index == count - 1 )
1870 wxArrayString headers;
1871 std::vector<wxArrayString> items;
1873 headers.Add(
_(
"Presets" ) );
1877 if( !preset.readOnly )
1881 items.emplace_back( item );
1893 if( idx != wxNOT_FOUND )
1943 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1945 const wxString& fieldName(
m_dataModel->GetColFieldName( i ) );
1966 int col =
m_dataModel->GetFieldNameCol( fieldName );
1970 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
1975 std::string fieldNameStr( fieldName.ToUTF8() );
1978 const wxString& label =
m_dataModel->GetColLabelValue( col );
1980 m_grid->SetColLabelValue( col, label );
1995 bool groupBy =
m_dataModel->GetGroupColumn( col );
2019 std::vector<BOM_FMT_PRESET> ret;
2023 if( !preset.readOnly )
2024 ret.emplace_back( preset );
2054 wxCommandEvent
dummy;
2096 int default_idx = 0;
2125 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
2127 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
2128 && aPair.second.stringDelimiter == current.stringDelimiter
2129 && aPair.second.refDelimiter == current.refDelimiter
2130 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
2131 && aPair.second.keepTabs == current.keepTabs
2132 && aPair.second.keepLineBreaks == current.keepLineBreaks );
2139 bool do_translate = it->second.readOnly;
2140 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
2159 wxString ui_label = aName;
2163 if( presetName == aName )
2165 if( preset.readOnly )
2166 ui_label = wxGetTranslation( aName );
2191 auto resetSelection =
2200 if(
index == count - 3 )
2206 else if(
index == count - 2 )
2214 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
2216 if( dlg.ShowModal() != wxID_OK )
2222 name = dlg.GetValue();
2240 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2241 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2248 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2269 else if(
index == count - 1 )
2272 wxArrayString headers;
2273 std::vector<wxArrayString> items;
2275 headers.Add(
_(
"Presets" ) );
2277 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2279 if( !pair.second.readOnly )
2282 item.Add( pair.first );
2283 items.emplace_back( item );
2295 if( idx != wxNOT_FOUND )
2350 bool modified =
false;
2353 std::vector<BOM_PRESET> presets;
2357 if( !preset.readOnly )
2358 presets.emplace_back( preset );
2374 std::vector<BOM_FMT_PRESET> fmts;
2378 if( !preset.readOnly )
2379 fmts.emplace_back( preset );
2402 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2416 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2422 std::set<SCH_SYMBOL*> symbols;
2426 symbols.insert( ref.GetSymbol() );
2431 for(
SCH_FIELD& field : symbol->GetFields() )
2432 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2464 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2478 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2484 std::set<SCH_SYMBOL*> symbols;
2488 symbols.insert( ref.GetSymbol() );
2493 for(
SCH_FIELD& field : symbol->GetFields() )
2494 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2511 if(
m_dataModel->GetScope() != FIELDS_EDITOR_GRID_DATA_MODEL::SCOPE::SCOPE_ALL )
2522 m_grid->Connect( wxEVT_GRID_RANGE_SELECTED,
2530 m_grid->Disconnect( wxEVT_GRID_RANGE_SELECTED,
2541 for(
size_t i = 0; i < aCachedRefs.
GetCount(); i++ )
2568 if( basePath.Path() == instance.m_Path )
2576 subSheets.push_back( sheetPath );
2594 wxTextEntryDialog dlg(
this,
_(
"Add new variant name:" ),
_(
"New Variant" ), wxEmptyString,
2595 wxOK | wxCANCEL | wxCENTER );
2597 if( dlg.ShowModal() == wxID_CANCEL )
2601 if( dlg.GetValue().IsEmpty() || (
m_variantListBox->FindString( dlg.GetValue() ) != wxNOT_FOUND ) )
2609 ctrlContents.Add( dlg.GetValue() );
2617 wxArrayInt selections;
2620 if( (
m_variantListBox->GetSelections( selections ) == 0 ) || ( selections[0] == 0 ) )
2628 for(
int selection : selections )
2631 ctrlContents.Remove( variantName );
2632 m_parent->Schematic().DeleteVariant( variantName );
2641 wxArrayInt selections;
2644 if( (
m_variantListBox->GetSelections( selections ) != 1 ) || ( selections[0] == 0 ) )
2651 wxString oldVariantName = ctrlContents[selections[0]];
2653 wxTextEntryDialog dlg(
this,
_(
"Add new variant name:" ),
_(
"New Variant" ), oldVariantName,
2654 wxOK | wxCANCEL | wxCENTER );
2656 if( dlg.ShowModal() == wxID_CANCEL )
2659 wxString newVariantName = dlg.GetValue();
2661 if( newVariantName.IsEmpty() || ( newVariantName == oldVariantName ) || ( newVariantName == ctrlContents[0] ) )
2668 ctrlContents.Add( newVariantName );
2686 if( selectedVariants.size() >= 1 )
2687 selectedVariant = *selectedVariants.cbegin();
2689 m_parent->SetCurrentVariant( selectedVariant );
2696 std::set<wxString> retv;
2698 wxArrayInt selections;
2702 for(
int selection : selections )
2704 if( selection == 0 )
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
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...
wxCheckBox * m_checkKeepLineBreaks
STD_BITMAP_BUTTON * m_bRefreshPreview
STD_BITMAP_BUTTON * m_bMenu
wxBitmapButton * m_deleteVariantButton
DIALOG_SYMBOL_FIELDS_TABLE_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Symbol Fields Table"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxRESIZE_BORDER)
wxCheckBox * m_checkKeepTabs
wxButton * m_buttonExport
STD_BITMAP_BUTTON * m_removeFieldButton
STD_BITMAP_BUTTON * m_browseButton
STD_BITMAP_BUTTON * m_sidebarButton
wxBitmapButton * m_addVariantButton
wxTextCtrl * m_textOutput
STD_BITMAP_BUTTON * m_bRefresh
STD_BITMAP_BUTTON * m_renameFieldButton
STD_BITMAP_BUTTON * m_addFieldButton
wxTextCtrl * m_textStringDelimiter
wxChoice * m_cbBomPresets
wxListBox * m_variantListBox
wxTextCtrl * m_outputFileName
wxSplitterWindow * m_splitterMainWindow
wxTextCtrl * m_textFieldDelimiter
wxCheckBox * m_groupSymbolsBox
wxTextCtrl * m_textRefRangeDelimiter
WX_GRID * m_viewControlsGrid
wxBoxSizer * variantSizer
wxChoice * m_cbBomFmtPresets
wxBitmapButton * m_renameVariantButton
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 onAddVariant(wxCommandEvent &aEvent) override
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 OnSidebarToggle(wxCommandEvent &event) override
void OnOk(wxCommandEvent &aEvent) override
void OnGroupSymbolsToggled(wxCommandEvent &event) override
~DIALOG_SYMBOL_FIELDS_TABLE() 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)
void ShowHideColumn(int aCol, bool aShow)
VIEW_CONTROLS_GRID_DATA_MODEL * m_viewControlsDataModel
std::set< wxString > getSelectedVariants() const
SCH_EDIT_FRAME * m_parent
bool TransferDataFromWindow() override
SCH_REFERENCE_LIST m_symbolsList
void SetupColumnProperties(int aCol)
void setSideBarButtonLook(bool aIsLeftPanelCollapsed)
FIELDS_EDITOR_GRID_DATA_MODEL * m_dataModel
void updateBomPresetSelection(const wxString &aName)
void updateBomFmtPresetSelection(const wxString &aName)
void OnFilterText(wxCommandEvent &aEvent) override
std::map< FIELD_T, int > m_mandatoryFieldListIndexes
void OnRemoveField(wxCommandEvent &event) override
void OnTableCellClick(wxGridEvent &event) override
wxArrayString m_bomPresetMRU
void onVariantSelectionChange(wxCommandEvent &aEvent) override
void doApplyBomFmtPreset(const BOM_FMT_PRESET &aPreset)
void loadDefaultBomPresets()
void OnScope(wxCommandEvent &event) override
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 DisableSelectionEvents()
void onDeleteVariant(wxCommandEvent &aEvent) override
bool TransferDataToWindow() override
void OnTableRangeSelected(wxGridRangeSelectEvent &aEvent)
void OnMenu(wxCommandEvent &event) override
void EnableSelectionEvents()
void setScope(FIELDS_EDITOR_GRID_DATA_MODEL::SCOPE aScope)
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 doApplyBomPreset(const BOM_PRESET &aPreset)
void OnPageChanged(wxNotebookEvent &event) override
void SetUserBomFmtPresets(std::vector< BOM_FMT_PRESET > &aPresetList)
void OnRegroupSymbols(wxCommandEvent &aEvent) override
void OnViewControlsCellChanged(wxGridEvent &aEvent) override
void onRenameVariant(wxCommandEvent &aEvent) override
void OnColSort(wxGridEvent &aEvent)
JOB_EXPORT_SCH_BOM * m_job
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 OnSizeViewControlsGrid(wxSizeEvent &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_SYMBOL_FIELDS_TABLE m_FieldEditorPanel
static const wxString ITEM_NUMBER_VARIABLE
static const wxString QUANTITY_VARIABLE
VIEW_CONTROLS_GRID_DATA_MODEL * m_viewControlsDataModel
DIALOG_SYMBOL_FIELDS_TABLE * m_dlg
void showPopupMenu(wxMenu &menu, wxGridEvent &aEvent) override
void doPopupSelection(wxCommandEvent &event) override
FIELDS_EDITOR_GRID_TRICKS(DIALOG_SYMBOL_FIELDS_TABLE *aParent, WX_GRID *aGrid, VIEW_CONTROLS_GRID_DATA_MODEL *aViewFieldsData, FIELDS_EDITOR_GRID_DATA_MODEL *aDataModel, EMBEDDED_FILES *aFiles)
FIELDS_EDITOR_GRID_DATA_MODEL * m_dataModel
A general-purpose text renderer for WX_GRIDs backed by WX_GRID_TABLE_BASE tables that can handle draw...
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
GRID_TRICKS(WX_GRID *aGrid)
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.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
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.
Holds all the data relating to one schematic.
bool ResolveTextVar(const SCH_SHEET_PATH *aSheetPath, wxString *token, int aDepth) const
wxArrayString GetVariantNamesForUI() const
Return an array of variant names for using in wxWidgets UI controls.
SCH_SHEET_PATH & CurrentSheet() 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.
SCHEMATIC & Schematic() const
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 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...
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
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly) const override
Populate a std::vector with SCH_FIELDs, sorted in ordinal order.
bool IsMissingLibSymbol() const
Check to see if the library symbol is set to the dummy library symbol.
bool IsPower() const override
VIEW_CONTROLS_GRID_TRICKS(WX_GRID *aGrid)
void doPopupSelection(wxCommandEvent &event) override
const wxString ExpandEnvVarSubstitutions(const wxString &aString, const PROJECT *aProject)
Replace any environment variable & text variable references with their values.
wxString GetGeneratedFieldDisplayName(const wxString &aSource)
Returns any variables unexpanded, e.g.
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 IsGeneratedField(const wxString &aSource)
Returns true if the string is generated, e.g contains a single text var reference.
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 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.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
This file is part of the common library.
wxDEFINE_EVENT(EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxCommandEvent)
FIELDS_EDITOR_GRID_DATA_MODEL::SCOPE SCOPE
bool GetAssociatedDocument(wxWindow *aParent, const wxString &aDocName, PROJECT *aProject, SEARCH_STACK *aPaths, std::vector< EMBEDDED_FILES * > aFilesStack)
Open a document (file) with the suitable browser.
This file is part of the common library.
#define DISPLAY_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 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...
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
std::vector< FAB_LAYER_COLOR > dummy
wxString GetDefaultVariantName()
int SortVariantNames(const wxString &aLhs, const wxString &aRhs)
#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
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.
wxString GetDefaultFieldName(FIELD_T aFieldId, bool aTranslateForHI)
Return a default symbol field name for a mandatory field type.
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
@ DESCRIPTION
Field Description of part, i.e. "1/4W 1% Metal Film Resistor".
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ DATASHEET
name of datasheet
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
wxString GetCanonicalFieldName(FIELD_T aFieldType)
Definition of file extensions used in Kicad.