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 );
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;
253 m_grid->UseNativeColHeader(
true );
257 m_grid->SetSelectionMode( wxGrid::wxGridSelectCells );
265 if( !
m_parent->Schematic().GetCurrentVariant().IsEmpty() )
269 if( toSelect == wxNOT_FOUND )
282 SetTitle(
m_job->GetSettingsDialogTitle() );
304 CallAfter( [
this, cfg]()
333 m_parent->Schematic().AddListener(
this );
338 m_grid->EnableEditing(
false );
357 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
359 if(
m_grid->IsColShown( i ) )
361 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
375 m_grid->PopEventHandler(
true );
385 if( aIsLeftPanelCollapsed )
400 wxGridCellAttr* attr =
new wxGridCellAttr;
401 attr->SetReadOnly(
false );
425 attr->SetAlignment( wxALIGN_RIGHT, wxALIGN_CENTER );
426 attr->SetRenderer(
new wxGridCellNumberRenderer() );
431 attr->SetAlignment( wxALIGN_CENTER, wxALIGN_CENTER );
444 attr->SetEditor(
m_grid->GetDefaultEditor() );
453 wxSize defaultDlgSize = ConvertDialogToPixels( wxSize( 600, 300 ) );
456 m_grid->AutoSizeColumns(
false );
458 bool sortAscending =
true;
460 for(
int col = 0; col <
m_grid->GetNumberCols(); ++col )
486 std::string key(
m_dataModel->GetColFieldName( col ).ToUTF8() );
496 int maxWidth = defaultDlgSize.x / 3;
498 m_grid->SetColSize( col, std::clamp( textWidth, 100, maxWidth ) );
508 m_grid->SetSortingColumn( sortCol, sortAscending );
514 if( !wxDialog::TransferDataToWindow() )
537 for(
const wxString& fieldName :
m_job->m_fieldsOrdered )
540 field.
name = fieldName;
541 field.
show = !fieldName.StartsWith( wxT(
"__" ), &field.
name );
544 if( (
m_job->m_fieldsLabels.size() > i ) && !
m_job->m_fieldsLabels[i].IsEmpty() )
565 fmtPreset.
name =
m_job->m_bomFmtPresetName;
584 wxCommandEvent
dummy;
587 if( selection.GetSize() == 1 )
599 for(
int row = 0; row <
m_dataModel->GetNumberRows(); ++row )
601 std::vector<SCH_REFERENCE> references =
m_dataModel->GetRowReferences( row );
606 if( ref.GetSymbol() == symbol )
620 for(
int col = 0; col <
m_dataModel->GetNumberCols(); col++ )
626 else if( anyCol == -1 &&
m_dataModel->GetShowColumn( col ) )
630 if( valueCol != -1 &&
m_dataModel->GetShowColumn( valueCol ) )
631 m_grid->GoToCell( row, valueCol );
632 else if( refCol != -1 &&
m_dataModel->GetShowColumn( refCol ) )
633 m_grid->GoToCell( row, refCol );
634 else if( anyCol != -1 )
635 m_grid->GoToCell( row, anyCol );
653 if( !
m_grid->CommitPendingChanges() )
656 if( !wxDialog::TransferDataFromWindow() )
667 wxString currentVariant =
m_parent->Schematic().GetCurrentVariant();
671 if( !commit.
Empty() )
673 commit.
Push( wxS(
"Symbol Fields Table Edit" ) );
678 m_parent->SetCurrentSheet( currentSheet );
687 bool show,
bool groupBy,
bool addedByUser )
697 m_dataModel->AddColumn( aFieldName, aLabelValue, addedByUser,
m_parent->Schematic().GetCurrentVariant() );
699 wxGridTableMessage msg(
m_dataModel, wxGRIDTABLE_NOTIFY_COLS_APPENDED, 1 );
700 m_grid->ProcessTableMessage( msg );
703 [&]() -> std::pair<int, int>
714 auto addMandatoryField =
715 [&](
FIELD_T fieldId,
bool show,
bool groupBy )
735 std::set<wxString> userFieldNames;
743 if( !field.IsMandatory() && !field.IsPrivate() )
744 userFieldNames.insert( field.GetName() );
748 for(
const wxString& fieldName : userFieldNames )
754 if( userFieldNames.count( tfn.m_Name ) == 0 )
762 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Add Field" ) );
764 if( dlg.ShowModal() != wxID_OK )
767 wxString fieldName = dlg.GetValue();
769 if( fieldName.IsEmpty() )
775 for(
int i = 0; i <
m_dataModel->GetNumberCols(); ++i )
777 if( fieldName ==
m_dataModel->GetColFieldName( i ) )
779 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), fieldName ) );
802 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
808 return IsOK(
this, wxString::Format(
_(
"Are you sure you want to remove the field '%s'?" ),
814 int col =
m_dataModel->GetFieldNameCol( fieldName );
834 if( selectedRows.empty() )
837 int row = selectedRows[0];
843 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory and names cannot be changed." ),
853 int col =
m_dataModel->GetFieldNameCol( fieldName );
854 wxCHECK_RET( col != -1, wxS(
"Existing field name missing from data model" ) );
856 wxTextEntryDialog dlg(
this,
_(
"New field name:" ),
_(
"Rename Field" ), fieldName );
858 if( dlg.ShowModal() != wxID_OK )
861 wxString newFieldName = dlg.GetValue();
864 if( newFieldName == fieldName )
868 if(
m_dataModel->GetFieldNameCol( newFieldName ) != -1 )
870 wxString confirm_msg = wxString::Format(
_(
"Field name %s already exists." ), newFieldName );
879 if( labelIsAutogenerated )
903#if defined( __WXOSX__ )
904 wxPoint pos = aEvent.GetPosition();
905 wxRect ctrlRect =
m_filter->GetScreenRect();
906 int buttonWidth = ctrlRect.GetHeight();
909 if(
m_filter->IsSearchButtonVisible() && pos.x < buttonWidth )
910 SetCursor( wxCURSOR_ARROW );
911 else if(
m_filter->IsCancelButtonVisible() && pos.x > ctrlRect.GetWidth() - buttonWidth )
912 SetCursor( wxCURSOR_ARROW );
914 SetCursor( wxCURSOR_IBEAM );
929 switch( aEvent.GetSelection() )
931 case 0:
setScope( SCOPE::SCOPE_ALL );
break;
932 case 1:
setScope( SCOPE::SCOPE_SHEET );
break;
933 case 2:
setScope( SCOPE::SCOPE_SHEET_RECURSIVE );
break;
955 menu.Append( 4204,
_(
"Include 'DNP' Symbols" ),
956 _(
"Show symbols marked 'DNP' in the table. This setting also controls whether or not 'DNP' "
957 "symbols are included on export." ),
961 menu.Append( 4205,
_(
"Include 'Exclude from BOM' Symbols" ),
962 _(
"Show symbols marked 'Exclude from BOM' in the table. Symbols marked 'Exclude from BOM' "
963 "are never included on export." ),
965 menu.Check( 4205,
m_dataModel->GetIncludeExcludedFromBOM() );
967 menu.AppendSeparator();
969 menu.Append( 4206,
_(
"Highlight on Cross-probe" ),
970 _(
"Highlight corresponding item on canvas when it is selected in the table" ),
974 menu.Append( 4207,
_(
"Select on Cross-probe" ),
975 _(
"Select corresponding item on canvas when it is selected in the table" ),
980 int menu_id =
m_bMenu->GetPopupMenuSelectionFromUser( menu );
982 if( menu_id == 0 || menu_id == 4204 )
990 else if( menu_id == 1 || menu_id == 4205 )
998 else if( menu_id == 3 || menu_id == 4206 )
1005 else if( menu_id == 4 || menu_id == 4207 )
1017 int sortCol = aEvent.GetCol();
1018 std::string key(
m_dataModel->GetColFieldName( sortCol ).ToUTF8() );
1030 if(
m_grid->IsSortingBy( sortCol ) )
1033 ascending = !
m_grid->IsSortOrderAscending();
1051 int origPos = aEvent.GetCol();
1056 for(
int i = 0; i <
m_grid->GetNumberCols(); i++ )
1058 if(
m_grid->IsColShown( i ) )
1060 std::string fieldName(
m_dataModel->GetColFieldName( i ).ToUTF8() );
1068 int newPos =
m_grid->GetColPos( origPos );
1071 if( newPos < origPos )
1112 int row = aEvent.GetRow();
1114 wxCHECK( row < m_viewControlsGrid->GetNumberRows(), );
1116 switch( aEvent.GetCol() )
1122 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1127 m_grid->SetColLabelValue( dataCol, label );
1145 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1157 int dataCol =
m_dataModel->GetFieldNameCol( fieldName );
1159 if(
m_dataModel->ColIsQuantity( dataCol ) && value )
1161 DisplayError(
this,
_(
"The Quantity column cannot be grouped by." ) );
1168 if(
m_dataModel->ColIsItemNumber( dataCol ) && value )
1170 DisplayError(
this,
_(
"The Item Number column cannot be grouped by." ) );
1219 if(
m_dataModel->IsExpanderColumn( event.GetCol() ) )
1221 m_grid->ClearSelection();
1224 m_grid->SetGridCursor( event.GetRow(), event.GetCol() );
1243 std::set<SCH_REFERENCE> refs;
1244 std::set<SCH_ITEM*> symbols;
1247 if( aEvent.Selecting() )
1249 for(
int i = aEvent.GetTopRow(); i <= aEvent.GetBottomRow(); i++ )
1256 symbols.insert( ref.GetSymbol() );
1263 if( refs.size() > 0 )
1267 wxString symbol_path = refs.begin()->GetFullPath();
1280 std::vector<SCH_ITEM*> items( symbols.begin(), symbols.end() );
1282 if( refs.size() > 0 )
1283 selTool->
SyncSelection( refs.begin()->GetSheetPath(),
nullptr, items );
1296 int remainingWidth =
m_viewControlsGrid->GetSize().GetX() - showColWidth - groupByColWidth;
1345 bool saveIncludeExcudedFromBOM =
m_dataModel->GetIncludeExcludedFromBOM();
1352 if( saveIncludeExcudedFromBOM )
1396 wxFileName fn(
Prj().AbsolutePath(
m_parent->Schematic().GetFileName() ) );
1399 wxFileDialog saveDlg(
this,
_(
"Bill of Materials Output File" ),
path, fn.GetFullName(),
1402 if( saveDlg.ShowModal() == wxID_CANCEL )
1406 wxFileName file = wxFileName( saveDlg.GetPath() );
1407 wxString defaultPath = fn.GetPathWithSep();
1409 if(
IsOK(
this, wxString::Format(
_(
"Do you want to use a path relative to\n'%s'?" ), defaultPath ) ) )
1411 if( !file.MakeRelativeTo( defaultPath ) )
1413 DisplayErrorMessage(
this,
_(
"Cannot make path relative (target volume different from schematic "
1414 "file volume)!" ) );
1448 _(
"Changes have not yet been saved. Export unsaved data?" ),
"",
1449 _(
"OK" ),
_(
"Cancel" ) )
1459 std::function<bool( wxString* )> textResolver =
1460 [&]( wxString* token ) ->
bool
1470 if(
path.IsEmpty() )
1472 DisplayError(
this,
_(
"No output file specified in Export tab." ) );
1479 wxFileName outputFile = wxFileName::FileName(
path );
1485 msg.Printf(
_(
"Could not open/create path '%s'." ), outputFile.GetPath() );
1490 wxFFile out( outputFile.GetFullPath(),
"wb" );
1492 if( !out.IsOpened() )
1494 msg.Printf(
_(
"Could not create BOM output '%s'." ), outputFile.GetFullPath() );
1503 msg.Printf(
_(
"Could not write BOM output '%s'." ), outputFile.GetFullPath() );
1510 msg.Printf(
_(
"Wrote BOM output to '%s'" ), outputFile.GetFullPath() );
1518 EndModal( wxID_CANCEL );
1535 m_job->m_bomFmtPresetName = wxEmptyString;
1540 m_job->m_bomPresetName = wxEmptyString;
1556 m_job->m_fieldsOrdered.clear();
1557 m_job->m_fieldsLabels.clear();
1558 m_job->m_fieldsGroupBy.clear();
1562 if( modelField.show )
1563 m_job->m_fieldsOrdered.emplace_back( modelField.name );
1565 m_job->m_fieldsOrdered.emplace_back( wxT(
"__" ) + modelField.name );
1567 m_job->m_fieldsLabels.emplace_back( modelField.label );
1569 if( modelField.groupBy )
1570 m_job->m_fieldsGroupBy.emplace_back( modelField.name );
1575 if( !selectedVariant.IsEmpty() )
1576 m_job->m_variantNames.push_back( selectedVariant );
1578 EndModal( wxID_OK );
1595 m_grid->CommitPendingChanges(
true );
1611 m_parent->Schematic().RemoveListener(
this );
1614 wxCommandEvent* evt =
new wxCommandEvent( EDA_EVT_CLOSE_DIALOG_SYMBOL_FIELDS_TABLE, wxID_ANY );
1616 if( wxWindow* parent = GetParent() )
1617 wxQueueEvent( parent, evt );
1623 std::vector<BOM_PRESET> ret;
1625 for(
const std::pair<const wxString, BOM_PRESET>& pair :
m_bomPresets )
1627 if( !pair.second.readOnly )
1628 ret.emplace_back( pair.second );
1640 for(
const BOM_PRESET& preset : aPresetList )
1658 wxCommandEvent
dummy;
1701 int default_idx = 0;
1705 m_cbBomPresets->Append( wxGetTranslation( presetName ), (
void*) &preset );
1730 [&](
const std::pair<const wxString, BOM_PRESET>& aPair )
1732 const BOM_PRESET& preset = aPair.second;
1735 if( !( preset.sortAsc == current.sortAsc
1736 && preset.filterString == current.filterString
1737 && preset.groupSymbols == current.groupSymbols
1738 && preset.excludeDNP == current.excludeDNP
1739 && preset.includeExcludedFromBOM == current.includeExcludedFromBOM ) )
1750 if( preset.sortField != wxGetTranslation( current.
sortField ) )
1754 std::vector<BOM_FIELD>
A,
B;
1756 for(
const BOM_FIELD& field : preset.fieldsOrdered )
1758 if( field.show || field.groupBy )
1759 A.emplace_back( field );
1764 if( field.show || field.groupBy )
1765 B.emplace_back( field );
1771 if( it != m_bomPresets.end() )
1775 bool do_translate = it->second.readOnly;
1776 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
1777 m_cbBomPresets->SetStringSelection(
text );
1781 m_cbBomPresets->SetSelection( m_cbBomPresets->GetCount() - 3 );
1784 m_currentBomPreset =
static_cast<BOM_PRESET*
>( m_cbBomPresets->GetClientData( m_cbBomPresets->GetSelection() ) );
1793 wxString ui_label = aName;
1797 if( presetName == aName )
1799 if( preset.readOnly ==
true )
1800 ui_label = wxGetTranslation( aName );
1825 auto resetSelection =
1834 if(
index == count - 3 )
1840 else if(
index == count - 2 )
1848 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
1850 if( dlg.ShowModal() != wxID_OK )
1856 name = dlg.GetValue();
1874 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
1875 _(
"Error" ), wxOK | wxICON_ERROR,
this );
1882 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
1903 else if(
index == count - 1 )
1906 wxArrayString headers;
1907 std::vector<wxArrayString> items;
1909 headers.Add(
_(
"Presets" ) );
1913 if( !preset.readOnly )
1917 items.emplace_back( item );
1929 if( idx != wxNOT_FOUND )
1979 for(
int i = 0; i <
m_dataModel->GetColsCount(); i++ )
1981 const wxString& fieldName(
m_dataModel->GetColFieldName( i ) );
2002 int col =
m_dataModel->GetFieldNameCol( fieldName );
2006 wxASSERT_MSG(
true,
"Fields control has a field not found in the data model." );
2011 std::string fieldNameStr( fieldName.ToUTF8() );
2014 const wxString& label =
m_dataModel->GetColLabelValue( col );
2016 m_grid->SetColLabelValue( col, label );
2031 bool groupBy =
m_dataModel->GetGroupColumn( col );
2055 std::vector<BOM_FMT_PRESET> ret;
2059 if( !preset.readOnly )
2060 ret.emplace_back( preset );
2090 wxCommandEvent
dummy;
2132 int default_idx = 0;
2161 [&](
const std::pair<const wxString, BOM_FMT_PRESET>& aPair )
2163 return ( aPair.second.fieldDelimiter == current.fieldDelimiter
2164 && aPair.second.stringDelimiter == current.stringDelimiter
2165 && aPair.second.refDelimiter == current.refDelimiter
2166 && aPair.second.refRangeDelimiter == current.refRangeDelimiter
2167 && aPair.second.keepTabs == current.keepTabs
2168 && aPair.second.keepLineBreaks == current.keepLineBreaks );
2175 bool do_translate = it->second.readOnly;
2176 wxString
text = do_translate ? wxGetTranslation( it->first ) : it->first;
2195 wxString ui_label = aName;
2199 if( presetName == aName )
2201 if( preset.readOnly )
2202 ui_label = wxGetTranslation( aName );
2227 auto resetSelection =
2236 if(
index == count - 3 )
2242 else if(
index == count - 2 )
2250 wxTextEntryDialog dlg(
this,
_(
"BOM preset name:" ),
_(
"Save BOM Preset" ),
name );
2252 if( dlg.ShowModal() != wxID_OK )
2258 name = dlg.GetValue();
2276 wxMessageBox(
_(
"Default presets cannot be modified.\nPlease use a different name." ),
2277 _(
"Error" ), wxOK | wxICON_ERROR,
this );
2284 if( !
IsOK(
this,
_(
"Overwrite existing preset?" ) ) )
2305 else if(
index == count - 1 )
2308 wxArrayString headers;
2309 std::vector<wxArrayString> items;
2311 headers.Add(
_(
"Presets" ) );
2313 for( std::pair<const wxString, BOM_FMT_PRESET>& pair :
m_bomFmtPresets )
2315 if( !pair.second.readOnly )
2318 item.Add( pair.first );
2319 items.emplace_back( item );
2331 if( idx != wxNOT_FOUND )
2386 bool modified =
false;
2389 std::vector<BOM_PRESET> presets;
2393 if( !preset.readOnly )
2394 presets.emplace_back( preset );
2410 std::vector<BOM_FMT_PRESET> fmts;
2414 if( !preset.readOnly )
2415 fmts.emplace_back( preset );
2438 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2452 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2458 std::set<SCH_SYMBOL*> symbols;
2462 symbols.insert( ref.GetSymbol() );
2467 for(
SCH_FIELD& field : symbol->GetFields() )
2468 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2500 m_parent->Schematic().Hierarchy().GetSymbols( allRefs );
2514 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2517 m_parent->Schematic().GetCurrentVariant() );
2521 std::set<SCH_SYMBOL*> symbols;
2525 symbols.insert( ref.GetSymbol() );
2530 for(
SCH_FIELD& field : symbol->GetFields() )
2531 AddField( field.GetCanonicalName(), field.GetName(),
true,
false,
true );
2548 if(
m_dataModel->GetScope() != FIELDS_EDITOR_GRID_DATA_MODEL::SCOPE::SCOPE_ALL )
2559 m_grid->Connect( wxEVT_GRID_RANGE_SELECTED,
2567 m_grid->Disconnect( wxEVT_GRID_RANGE_SELECTED,
2578 for(
size_t i = 0; i < aCachedRefs.
GetCount(); i++ )
2605 if( basePath.Path() == instance.m_Path )
2613 subSheets.push_back( sheetPath );
2631 if( !
m_parent->ShowAddVariantDialog() )
2634 wxArrayString ctrlContents;
2637 for(
const wxString& variant :
m_parent->Schematic().GetVariantNames() )
2638 ctrlContents.Add( variant );
2643 wxString currentVariant =
m_parent->Schematic().GetCurrentVariant();
2647 if( newSelection != wxNOT_FOUND )
2659 if( ( selection == wxNOT_FOUND ) || ( selection == 0 ) )
2661 m_parent->GetInfoBar()->ShowMessageFor(
_(
"Cannot delete the default variant." ),
2662 10000, wxICON_ERROR );
2668 m_parent->Schematic().DeleteVariant( variantName );
2670 int newSelection = std::max( 0, selection - 1 );
2674 m_parent->SetCurrentVariant( selectedVariant );
2676 if(
m_grid->CommitPendingChanges(
true ) )
2678 m_dataModel->SetCurrentVariant( selectedVariant );
2689 m_parent->UpdateVariantSelectionCtrl(
m_parent->Schematic().GetVariantNamesForUI() );
2698 if( ( selection == wxNOT_FOUND ) || ( selection == 0 ) )
2700 m_parent->GetInfoBar()->ShowMessageFor(
_(
"Cannot rename the default variant." ),
2701 10000, wxICON_ERROR );
2707 wxTextEntryDialog dlg(
this,
_(
"Enter new variant name:" ),
_(
"Rename Variant" ),
2708 oldVariantName, wxOK | wxCANCEL | wxCENTER );
2710 if( dlg.ShowModal() == wxID_CANCEL )
2713 wxString newVariantName = dlg.GetValue().Trim().Trim(
false );
2716 if( newVariantName.IsEmpty() )
2718 m_parent->GetInfoBar()->ShowMessageFor(
_(
"Variant name cannot be empty." ),
2719 10000, wxICON_ERROR );
2726 m_parent->GetInfoBar()->ShowMessageFor( wxString::Format(
_(
"'%s' is a reserved variant name." ),
2728 10000, wxICON_ERROR );
2733 if( newVariantName == oldVariantName )
2737 for(
const wxString& existingName :
m_parent->Schematic().GetVariantNames() )
2739 if( existingName.CmpNoCase( newVariantName ) == 0
2740 && existingName.CmpNoCase( oldVariantName ) != 0 )
2742 m_parent->GetInfoBar()->ShowMessageFor( wxString::Format(
_(
"Variant '%s' already exists." ),
2744 0000, wxICON_ERROR );
2749 m_parent->Schematic().RenameVariant( oldVariantName, newVariantName );
2752 ctrlContents.Remove( oldVariantName );
2753 ctrlContents.Add( newVariantName );
2759 if( newSelection != wxNOT_FOUND )
2763 m_parent->UpdateVariantSelectionCtrl(
m_parent->Schematic().GetVariantNamesForUI() );
2772 if( ( selection == wxNOT_FOUND ) || ( selection == 0 ) )
2774 m_parent->GetInfoBar()->ShowMessageFor(
_(
"Cannot copy the default variant." ),
2775 10000, wxICON_ERROR );
2781 wxTextEntryDialog dlg(
this,
_(
"Enter name for the copied variant:" ),
_(
"Copy Variant" ),
2782 sourceVariantName + wxS(
"_copy" ), wxOK | wxCANCEL | wxCENTER );
2784 if( dlg.ShowModal() == wxID_CANCEL )
2787 wxString newVariantName = dlg.GetValue().Trim().Trim(
false );
2790 if( newVariantName.IsEmpty() )
2792 m_parent->GetInfoBar()->ShowMessageFor(
_(
"Variant name cannot be empty." ),
2793 10000, wxICON_ERROR );
2800 m_parent->GetInfoBar()->ShowMessageFor( wxString::Format(
_(
"Variant '%s' already exists." ),
2802 10000, wxICON_ERROR );
2806 m_parent->Schematic().CopyVariant( sourceVariantName, newVariantName );
2809 ctrlContents.Add( newVariantName );
2815 if( newSelection != wxNOT_FOUND )
2819 m_parent->UpdateVariantSelectionCtrl(
m_parent->Schematic().GetVariantNamesForUI() );
2825 wxString currentVariant;
2832 currentVariant =
m_parent->Schematic().GetCurrentVariant();
2834 if( currentVariant != selectedVariant )
2835 m_parent->SetCurrentVariant( selectedVariant );
2838 if( currentVariant != selectedVariant )
2840 if(
m_grid->CommitPendingChanges(
true ) )
2843 m_dataModel->SetCurrentVariant( selectedVariant );
2867 bool canModify = ( selection != wxNOT_FOUND ) && ( selection != 0 );
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_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
STD_BITMAP_BUTTON * m_browseButton
STD_BITMAP_BUTTON * m_sidebarButton
STD_BITMAP_BUTTON * m_copyVariantButton
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
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 onCopyVariant(wxCommandEvent &aEvent) override
void onDeleteVariant(wxCommandEvent &aEvent) override
bool TransferDataToWindow() override
void OnTableRangeSelected(wxGridRangeSelectEvent &aEvent)
void OnMenu(wxCommandEvent &event) override
void updateVariantButtonStates()
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)
wxString getSelectedVariant() const
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.