KiCad PCB EDA Suite
Loading...
Searching...
No Matches
dialog_sheet_properties.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright (C) 2009 Wayne Stambaugh <[email protected]>
5 * Copyright The KiCad Developers, see CHANGELOG.txt for contributors.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program. If not, see <https://www.gnu.org/licenses/>.
19 */
20
22
23#include <algorithm>
24
25#include <kiface_base.h>
26#include <wx/string.h>
27#include <wx/log.h>
28#include <wx/tooltip.h>
29#include <common.h>
30#include <confirm.h>
31#include <kidialog.h>
32#include <validators.h>
33#include <wx_filename.h>
36#include <kiplatform/ui.h>
37#include <sch_commit.h>
38#include <sch_edit_frame.h>
39#include <sch_io/sch_io.h>
40#include <sch_sheet.h>
41#include <schematic.h>
44#include <template_fieldnames.h>
45#include <bitmaps.h>
46#include <eeschema_settings.h>
48#include <widgets/wx_infobar.h>
49#include <trace_helpers.h>
51#include "wx/dcclient.h"
52#include "string_utils.h"
53
55 bool* aIsUndoable, bool* aClearAnnotationNewItems,
56 bool* aUpdateHierarchyNavigator,
57 wxString* aSourceSheetFilename ) :
59 m_frame( aParent ),
60 m_isUndoable( aIsUndoable ),
61 m_clearAnnotationNewItems( aClearAnnotationNewItems ),
62 m_updateHierarchyNavigator( aUpdateHierarchyNavigator ),
63 m_sourceSheetFilename( aSourceSheetFilename ),
65 m_dummySheet( *aSheet ),
67{
68 m_sheet = aSheet;
69
70 std::vector<EMBEDDED_FILES*> embeddedFilesStack;
71 embeddedFilesStack.push_back( m_sheet->Schematic() );
72
73 m_fields = new FIELDS_GRID_TABLE( this, aParent, m_grid, m_sheet, embeddedFilesStack );
76
77 m_grid->SetTable( m_fields );
78 m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, embeddedFilesStack,
79 [&]( wxCommandEvent& aEvent )
80 {
81 OnAddField( aEvent );
82 } ) );
83 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
84 m_grid->ShowHideColumns( "0 1 2 3 4 5 6 7" );
85 m_shownColumns = m_grid->GetShownColumns();
86
87 if( m_frame->GetColorSettings()->GetOverrideSchItemColors() )
88 m_infoBar->ShowMessage( _( "Note: individual item colors overridden in Preferences." ) );
89
90 wxSize minSize = m_pageNumberTextCtrl->GetMinSize();
91 int minWidth = m_pageNumberTextCtrl->GetTextExtent( wxT( "XXX.XXX" ) ).GetWidth();
92
93 m_pageNumberTextCtrl->SetMinSize( wxSize( minWidth, minSize.GetHeight() ) );
94
95 wxToolTip::Enable( true );
97
98 // Configure button logos
103
104 // Set font sizes
106 m_hierarchicalPath->SetFont( KIUI::GetSmallInfoFont( this ) );
107
108 // wxFormBuilder doesn't include this event...
109 m_grid->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_SHEET_PROPERTIES::OnGridCellChanging ),
110 nullptr, this );
111
113}
114
115
117{
118 // Prevents crash bug in wxGrid's d'tor
119 m_grid->DestroyTable( m_fields );
120
121 m_grid->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_SHEET_PROPERTIES::OnGridCellChanging ),
122 nullptr, this );
123
124 // Delete the GRID_TRICKS.
125 m_grid->PopEventHandler( true );
126}
127
128
130{
131 if( !wxDialog::TransferDataToWindow() )
132 return false;
133
134 SCHEMATIC& schematic = m_frame->Schematic();
135 SCH_SHEET_PATH instance = m_frame->GetCurrentSheet();
136 wxString variantName = m_frame->Schematic().GetCurrentVariant();
137
138 std::vector<SCH_FIELD*> orderedFields;
139
140 for( SCH_FIELD& field : m_sheet->GetFields() )
141 orderedFields.push_back( &field );
142
143 std::stable_sort( orderedFields.begin(), orderedFields.end(),
144 []( const SCH_FIELD* lhs, const SCH_FIELD* rhs )
145 {
146 return lhs->GetOrdinal() < rhs->GetOrdinal();
147 } );
148
149 // Push a copy of each field into m_fields
150 for( SCH_FIELD* field : orderedFields )
151 {
152 SCH_FIELD field_copy( *field );
153
154#ifdef __WINDOWS__
155 // Filenames are stored using unix notation, so convert to Windows notation
156 if( field_copy.GetId() == FIELD_T::SHEET_FILENAME )
157 {
158 wxString filename = field_copy.GetText();
159 filename.Replace( wxT( "/" ), wxT( "\\" ) );
160 field_copy.SetText( filename );
161 }
162#endif
163
164 if( !field_copy.IsMandatory() )
165 {
166 field_copy.SetText( schematic.ConvertKIIDsToRefs( m_sheet->GetFieldText( field->GetName(), &instance,
167 variantName ) ) );
168 }
169
170 // change offset to be symbol-relative
171 field_copy.Offset( -m_sheet->GetPosition() );
172
173 m_fields->push_back( field_copy );
174 }
175
176 // notify the grid
177 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_fields->size() );
178 m_grid->ProcessTableMessage( msg );
179
180 // border width
181 m_borderWidth.SetValue( m_sheet->GetBorderWidth() );
182
183 // set up color swatches
184 KIGFX::COLOR4D borderColor = m_sheet->GetBorderColor();
185 KIGFX::COLOR4D backgroundColor = m_sheet->GetBackgroundColor();
186
187 m_borderSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
188 m_backgroundSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
189
190 m_borderSwatch->SetSwatchColor( borderColor, false );
191 m_backgroundSwatch->SetSwatchColor( backgroundColor, false );
192
193 KIGFX::COLOR4D canvas = m_frame->GetColorSettings()->GetColor( LAYER_SCHEMATIC_BACKGROUND );
194 m_borderSwatch->SetSwatchBackground( canvas );
195 m_backgroundSwatch->SetSwatchBackground( canvas );
196
197 m_cbExcludeFromSim->SetValue( m_sheet->GetExcludedFromSim( &instance, variantName ) );
198 m_cbExcludeFromBom->SetValue( m_sheet->GetExcludedFromBOM( &instance, variantName ) );
199 m_cbExcludeFromBoard->SetValue( m_sheet->GetExcludedFromBoard( &instance, variantName ) );
200 m_cbDNP->SetValue( m_sheet->GetDNP( &instance, variantName ) );
201
202 instance.push_back( m_sheet );
203 m_pageNumberTextCtrl->ChangeValue( instance.GetPageNumber() );
204
205 // Recalculate the dialog size now that the grid is populated and controls
206 // have their real values. On first run, the dialog was sized before data
207 // was available, so the minimum size may not account for the actual content.
208 m_grid->Layout();
209 Layout();
210 GetSizer()->SetSizeHints( this );
211
212 wxSize minSize = GetMinSize();
213 wxSize curSize = GetSize();
214
215 if( curSize.x < minSize.x || curSize.y < minSize.y )
216 SetSize( wxSize( std::max( curSize.x, minSize.x ), std::max( curSize.y, minSize.y ) ) );
217
218 return true;
219}
220
221
223{
224 if( !m_grid->CommitPendingChanges() || !m_grid->Validate() )
225 return false;
226
227 // Check for missing field names.
228 for( size_t i = 0; i < m_fields->size(); ++i )
229 {
230 SCH_FIELD& field = m_fields->at( i );
231
232 if( field.IsMandatory() )
233 continue;
234
235 if( field.GetName( false ).empty() && !field.GetText().empty() )
236 {
237 DisplayErrorMessage( this, _( "Fields must have a name." ) );
238
240 m_delayedFocusRow = (int) i;
241
242 return false;
243 }
244 }
245
246 return true;
247}
248
249
250static bool positioningChanged( const SCH_FIELD& a, const SCH_FIELD& b )
251{
252 if( a.GetPosition() != b.GetPosition() )
253 return true;
254
255 if( a.GetHorizJustify() != b.GetHorizJustify() )
256 return true;
257
258 if( a.GetVertJustify() != b.GetVertJustify() )
259 return true;
260
261 if( a.GetTextAngle() != b.GetTextAngle() )
262 return true;
263
264 return false;
265}
266
267
269{
271 return true;
272
274 return true;
275
276 return false;
277}
278
279
281{
282 wxCHECK( m_sheet && m_frame, false );
283
284 if( !wxDialog::TransferDataFromWindow() ) // Calls our Validate() method.
285 return false;
286
287 if( m_isUndoable )
288 *m_isUndoable = true;
289
290 // Sheet file names can be relative or absolute.
291 wxString sheetFileName = m_fields->GetField( FIELD_T::SHEET_FILENAME )->GetText();
292
293 // Ensure filepath is not empty. (In normal use will be caught by grid validators,
294 // but unedited data from existing files can be bad.)
295 if( sheetFileName.IsEmpty() )
296 {
297 DisplayError( this, _( "A sheet must have a valid file name." ) );
298 return false;
299 }
300
301 // Ensure the filename extension is OK. (In normal use will be caught by grid validators,
302 // but unedited data from existing files can be bad.)
303 sheetFileName = EnsureFileExtension( sheetFileName, FILEEXT::KiCadSchematicFileExtension );
304
305 // Ensure sheetFileName is legal
306 if( !IsFullFileNameValid( sheetFileName ) )
307 {
308 DisplayError( this, _( "A sheet must have a valid file name." ) );
309 return false;
310 }
311
312 wxFileName fn( sheetFileName );
313
314 wxString newRelativeFilename = fn.GetFullPath();
315
316 // Inside Eeschema, filenames are stored using unix notation
317 newRelativeFilename.Replace( wxT( "\\" ), wxT( "/" ) );
318
319 wxString oldFilename = m_sheet->GetField( FIELD_T::SHEET_FILENAME )->GetText();
320 oldFilename.Replace( wxT( "\\" ), wxT( "/" ) );
321
322 bool filename_changed = oldFilename != newRelativeFilename;
323
324 if( filename_changed || m_sheet->IsNew() )
325 {
326 SCH_SCREEN* currentScreen = m_frame->GetCurrentSheet().LastScreen();
327
328 wxCHECK( currentScreen, false );
329
330 bool clearFileName = false;
331
332 // This can happen for the root sheet when opening Eeschema in the stand alone mode.
333 if( currentScreen->GetFileName().IsEmpty() )
334 {
335 clearFileName = true;
336 currentScreen->SetFileName( m_frame->Prj().AbsolutePath( wxT( "noname.kicad_sch" ) ) );
337 }
338
339 wxFileName tmp( fn );
340 wxFileName screenFileName = currentScreen->GetFileName();
341
342 if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
343 {
344 KICAD_MESSAGE_DIALOG makeRelDlg( this, _( "Use relative path for sheet file?" ),
345 _( "Sheet File Path" ),
346 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
347
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" ) ) );
353
354 if( makeRelDlg.ShowModal() == wxID_YES )
355 {
356 wxLogTrace( tracePathsAndFiles, "\n Converted absolute path: '%s'"
357 "\n to relative path: '%s'",
358 tmp.GetPath(),
359 fn.GetPath() );
360 m_fields->GetField( FIELD_T::SHEET_FILENAME )->SetText( fn.GetFullPath() );
361 newRelativeFilename = fn.GetFullPath();
362 }
363 }
364
365 if( !onSheetFilenameChanged( newRelativeFilename ) )
366 {
367 if( clearFileName )
368 currentScreen->SetFileName( wxEmptyString );
369 else
371
372 return false;
373 }
375 {
377 }
378
379 if( clearFileName )
380 currentScreen->SetFileName( wxEmptyString );
381
382 // One last validity check (and potential repair) just to be sure to be sure
383 SCH_SHEET_LIST repairedList;
384 repairedList.BuildSheetList( &m_frame->Schematic().Root(), true );
385 }
386
387 wxString newSheetname = m_fields->GetField( FIELD_T::SHEET_NAME )->GetText();
388
389 if( ( newSheetname != m_sheet->GetName() ) && m_updateHierarchyNavigator )
391
392 if( newSheetname.IsEmpty() )
393 newSheetname = _( "Untitled Sheet" );
394
395 m_fields->GetField( FIELD_T::SHEET_NAME )->SetText( newSheetname );
396
397 // Net names embed the sheet path, so retarget netclass/color assignments on a rename.
398 SCH_SHEET_PATH renamedPath = m_frame->GetCurrentSheet();
399 renamedPath.push_back( m_sheet );
400 wxString oldNetPrefix = renamedPath.PathHumanReadable( true, false, true );
401
402 m_sheet->SetName( newSheetname );
403 m_sheet->SetFileName( newRelativeFilename );
404
405 wxString newNetPrefix = renamedPath.PathHumanReadable( true, false, true );
406
407 if( oldNetPrefix != newNetPrefix )
408 m_frame->Prj().GetProjectFile().NetSettings()->RenameNetPathPrefix( oldNetPrefix, newNetPrefix );
409
410 // change all field positions from relative to absolute
411 for( SCH_FIELD& m_field : *m_fields)
412 m_field.Offset( m_sheet->GetPosition() );
413
415 m_sheet->SetFieldsAutoplaced( AUTOPLACE_NONE );
416
417 SCH_SHEET_PATH instance = m_frame->GetCurrentSheet();
418 wxString variantName = m_frame->Schematic().GetCurrentVariant();
419
420 int ordinal = 42; // Arbitrarily larger than any mandatory FIELD_T ids.
421
422 for( SCH_FIELD& field : *m_fields )
423 {
424 const wxString& fieldName = field.GetUntranslatedName();
425
426 if( field.IsEmpty() )
427 continue;
428 else if( fieldName.IsEmpty() )
429 field.SetName( _( "untitled" ) );
430
431 if( !field.IsMandatory() )
432 field.SetOrdinal( ordinal++, FIELD_T::SHEET_USER );
433
434 SCH_FIELD* existingField = m_sheet->GetField( fieldName );
435 SCH_FIELD* tmp;
436
437 if( !existingField )
438 {
439 tmp = m_sheet->AddField( field );
440 tmp->SetParent( m_sheet );
441 }
442 else
443 {
444 wxString defaultText = m_sheet->Schematic()->ConvertRefsToKIIDs( existingField->GetText() );
445 tmp = const_cast<SCH_FIELD*>( existingField );
446
447 *tmp = field;
448
449 if( !variantName.IsEmpty() )
450 {
451 // Restore the default field text for existing fields.
452 tmp->SetText( defaultText, &instance );
453
454 wxString variantText = m_sheet->Schematic()->ConvertRefsToKIIDs( field.GetText() );
455 tmp->SetText( variantText, &instance, variantName );
456 }
457 }
458 }
459
460 for( int ii = (int) m_sheet->GetFields().size() - 1; ii >= 0; ii-- )
461 {
462 SCH_FIELD& sheetField = m_sheet->GetFields()[ii];
463
464 if( sheetField.IsMandatory() )
465 continue;
466
467 bool found = false;
468
469 for( const SCH_FIELD& editedField : *m_fields )
470 {
471 if( editedField.GetName() == sheetField.GetName() )
472 {
473 found = true;
474 break;
475 }
476 }
477
478 if( !found )
479 m_sheet->GetFields().erase( m_sheet->GetFields().begin() + ii );
480 }
481
482 std::stable_sort( m_sheet->GetFields().begin(), m_sheet->GetFields().end(),
483 []( const SCH_FIELD& lhs, const SCH_FIELD& rhs )
484 {
485 return lhs.GetOrdinal() < rhs.GetOrdinal();
486 } );
487
488 m_sheet->SetBorderWidth( m_borderWidth.GetIntValue() );
489
490 COLOR_SETTINGS* colorSettings = m_frame->GetColorSettings();
491
492 if( colorSettings->GetOverrideSchItemColors()
493 && ( m_sheet->GetBorderColor() != m_borderSwatch->GetSwatchColor() ||
494 m_sheet->GetBackgroundColor() != m_backgroundSwatch->GetSwatchColor() ) )
495 {
496 wxPanel temp( this );
497 temp.Hide();
498 PANEL_EESCHEMA_COLOR_SETTINGS prefs( &temp );
499 wxString checkboxLabel = prefs.m_optOverrideColors->GetLabel();
500
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." ),
505 checkboxLabel ) );
506 dlg.DoNotShowCheckbox( __FILE__, __LINE__ );
507 dlg.ShowModal();
508 }
509
510 m_sheet->SetBorderColor( m_borderSwatch->GetSwatchColor() );
511 m_sheet->SetBackgroundColor( m_backgroundSwatch->GetSwatchColor() );
512
513 m_sheet->SetExcludedFromSim( m_cbExcludeFromSim->GetValue(), &instance, variantName );
514 m_sheet->SetExcludedFromBOM( m_cbExcludeFromBom->GetValue(), &instance, variantName );
515 m_sheet->SetExcludedFromBoard( m_cbExcludeFromBoard->GetValue() );
516 m_sheet->SetDNP( m_cbDNP->GetValue(), &instance, variantName );
517
518 instance.push_back( m_sheet );
519
520 instance.SetPageNumber( m_pageNumberTextCtrl->GetValue() );
521
522 m_frame->TestDanglingEnds();
523
524 // Refresh all sheets in case ordering changed.
525 for( SCH_ITEM* item : m_frame->GetScreen()->Items().OfType( SCH_SHEET_T ) )
526 m_frame->UpdateItem( item );
527
528 return true;
529}
530
531
532bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilename )
533{
534 return m_frame->ChangeSheetFile( m_sheet, aNewFilename, m_clearAnnotationNewItems, m_isUndoable,
536}
537
538
540{
541 bool success = true;
542 wxGridCellEditor* editor = m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
543 wxControl* control = editor->GetControl();
544
545 if( control && control->GetValidator() )
546 success = control->GetValidator()->Validate( control );
547
548 if( !success )
549 {
550 event.Veto();
551 m_delayedFocusRow = event.GetRow();
552 m_delayedFocusColumn = event.GetCol();
553 }
554 else if( event.GetCol() == FDC_NAME )
555 {
556 wxString newName = event.GetString();
557
558 for( int i = 0; i < m_grid->GetNumberRows(); ++i )
559 {
560 if( i == event.GetRow() )
561 continue;
562
563 if( FieldNamesAreDuplicates( newName, m_grid->GetCellValue( i, FDC_NAME ),
565 {
566 DisplayError( this, wxString::Format( _( "Field name '%s' already in use." ), newName ) );
567 event.Veto();
568 m_delayedFocusRow = event.GetRow();
569 m_delayedFocusColumn = event.GetCol();
570 break;
571 }
572 }
573 }
574
575 editor->DecRef();
576}
577
578
579void DIALOG_SHEET_PROPERTIES::OnAddField( wxCommandEvent& event )
580{
581 m_grid->OnAddRow(
582 [&]() -> std::pair<int, int>
583 {
585
586 newField.SetTextAngle( m_fields->GetField( FIELD_T::SHEET_NAME )->GetTextAngle() );
587 newField.SetVisible( false );
588 m_fields->push_back( newField );
589
590 // notify the grid
591 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
592 m_grid->ProcessTableMessage( msg );
593 return { m_fields->GetNumberRows() - 1, FDC_NAME };
594 } );
595}
596
597
598void DIALOG_SHEET_PROPERTIES::OnDeleteField( wxCommandEvent& event )
599{
600 m_grid->OnDeleteRows(
601 [&]( int row )
602 {
603 if( row < m_fields->GetMandatoryRowCount() )
604 {
605 DisplayError( this, wxString::Format( _( "The first %d fields are mandatory." ),
606 m_fields->GetMandatoryRowCount() ) );
607 return false;
608 }
609
610 return true;
611 },
612 [&]( int row )
613 {
614 if( !m_fields->EraseRow( row ) )
615 return;
616
617 // notify the grid
618 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
619 m_grid->ProcessTableMessage( msg );
620 } );
621}
622
623
624void DIALOG_SHEET_PROPERTIES::OnMoveUp( wxCommandEvent& event )
625{
626 m_grid->OnMoveRowUp(
627 [&]( int row )
628 {
629 return row > m_fields->GetMandatoryRowCount();
630 },
631 [&]( int row )
632 {
633 m_fields->SwapRows( row, row - 1 );
634 m_grid->ForceRefresh();
635 } );
636}
637
638
639void DIALOG_SHEET_PROPERTIES::OnMoveDown( wxCommandEvent& event )
640{
641 m_grid->OnMoveRowDown(
642 [&]( int row )
643 {
644 return row >= m_fields->GetMandatoryRowCount();
645 },
646 [&]( int row )
647 {
648 m_fields->SwapRows( row, row + 1 );
649 m_grid->ForceRefresh();
650 } );
651}
652
653
654void DIALOG_SHEET_PROPERTIES::OnUpdateUI( wxUpdateUIEvent& event )
655{
656 std::bitset<64> shownColumns = m_grid->GetShownColumns();
657
658 if( shownColumns != m_shownColumns )
659 {
660 m_shownColumns = shownColumns;
661
662 if( !m_grid->IsCellEditControlShown() )
663 m_grid->SetGridWidthsDirty();
664 }
665
666 // Propagate changes in sheetname to displayed hierarchical path
667 int sheetnameRow = m_fields->GetFieldRow( FIELD_T::SHEET_NAME );
668 wxString path = m_frame->GetCurrentSheet().PathHumanReadable( false );
669
670 if( path.Last() != '/' )
671 path.Append( '/' );
672
673 wxGridCellEditor* editor = m_grid->GetCellEditor( sheetnameRow, FDC_VALUE );
674 wxControl* control = editor->GetControl();
675 wxTextEntry* textControl = dynamic_cast<wxTextEntry*>( control );
676 wxString sheetName;
677
678 if( textControl )
679 sheetName = textControl->GetValue();
680 else
681 sheetName = m_grid->GetCellValue( sheetnameRow, FDC_VALUE );
682
683 m_dummySheet.SetFields( *m_fields );
684 m_dummySheetNameField.SetText( sheetName );
685 path += m_dummySheetNameField.GetShownText( FOR_GUI );
686
687 editor->DecRef();
688
689 wxClientDC dc( m_hierarchicalPathLabel );
690 int width = m_sizerBottom->GetSize().x - m_stdDialogButtonSizer->GetSize().x
691 - m_hierarchicalPathLabel->GetSize().x
692 - 30;
693
694 path = wxControl::Ellipsize( path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
695
696 if( m_hierarchicalPath->GetLabel() != path )
697 m_hierarchicalPath->SetLabel( path );
698
699 // Handle a delayed focus
700 if( m_delayedFocusRow >= 0 )
701 {
702 m_grid->SetFocus();
703 m_grid->MakeCellVisible( m_delayedFocusRow, m_delayedFocusColumn );
705
706 m_grid->EnableCellEditControl( true );
707 m_grid->ShowCellEditControl();
708
711 }
712}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:106
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:400
Color settings are a bit different than most of the settings objects in that there can be more than o...
bool GetOverrideSchItemColors() const
wxStdDialogButtonSizer * m_stdDialogButtonSizer
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)
void OnAddField(wxCommandEvent &event) override
void OnMoveDown(wxCommandEvent &event) override
void OnGridCellChanging(wxGridEvent &event)
void OnDeleteField(wxCommandEvent &event) override
bool onSheetFilenameChanged(const wxString &aNewFilename)
void OnUpdateUI(wxUpdateUIEvent &event) override
void OnMoveUp(wxCommandEvent &event) override
DIALOG_SHEET_PROPERTIES(SCH_EDIT_FRAME *aParent, SCH_SHEET *aSheet, bool *aIsUndoable, bool *aClearAnnotationNewItems, bool *aUpdateHierarchyNavigator, wxString *aSourceSheetFilename)
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)
Definition eda_item.cpp:153
virtual void Offset(const VECTOR2I &aOffset)
Definition eda_text.cpp:575
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:239
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:347
virtual EDA_ANGLE GetTextAngle() const
Definition eda_text.h:178
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:242
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:268
SCH_FIELD * GetField(FIELD_T aFieldId)
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
Definition kidialog.h:38
@ KD_WARNING
Definition kidialog.h:43
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
Definition kidialog.cpp:51
int ShowModal() override
Definition kidialog.cpp:89
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:101
Holds all the data relating to one schematic.
Definition schematic.h:149
wxString ConvertKIIDsToRefs(const wxString &aSource) const
Schematic editor (Eeschema) main window.
bool IsMandatory() const
VECTOR2I GetPosition() const override
virtual const wxString & GetText() const override
Return the string associated with the text object.
Definition sch_field.h:139
FIELD_T GetId() const
Definition sch_field.h:143
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,...
Definition sch_item.h:170
const wxString & GetFileName() const
Definition sch_screen.h:157
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.
Definition sch_sheet.h:48
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.
Definition common.cpp:880
@ FOR_GUI
Definition common.h:93
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:217
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:192
This file is part of the common library.
#define KICAD_MESSAGE_DIALOG
Definition confirm.h:48
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.
#define _(s)
@ FDC_NAME
@ FDC_VALUE
static const std::string KiCadSchematicFileExtension
const wxChar *const tracePathsAndFiles
Flag to enable path and file name debug output.
@ LAYER_SCHEMATIC_BACKGROUND
Definition layer_ids.h:516
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
Definition sch_field.h:394
@ AUTOPLACE_NONE
Definition sch_item.h:74
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...
@ TRANSLATED
#define SHEET_MANDATORY_FIELDS
std::string path
wxLogTrace helper definitions.
@ SCH_SHEET_T
Definition typeinfo.h:171
Custom text control validator definitions.
Definition of file extensions used in Kicad.