50#include <wx/textdlg.h>
51#include <wx/filedlg.h>
63#define COLUMN_MARGIN 4
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]()
375 m_parent->Schematic().AddListener(
this );
380 m_grid->EnableEditing(
false );
399 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
401 if(
m_grid->IsColShown( i ) )
403 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
417 m_grid->PopEventHandler(
true );
427 if( aIsLeftPanelCollapsed )
442 wxGridCellAttr* attr =
new wxGridCellAttr;
443 attr->SetReadOnly(
false );
467 attr->SetAlignment( wxALIGN_RIGHT, wxALIGN_CENTER );
468 attr->SetRenderer(
new wxGridCellNumberRenderer() );
473 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
486 attr->SetEditor(
m_grid->GetDefaultEditor() );
495 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
498 m_grid->AutoSizeColumns(
false );
500 bool sortAscending =
true;
502 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
528 std::string key(
m_dataModel->GetColFieldName( col ).ToUTF8() );
538 int maxWidth = defaultDlgSize.x / 3;
540 m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
550 m_grid->SetSortingColumn( sortCol, sortAscending );
556 if( !wxDialog::TransferDataFromWindow() )
566 wxCommandEvent
dummy;
569 if( selection.GetSize() == 1 )
581 for(
int row = 0; row <
m_dataModel->GetNumberRows(); ++row )
583 std::vector<SCH_REFERENCE> references =
m_dataModel->GetRowReferences( row );
588 if( ref.GetSymbol() == symbol )
602 for(
int col = 0; col <
m_dataModel->GetNumberCols(); col++ )
608 else if( anyCol == -1 &&
m_dataModel->GetShowColumn( col ) )
612 if( valueCol != -1 &&
m_dataModel->GetShowColumn( valueCol ) )
613 m_grid->GoToCell( row, valueCol );
614 else if( refCol != -1 &&
m_dataModel->GetShowColumn( refCol ) )
615 m_grid->GoToCell( row, refCol );
616 else if( anyCol != -1 )
617 m_grid->GoToCell( row, anyCol );
635 if( !
m_grid->CommitPendingChanges() )
638 if( !wxDialog::TransferDataFromWindow() )
647 std::set<wxString> selectedVariantNames;
653 if( !commit.
Empty() )
655 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
660 m_parent->SetCurrentSheet( currentSheet );
669 bool show,
bool groupBy,
bool addedByUser )
681 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
682 m_grid->ProcessTableMessage( msg );
685 [&]() -> std::pair<int, int>
696 auto addMandatoryField =
697 [&](
FIELD_T fieldId,
bool show,
bool groupBy )
717 std::set<wxString> userFieldNames;
725 if( !field.IsMandatory() && !field.IsPrivate() )
726 userFieldNames.insert( field.GetName() );
730 for(
const wxString& fieldName : userFieldNames )
736 if( userFieldNames.count( tfn.m_Name ) == 0 )
744 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
746 if( dlg.ShowModal() != wxID_OK )
749 wxString fieldName = dlg.GetValue();
751 if( fieldName.IsEmpty() )
757 for(
int i = 0; i <
m_dataModel->GetNumberCols(); ++i )
759 if( fieldName ==
m_dataModel->GetColFieldName( i ) )
761 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), fieldName ) );
784 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
790 return IsOK(
this, wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ),
796 int col =
m_dataModel->GetFieldNameCol( fieldName );
816 if( selectedRows.empty() )
819 int row = selectedRows[0];
825 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory and names cannot be changed." ),
833 int col =
m_dataModel->GetFieldNameCol( fieldName );
834 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
836 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ), fieldName );
838 if( dlg.ShowModal() != wxID_OK )
841 wxString newFieldName = dlg.GetValue();
844 if( newFieldName == fieldName )
848 if(
m_dataModel->GetFieldNameCol( newFieldName ) != -1 )
850 wxString confirm_msg = wxString::Format(
_(
"Field name %s already exists." ), newFieldName );
877#if defined( __WXOSX__ )
878 wxPoint pos = aEvent.GetPosition();
879 wxRect ctrlRect =
m_filter->GetScreenRect();
880 int buttonWidth = ctrlRect.GetHeight();
883 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
884 SetCursor( wxCURSOR_ARROW );
885 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
886 SetCursor( wxCURSOR_ARROW );
888 SetCursor( wxCURSOR_IBEAM );
903 switch( aEvent.GetSelection() )
905 case 0:
setScope( SCOPE::SCOPE_ALL );
break;
906 case 1:
setScope( SCOPE::SCOPE_SHEET );
break;
907 case 2:
setScope( SCOPE::SCOPE_SHEET_RECURSIVE );
break;
929 menu.Append( 4204,
_(
"Include 'DNP' Symbols" ),
930 _(
"Show symbols marked 'DNP' in the table. This setting also controls whether or not 'DNP' "
931 "symbols are included on export." ),
935 menu.Append( 4205,
_(
"Include 'Exclude from BOM' Symbols" ),
936 _(
"Show symbols marked 'Exclude from BOM' in the table. Symbols marked 'Exclude from BOM' "
937 "are never included on export." ),
939 menu.Check( 4205,
m_dataModel->GetIncludeExcludedFromBOM() );
941 menu.AppendSeparator();
943 menu.Append( 4206,
_(
"Highlight on Cross-probe" ),
944 _(
"Highlight corresponding item on canvas when it is selected in the table" ),
948 menu.Append( 4207,
_(
"Select on Cross-probe" ),
949 _(
"Select corresponding item on canvas when it is selected in the table" ),
954 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
956 if( menu_id == 0 || menu_id == 4204 )
964 else if( menu_id == 1 || menu_id == 4205 )
972 else if( menu_id == 3 || menu_id == 4206 )
979 else if( menu_id == 4 || menu_id == 4207 )
991 int sortCol = aEvent.GetCol();
992 std::string key(
m_dataModel->GetColFieldName( sortCol ).ToUTF8() );
1004 if(
m_grid->IsSortingBy( sortCol ) )
1007 ascending = !
m_grid->IsSortOrderAscending();
1025 int origPos = aEvent.GetCol();
1030 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1032 if(
m_grid->IsColShown( i ) )
1034 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
1042 int newPos =
m_grid->GetColPos( origPos );
1045 if( newPos < origPos )
1086 int row = aEvent.GetRow();
1088 wxCHECK( row < m_viewControlsGrid->GetNumberRows(), );
1090 switch( aEvent.GetCol() )
1096 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1101 m_grid->SetColLabelValue( dataCol, label );
1119 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1131 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1133 if(
m_dataModel->ColIsQuantity( dataCol ) && value )
1135 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
1142 if(
m_dataModel->ColIsItemNumber( dataCol ) && value )
1144 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
1193 if(
m_dataModel->IsExpanderColumn( event.GetCol() ) )
1195 m_grid->ClearSelection();
1198 m_grid->SetGridCursor( event.GetRow(), event.GetCol() );
1217 std::set<SCH_REFERENCE> refs;
1218 std::set<SCH_ITEM*> symbols;
1221 if( aEvent.Selecting() )
1223 for(
int i = aEvent.GetTopRow(); i <= aEvent.GetBottomRow(); i++ )
1230 symbols.insert( ref.GetSymbol() );
1237 if( refs.size() > 0 )
1241 wxString symbol_path = refs.begin()->GetFullPath();
1254 std::vector<SCH_ITEM*> items( symbols.begin(), symbols.end() );
1256 if( refs.size() > 0 )
1257 selTool->
SyncSelection( refs.begin()->GetSheetPath(),
nullptr, items );
1270 int remainingWidth =
m_viewControlsGrid->GetSize().GetX() - showColWidth - groupByColWidth;
1318 bool saveIncludeExcudedFromBOM =
m_dataModel->GetIncludeExcludedFromBOM();
1325 if( saveIncludeExcudedFromBOM )
1369 wxFileName fn(
Prj().AbsolutePath(
m_parent->Schematic().GetFileName() ) );
1372 wxFileDialog saveDlg(
this,
_(
"Bill of Materials Output File" ),
path, fn.GetFullName(),
1375 if( saveDlg.ShowModal() == wxID_CANCEL )
1379 wxFileName file = wxFileName( saveDlg.GetPath() );
1380 wxString defaultPath = fn.GetPathWithSep();
1382 if(
IsOK(
this, wxString::Format(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath ) ) )
1384 if( !file.MakeRelativeTo( defaultPath ) )
1386 DisplayErrorMessage(
this,
_(
"Cannot make path relative (target volume different from schematic "
1387 "file volume)!" ) );
1421 _(
"Changes have not yet been saved. Export unsaved data?" ),
"",
1422 _(
"OK" ),
_(
"Cancel" ) )
1432 std::function<bool( wxString* )> textResolver =
1433 [&]( wxString* token ) ->
bool
1443 if(
path.IsEmpty() )
1445 DisplayError(
this,
_(
"No output file specified in Export tab." ) );
1452 wxFileName outputFile = wxFileName::FileName(
path );
1458 msg.Printf(
_(
"Could not open/create path '%s'." ), outputFile.GetPath() );
1463 wxFFile out( outputFile.GetFullPath(),
"wb" );
1465 if( !out.IsOpened() )
1467 msg.Printf(
_(
"Could not create BOM output '%s'." ), outputFile.GetFullPath() );
1476 msg.Printf(
_(
"Could not write BOM output '%s'." ), outputFile.GetFullPath() );
1483 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1491 EndModal( wxID_CANCEL );
1508 m_job->m_bomFmtPresetName = wxEmptyString;
1513 m_job->m_bomPresetName = wxEmptyString;
1529 m_job->m_fieldsOrdered.clear();
1530 m_job->m_fieldsLabels.clear();
1531 m_job->m_fieldsGroupBy.clear();
1535 if( modelField.show )
1536 m_job->m_fieldsOrdered.emplace_back( modelField.name );
1538 m_job->m_fieldsOrdered.emplace_back( wxT(
"__" ) + modelField.name );
1540 m_job->m_fieldsLabels.emplace_back( modelField.label );
1542 if( modelField.groupBy )
1543 m_job->m_fieldsGroupBy.emplace_back( modelField.name );
1546 EndModal( wxID_OK );
1563 m_grid->CommitPendingChanges(
true );
1579 m_parent->Schematic().RemoveListener(
this );
1582 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1584 if( wxWindow* parent = GetParent() )
1585 wxQueueEvent( parent, evt );
1591 std::vector<BOM_PRESET> ret;
1593 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1595 if( !pair.second.readOnly )
1596 ret.emplace_back( pair.second );
1608 for(
const BOM_PRESET& preset : aPresetList )
1626 wxCommandEvent
dummy;
1669 int default_idx = 0;
1673 m_cbBomPresets->Append( wxGetTranslation( presetName ), (
void*) &preset );
1698 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1700 const BOM_PRESET& preset = aPair.second;
1703 if( !( preset.sortAsc == current.sortAsc
1704 && preset.filterString == current.filterString
1705 && preset.groupSymbols == current.groupSymbols
1706 && preset.excludeDNP == current.excludeDNP
1707 && preset.includeExcludedFromBOM == current.includeExcludedFromBOM ) )
1718 if( preset.sortField != wxGetTranslation( current.
sortField ) )
1722 std::vector<BOM_FIELD>
A,
B;
1724 for(
const BOM_FIELD& field : preset.fieldsOrdered )
1726 if( field.show || field.groupBy )
1727 A.emplace_back( field );
1732 if( field.show || field.groupBy )
1733 B.emplace_back( field );
1739 if( it != m_bomPresets.end() )
1743 bool do_translate = it->second.readOnly;
1744 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1745 m_cbBomPresets->SetStringSelection(
text );
1749 m_cbBomPresets->SetSelection( m_cbBomPresets->GetCount() - 3 );
1752 m_currentBomPreset =
static_cast<BOM_PRESET*
>( m_cbBomPresets->GetClientData( m_cbBomPresets->GetSelection() ) );
1761 wxString ui_label = aName;
1765 if( presetName == aName )
1767 if( preset.readOnly ==
true )
1768 ui_label = wxGetTranslation( aName );
1793 auto resetSelection =
1802 if(
index == count - 3 )
1808 else if(
index == count - 2 )
1816 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1818 if( dlg.ShowModal() != wxID_OK )
1824 name = dlg.GetValue();
1842 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1843 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1850 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1871 else if(
index == count - 1 )
1874 wxArrayString headers;
1875 std::vector<wxArrayString> items;
1877 headers.Add(
_(
"Presets" ) );
1881 if( !preset.readOnly )
1885 items.emplace_back( item );
1897 if( idx != wxNOT_FOUND )
1947 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1949 const wxString& fieldName(
m_dataModel->GetColFieldName( i ) );
1970 int col =
m_dataModel->GetFieldNameCol( fieldName );
1974 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
1979 std::string fieldNameStr( fieldName.ToUTF8() );
1982 const wxString& label =
m_dataModel->GetColLabelValue( col );
1984 m_grid->SetColLabelValue( col, label );
1999 bool groupBy =
m_dataModel->GetGroupColumn( col );
2023 std::vector<BOM_FMT_PRESET> ret;
2027 if( !preset.readOnly )
2028 ret.emplace_back( preset );
2058 wxCommandEvent
dummy;
2100 int default_idx = 0;
2129 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
2131 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
2132 && aPair.second.stringDelimiter == current.stringDelimiter
2133 && aPair.second.refDelimiter == current.refDelimiter
2134 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
2135 && aPair.second.keepTabs == current.keepTabs
2136 && aPair.second.keepLineBreaks == current.keepLineBreaks );
2143 bool do_translate = it->second.readOnly;
2144 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
2163 wxString ui_label = aName;
2167 if( presetName == aName )
2169 if( preset.readOnly )
2170 ui_label = wxGetTranslation( aName );
2195 auto resetSelection =
2204 if(
index == count - 3 )
2210 else if(
index == count - 2 )
2218 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
2220 if( dlg.ShowModal() != wxID_OK )
2226 name = dlg.GetValue();
2244 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2245 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2252 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2273 else if(
index == count - 1 )
2276 wxArrayString headers;
2277 std::vector<wxArrayString> items;
2279 headers.Add(
_(
"Presets" ) );
2281 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2283 if( !pair.second.readOnly )
2286 item.Add( pair.first );
2287 items.emplace_back( item );
2299 if( idx != wxNOT_FOUND )
2354 bool modified =
false;
2357 std::vector<BOM_PRESET> presets;
2361 if( !preset.readOnly )
2362 presets.emplace_back( preset );
2378 std::vector<BOM_FMT_PRESET> fmts;
2382 if( !preset.readOnly )
2383 fmts.emplace_back( preset );
2406 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2420 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2426 std::set<SCH_SYMBOL*> symbols;
2430 symbols.insert( ref.GetSymbol() );
2435 for(
SCH_FIELD& field : symbol->GetFields() )
2436 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2468 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2482 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2488 std::set<SCH_SYMBOL*> symbols;
2492 symbols.insert( ref.GetSymbol() );
2497 for(
SCH_FIELD& field : symbol->GetFields() )
2498 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2515 if(
m_dataModel->GetScope() != FIELDS_EDITOR_GRID_DATA_MODEL::SCOPE::SCOPE_ALL )
2526 m_grid->Connect( wxEVT_GRID_RANGE_SELECTED,
2534 m_grid->Disconnect( wxEVT_GRID_RANGE_SELECTED,
2545 for(
size_t i = 0; i < aCachedRefs.
GetCount(); i++ )
2572 if( basePath.Path() == instance.m_Path )
2580 subSheets.push_back( sheetPath );
2598 wxTextEntryDialog dlg(
this,
_(
"Add new variant name:" ),
_(
"New Variant" ), wxEmptyString,
2599 wxOK | wxCANCEL | wxCENTER );
2601 if( dlg.ShowModal() == wxID_CANCEL )
2605 if( dlg.GetValue().IsEmpty() || (
m_variantListBox->FindString( dlg.GetValue() ) != wxNOT_FOUND ) )
2613 ctrlContents.Add( dlg.GetValue() );
2621 wxArrayInt selections;
2624 if( (
m_variantListBox->GetSelections( selections ) == 0 ) || ( selections[0] == 0 ) )
2632 for(
int selection : selections )
2635 ctrlContents.Remove( variantName );
2636 m_parent->Schematic().DeleteVariant( variantName );
2645 wxArrayInt selections;
2648 if( (
m_variantListBox->GetSelections( selections ) != 1 ) || ( selections[0] == 0 ) )
2655 wxString oldVariantName = ctrlContents[selections[0]];
2657 wxTextEntryDialog dlg(
this,
_(
"Add new variant name:" ),
_(
"New Variant" ), oldVariantName,
2658 wxOK | wxCANCEL | wxCENTER );
2660 if( dlg.ShowModal() == wxID_CANCEL )
2663 wxString newVariantName = dlg.GetValue();
2665 if( newVariantName.IsEmpty() || ( newVariantName == oldVariantName ) || ( newVariantName == ctrlContents[0] ) )
2672 ctrlContents.Add( newVariantName );
2690 if( selectedVariants.size() >= 1 )
2691 selectedVariant = *selectedVariants.cbegin();
2693 m_parent->SetCurrentVariant( selectedVariant );
2700 std::set<wxString> retv;
2702 wxArrayInt selections;
2706 for(
int selection : selections )
2708 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_deleteVariantButton
STD_BITMAP_BUTTON * m_bRefreshPreview
STD_BITMAP_BUTTON * m_bMenu
STD_BITMAP_BUTTON * m_addVariantButton
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
wxPanel * m_variantsPanel
STD_BITMAP_BUTTON * m_browseButton
STD_BITMAP_BUTTON * m_sidebarButton
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
STD_BITMAP_BUTTON * m_renameVariantButton
wxTextCtrl * m_textFieldDelimiter
wxCheckBox * m_groupSymbolsBox
wxTextCtrl * m_textRefRangeDelimiter
wxSplitterWindow * m_splitter_left
WX_GRID * m_viewControlsGrid
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 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.