51#include <wx/textdlg.h>
52#include <wx/filedlg.h>
64#define COLUMN_MARGIN 3
66#define COLUMN_MARGIN 15
112 int col =
m_grid->GetGridCursorCol();
117 menu.AppendSeparator();
122 menu.AppendSeparator();
130 int row =
m_grid->GetGridCursorRow();
131 int col =
m_grid->GetGridCursorCol();
136 wxString fpid =
m_grid->GetCellValue( row, col );
140 if( frame->ShowModal( &fpid,
m_dlg ) )
141 m_grid->SetCellValue( row, col, fpid );
148 wxString datasheet_uri =
m_grid->GetCellValue( row, col );
154 if( !
m_grid->CommitPendingChanges(
false ) )
162 m_dlg->ShowHideColumn( col, show );
164 wxString fieldName =
m_dataModel->GetColFieldName( col );
228 wxGridCellAttr* attr =
new wxGridCellAttr;
229 attr->SetReadOnly(
true );
232 attr =
new wxGridCellAttr;
233 attr->SetRenderer(
new wxGridCellBoolRenderer() );
235 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
238 attr =
new wxGridCellAttr;
239 attr->SetRenderer(
new wxGridCellBoolRenderer() );
241 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
247 m_filter->SetDescriptiveText(
_(
"Filter" ) );
249 attr =
new wxGridCellAttr;
255 m_grid->UseNativeColHeader(
true );
259 m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
277 SetTitle(
m_job->GetSettingsDialogTitle() );
290 for(
const wxString& fieldName :
m_job->m_fieldsOrdered )
293 field.
name = fieldName;
294 field.
show = !fieldName.StartsWith( wxT(
"__" ), &field.
name );
297 if( (
m_job->m_fieldsLabels.size() > i ) && !
m_job->m_fieldsLabels[i].IsEmpty() )
322 fmtPreset.
name =
m_job->m_bomFmtPresetName;
352 if( visible_column.IsEmpty() )
354 visible_column = wxT(
"0" );
358 CallAfter( [
this, cfg]()
385 m_parent->Schematic().AddListener(
this );
390 m_grid->EnableEditing(
false );
410 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
412 if(
m_grid->IsColShown( i ) )
414 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
428 m_grid->PopEventHandler(
true );
438 if( aIsLeftPanelCollapsed )
453 wxGridCellAttr* attr =
new wxGridCellAttr;
454 attr->SetReadOnly(
false );
478 attr->SetAlignment( wxALIGN_RIGHT, wxALIGN_CENTER );
479 attr->SetRenderer(
new wxGridCellNumberRenderer() );
484 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
497 attr->SetEditor(
m_grid->GetDefaultEditor() );
506 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
509 m_grid->AutoSizeColumns(
false );
511 bool sortAscending =
true;
513 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
539 std::string key(
m_dataModel->GetColFieldName( col ).ToUTF8() );
549 int maxWidth = defaultDlgSize.x / 3;
551 m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
561 m_grid->SetSortingColumn( sortCol, sortAscending );
567 if( !wxDialog::TransferDataFromWindow() )
579 case SCOPE::SCOPE_ALL:
m_scope->SetSelection( 0 );
break;
580 case SCOPE::SCOPE_SHEET:
m_scope->SetSelection( 1 );
break;
581 case SCOPE::SCOPE_SHEET_RECURSIVE:
m_scope->SetSelection( 2 );
break;
586 if( selection.GetSize() == 1 )
598 for(
int row = 0; row <
m_dataModel->GetNumberRows(); ++row )
600 std::vector<SCH_REFERENCE> references =
m_dataModel->GetRowReferences( row );
605 if( ref.GetSymbol() == symbol )
619 for(
int col = 0; col <
m_dataModel->GetNumberCols(); col++ )
625 else if( anyCol == -1 &&
m_dataModel->GetShowColumn( col ) )
629 if( valueCol != -1 &&
m_dataModel->GetShowColumn( valueCol ) )
630 m_grid->GoToCell( row, valueCol );
631 else if( refCol != -1 &&
m_dataModel->GetShowColumn( refCol ) )
632 m_grid->GoToCell( row, refCol );
633 else if( anyCol != -1 )
634 m_grid->GoToCell( row, anyCol );
652 if( !
m_grid->CommitPendingChanges() )
655 if( !wxDialog::TransferDataFromWindow() )
664 std::set<wxString> selectedVariantNames;
670 if( !commit.
Empty() )
672 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
677 m_parent->SetCurrentSheet( currentSheet );
686 bool show,
bool groupBy,
bool addedByUser )
698 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
699 m_grid->ProcessTableMessage( msg );
702 [&]() -> std::pair<int, int>
713 auto addMandatoryField =
714 [&](
FIELD_T fieldId,
bool show,
bool groupBy )
734 std::set<wxString> userFieldNames;
742 if( !field.IsMandatory() && !field.IsPrivate() )
743 userFieldNames.insert( field.GetName() );
747 for(
const wxString& fieldName : userFieldNames )
753 if( userFieldNames.count( tfn.m_Name ) == 0 )
761 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
763 if( dlg.ShowModal() != wxID_OK )
766 wxString fieldName = dlg.GetValue();
768 if( fieldName.IsEmpty() )
774 for(
int i = 0; i <
m_dataModel->GetNumberCols(); ++i )
776 if( fieldName ==
m_dataModel->GetColFieldName( i ) )
778 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), fieldName ) );
801 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
807 return IsOK(
this, wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ),
813 int col =
m_dataModel->GetFieldNameCol( fieldName );
833 if( selectedRows.empty() )
836 int row = selectedRows[0];
842 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory and names cannot be changed." ),
850 int col =
m_dataModel->GetFieldNameCol( fieldName );
851 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
853 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ), fieldName );
855 if( dlg.ShowModal() != wxID_OK )
858 wxString newFieldName = dlg.GetValue();
861 if( newFieldName == fieldName )
865 if(
m_dataModel->GetFieldNameCol( newFieldName ) != -1 )
867 wxString confirm_msg = wxString::Format(
_(
"Field name %s already exists." ), newFieldName );
894#if defined( __WXOSX__ ) || wxCHECK_VERSION( 3, 3, 0 )
895 wxPoint pos = aEvent.GetPosition();
896 wxRect ctrlRect =
m_filter->GetScreenRect();
897 int buttonWidth = ctrlRect.GetHeight();
900 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
901 SetCursor( wxCURSOR_ARROW );
902 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
903 SetCursor( wxCURSOR_ARROW );
905 SetCursor( wxCURSOR_IBEAM );
924 switch( aEvent.GetSelection() )
926 case 0:
setScope( SCOPE::SCOPE_ALL );
break;
927 case 1:
setScope( SCOPE::SCOPE_SHEET );
break;
928 case 2:
setScope( SCOPE::SCOPE_SHEET_RECURSIVE );
break;
950 menu.Append( 4204,
_(
"Include 'DNP' Symbols" ),
951 _(
"Show symbols marked 'DNP' in the table. This setting also controls whether or not 'DNP' "
952 "symbols are included on export." ),
956 menu.Append( 4205,
_(
"Include 'Exclude from BOM' Symbols" ),
957 _(
"Show symbols marked 'Exclude from BOM' in the table. Symbols marked 'Exclude from BOM' "
958 "are never included on export." ),
960 menu.Check( 4205,
m_dataModel->GetIncludeExcludedFromBOM() );
962 menu.AppendSeparator();
964 menu.Append( 4206,
_(
"Highlight on Cross-probe" ),
965 _(
"Highlight corresponding item on canvas when it is selected in the table" ),
969 menu.Append( 4207,
_(
"Select on Cross-probe" ),
970 _(
"Select corresponding item on canvas when it is selected in the table" ),
975 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
977 if( menu_id == 0 || menu_id == 4204 )
985 else if( menu_id == 1 || menu_id == 4205 )
993 else if( menu_id == 3 || menu_id == 4206 )
1000 else if( menu_id == 4 || menu_id == 4207 )
1012 int sortCol = aEvent.GetCol();
1013 std::string key(
m_dataModel->GetColFieldName( sortCol ).ToUTF8() );
1025 if(
m_grid->IsSortingBy( sortCol ) )
1028 ascending = !
m_grid->IsSortOrderAscending();
1046 int origPos = aEvent.GetCol();
1051 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1053 if(
m_grid->IsColShown( i ) )
1055 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
1063 int newPos =
m_grid->GetColPos( origPos );
1066 if( newPos < origPos )
1107 int row = aEvent.GetRow();
1109 wxCHECK( row < m_viewControlsGrid->GetNumberRows(), );
1111 switch( aEvent.GetCol() )
1117 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1122 m_grid->SetColLabelValue( dataCol, label );
1140 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1152 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1154 if(
m_dataModel->ColIsQuantity( dataCol ) && value )
1156 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
1163 if(
m_dataModel->ColIsItemNumber( dataCol ) && value )
1165 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
1214 if(
m_dataModel->IsExpanderColumn( event.GetCol() ) )
1216 m_grid->ClearSelection();
1219 m_grid->SetGridCursor( event.GetRow(), event.GetCol() );
1238 std::set<SCH_REFERENCE> refs;
1239 std::set<SCH_ITEM*> symbols;
1242 if( aEvent.Selecting() )
1244 for(
int i = aEvent.GetTopRow(); i <= aEvent.GetBottomRow(); i++ )
1251 symbols.insert( ref.GetSymbol() );
1258 if( refs.size() > 0 )
1262 wxString symbol_path = refs.begin()->GetFullPath();
1275 std::vector<SCH_ITEM*> items( symbols.begin(), symbols.end() );
1277 if( refs.size() > 0 )
1278 selTool->
SyncSelection( refs.begin()->GetSheetPath(),
nullptr, items );
1291 int remainingWidth =
m_viewControlsGrid->GetSize().GetX() - showColWidth - groupByColWidth;
1339 bool saveIncludeExcudedFromBOM =
m_dataModel->GetIncludeExcludedFromBOM();
1346 if( saveIncludeExcudedFromBOM )
1390 wxFileName fn(
Prj().AbsolutePath(
m_parent->Schematic().GetFileName() ) );
1393 wxFileDialog saveDlg(
this,
_(
"Bill of Materials Output File" ),
path, fn.GetFullName(),
1396 if( saveDlg.ShowModal() == wxID_CANCEL )
1400 wxFileName file = wxFileName( saveDlg.GetPath() );
1401 wxString defaultPath = fn.GetPathWithSep();
1403 if(
IsOK(
this, wxString::Format(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath ) ) )
1405 if( !file.MakeRelativeTo( defaultPath ) )
1407 DisplayErrorMessage(
this,
_(
"Cannot make path relative (target volume different from schematic "
1408 "file volume)!" ) );
1442 _(
"Changes have not yet been saved. Export unsaved data?" ),
"",
1443 _(
"OK" ),
_(
"Cancel" ) )
1453 std::function<bool( wxString* )> textResolver =
1454 [&]( wxString* token ) ->
bool
1464 if(
path.IsEmpty() )
1466 DisplayError(
this,
_(
"No output file specified in Export tab." ) );
1473 wxFileName outputFile = wxFileName::FileName(
path );
1477 Prj().AbsolutePath(
m_parent->Schematic().GetFileName() ),
1480 msg.Printf(
_(
"Could not open/create path '%s'." ), outputFile.GetPath() );
1485 wxFFile out( outputFile.GetFullPath(),
"wb" );
1487 if( !out.IsOpened() )
1489 msg.Printf(
_(
"Could not create BOM output '%s'." ), outputFile.GetFullPath() );
1498 msg.Printf(
_(
"Could not write BOM output '%s'." ), outputFile.GetFullPath() );
1505 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1513 EndModal( wxID_CANCEL );
1530 m_job->m_bomFmtPresetName = wxEmptyString;
1535 m_job->m_bomPresetName = wxEmptyString;
1551 m_job->m_fieldsOrdered.clear();
1552 m_job->m_fieldsLabels.clear();
1553 m_job->m_fieldsGroupBy.clear();
1557 if( modelField.show )
1558 m_job->m_fieldsOrdered.emplace_back( modelField.name );
1560 m_job->m_fieldsOrdered.emplace_back( wxT(
"__" ) + modelField.name );
1562 m_job->m_fieldsLabels.emplace_back( modelField.label );
1564 if( modelField.groupBy )
1565 m_job->m_fieldsGroupBy.emplace_back( modelField.name );
1568 EndModal( wxID_OK );
1585 m_grid->CommitPendingChanges(
true );
1601 m_parent->Schematic().RemoveListener(
this );
1604 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1606 if( wxWindow* parent = GetParent() )
1607 wxQueueEvent( parent, evt );
1613 std::vector<BOM_PRESET> ret;
1615 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1617 if( !pair.second.readOnly )
1618 ret.emplace_back( pair.second );
1630 for(
const BOM_PRESET& preset : aPresetList )
1648 wxCommandEvent
dummy;
1691 int default_idx = 0;
1695 m_cbBomPresets->Append( wxGetTranslation( presetName ), (
void*) &preset );
1720 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1722 const BOM_PRESET& preset = aPair.second;
1725 if( !( preset.sortAsc == current.sortAsc
1726 && preset.filterString == current.filterString
1727 && preset.groupSymbols == current.groupSymbols
1728 && preset.excludeDNP == current.excludeDNP
1729 && preset.includeExcludedFromBOM == current.includeExcludedFromBOM ) )
1740 if( preset.sortField != wxGetTranslation( current.
sortField ) )
1744 std::vector<BOM_FIELD>
A,
B;
1746 for(
const BOM_FIELD& field : preset.fieldsOrdered )
1748 if( field.show || field.groupBy )
1749 A.emplace_back( field );
1754 if( field.show || field.groupBy )
1755 B.emplace_back( field );
1761 if( it != m_bomPresets.end() )
1765 bool do_translate = it->second.readOnly;
1766 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1767 m_cbBomPresets->SetStringSelection(
text );
1771 m_cbBomPresets->SetSelection( m_cbBomPresets->GetCount() - 3 );
1774 m_currentBomPreset =
static_cast<BOM_PRESET*
>( m_cbBomPresets->GetClientData( m_cbBomPresets->GetSelection() ) );
1783 wxString ui_label = aName;
1787 if( presetName == aName )
1789 if( preset.readOnly ==
true )
1790 ui_label = wxGetTranslation( aName );
1815 auto resetSelection =
1824 if( index == count - 3 )
1830 else if( index == count - 2 )
1838 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1840 if( dlg.ShowModal() != wxID_OK )
1846 name = dlg.GetValue();
1864 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1865 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1872 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1893 else if( index == count - 1 )
1896 wxArrayString headers;
1897 std::vector<wxArrayString> items;
1899 headers.Add(
_(
"Presets" ) );
1903 if( !preset.readOnly )
1907 items.emplace_back( item );
1919 if( idx != wxNOT_FOUND )
1969 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1971 const wxString& fieldName(
m_dataModel->GetColFieldName( i ) );
1992 int col =
m_dataModel->GetFieldNameCol( fieldName );
1996 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
2001 std::string fieldNameStr( fieldName.ToUTF8() );
2004 const wxString& label =
m_dataModel->GetColLabelValue( col );
2006 m_grid->SetColLabelValue( col, label );
2021 bool groupBy =
m_dataModel->GetGroupColumn( col );
2045 std::vector<BOM_FMT_PRESET> ret;
2049 if( !preset.readOnly )
2050 ret.emplace_back( preset );
2080 wxCommandEvent
dummy;
2122 int default_idx = 0;
2151 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
2153 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
2154 && aPair.second.stringDelimiter == current.stringDelimiter
2155 && aPair.second.refDelimiter == current.refDelimiter
2156 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
2157 && aPair.second.keepTabs == current.keepTabs
2158 && aPair.second.keepLineBreaks == current.keepLineBreaks );
2165 bool do_translate = it->second.readOnly;
2166 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
2185 wxString ui_label = aName;
2189 if( presetName == aName )
2191 if( preset.readOnly )
2192 ui_label = wxGetTranslation( aName );
2217 auto resetSelection =
2226 if( index == count - 3 )
2232 else if( index == count - 2 )
2240 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
2242 if( dlg.ShowModal() != wxID_OK )
2248 name = dlg.GetValue();
2266 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2267 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2274 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2295 else if( index == count - 1 )
2298 wxArrayString headers;
2299 std::vector<wxArrayString> items;
2301 headers.Add(
_(
"Presets" ) );
2303 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2305 if( !pair.second.readOnly )
2308 item.Add( pair.first );
2309 items.emplace_back( item );
2321 if( idx != wxNOT_FOUND )
2376 bool modified =
false;
2379 std::vector<BOM_PRESET> presets;
2383 if( !preset.readOnly )
2384 presets.emplace_back( preset );
2400 std::vector<BOM_FMT_PRESET> fmts;
2404 if( !preset.readOnly )
2405 fmts.emplace_back( preset );
2426 std::vector<SCH_ITEM*>& aSchItem )
2429 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2443 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2449 std::set<SCH_SYMBOL*> symbols;
2453 symbols.insert( ref.GetSymbol() );
2458 for(
SCH_FIELD& field : symbol->GetFields() )
2459 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2473 std::vector<SCH_ITEM*>& aSchItem )
2490 std::vector<SCH_ITEM*>& aSchItem )
2493 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2507 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2513 std::set<SCH_SYMBOL*> symbols;
2517 symbols.insert( ref.GetSymbol() );
2522 for(
SCH_FIELD& field : symbol->GetFields() )
2523 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2540 if(
m_dataModel->GetScope() != FIELDS_EDITOR_GRID_DATA_MODEL::SCOPE::SCOPE_ALL )
2551 m_grid->Connect( wxEVT_GRID_RANGE_SELECTED,
2559 m_grid->Disconnect( wxEVT_GRID_RANGE_SELECTED,
2571 for(
size_t i = 0; i < aCachedRefs.
GetCount(); i++ )
2598 if( basePath.Path() == instance.m_Path )
2606 subSheets.push_back( sheetPath );
2624 wxTextEntryDialog dlg(
this,
_(
"Add new variant name:" ),
_(
"New Variant" ), wxEmptyString,
2625 wxOK | wxCANCEL | wxCENTER );
2627 if( dlg.ShowModal() == wxID_CANCEL )
2631 if( dlg.GetValue().IsEmpty() || (
m_variantListBox->FindString( dlg.GetValue() ) != wxNOT_FOUND ) )
2639 ctrlContents.Add( dlg.GetValue() );
2647 wxArrayInt selections;
2650 if( (
m_variantListBox->GetSelections( selections ) == 0 ) || ( selections[0] == 0 ) )
2658 for(
int selection : selections )
2661 ctrlContents.Remove( variantName );
2662 m_parent->Schematic().DeleteVariant( variantName );
2671 wxArrayInt selections;
2674 if( (
m_variantListBox->GetSelections( selections ) != 1 ) || ( selections[0] == 0 ) )
2681 wxString oldVariantName = ctrlContents[selections[0]];
2683 wxTextEntryDialog dlg(
this,
_(
"Add new variant name:" ),
_(
"New Variant" ), oldVariantName,
2684 wxOK | wxCANCEL | wxCENTER );
2686 if( dlg.ShowModal() == wxID_CANCEL )
2689 wxString newVariantName = dlg.GetValue();
2691 if( newVariantName.IsEmpty() || ( newVariantName == oldVariantName ) || ( newVariantName == ctrlContents[0] ) )
2698 ctrlContents.Add( newVariantName );
2706 std::set<wxString> retv;
2708 wxArrayInt selections;
2712 for(
int selection : selections )
2714 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 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
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
wxString view_controls_visible_columns
A simple container for sheet instance information.
Hold a name of a symbol's field, field value, and default visibility.
Definition for symbol library class.
wxString GetDefaultFieldName(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.