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() )
131 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
133 std::vector<SCH_FIELD*> orderedFields;
136 orderedFields.push_back( &field );
138 std::stable_sort( orderedFields.begin(), orderedFields.end(),
141 return lhs->GetOrdinal() < rhs->GetOrdinal();
153 wxString filename = field_copy.
GetText();
154 filename.Replace( wxT(
"/" ), wxT(
"\\" ) );
155 field_copy.
SetText( filename );
160 field_copy.
SetText(
m_sheet->GetFieldText( field->GetName(), &instance, variantName ) );
169 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED,
m_fields->size() );
170 m_grid->ProcessTableMessage( msg );
202 GetSizer()->SetSizeHints(
this );
205 wxSize curSize = GetSize();
208 SetSize( wxSize( std::max( curSize.x,
minSize.x ), std::max( curSize.y,
minSize.y ) ) );
216 if( !
m_grid->CommitPendingChanges() || !
m_grid->Validate() )
220 for(
size_t i = 0; i <
m_fields->size(); ++i )
276 if( !wxDialog::TransferDataFromWindow() )
287 if( sheetFileName.IsEmpty() )
289 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
300 DisplayError(
this,
_(
"A sheet must have a valid file name." ) );
304 wxFileName fn( sheetFileName );
306 wxString newRelativeFilename = fn.GetFullPath();
309 newRelativeFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
312 oldFilename.Replace( wxT(
"\\" ), wxT(
"/" ) );
314 bool filename_changed = oldFilename != newRelativeFilename;
316 if( filename_changed ||
m_sheet->IsNew() )
320 wxCHECK( currentScreen,
false );
322 bool clearFileName =
false;
327 clearFileName =
true;
328 currentScreen->
SetFileName(
m_frame->Prj().AbsolutePath( wxT(
"noname.kicad_sch" ) ) );
331 wxFileName tmp( fn );
332 wxFileName screenFileName = currentScreen->
GetFileName();
334 if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
337 _(
"Sheet File Path" ),
338 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
340 makeRelDlg.SetExtendedMessage(
_(
"Using relative hierarchical sheet file name paths improves "
341 "schematic portability across systems and platforms. Using "
342 "absolute paths can result in portability issues." ) );
343 makeRelDlg.SetYesNoLabels( KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Use Relative Path" ) ),
344 KICAD_MESSAGE_DIALOG::ButtonLabel(
_(
"Use Absolute Path" ) ) );
346 if( makeRelDlg.ShowModal() == wxID_YES )
349 "\n to relative path: '%s'",
353 newRelativeFilename = fn.GetFullPath();
384 if( newSheetname.IsEmpty() )
385 newSheetname =
_(
"Untitled Sheet" );
394 m_sheet->SetName( newSheetname );
395 m_sheet->SetFileName( newRelativeFilename );
399 if( oldNetPrefix != newNetPrefix )
400 m_frame->Prj().GetProjectFile().NetSettings()->RenameNetPathPrefix( oldNetPrefix, newNetPrefix );
404 m_field.Offset(
m_sheet->GetPosition() );
410 wxString variantName =
m_frame->Schematic().GetCurrentVariant();
416 const wxString& fieldName = field.GetUntranslatedName();
418 if( field.IsEmpty() )
420 else if( fieldName.IsEmpty() )
421 field.SetName(
_(
"untitled" ) );
423 if( !field.IsMandatory() )
431 tmp =
m_sheet->AddField( field );
436 wxString defaultText =
m_sheet->Schematic()->ConvertRefsToKIIDs( existingField->
GetText() );
437 tmp =
const_cast<SCH_FIELD*
>( existingField );
441 if( !variantName.IsEmpty() )
444 tmp->
SetText( defaultText, &instance );
446 wxString variantText =
m_sheet->Schematic()->ConvertRefsToKIIDs( field.GetText() );
447 tmp->
SetText( variantText, &instance, variantName );
452 for(
int ii = (
int)
m_sheet->GetFields().size() - 1; ii >= 0; ii-- )
463 if( editedField.GetName() == sheetField.
GetName() )
474 std::stable_sort(
m_sheet->GetFields().begin(),
m_sheet->GetFields().end(),
477 return lhs.GetOrdinal() < rhs.GetOrdinal();
488 wxPanel temp(
this );
493 KIDIALOG dlg(
this,
_(
"Note: item colors are overridden in the current color theme." ),
495 dlg.ShowDetailedText( wxString::Format(
_(
"To see individual item colors uncheck '%s'\n"
496 "in Preferences > Schematic Editor > Colors." ),
534 wxGridCellEditor*
editor =
m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
535 wxControl* control =
editor->GetControl();
537 if( control && control->GetValidator() )
538 success = control->GetValidator()->Validate( control );
546 else if( event.GetCol() ==
FDC_NAME )
548 wxString newName =
event.GetString();
550 for(
int i = 0; i <
m_grid->GetNumberRows(); ++i )
552 if( i == event.GetRow() )
558 DisplayError(
this, wxString::Format(
_(
"Field name '%s' already in use." ), newName ) );
574 [&]() -> std::pair<int, int>
583 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
584 m_grid->ProcessTableMessage( msg );
595 if( row < m_fields->GetMandatoryRowCount() )
597 DisplayError(
this, wxString::Format(
_(
"The first %d fields are mandatory." ),
598 m_fields->GetMandatoryRowCount() ) );
609 wxGridTableMessage msg(
m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
610 m_grid->ProcessTableMessage( msg );
620 return row >
m_fields->GetMandatoryRowCount();
624 std::swap( *(
m_fields->begin() + row ), *(
m_fields->begin() + row - 1 ) );
635 return row >=
m_fields->GetMandatoryRowCount();
639 std::swap( *(
m_fields->begin() + row ), *(
m_fields->begin() + row + 1 ) );
647 std::bitset<64> shownColumns =
m_grid->GetShownColumns();
653 if( !
m_grid->IsCellEditControlShown() )
654 m_grid->SetGridWidthsDirty();
659 wxString
path =
m_frame->GetCurrentSheet().PathHumanReadable(
false );
661 if(
path.Last() !=
'/' )
665 wxControl* control =
editor->GetControl();
666 wxTextEntry* textControl =
dynamic_cast<wxTextEntry*
>( control );
670 sheetName = textControl->GetValue();
685 path = wxControl::Ellipsize(
path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
697 m_grid->EnableCellEditControl(
true );
698 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
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.