29#include <wx/tooltip.h>
104 wxGridCellAttr* attr =
nullptr;
108 attr =
new wxGridCellAttr;
109 attr->SetReadOnly(
true );
114 wxArrayString choices;
115 choices.push_back( lib_pin->
GetName() );
117 for(
const std::pair<const wxString, LIB_PIN::ALT>& alt : lib_pin->
GetAlternates() )
118 choices.push_back( alt.first );
120 attr =
new wxGridCellAttr();
154 case COL_TYPE:
return _(
"Electrical Type" );
156 default: wxFAIL;
return wxEmptyString;
165 bool CanSetValueAs(
int aRow,
int aCol,
const wxString& aTypeName )
override
173 return GetValue( at( aRow ), aCol );
181 return wxEmptyString;
182 else if( aPin.
GetAlt().IsEmpty() )
194 default: wxFAIL;
return wxEmptyString;
198 wxGridCellAttr*
GetAttr(
int aRow,
int aCol, wxGridCellAttr::wxAttrKind )
override
225 void SetValue(
int aRow,
int aCol,
const wxString &aValue )
override
230 if( aValue == at( aRow ).GetLibPin()->GetName() )
231 at( aRow ).SetAlt( wxEmptyString );
233 at( aRow ).SetAlt( aValue );
251 wxString lhStr =
GetValue( lhs, sortCol );
252 wxString rhStr =
GetValue( rhs, sortCol );
266 auto cmp = [ ascending ](
const auto a,
const auto b )
283 res = cmp( lhStr.CmpNoCase( rhStr ), 0 );
295 std::sort( begin(), end(),
296 [ aSortCol, ascending ](
const SCH_PIN& lhs,
const SCH_PIN& rhs ) ->
bool
298 return compare( lhs, rhs, aSortCol, ascending );
315 m_fieldsSize( 0, 0 ),
316 m_lastRequestedSize( 0, 0 ),
317 m_editorShown( false ),
319 m_dataModel( nullptr )
337 [&]( wxCommandEvent& aEvent )
341 m_fieldsGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
356 m_pinTablePage->SetToolTip(
_(
"Alternate pin assignments are not available for De Morgan "
377 m_pinGrid->SetSelectionMode( wxGrid::wxGridSelectRows );
381 wxToolTip::Enable(
true );
397 QueueEvent(
new wxCommandEvent( SYMBOL_DELAY_SELECTION ) );
398 wxCommandEvent *evt =
new wxCommandEvent( SYMBOL_DELAY_FOCUS );
411 cfg->m_Appearance.edit_symbol_width = GetSize().x;
412 cfg->m_Appearance.edit_symbol_height = GetSize().y;
441 if( !wxDialog::TransferDataToWindow() )
444 std::set<wxString> defined;
454 defined.insert( field.
GetName() );
460 GetParent()->Schematic().Settings().m_TemplateFieldNames.GetTemplateFieldNames() )
462 if( defined.count( templateFieldname.m_Name ) <= 0 )
465 field.
SetVisible( templateFieldname.m_Visible );
471 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_fields->size() );
512 switch( orientation )
557 std::vector<SCH_FIELD> fields;
560 fields.emplace_back( field );
564 if( dialog.ShowModal() != wxID_OK )
568 for(
const SCH_FIELD& editedField : fields )
574 if( existingField.GetName() == editedField.GetName() )
577 existingField.SetText( editedField.GetText() );
584 m_fields->emplace_back( editedField );
585 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
591 for(
int ii = (
int)
m_fields->size() - 1; ii >= 0; --ii )
598 if( editedField.GetName() == existingField.
GetName() )
608 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, ii, 1 );
638 wxCommandEvent *evt =
new wxCommandEvent( SYMBOL_DELAY_FOCUS );
649 wxString fieldName = field.
GetName(
false );
651 if( fieldName.IsEmpty() )
655 wxCommandEvent *evt =
new wxCommandEvent( SYMBOL_DELAY_FOCUS );
669 if( !wxDialog::TransferDataFromWindow() )
680 bool replaceOnCurrentScreen;
681 wxCHECK( currentScreen,
false );
731 for(
unsigned i = 0; i <
m_fields->size(); ++i )
738 for(
size_t ii = 0; ii <
m_fields->size(); ++ii )
743 if( fieldName.IsEmpty() && field.
GetText().IsEmpty() )
745 else if( fieldName.IsEmpty() )
748 fields.push_back( field );
775 src_pin->
SetAlt( model_pin.GetAlt() );
790 std::vector<SCH_SYMBOL*> otherUnits;
796 commit.
Modify( otherUnit, screen );
814 newField.
Offset( otherUnit->GetPosition() );
817 otherUnit->AddField( newField );
821 for(
size_t ii = otherUnit->GetFields().size() - 1; ii >
DATASHEET_FIELD; ii-- )
823 SCH_FIELD& otherField = otherUnit->GetFields().at( ii );
826 otherUnit->GetFields().erase( otherUnit->GetFields().begin() + ii );
832 otherUnit->SetDNP(
m_cbDNP->IsChecked() );
838 SCH_PIN* src_pin = otherUnit->GetPin( model_pin.GetNumber() );
841 src_pin->
SetAlt( model_pin.GetAlt() );
848 if( replaceOnCurrentScreen )
851 if( !commit.
Empty() )
852 commit.
Push(
_(
"Edit Symbol Properties" ) );
860 wxGridCellEditor*
editor =
m_fieldsGrid->GetCellEditor( event.GetRow(), event.GetCol() );
861 wxControl* control =
editor->GetControl();
863 if( control && control->GetValidator() && !control->GetValidator()->Validate( control ) )
866 wxCommandEvent *evt =
new wxCommandEvent( SYMBOL_DELAY_FOCUS );
867 evt->SetClientData(
new VECTOR2I( event.GetRow(), event.GetCol() ) );
870 else if( event.GetCol() ==
FDC_NAME )
872 wxString newName =
event.GetString();
874 for(
int i = 0; i <
m_fieldsGrid->GetNumberRows(); ++i )
876 if( i == event.GetRow() )
881 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ),
884 wxCommandEvent *evt =
new wxCommandEvent( SYMBOL_DELAY_FOCUS );
885 evt->SetClientData(
new VECTOR2I( event.GetRow(), event.GetCol() ) );
898 QueueEvent(
new wxCommandEvent( SYMBOL_DELAY_SELECTION ) );
916 int fieldID = (int)
m_fields->size();
927 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
942 wxArrayInt selectedRows =
m_fieldsGrid->GetSelectedRows();
944 if( selectedRows.empty() &&
m_fieldsGrid->GetGridCursorRow() >= 0 )
945 selectedRows.push_back(
m_fieldsGrid->GetGridCursorRow() );
947 if( selectedRows.empty() )
950 for(
int row : selectedRows )
954 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
964 selectedRows.Sort( [](
int* first,
int* second ) {
return *second - *first; } );
966 for(
int row : selectedRows )
971 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
1069 int row = aEvent.GetRow();
1087 int sortCol = aEvent.GetCol();
1094 ascending = !
m_pinGrid->IsSortOrderAscending();
1106 wxGridUpdateLocker deferRepaintsTillLeavingScope(
m_fieldsGrid );
1116 for(
int i = 2; i <
m_fieldsGrid->GetNumberCols(); i++ )
1119 m_fieldsGrid->SetColSize( 1, std::max( 120, fieldsWidth - fixedColsWidth ) );
1125 wxGridUpdateLocker deferRepaintsTillLeavingScope(
m_pinGrid );
1134 pinTblWidth -=
m_pinGrid->GetColSize( i );
1160 wxCHECK_RET( loc, wxT(
"Missing focus cell location" ) );
1180 if( wxTextEntry* txt =
dynamic_cast<wxTextEntry*
>( cellEditor->GetControl() ) )
1183 cellEditor->DecRef();
1188 wxSize new_size =
event.GetSize();
1209 wxSize new_size =
event.GetSize();
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap)
COMMIT & Modify(EDA_ITEM *aItem, BASE_SCREEN *aScreen=nullptr)
Create an undo entry for an item that has been already modified.
bool Empty() const
Returns status of an item.
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void EndQuasiModal(int retCode)
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
Class DIALOG_SYMBOL_PROPERTIES_BASE.
wxCheckBox * m_cbExcludeFromBom
wxChoice * m_orientationCtrl
STD_BITMAP_BUTTON * m_bpMoveDown
wxStaticText * m_unitLabel
wxCheckBox * m_cbExcludeFromSim
STD_BITMAP_BUTTON * m_bpAdd
STD_BITMAP_BUTTON * m_bpDelete
wxTextCtrl * m_tcLibraryID
wxCheckBox * m_cbAlternateSymbol
wxButton * m_spiceFieldsButton
wxCheckBox * m_cbExcludeFromBoard
wxCheckBox * m_ShowPinNameButt
wxCheckBox * m_ShowPinNumButt
STD_BITMAP_BUTTON * m_bpMoveUp
void OnSizePinsGrid(wxSizeEvent &event) override
wxSize m_lastRequestedSize
void OnPinTableCellEdited(wxGridEvent &event) override
void OnGridEditorShown(wxGridEvent &event) override
void OnUpdateUI(wxUpdateUIEvent &event) override
void OnEditSymbol(wxCommandEvent &) override
void OnCancelButtonClick(wxCommandEvent &event) override
bool TransferDataFromWindow() override
virtual void onUpdateEditLibrarySymbol(wxUpdateUIEvent &event) override
SCH_PIN_TABLE_DATA_MODEL * m_dataModel
void OnMoveDown(wxCommandEvent &event) override
void OnSizeFieldsGrid(wxSizeEvent &event) override
SCH_EDIT_FRAME * GetParent()
std::bitset< 64 > m_shownColumns
void OnPinTableColSort(wxGridEvent &aEvent)
void OnMoveUp(wxCommandEvent &event) override
void OnDeleteField(wxCommandEvent &event) override
void OnInitDlg(wxInitDialogEvent &event) override
void OnAddField(wxCommandEvent &event) override
void OnGridEditorHidden(wxGridEvent &event) override
bool TransferDataToWindow() override
void AdjustPinsGridColumns()
~DIALOG_SYMBOL_PROPERTIES() override
void OnUnitChoice(wxCommandEvent &event) override
void OnEditSpiceModel(wxCommandEvent &event) override
DIALOG_SYMBOL_PROPERTIES(SCH_EDIT_FRAME *aParent, SCH_SYMBOL *aSymbol)
void HandleDelayedFocus(wxCommandEvent &event)
void HandleDelayedSelection(wxCommandEvent &event)
void OnCheckBox(wxCommandEvent &event) override
void OnGridCellChanging(wxGridEvent &event)
void OnEditLibrarySymbol(wxCommandEvent &) override
void OnUpdateSymbol(wxCommandEvent &) override
void AdjustFieldsGridColumns()
FIELDS_GRID_TABLE< SCH_FIELD > * m_fields
void OnExchangeSymbol(wxCommandEvent &) override
virtual void onUpdateEditSymbol(wxUpdateUIEvent &event) override
EDA_ITEM_FLAGS GetEditFlags() const
void SetFlags(EDA_ITEM_FLAGS aMask)
void ClearFlags(EDA_ITEM_FLAGS aMask=EDA_ITEM_ALL_FLAGS)
virtual void SetParent(EDA_ITEM *aParent)
EDA_ITEM_FLAGS GetFlags() const
void SetTextSize(VECTOR2I aNewSize)
virtual const wxString & GetText() const
Return the string associated with the text object.
void Offset(const VECTOR2I &aOffset)
virtual void SetVisible(bool aVisible)
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Add mouse and command handling (such as cut, copy, and paste) to a WX_GRID instance.
APP_SETTINGS_BASE * KifaceSettings() const
A logical library item identifier and consists of various portions much like a URI.
std::map< wxString, ALT > & GetAlternates()
const wxString & GetName() const
void SetShowPinNames(bool aShow)
Set or clear the pin name visibility flag.
bool ShowPinNames() const
void SetShowPinNumbers(bool aShow)
Set or clear the pin number visibility flag.
bool HasConversion() const
Test if symbol has more than one body conversion type (DeMorgan).
bool ShowPinNumbers() const
static int Compare(const wxString &lhs, const wxString &rhs)
These settings were stored in SCH_BASE_FRAME previously.
SCHEMATIC_SETTINGS & Settings() const
virtual void Push(const wxString &aMessage=wxT("A commit"), int aCommitFlags=0) override
Revert the commit by restoring the modified items state.
Schematic editor (Eeschema) main window.
SCH_SCREEN * GetScreen() const override
Return a pointer to a BASE_SCREEN or one of its derivatives.
Instances are attached to a symbol or sheet and provide a place for the symbol's value,...
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetName(const wxString &aName)
void SetText(const wxString &aText) override
SCHEMATIC * Schematic() const
Searches the item hierarchy to find a SCHEMATIC.
virtual void SetExcludedFromSim(bool aExclude)
bool IsEmptyCell(int row, int col) override
wxGridCellAttr * m_typeAttr
wxString GetValue(int aRow, int aCol) override
std::vector< wxGridCellAttr * > m_nameAttrs
int GetNumberCols() override
static bool compare(const SCH_PIN &lhs, const SCH_PIN &rhs, int sortCol, bool ascending)
void SortRows(int aSortCol, bool ascending)
~SCH_PIN_TABLE_DATA_MODEL()
wxGridCellAttr * m_shapeAttr
wxGridCellAttr * GetAttr(int aRow, int aCol, wxGridCellAttr::wxAttrKind) override
SCH_PIN_TABLE_DATA_MODEL()
int GetNumberRows() override
bool CanSetValueAs(int aRow, int aCol, const wxString &aTypeName) override
static wxString GetValue(const SCH_PIN &aPin, int aCol)
wxGridCellAttr * m_readOnlyAttr
wxString GetColLabelValue(int aCol) override
void SetValue(int aRow, int aCol, const wxString &aValue) override
void SetAlt(const wxString &aAlt)
LIB_PIN * GetLibPin() const
wxString GetNumber() const
GRAPHIC_PINSHAPE GetShape() const
ELECTRICAL_PINTYPE GetType() const
void Append(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
bool Remove(SCH_ITEM *aItem, bool aUpdateLibSymbol=true)
Remove aItem from the schematic associated with this screen.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
int GetUnitCount() const
Return the number of units per package of the symbol.
void SetConvert(int aConvert)
std::vector< std::unique_ptr< SCH_PIN > > & GetRawPins()
int GetFieldCount() const
Return the number of fields in this symbol.
void UpdateUnit(int aUnit)
Change the unit number to aUnit without setting any internal flags.
wxString SubReference(int aUnit, bool aAddSeparator=true) const
static bool IsReferenceStringValid(const wxString &aReferenceString)
Test for an acceptable reference string.
void SetValueFieldText(const wxString &aValue)
SCH_FIELD * FindField(const wxString &aFieldName, bool aIncludeDefaultFields=true, bool aCaseInsensitive=false)
Search for a SCH_FIELD with aFieldName.
const wxString GetRef(const SCH_SHEET_PATH *aSheet, bool aIncludeUnit=false) const
Return the reference for the given sheet path.
void SetExcludedFromSim(bool aExclude) override
void SetRef(const SCH_SHEET_PATH *aSheet, const wxString &aReference)
Set the reference for the given sheet path for this symbol.
void SetOrientation(int aOrientation)
Compute the new transform matrix based on aOrientation for the symbol which is applied to the current...
void SetFootprintFieldText(const wxString &aFootprint)
bool GetExcludedFromBOM() const
VECTOR2I GetPosition() const override
bool GetExcludedFromSim() const override
bool HasUnitDisplayName(int aUnit)
Return true if the given unit aUnit has a display name set.
void SetExcludedFromBOM(bool aIncludeInBOM)
int GetOrientation() const
Get the display symbol orientation.
bool IsAnnotated(const SCH_SHEET_PATH *aSheet)
Check if the symbol has a valid annotation (reference) for the given sheet path.
int GetUnitSelection(const SCH_SHEET_PATH *aSheet) const
Return the instance-specific unit selection for the given sheet path.
void SetUnit(int aUnit)
Change the unit number to aUnit.
const LIB_ID & GetLibId() const
wxString GetUnitDisplayName(int aUnit)
Return the display name for a given unit aUnit.
SCH_PIN * GetPin(const wxString &number) const
Find a symbol pin by number.
bool GetExcludedFromBoard() const
void GetFields(std::vector< SCH_FIELD * > &aVector, bool aVisibleOnly)
Populate a std::vector with SCH_FIELDs.
void SetUnitSelection(const SCH_SHEET_PATH *aSheet, int aUnitSelection)
Set the selected unit of this symbol on one sheet.
std::unique_ptr< LIB_SYMBOL > & GetLibSymbolRef()
void SetExcludedFromBoard(bool aIncludeOnBoard)
void ShowHideColumns(const wxString &shownColumns)
Show/hide the grid columns based on a tokenized string of shown column indexes.
void SetTable(wxGridTableBase *table, bool aTakeOwnership=false)
Hide wxGrid's SetTable() method with one which doesn't mess up the grid column widths when setting th...
void DestroyTable(wxGridTableBase *aTable)
Work-around for a bug in wxGrid which crashes when deleting the table if the cell edit control was no...
wxString GetShownColumnsAsString()
Get a tokenized string containing the shown column indexes.
std::bitset< 64 > GetShownColumns()
bool CommitPendingChanges(bool aQuietMode=false)
Close any open cell edit controls.
void DisplayError(wxWindow *aParent, const wxString &aText, int aDisplayTime)
Display an error or warning message box with aMessage.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
This file is part of the common library.
wxDEFINE_EVENT(SYMBOL_DELAY_FOCUS, wxCommandEvent)
@ SYMBOL_PROPS_EDIT_SCHEMATIC_SYMBOL
@ SYMBOL_PROPS_WANT_EXCHANGE_SYMBOL
@ SYMBOL_PROPS_WANT_UPDATE_SYMBOL
@ SYMBOL_PROPS_EDIT_LIBRARY_SYMBOL
std::uint32_t EDA_ITEM_FLAGS
void CollectOtherUnits(const wxString &aRef, int aUnit, const LIB_ID &aLibId, SCH_SHEET_PATH &aSheet, std::vector< SCH_SYMBOL * > *otherUnits)
void SelectReferenceNumber(wxTextEntry *aTextEntry)
Select the number (or "?") in a reference for ease of editing.
const std::vector< BITMAPS > & PinTypeIcons()
const wxArrayString & PinTypeNames()
const wxArrayString & PinShapeNames()
const std::vector< BITMAPS > & PinShapeIcons()
std::vector< SCH_FIELD > SCH_FIELDS
A container for several SCH_FIELD items.
int StrNumCmp(const wxString &aString1, const wxString &aString2, bool aIgnoreCase)
Compare two strings with alphanumerical content.
wxString UnescapeString(const wxString &aSource)
Hold a name of a symbol's field, field value, and default visibility.
static const wxString GetDefaultFieldName(int aFieldNdx, bool aTranslateForHI=false)
Return a default symbol field name for field aFieldNdx for all components.
Definition for symbol library class.
@ DATASHEET_FIELD
name of datasheet
@ FOOTPRINT_FIELD
Field Name Module PCB, i.e. "16DIP300".
@ VALUE_FIELD
Field Value of part, i.e. "3.3K".
@ MANDATORY_FIELDS
The first 5 are mandatory, and must be instantiated in SCH_COMPONENT and LIB_PART constructors.
@ REFERENCE_FIELD
Field Reference of part, i.e. "IC21".