28#include <wx/tooltip.h>
51#include "wx/dcclient.h"
55 bool* aIsUndoable,
bool* aClearAnnotationNewItems,
56 bool* aUpdateHierarchyNavigator,
57 wxString* aSourceSheetFilename ) :
70 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
71 embeddedFilesStack.push_back(
m_sheet->Schematic() );
79 [&]( wxCommandEvent& aEvent )
83 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
84 m_grid->ShowHideColumns(
"0 1 2 3 4 5 6 7" );
87 if(
m_frame->GetColorSettings()->GetOverrideSchItemColors() )
88 m_infoBar->ShowMessage(
_(
"Note: individual item colors overridden in Preferences." ) );
95 wxToolTip::Enable(
true );
125 m_grid->PopEventHandler(
true );
131 if( !wxDialog::TransferDataToWindow() )
136 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
138 std::vector<SCH_FIELD*> orderedFields;
141 orderedFields.push_back( &field );
143 std::stable_sort( orderedFields.begin(), orderedFields.end(),
146 return lhs->GetOrdinal() < rhs->GetOrdinal();
158 wxString filename = field_copy.
GetText();
159 filename.Replace( wxT(
"/" ), wxT(
"\\" ) );
160 field_copy.
SetText( filename );
177 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_fields->size() );
178 m_grid->ProcessTableMessage( msg );
210 GetSizer()->SetSizeHints(
this );
213 wxSize curSize = GetSize();
216 SetSize( wxSize( std::max( curSize.x,
minSize.x ), std::max( curSize.y,
minSize.y ) ) );
224 if( !
m_grid->CommitPendingChanges() || !
m_grid->Validate() )
228 for(
size_t i = 0; i <
m_fields->size(); ++i )
284 if( !wxDialog::TransferDataFromWindow() )
295 if( sheetFileName.IsEmpty() )
297 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
308 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
312 wxFileName fn( sheetFileName );
314 wxString newRelativeFilename = fn.GetFullPath();
317 newRelativeFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
320 oldFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
322 bool filename_changed = oldFilename != newRelativeFilename;
324 if( filename_changed ||
m_sheet->IsNew() )
328 wxCHECK( currentScreen,
false );
330 bool clearFileName =
false;
335 clearFileName =
true;
336 currentScreen->
SetFileName(
m_frame->Prj().AbsolutePath( wxT(
"noname.kicad_sch" ) ) );
339 wxFileName tmp( fn );
340 wxFileName screenFileName = currentScreen->
GetFileName();
342 if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
345 _(
"Sheet File Path" ),
346 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
348 makeRelDlg.SetExtendedMessage(
_(
"Using relative hierarchical sheet file name paths improves "
349 "schematic portability across systems and platforms. Using "
350 "absolute paths can result in portability issues." ) );
351 makeRelDlg.SetYesNoLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Use Relative Path" ) ),
352 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Use Absolute Path" ) ) );
354 if( makeRelDlg.ShowModal() == wxID_YES )
357 "\n to relative path: '%s'",
361 newRelativeFilename = fn.GetFullPath();
392 if( newSheetname.IsEmpty() )
393 newSheetname =
_(
"Untitled Sheet" );
402 m_sheet->SetName( newSheetname );
403 m_sheet->SetFileName( newRelativeFilename );
407 if( oldNetPrefix != newNetPrefix )
408 m_frame->Prj().GetProjectFile().NetSettings()->RenameNetPathPrefix( oldNetPrefix, newNetPrefix );
412 m_field.Offset(
m_sheet->GetPosition() );
418 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
424 const wxString& fieldName = field.GetUntranslatedName();
426 if( field.IsEmpty() )
428 else if( fieldName.IsEmpty() )
429 field.SetName(
_(
"untitled" ) );
431 if( !field.IsMandatory() )
439 tmp =
m_sheet->AddField( field );
444 wxString defaultText =
m_sheet->Schematic()->ConvertRefsToKIIDs( existingField->
GetText() );
445 tmp =
const_cast<SCH_FIELD*
>( existingField );
449 if( !variantName.IsEmpty() )
452 tmp->
SetText( defaultText, &instance );
454 wxString variantText =
m_sheet->Schematic()->ConvertRefsToKIIDs( field.GetText() );
455 tmp->
SetText( variantText, &instance, variantName );
460 for(
int ii = (
int)
m_sheet->GetFields().size() - 1; ii >= 0; ii-- )
471 if( editedField.GetName() == sheetField.
GetName() )
482 std::stable_sort(
m_sheet->GetFields().begin(),
m_sheet->GetFields().end(),
485 return lhs.GetOrdinal() < rhs.GetOrdinal();
496 wxPanel temp(
this );
501 KIDIALOG dlg(
this,
_(
"Note: item colors are overridden in the current color theme." ),
503 dlg.ShowDetailedText( wxString::Format(
_(
"To see individual item colors uncheck '%s'\n"
504 "in Preferences > Schematic Editor > Colors." ),
542 wxGridCellEditor*
editor =
m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
543 wxControl* control =
editor->GetControl();
545 if( control && control->GetValidator() )
546 success = control->GetValidator()->Validate( control );
554 else if( event.GetCol() ==
FDC_NAME )
556 wxString newName =
event.GetString();
558 for(
int i = 0; i <
m_grid->GetNumberRows(); ++i )
560 if( i == event.GetRow() )
566 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), newName ) );
582 [&]() -> std::pair<int, int>
591 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
592 m_grid->ProcessTableMessage( msg );
603 if( row < m_fields->GetMandatoryRowCount() )
605 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
606 m_fields->GetMandatoryRowCount() ) );
618 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
619 m_grid->ProcessTableMessage( msg );
629 return row >
m_fields->GetMandatoryRowCount();
644 return row >=
m_fields->GetMandatoryRowCount();
656 std::bitset<64> shownColumns =
m_grid->GetShownColumns();
662 if( !
m_grid->IsCellEditControlShown() )
663 m_grid->SetGridWidthsDirty();
668 wxString
path =
m_frame->GetCurrentSheet().PathHumanReadable(
false );
670 if(
path.Last() !=
'/' )
674 wxControl* control =
editor->GetControl();
675 wxTextEntry* textControl =
dynamic_cast<wxTextEntry*
>( control );
679 sheetName = textControl->GetValue();
694 path = wxControl::Ellipsize(
path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
706 m_grid->EnableCellEditControl(
true );
707 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.
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.