72 std::vector<const EMBEDDED_FILES*> inheritedEmbeddedFiles;
74 if( std::shared_ptr<LIB_SYMBOL> parent =
m_libEntry->GetParent().lock() )
78 inheritedEmbeddedFiles.push_back( parent->GetEmbeddedFiles() );
79 parent = parent->GetParent().lock();
83 m_embeddedFiles =
new PANEL_EMBEDDED_FILES( m_NoteBook, m_libEntry, 0, std::move( inheritedEmbeddedFiles ) );
84 m_NoteBook->AddPage( m_embeddedFiles,
_(
"Embedded Files" ) );
90 m_fpFiltersPanel->SetFootprintFieldAccessors( [
this]() {
return canAssignFootprintToField(); },
91 [
this](
const wxString& aFootprintName )
93 assignFootprintToField( aFootprintName );
96 m_NoteBook->InsertPage( 2, m_fpFiltersPanel,
_(
"Footprint Filters" ) );
99 bPinMapPageSizer->Add( m_pinMapPanel, 1, wxEXPAND, 5 );
101 m_fields =
new FIELDS_GRID_TABLE(
this, aParent, m_grid, m_libEntry, { m_embeddedFiles->GetLocalFiles() } );
102 m_grid->SetTable( m_fields );
103 m_grid->OverrideMinSize( 1.0, 1.0 );
104 m_grid->PushEventHandler(
new FIELDS_GRID_TRICKS( m_grid,
this, { m_embeddedFiles->GetLocalFiles() },
105 [&]( wxCommandEvent& aEvent )
107 OnAddField( aEvent );
109 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
112 std::vector<SCH_FIELD> fields;
113 m_libEntry->CopyFields( fields );
118 if( std::shared_ptr<LIB_SYMBOL> parent = m_libEntry->GetParent().lock() )
119 addInheritedFields( parent );
121 int minWidth = wxSystemSettings::GetMetric( wxSYS_VSCROLL_X );
123 for(
int ii = 0; ii <= 7; ++ii )
125 if( m_grid->IsColShown( ii ) )
126 minWidth += m_grid->GetColSize( ii );
129 m_grid->SetMinSize( wxSize( minWidth, -1 ) );
133 m_grid->SetColSize( 13, 48 );
134 m_grid->SetColSize( 14, 136 );
135 m_grid->SetColSize( 15, 62 );
136 m_grid->SetupColumnAutosizer( 1 );
138 m_grid->ShowHideColumns(
"0 1 2 3 4 5 6 7" );
142 m_unitNamesGrid->PushEventHandler(
new GRID_TRICKS( m_unitNamesGrid ) );
143 m_unitNamesGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
144 m_unitNamesGrid->SetupColumnAutosizer( 1 );
146 m_bodyStyleNamesGrid->PushEventHandler(
new GRID_TRICKS( m_bodyStyleNamesGrid,
147 [
this]( wxCommandEvent& aEvent )
149 OnAddBodyStyle( aEvent );
151 m_bodyStyleNamesGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
152 m_bodyStyleNamesGrid->SetupColumnAutosizer( 0 );
154 m_jumperGroupsGrid->SetupColumnAutosizer( 0 );
155 m_jumperGroupsGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
157 m_jumperGroupsGrid->PushEventHandler(
new GRID_TRICKS( m_jumperGroupsGrid,
158 [
this]( wxCommandEvent& aEvent )
160 OnAddJumperGroup( aEvent );
177 SetupStandardButtons();
179 if( aParent->IsSymbolFromLegacyLibrary() && !aParent->IsSymbolFromSchematic() )
181 m_stdSizerButtonCancel->SetDefault();
182 m_stdSizerButtonOK->SetLabel(
_(
"Read Only" ) );
183 m_stdSizerButtonOK->Enable(
false );
208 m_grid->GetParent()->Layout();
209 syncControlStates( m_libEntry->IsDerived() );
212 finishDialogSettings();
221 for(
size_t page = 0; page <
m_NoteBook->GetPageCount(); ++page )
244 m_grid->PopEventHandler(
true );
253 if( std::shared_ptr<LIB_SYMBOL> ancestor = aParent->GetParent().lock() )
257 std::vector<SCH_FIELD*> parentFields;
258 aParent->GetFields( parentFields );
260 for(
SCH_FIELD* parentField : parentFields )
263 if( parentField->IsMandatory() && parentField->GetText().IsEmpty() )
268 for(
size_t ii = 0; ii <
m_fields->size(); ++ii )
273 if( parentField->IsMandatory() )
274 match = field.
GetId() == parentField->GetId();
286 if( !found && !parentField->IsMandatory() )
294 if( !wxDialog::TransferDataToWindow() )
297 std::set<wxString> defined;
300 defined.insert( field.GetName() );
304 Pgm().GetCommonSettings()->m_FieldNameTemplates.GetTemplateFieldNames( TEMPLATES::SCOPE::GLOBAL ) )
306 if( defined.count( templateFieldname.m_Name ) <= 0 )
309 field.
SetVisible( templateFieldname.m_Visible );
319 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_fields->GetNumberRows() );
320 m_grid->ProcessTableMessage( msg );
329 std::set<LIB_SYMBOL*> visited;
331 while(
source &&
source->GetRawKeyWords().IsEmpty() && visited.insert(
source.get() ).second )
348 std::shared_ptr<LIB_SYMBOL> root =
m_libEntry->GetRootSymbol();
349 const std::map<int, wxString>& unitNames = root->GetUnitDisplayNames();
351 for(
int unit = 0; unit <
m_libEntry->GetUnitCount(); unit++ )
353 if( unitNames.contains( unit + 1 ) )
406 std::set<wxString> availablePins;
409 availablePins.insert(
pin->GetNumber() );
415 for(
const wxString& pinNumber :
group.GetNames() )
417 if( !groupTxt.IsEmpty() )
420 groupTxt << pinNumber;
430 wxArrayString symbolNames;
431 wxString libName =
m_libEntry->GetLibNickname();
433 if( !libName.empty() )
435 m_Parent->GetLibManager().GetSymbolNames( libName, symbolNames );
438 symbolNames.Sort( [](
const wxString& a,
const wxString& b ) ->
int
444 if( symbolNames.Index(
m_libEntry->GetName() ) != wxNOT_FOUND )
449 wxArrayString descendants;
450 m_Parent->GetLibManager().GetDerivedSymbolNames(
m_libEntry->GetName(), libName, descendants );
452 for(
const wxString& descendant : descendants )
454 if( symbolNames.Index( descendant ) != wxNOT_FOUND )
455 symbolNames.Remove( descendant );
460 if( std::shared_ptr<LIB_SYMBOL> rootSymbol =
m_libEntry->GetParent().lock() )
465 if( selection != wxNOT_FOUND )
477 m_grid->SetMinVisibleRows(
this, 4 );
488 for(
size_t page = 0; page <
m_NoteBook->GetPageCount(); ++page )
492 targetPage = (int) page;
506 if( !
m_grid->CommitPendingChanges() )
530 for(
int ii = 0; ii < (int)
m_fields->size(); ++ii )
537 wxString fieldName = field.
GetName(
false );
539 if( fieldName.IsEmpty() && !field.
GetText().IsEmpty() )
559 if( parentName.IsEmpty() )
569 std::set<wxString> seenSubRefs;
575 if( subRef.IsEmpty() )
578 if( !seenSubRefs.insert( subRef.Upper() ).second )
595 if( !
IsOK(
this,
_(
"Delete extra units from symbol?" ) ) )
599 int bodyStyleCount = 0;
627 if( bodyStyleCount < m_libEntry->GetBodyStyleCount() )
629 if( !
IsOK(
this,
_(
"Delete extra body styles from symbol?" ) ) )
639 if( !
m_grid->CommitPendingChanges()
652 if( newName.IsEmpty() )
654 wxMessageBox(
_(
"Symbol must have a name." ) );
660 if( oldName != newName )
662 wxString libName =
m_libEntry->GetLibNickname();
664 if( !libName.empty() &&
m_Parent->GetLibManager().SymbolNameInUse( newName, libName ) )
666 DisplayErrorMessage(
this, wxString::Format(
_(
"Symbol name '%s' already in use in library '%s'." ),
681 if( editingCurrentSymbol )
686 std::vector<SCH_FIELD> fieldsToSave;
689 for(
size_t ii = 0; ii <
m_fields->size(); ++ii )
705 emptyField.
SetText( wxEmptyString );
706 fieldsToSave.push_back( emptyField );
712 if( field.
GetText().IsEmpty() )
717 else if( fieldName.IsEmpty() )
722 fieldsToSave.push_back( field );
731 wxString libName =
m_libEntry->GetLibNickname();
737 wxCHECK( newParent,
false );
764 m_libEntry->SetBodyStyleCount( 1,
false,
false );
765 m_libEntry->SetHasDeMorganBodyStyles(
false );
770 m_libEntry->SetBodyStyleCount( 2,
false,
true );
776 std::vector<wxString> bodyStyleNames;
784 m_libEntry->SetBodyStyleCount( bodyStyleNames.size(),
true,
true );
785 m_libEntry->SetHasDeMorganBodyStyles(
false );
786 m_libEntry->SetBodyStyleNames( bodyStyleNames );
798 m_libEntry->GetValueField().SetText( newName );
818 m_libEntry->SetPinNameOffset( offset == 0 ? 20 : offset );
833 wxStringTokenizer tokenizer(
m_jumperGroupsGrid->GetCellValue( ii, 0 ),
", \t\r\n", wxTOKEN_STRTOK );
834 std::set<wxString> names;
836 while( tokenizer.HasMoreTokens() )
838 wxString token = tokenizer.GetNextToken();
840 if( token.IsEmpty() )
845 DisplayErrorMessage(
this, wxString::Format(
_(
"Pin '%s' in jumper pin group %d does not exist "
852 names.insert( token );
865 if( editingCurrentSymbol )
866 m_Parent->UpdateAfterSymbolProperties( &oldName );
880 if( !
pin->GetAlternates().empty() )
881 pinNumbersWithAlternates.
insert(
pin->GetNumber() );
884 if( pinNumbersWithAlternates.
size() )
887 wxString::Format(
_(
"(Pins %s.)" ), pinNumbersWithAlternates.
GetSummary() ) );
902 wxPoint pos = aEvent.GetPosition();
903 wxPoint unscolled_pos =
m_grid->CalcUnscrolledPosition( pos );
904 int row =
m_grid->YToRow( unscolled_pos.y );
905 int col =
m_grid->XToCol( unscolled_pos.x );
907 if( row == wxNOT_FOUND || col == wxNOT_FOUND || !
m_fields->IsInherited( row ) )
913 m_grid->SetToolTip( wxString::Format(
_(
"This field is inherited from '%s'." ),
m_fields->InheritedFrom( row ) ) );
919 wxGridCellEditor*
editor =
m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
920 wxControl* control =
editor->GetControl();
922 if( control && control->GetValidator() && !control->GetValidator()->Validate( control ) )
931 else if( event.GetCol() ==
FDC_NAME )
933 wxString newName =
event.GetString();
935 for(
int i = 0; i <
m_grid->GetNumberRows(); ++i )
937 if( i == event.GetRow() )
942 DisplayErrorMessage(
this, wxString::Format(
_(
"The name '%s' is already in use." ), newName ) );
994 [&]() -> std::pair<int, int>
1006 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
1007 m_grid->ProcessTableMessage( msg );
1020 if( row < m_fields->GetMandatoryRowCount() )
1023 m_fields->GetMandatoryRowCount() ) );
1035 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
1036 m_grid->ProcessTableMessage( msg );
1048 return row >
m_fields->GetMandatoryRowCount();
1052 m_fields->SwapRows( row, row - 1 );
1064 return row >=
m_fields->GetMandatoryRowCount();
1068 m_fields->SwapRows( row, row + 1 );
1078 [&]() -> std::pair<int, int>
1124 if( !
m_grid->CommitPendingChanges() )
1127 m_grid->ClearSelection();
1129 std::vector<SCH_FIELD> fields;
1132 fields.emplace_back( field );
1140 for(
const SCH_FIELD& editedField : fields )
1146 if( existingField.GetName() == editedField.GetName() )
1149 existingField.SetText( editedField.GetText() );
1156 m_fields->emplace_back( editedField );
1157 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
1158 m_grid->ProcessTableMessage( msg );
1163 for(
int ii = (
int)
m_fields->size() - 1; ii >= 0; --ii )
1170 if( editedField.GetName() == existingField.
GetName() )
1179 m_grid->ClearSelection();
1185 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, ii, 1 );
1186 m_grid->ProcessTableMessage( msg );
1230 if(
m_grid->IsCellEditControlShown() )
1232 int row =
m_grid->GetGridCursorRow();
1233 int col =
m_grid->GetGridCursorCol();
1237 wxGridCellEditor*
editor =
m_grid->GetCellEditor( row, col );
1244 std::bitset<64> shownColumns =
m_grid->GetShownColumns();
1250 if( !
m_grid->IsCellEditControlShown() )
1251 m_grid->SetGridWidthsDirty();
1281 textEntry->SelectAll();
1410 for(
int row =
m_unitNamesGrid->GetNumberRows() - needed; row < m_unitNamesGrid->GetNumberRows(); ++row )
1449 if( !
m_grid->CommitPendingChanges() )
1457 [&]() -> std::pair<int, int>
constexpr EDA_IU_SCALE schIUScale
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
WX_GRID * m_jumperGroupsGrid
STD_BITMAP_BUTTON * m_bpAddBodyStyle
wxButton * m_spiceFieldsButton
DIALOG_LIB_SYMBOL_PROPERTIES_BASE(wxWindow *parent, wxWindowID id=ID_LIBEDIT_NOTEBOOK, const wxString &title=_("Library Symbol Properties"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
wxTextCtrl * m_KeywordCtrl
WX_GRID * m_bodyStyleNamesGrid
wxBoxSizer * bSizerLowerBasicPanel
wxCheckBox * m_PinsNameInsideButt
wxRadioButton * m_radioSingle
STD_BITMAP_BUTTON * m_bpMoveDownBodyStyle
wxStaticText * m_nameOffsetUnits
wxComboBox * m_inheritanceSelectCombo
STD_BITMAP_BUTTON * m_bpDeleteBodyStyle
wxCheckBox * m_ShowPinNumButt
wxCheckBox * m_OptionPower
wxRadioButton * m_radioDeMorgan
wxStaticText * m_nameOffsetLabel
wxCheckBox * m_excludeFromBoardCheckBox
wxCheckBox * m_cbDuplicatePinsAreJumpers
STD_BITMAP_BUTTON * m_bpMoveUpBodyStyle
WX_GRID * m_unitNamesGrid
wxCheckBox * m_OptionLocalPower
wxTextCtrl * m_nameOffsetCtrl
wxCheckBox * m_excludeFromPosFilesCheckBox
wxCheckBox * m_excludeFromBomCheckBox
wxSpinCtrl * m_unitSpinCtrl
wxCheckBox * m_OptionPartsInterchangeable
wxCheckBox * m_excludeFromSimCheckBox
wxRadioButton * m_radioCustom
wxTextCtrl * m_SymbolNameCtrl
wxStaticText * m_inheritsStaticText
wxCheckBox * m_ShowPinNameButt
void syncBodyStyleControls()
void OnSymbolNameKillFocus(wxFocusEvent &event) override
void OnUnitSpinCtrlText(wxCommandEvent &event) override
void OnPageChanging(wxNotebookEvent &event) override
wxString m_delayedErrorMessage
void OnBodyStyle(wxCommandEvent &event) override
wxString m_keywordsSource
Ancestor supplying the keywords while the symbol leaves them empty.
FIELDS_GRID_TABLE * m_fields
WX_GRID * m_delayedFocusGrid
std::set< wxString > m_addedTemplateFields
DIALOG_LIB_SYMBOL_PROPERTIES(SYMBOL_EDIT_FRAME *parent, LIB_SYMBOL *aLibEntry)
wxControl * m_delayedFocusCtrl
void OnUpdateUI(wxUpdateUIEvent &event) override
static LAST_LAYOUT m_lastLayout
void OnBodyStyleMoveUp(wxCommandEvent &event) override
void OnCancelButtonClick(wxCommandEvent &event) override
PANEL_EMBEDDED_FILES * m_embeddedFiles
void OnDeleteField(wxCommandEvent &event) override
bool TransferDataFromWindow() override
void OnCombobox(wxCommandEvent &event) override
void OnUnitSpinCtrlEnter(wxCommandEvent &event) override
void OnAddBodyStyle(wxCommandEvent &event) override
void OnGridCellChanged(wxGridEvent &event)
std::bitset< 64 > m_shownColumns
void OnMoveUp(wxCommandEvent &event) override
void OnDeleteBodyStyle(wxCommandEvent &event) override
void OnAddJumperGroup(wxCommandEvent &event) override
SYMBOL_EDIT_FRAME * m_Parent
void OnText(wxCommandEvent &event) override
PANEL_SYMBOL_PIN_MAP * m_pinMapPanel
void OnGridMotion(wxMouseEvent &event)
void OnUnitSpinCtrlKillFocus(wxFocusEvent &event) override
~DIALOG_LIB_SYMBOL_PROPERTIES()
static int m_lastOpenedPage
bool canAssignFootprintToField()
void OnMoveDown(wxCommandEvent &event) override
void SelectPinMapPage()
Switch the notebook to the Pin Map page (issue #2282).
PANEL_FOOTPRINT_FILTERS * m_fpFiltersPanel
bool m_forcePinMapPage
When set by SelectPinMapPage(), TransferDataToWindow opens the Pin Map page instead of the remembered...
void syncControlStates(bool aIsAlias)
void OnCheckBox(wxCommandEvent &event) override
void OnSymbolNameText(wxCommandEvent &event) override
void assignFootprintToField(const wxString &aFootprintName)
void OnBodyStyleMoveDown(wxCommandEvent &event) override
void OnRemoveJumperGroup(wxCommandEvent &event) override
bool TransferDataToWindow() override
void OnGridCellChanging(wxGridEvent &event)
void onPowerCheckBox(wxCommandEvent &aEvent) override
void syncKeywordsToolTip()
void OnAddField(wxCommandEvent &event) override
void OnEditSpiceModel(wxCommandEvent &event) override
void addInheritedFields(const std::shared_ptr< LIB_SYMBOL > &aParent)
UNIT_BINDER m_pinNameOffset
void OnUnitSpinCtrl(wxSpinEvent &event) override
void EndDialogShim(int aReturnCode)
A mode agnostic way to close a dialog.
EDA_BASE_FRAME * m_parentFrame
virtual void SetTextSize(VECTOR2I aNewSize, bool aEnforceMinTextSize=true)
virtual void SetVisible(bool aVisible)
void push_back(const SCH_FIELD &field)
A text control validator used for validating the text allowed in fields.
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
Represents an (ordered) list of JUMPER_GROUP objects.
void Add(JUMPER_GROUP aGroup)
Add a JUMPER_GROUP to the set.
Represents a group of jumper pins or pads, keyed by name.
static std::optional< JUMPER_GROUP > Make(std::set< wxString > aNames)
Factory method to create a JUMPER_GROUP from a set of names.
Define a library symbol object.
static wxString LetterSubReference(int aUnit, wxChar aInitialLetter)
Composed widget that edits a symbol's named pin maps and the footprint each is bound to.
container_type::size_type size() const
void insert(value_type const &v)
wxString GetSummary() const
void SetOrdinal(int aOrdinal, FIELD_T aType)
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetUntranslatedName() const
Get the untranslated field name for storage, variable look-up, etc.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetName(const wxString &aName)
void SetText(const wxString &aText) override
The symbol library editor main window.
bool IsOK(wxWindow *aParent, const wxString &aMessage)
Display a yes/no dialog with aMessage and returns the user response.
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.
wxString GetRefDesPrefix(const wxString &aRefDes)
Get the (non-numeric) prefix from a refdes - e.g.
PGM_BASE & Pgm()
The global program "get" accessor.
Collection of utility functions for component reference designators (refdes)
#define NO_BODY_STYLES_WITH_ALTERNATE_PIN_FUNCTIONS
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
wxString UnescapeString(const wxString &aSource)
wxString EscapeString(const wxString &aSource, ESCAPE_CONTEXT aContext)
The Escape/Unescape routines use HTML-entity-reference-style encoding to handle characters which are:...
Hold a name of a symbol's field, field value, and default visibility.
bool FieldNamesAreDuplicates(const wxString &aLhs, const wxString &aRhs, std::initializer_list< FIELD_T > aMandatoryFields)
Test whether two field names should be treated as duplicates for the purposes of field name uniquenes...
wxString GetUserFieldName(int aFieldNdx, TRANSLATION aTranslation)
@ USER
The field ID hasn't been set yet; field is invalid.
@ FOOTPRINT
Field Name Module PCB, i.e. "16DIP300".
@ REFERENCE
Field Reference of part, i.e. "IC21".
@ VALUE
Field Value of part, i.e. "3.3K".
UNDO_REDO
Undo Redo considerations: Basically we have 3 cases New item Deleted item Modified item there is also...
VECTOR2< int32_t > VECTOR2I