28#include <wx/tooltip.h>
51#include "wx/dcclient.h"
55 bool* aIsUndoable,
bool* aClearAnnotationNewItems,
56 bool* aUpdateHierarchyNavigator,
57 wxString* aSourceSheetFilename ) :
75 [&]( wxCommandEvent& aEvent )
79 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
80 m_grid->ShowHideColumns(
"0 1 2 3 4 5 6 7" );
83 if(
m_frame->GetColorSettings()->GetOverrideSchItemColors() )
84 m_infoBar->ShowMessage(
_(
"Note: individual item colors overridden in Preferences." ) );
91 wxToolTip::Enable(
true );
121 m_grid->PopEventHandler(
true );
127 if( !wxDialog::TransferDataToWindow() )
132 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
134 std::vector<SCH_FIELD*> orderedFields;
137 orderedFields.push_back( &field );
139 std::stable_sort( orderedFields.begin(), orderedFields.end(),
142 return lhs->GetOrdinal() < rhs->GetOrdinal();
154 wxString filename = field_copy.
GetText();
155 filename.Replace( wxT(
"/" ), wxT(
"\\" ) );
156 field_copy.
SetText( filename );
173 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_fields->size() );
174 m_grid->ProcessTableMessage( msg );
206 GetSizer()->SetSizeHints(
this );
209 wxSize curSize = GetSize();
212 SetSize( wxSize( std::max( curSize.x,
minSize.x ), std::max( curSize.y,
minSize.y ) ) );
220 if( !
m_grid->CommitPendingChanges() || !
m_grid->Validate() )
224 for(
size_t i = 0; i <
m_fields->size(); ++i )
280 if( !wxDialog::TransferDataFromWindow() )
291 if( sheetFileName.IsEmpty() )
293 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
304 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
308 wxFileName fn( sheetFileName );
310 wxString newRelativeFilename = fn.GetFullPath();
313 newRelativeFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
316 oldFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
318 bool filename_changed = oldFilename != newRelativeFilename;
320 if( filename_changed ||
m_sheet->IsNew() )
324 wxCHECK( currentScreen,
false );
326 bool clearFileName =
false;
331 clearFileName =
true;
332 currentScreen->
SetFileName(
m_frame->Prj().AbsolutePath( wxT(
"noname.kicad_sch" ) ) );
335 wxFileName tmp( fn );
336 wxFileName screenFileName = currentScreen->
GetFileName();
338 if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
341 _(
"Sheet File Path" ),
342 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
344 makeRelDlg.SetExtendedMessage(
_(
"Using relative hierarchical sheet file name paths improves "
345 "schematic portability across systems and platforms. Using "
346 "absolute paths can result in portability issues." ) );
347 makeRelDlg.SetYesNoLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Use Relative Path" ) ),
348 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Use Absolute Path" ) ) );
350 if( makeRelDlg.ShowModal() == wxID_YES )
353 "\n to relative path: '%s'",
357 newRelativeFilename = fn.GetFullPath();
388 if( newSheetname.IsEmpty() )
389 newSheetname =
_(
"Untitled Sheet" );
398 m_sheet->SetName( newSheetname );
399 m_sheet->SetFileName( newRelativeFilename );
403 if( oldNetPrefix != newNetPrefix )
404 m_frame->Prj().GetProjectFile().NetSettings()->RenameNetPathPrefix( oldNetPrefix, newNetPrefix );
408 m_field.Offset(
m_sheet->GetPosition() );
414 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
420 const wxString& fieldName = field.GetUntranslatedName();
422 if( field.IsEmpty() )
424 else if( fieldName.IsEmpty() )
425 field.SetName(
_(
"untitled" ) );
427 if( !field.IsMandatory() )
435 tmp =
m_sheet->AddField( field );
440 wxString defaultText =
m_sheet->Schematic()->ConvertRefsToKIIDs( existingField->
GetText() );
441 tmp =
const_cast<SCH_FIELD*
>( existingField );
445 if( !variantName.IsEmpty() )
448 tmp->
SetText( defaultText, &instance );
450 wxString variantText =
m_sheet->Schematic()->ConvertRefsToKIIDs( field.GetText() );
451 tmp->
SetText( variantText, &instance, variantName );
456 for(
int ii = (
int)
m_sheet->GetFields().size() - 1; ii >= 0; ii-- )
467 if( editedField.GetName() == sheetField.
GetName() )
478 std::stable_sort(
m_sheet->GetFields().begin(),
m_sheet->GetFields().end(),
481 return lhs.GetOrdinal() < rhs.GetOrdinal();
492 wxPanel temp(
this );
497 KIDIALOG dlg(
this,
_(
"Note: item colors are overridden in the current color theme." ),
499 dlg.ShowDetailedText( wxString::Format(
_(
"To see individual item colors uncheck '%s'\n"
500 "in Preferences > Schematic Editor > Colors." ),
538 wxGridCellEditor*
editor =
m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
539 wxControl* control =
editor->GetControl();
541 if( control && control->GetValidator() )
542 success = control->GetValidator()->Validate( control );
550 else if( event.GetCol() ==
FDC_NAME )
552 wxString newName =
event.GetString();
554 for(
int i = 0; i <
m_grid->GetNumberRows(); ++i )
556 if( i == event.GetRow() )
562 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), newName ) );
578 [&]() -> std::pair<int, int>
587 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
588 m_grid->ProcessTableMessage( msg );
599 if( row < m_fields->GetMandatoryRowCount() )
601 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
602 m_fields->GetMandatoryRowCount() ) );
614 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
615 m_grid->ProcessTableMessage( msg );
625 return row >
m_fields->GetMandatoryRowCount();
640 return row >=
m_fields->GetMandatoryRowCount();
652 std::bitset<64> shownColumns =
m_grid->GetShownColumns();
658 if( !
m_grid->IsCellEditControlShown() )
659 m_grid->SetGridWidthsDirty();
664 wxString
path =
m_frame->GetCurrentSheet().PathHumanReadable(
false );
666 if(
path.Last() !=
'/' )
670 wxControl* control =
editor->GetControl();
671 wxTextEntry* textControl =
dynamic_cast<wxTextEntry*
>( control );
675 sheetName = textControl->GetValue();
690 path = wxControl::Ellipsize(
path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
702 m_grid->EnableCellEditControl(
true );
703 m_grid->ShowCellEditControl();
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Color settings are a bit different than most of the settings objects in that there can be more than o...
bool GetOverrideSchItemColors() const
wxCheckBox * m_cbExcludeFromSim
wxStaticText * m_borderWidthLabel
STD_BITMAP_BUTTON * m_bpMoveUp
wxTextCtrl * m_pageNumberTextCtrl
wxTextCtrl * m_borderWidthCtrl
wxCheckBox * m_cbExcludeFromBom
wxStaticText * m_borderWidthUnits
COLOR_SWATCH * m_backgroundSwatch
wxStaticText * m_hierarchicalPath
wxCheckBox * m_cbExcludeFromBoard
STD_BITMAP_BUTTON * m_bpAdd
wxStdDialogButtonSizer * m_stdDialogButtonSizer
wxBoxSizer * m_sizerBottom
STD_BITMAP_BUTTON * m_bpDelete
COLOR_SWATCH * m_borderSwatch
DIALOG_SHEET_PROPERTIES_BASE(wxWindow *parent, wxWindowID id=wxID_ANY, const wxString &title=_("Sheet Properties"), const wxPoint &pos=wxDefaultPosition, const wxSize &size=wxSize(-1,-1), long style=wxCAPTION|wxCLOSE_BOX|wxDEFAULT_DIALOG_STYLE|wxMAXIMIZE_BOX|wxMINIMIZE_BOX|wxRESIZE_BORDER|wxSYSTEM_MENU)
wxStaticText * m_hierarchicalPathLabel
STD_BITMAP_BUTTON * m_bpMoveDown
bool TransferDataToWindow() override
void OnAddField(wxCommandEvent &event) override
void OnMoveDown(wxCommandEvent &event) override
UNIT_BINDER m_borderWidth
std::bitset< 64 > m_shownColumns
SCH_FIELD m_dummySheetNameField
bool TransferDataFromWindow() override
void OnGridCellChanging(wxGridEvent &event)
void OnDeleteField(wxCommandEvent &event) override
bool onSheetFilenameChanged(const wxString &aNewFilename)
wxString * m_sourceSheetFilename
bool * m_updateHierarchyNavigator
void OnUpdateUI(wxUpdateUIEvent &event) override
bool * m_clearAnnotationNewItems
FIELDS_GRID_TABLE * m_fields
void OnMoveUp(wxCommandEvent &event) override
DIALOG_SHEET_PROPERTIES(SCH_EDIT_FRAME *aParent, SCH_SHEET *aSheet, bool *aIsUndoable, bool *aClearAnnotationNewItems, bool *aUpdateHierarchyNavigator, wxString *aSourceSheetFilename)
~DIALOG_SHEET_PROPERTIES() override
void SetupStandardButtons(std::map< int, wxString > aLabels={})
void finishDialogSettings()
In all dialogs, we must call the same functions to fix minimal dlg size, the default position and per...
virtual void SetParent(EDA_ITEM *aParent)
virtual void Offset(const VECTOR2I &aOffset)
GR_TEXT_H_ALIGN_T GetHorizJustify() const
virtual void SetVisible(bool aVisible)
virtual EDA_ANGLE GetTextAngle() const
GR_TEXT_V_ALIGN_T GetVertJustify() const
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
SCH_FIELD * GetField(FIELD_T aFieldId)
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
A color representation with 4 components: red, green, blue, alpha.
wxCheckBox * m_optOverrideColors
Holds all the data relating to one schematic.
wxString ConvertKIIDsToRefs(const wxString &aSource) const
Schematic editor (Eeschema) main window.
SCHEMATIC & Schematic() const
VECTOR2I GetPosition() const override
virtual const wxString & GetText() const override
Return the string associated with the text object.
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
const wxString & GetFileName() const
void SetFileName(const wxString &aFileName)
Set the file name for this screen to aFileName.
A container for handling SCH_SHEET_PATH objects in a flattened hierarchy.
void BuildSheetList(SCH_SHEET *aSheet, bool aCheckIntegrity)
Build the list of sheets and their sheet path from aSheet.
Handle access to a stack of flattened SCH_SHEET objects by way of a path for creating a flattened sch...
wxString GetPageNumber() const
wxString PathHumanReadable(bool aUseShortRootName=true, bool aStripTrailingSeparator=false, bool aEscapeSheetNames=false) const
Return the sheet path in a human readable form made from the sheet names.
void SetPageNumber(const wxString &aPageNumber)
Set the sheet instance user definable page number.
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.
SCH_FIELD * GetField(FIELD_T aFieldType)
Return a mandatory field in this sheet.
wxString EnsureFileExtension(const wxString &aFilename, const wxString &aExtension)
It's annoying to throw up nag dialogs when the extension isn't right.
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.
#define KICAD_MESSAGE_DIALOG
static bool positioningChanged(const SCH_FIELD &a, const SCH_FIELD &b)
static bool positioningChanged(const SCH_FIELD &a, const SCH_FIELD &b)
const int minSize
Push and Shove router track width and via size dialog.
static const std::string KiCadSchematicFileExtension
const wxChar *const tracePathsAndFiles
Flag to enable path and file name debug output.
@ LAYER_SCHEMATIC_BACKGROUND
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
bool IsFullFileNameValid(const wxString &aFullFilename)
Checks if a full filename is valid, i.e.
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)
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
#define SHEET_MANDATORY_FIELDS
wxLogTrace helper definitions.
Custom text control validator definitions.
Definition of file extensions used in Kicad.