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 );
224 wxGridCellAttr* attr =
new wxGridCellAttr;
225 attr->SetReadOnly(
true );
228 attr =
new wxGridCellAttr;
229 attr->SetRenderer(
new wxGridCellBoolRenderer() );
231 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
234 attr =
new wxGridCellAttr;
235 attr->SetRenderer(
new wxGridCellBoolRenderer() );
237 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
243 m_filter->SetDescriptiveText(
_(
"Filter" ) );
245 attr =
new wxGridCellAttr;
251 m_grid->UseNativeColHeader(
true );
255 m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
268 SetTitle(
m_job->GetSettingsDialogTitle() );
281 for(
const wxString& fieldName :
m_job->m_fieldsOrdered )
284 field.
name = fieldName;
285 field.
show = !fieldName.StartsWith( wxT(
"__" ), &field.
name );
288 if( (
m_job->m_fieldsLabels.size() > i ) && !
m_job->m_fieldsLabels[i].IsEmpty() )
313 fmtPreset.
name =
m_job->m_bomFmtPresetName;
343 if( visible_column.IsEmpty() )
345 visible_column = wxT(
"0" );
349 CallAfter( [
this, cfg]()
379 m_parent->Schematic().AddListener(
this );
384 m_grid->EnableEditing(
false );
406 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
408 if(
m_grid->IsColShown( i ) )
410 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
424 m_grid->PopEventHandler(
true );
432 wxGridCellAttr* attr =
new wxGridCellAttr;
433 attr->SetReadOnly(
false );
456 attr->SetAlignment( wxALIGN_RIGHT, wxALIGN_CENTER );
457 attr->SetRenderer(
new wxGridCellNumberRenderer() );
462 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
474 attr->SetEditor(
m_grid->GetDefaultEditor() );
483 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
486 m_grid->AutoSizeColumns(
false );
488 bool sortAscending =
true;
490 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
516 std::string key(
m_dataModel->GetColFieldName( col ).ToUTF8() );
526 int maxWidth = defaultDlgSize.x / 3;
528 m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
538 m_grid->SetSortingColumn( sortCol, sortAscending );
544 if( !wxDialog::TransferDataFromWindow() )
556 case SCOPE::SCOPE_ALL:
m_scope->SetSelection( 0 );
break;
557 case SCOPE::SCOPE_SHEET:
m_scope->SetSelection( 1 );
break;
558 case SCOPE::SCOPE_SHEET_RECURSIVE:
m_scope->SetSelection( 2 );
break;
563 if( selection.GetSize() == 1 )
575 for(
int row = 0; row <
m_dataModel->GetNumberRows(); ++row )
577 std::vector<SCH_REFERENCE> references =
m_dataModel->GetRowReferences( row );
582 if( ref.GetSymbol() == symbol )
596 for(
int col = 0; col <
m_dataModel->GetNumberCols(); col++ )
602 else if( anyCol == -1 &&
m_dataModel->GetShowColumn( col ) )
606 if( valueCol != -1 &&
m_dataModel->GetShowColumn( valueCol ) )
607 m_grid->GoToCell( row, valueCol );
608 else if( refCol != -1 &&
m_dataModel->GetShowColumn( refCol ) )
609 m_grid->GoToCell( row, refCol );
610 else if( anyCol != -1 )
611 m_grid->GoToCell( row, anyCol );
629 if( !
m_grid->CommitPendingChanges() )
632 if( !wxDialog::TransferDataFromWindow() )
646 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
649 m_parent->SetCurrentSheet( currentSheet );
660 bool show,
bool groupBy,
bool addedByUser )
670 m_dataModel->AddColumn( aFieldName, aLabelValue, addedByUser );
672 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
673 m_grid->ProcessTableMessage( msg );
676 [&]() -> std::pair<int, int>
687 auto addMandatoryField =
688 [&](
FIELD_T fieldId,
bool show,
bool groupBy )
708 std::set<wxString> userFieldNames;
716 if( !field.IsMandatory() && !field.IsPrivate() )
717 userFieldNames.insert( field.GetName() );
721 for(
const wxString& fieldName : userFieldNames )
727 if( userFieldNames.count( tfn.m_Name ) == 0 )
735 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
737 if( dlg.ShowModal() != wxID_OK )
740 wxString fieldName = dlg.GetValue();
742 if( fieldName.IsEmpty() )
748 for(
int i = 0; i <
m_dataModel->GetNumberCols(); ++i )
750 if( fieldName ==
m_dataModel->GetColFieldName( i ) )
752 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), fieldName ) );
775 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
781 return IsOK(
this, wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ),
787 int col =
m_dataModel->GetFieldNameCol( fieldName );
807 if( selectedRows.empty() )
810 int row = selectedRows[0];
816 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory and names cannot be changed." ),
824 int col =
m_dataModel->GetFieldNameCol( fieldName );
825 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
827 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ), fieldName );
829 if( dlg.ShowModal() != wxID_OK )
832 wxString newFieldName = dlg.GetValue();
835 if( newFieldName == fieldName )
839 if(
m_dataModel->GetFieldNameCol( newFieldName ) != -1 )
841 wxString confirm_msg = wxString::Format(
_(
"Field name %s already exists." ), newFieldName );
868#if defined( __WXOSX__ ) || wxCHECK_VERSION( 3, 3, 0 )
869 wxPoint pos = aEvent.GetPosition();
870 wxRect ctrlRect =
m_filter->GetScreenRect();
871 int buttonWidth = ctrlRect.GetHeight();
874 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
875 SetCursor( wxCURSOR_ARROW );
876 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
877 SetCursor( wxCURSOR_ARROW );
879 SetCursor( wxCURSOR_IBEAM );
898 switch( aEvent.GetSelection() )
900 case 0:
setScope( SCOPE::SCOPE_ALL );
break;
901 case 1:
setScope( SCOPE::SCOPE_SHEET );
break;
902 case 2:
setScope( SCOPE::SCOPE_SHEET_RECURSIVE );
break;
924 menu.Append( 4204,
_(
"Include 'DNP' Symbols" ),
925 _(
"Show symbols marked 'DNP' in the table. This setting also controls whether or not 'DNP' "
926 "symbols are included on export." ),
930 menu.Append( 4205,
_(
"Include 'Exclude from BOM' Symbols" ),
931 _(
"Show symbols marked 'Exclude from BOM' in the table. Symbols marked 'Exclude from BOM' "
932 "are never included on export." ),
934 menu.Check( 4205,
m_dataModel->GetIncludeExcludedFromBOM() );
936 menu.AppendSeparator();
938 menu.Append( 4206,
_(
"Highlight on Cross-probe" ),
939 _(
"Highlight corresponding item on canvas when it is selected in the table" ),
943 menu.Append( 4207,
_(
"Select on Cross-probe" ),
944 _(
"Select corresponding item on canvas when it is selected in the table" ),
949 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
951 if( menu_id == 0 || menu_id == 4204 )
959 else if( menu_id == 1 || menu_id == 4205 )
967 else if( menu_id == 3 || menu_id == 4206 )
974 else if( menu_id == 4 || menu_id == 4207 )
986 int sortCol = aEvent.GetCol();
987 std::string key(
m_dataModel->GetColFieldName( sortCol ).ToUTF8() );
999 if(
m_grid->IsSortingBy( sortCol ) )
1002 ascending = !
m_grid->IsSortOrderAscending();
1020 int origPos = aEvent.GetCol();
1025 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1027 if(
m_grid->IsColShown( i ) )
1029 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
1037 int newPos =
m_grid->GetColPos( origPos );
1040 if( newPos < origPos )
1081 int row = aEvent.GetRow();
1083 wxCHECK( row < m_viewControlsGrid->GetNumberRows(), );
1085 switch( aEvent.GetCol() )
1091 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1096 m_grid->SetColLabelValue( dataCol, label );
1114 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1126 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1128 if(
m_dataModel->ColIsQuantity( dataCol ) && value )
1130 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
1137 if(
m_dataModel->ColIsItemNumber( dataCol ) && value )
1139 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
1189 if(
m_dataModel->ColIsReference( 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 );
1452 Prj().AbsolutePath(
m_parent->Schematic().GetFileName() ),
1455 msg.Printf(
_(
"Could not open/create path '%s'." ), outputFile.GetPath() );
1460 wxFFile out( outputFile.GetFullPath(),
"wb" );
1462 if( !out.IsOpened() )
1464 msg.Printf(
_(
"Could not create BOM output '%s'." ), outputFile.GetFullPath() );
1473 msg.Printf(
_(
"Could not write BOM output '%s'." ), outputFile.GetFullPath() );
1480 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1488 EndModal( wxID_CANCEL );
1505 m_job->m_bomFmtPresetName = wxEmptyString;
1510 m_job->m_bomPresetName = wxEmptyString;
1526 m_job->m_fieldsOrdered.clear();
1527 m_job->m_fieldsLabels.clear();
1528 m_job->m_fieldsGroupBy.clear();
1532 if( modelField.show )
1533 m_job->m_fieldsOrdered.emplace_back( modelField.name );
1535 m_job->m_fieldsOrdered.emplace_back( wxT(
"__" ) + modelField.name );
1537 m_job->m_fieldsLabels.emplace_back( modelField.label );
1539 if( modelField.groupBy )
1540 m_job->m_fieldsGroupBy.emplace_back( modelField.name );
1543 EndModal( wxID_OK );
1560 m_grid->CommitPendingChanges(
true );
1576 m_parent->Schematic().RemoveListener(
this );
1579 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1581 if( wxWindow* parent = GetParent() )
1582 wxQueueEvent( parent, evt );
1588 std::vector<BOM_PRESET> ret;
1590 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1592 if( !pair.second.readOnly )
1593 ret.emplace_back( pair.second );
1605 for(
const BOM_PRESET& preset : aPresetList )
1623 wxCommandEvent
dummy;
1666 int default_idx = 0;
1670 m_cbBomPresets->Append( wxGetTranslation( presetName ), (
void*) &preset );
1695 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1697 const BOM_PRESET& preset = aPair.second;
1700 if( !( preset.sortAsc == current.sortAsc
1701 && preset.filterString == current.filterString
1702 && preset.groupSymbols == current.groupSymbols
1703 && preset.excludeDNP == current.excludeDNP
1704 && preset.includeExcludedFromBOM == current.includeExcludedFromBOM ) )
1715 if( preset.sortField != wxGetTranslation( current.
sortField ) )
1719 std::vector<BOM_FIELD>
A,
B;
1721 for(
const BOM_FIELD& field : preset.fieldsOrdered )
1723 if( field.show || field.groupBy )
1724 A.emplace_back( field );
1729 if( field.show || field.groupBy )
1730 B.emplace_back( field );
1736 if( it != m_bomPresets.end() )
1740 bool do_translate = it->second.readOnly;
1741 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1742 m_cbBomPresets->SetStringSelection(
text );
1746 m_cbBomPresets->SetSelection( m_cbBomPresets->GetCount() - 3 );
1749 m_currentBomPreset =
static_cast<BOM_PRESET*
>( m_cbBomPresets->GetClientData( m_cbBomPresets->GetSelection() ) );
1758 wxString ui_label = aName;
1762 if( presetName == aName )
1764 if( preset.readOnly ==
true )
1765 ui_label = wxGetTranslation( aName );
1790 auto resetSelection =
1799 if( index == count - 3 )
1805 else if( index == count - 2 )
1813 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1815 if( dlg.ShowModal() != wxID_OK )
1821 name = dlg.GetValue();
1839 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1840 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1847 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1868 else if( index == count - 1 )
1871 wxArrayString headers;
1872 std::vector<wxArrayString> items;
1874 headers.Add(
_(
"Presets" ) );
1878 if( !preset.readOnly )
1882 items.emplace_back( item );
1894 if( idx != wxNOT_FOUND )
1944 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1946 const wxString& fieldName(
m_dataModel->GetColFieldName( i ) );
1967 int col =
m_dataModel->GetFieldNameCol( fieldName );
1971 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
1976 std::string fieldNameStr( fieldName.ToUTF8() );
1979 const wxString& label =
m_dataModel->GetColLabelValue( col );
1981 m_grid->SetColLabelValue( col, label );
1996 bool groupBy =
m_dataModel->GetGroupColumn( col );
2020 std::vector<BOM_FMT_PRESET> ret;
2024 if( !preset.readOnly )
2025 ret.emplace_back( preset );
2055 wxCommandEvent
dummy;
2097 int default_idx = 0;
2126 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
2128 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
2129 && aPair.second.stringDelimiter == current.stringDelimiter
2130 && aPair.second.refDelimiter == current.refDelimiter
2131 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
2132 && aPair.second.keepTabs == current.keepTabs
2133 && aPair.second.keepLineBreaks == current.keepLineBreaks );
2140 bool do_translate = it->second.readOnly;
2141 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
2160 wxString ui_label = aName;
2164 if( presetName == aName )
2166 if( preset.readOnly )
2167 ui_label = wxGetTranslation( aName );
2192 auto resetSelection =
2201 if( index == count - 3 )
2207 else if( index == count - 2 )
2215 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
2217 if( dlg.ShowModal() != wxID_OK )
2223 name = dlg.GetValue();
2241 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2242 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2249 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2270 else if( index == count - 1 )
2273 wxArrayString headers;
2274 std::vector<wxArrayString> items;
2276 headers.Add(
_(
"Presets" ) );
2278 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2280 if( !pair.second.readOnly )
2283 item.Add( pair.first );
2284 items.emplace_back( item );
2296 if( idx != wxNOT_FOUND )
2351 bool modified =
false;
2354 std::vector<BOM_PRESET> presets;
2358 if( !preset.readOnly )
2359 presets.emplace_back( preset );
2375 std::vector<BOM_FMT_PRESET> fmts;
2379 if( !preset.readOnly )
2380 fmts.emplace_back( preset );
2401 std::vector<SCH_ITEM*>& aSchItem )
2404 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2418 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2424 std::set<SCH_SYMBOL*> symbols;
2428 symbols.insert( ref.GetSymbol() );
2433 for(
SCH_FIELD& field : symbol->GetFields() )
2434 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2448 std::vector<SCH_ITEM*>& aSchItem )
2465 std::vector<SCH_ITEM*>& aSchItem )
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,
2546 for(
size_t i = 0; i < aCachedRefs.
GetCount(); i++ )
2573 if( basePath.Path() == instance.m_Path )
2581 subSheets.push_back( sheetPath );
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
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
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
wxTextCtrl * m_textOutput
STD_BITMAP_BUTTON * m_bRefresh
STD_BITMAP_BUTTON * m_renameFieldButton
STD_BITMAP_BUTTON * m_addFieldButton
wxTextCtrl * m_textStringDelimiter
wxChoice * m_cbBomPresets
wxTextCtrl * m_outputFileName
wxSplitterWindow * m_splitterMainWindow
wxTextCtrl * m_textFieldDelimiter
wxCheckBox * m_groupSymbolsBox
wxTextCtrl * m_textRefRangeDelimiter
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 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
SCH_EDIT_FRAME * m_parent
bool TransferDataFromWindow() override
SCH_REFERENCE_LIST m_symbolsList
void SetupColumnProperties(int aCol)
FIELDS_EDITOR_GRID_DATA_MODEL * m_dataModel
void updateBomPresetSelection(const wxString &aName)
void 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()
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 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
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
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.
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
#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.