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, you may find one here:
19 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20 * or you may search the http://www.gnu.org website for the version 2 license,
21 * or you may write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23 */
24
26
27#include <kiface_base.h>
28#include <wx/string.h>
29#include <wx/log.h>
30#include <wx/tooltip.h>
31#include <common.h>
32#include <confirm.h>
33#include <kidialog.h>
34#include <validators.h>
35#include <wx_filename.h>
38#include <kiplatform/ui.h>
39#include <sch_commit.h>
40#include <sch_edit_frame.h>
41#include <sch_io/sch_io.h>
42#include <sch_sheet.h>
43#include <schematic.h>
44#include <bitmaps.h>
45#include <eeschema_settings.h>
47#include <widgets/wx_infobar.h>
48#include <trace_helpers.h>
50#include "wx/dcclient.h"
51#include "string_utils.h"
52
54 bool* aIsUndoable, bool* aClearAnnotationNewItems,
55 bool* aUpdateHierarchyNavigator,
56 wxString* aSourceSheetFilename ) :
58 m_frame( aParent ),
59 m_isUndoable( aIsUndoable ),
60 m_clearAnnotationNewItems( aClearAnnotationNewItems ),
61 m_updateHierarchyNavigator( aUpdateHierarchyNavigator ),
62 m_sourceSheetFilename( aSourceSheetFilename ),
64 m_dummySheet( *aSheet ),
66{
67 m_sheet = aSheet;
68 m_fields = new FIELDS_GRID_TABLE( this, aParent, m_grid, m_sheet );
71
72 m_grid->SetTable( m_fields );
73 m_grid->PushEventHandler( new FIELDS_GRID_TRICKS( m_grid, this, { &aParent->Schematic() },
74 [&]( wxCommandEvent& aEvent )
75 {
76 OnAddField( aEvent );
77 } ) );
78 m_grid->SetSelectionMode( wxGrid::wxGridSelectRows );
79 m_grid->ShowHideColumns( "0 1 2 3 4 5 6 7" );
80 m_shownColumns = m_grid->GetShownColumns();
81
82 if( m_frame->GetColorSettings()->GetOverrideSchItemColors() )
83 m_infoBar->ShowMessage( _( "Note: individual item colors overridden in Preferences." ) );
84
85 wxSize minSize = m_pageNumberTextCtrl->GetMinSize();
86 int minWidth = m_pageNumberTextCtrl->GetTextExtent( wxT( "XXX.XXX" ) ).GetWidth();
87
88 m_pageNumberTextCtrl->SetMinSize( wxSize( minWidth, minSize.GetHeight() ) );
89
90 wxToolTip::Enable( true );
92
93 // Configure button logos
98
99 // Set font sizes
101 m_hierarchicalPath->SetFont( KIUI::GetSmallInfoFont( this ) );
102
103 // wxFormBuilder doesn't include this event...
104 m_grid->Connect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_SHEET_PROPERTIES::OnGridCellChanging ),
105 nullptr, this );
106
108}
109
110
112{
113 // Prevents crash bug in wxGrid's d'tor
114 m_grid->DestroyTable( m_fields );
115
116 m_grid->Disconnect( wxEVT_GRID_CELL_CHANGING, wxGridEventHandler( DIALOG_SHEET_PROPERTIES::OnGridCellChanging ),
117 nullptr, this );
118
119 // Delete the GRID_TRICKS.
120 m_grid->PopEventHandler( true );
121}
122
123
125{
126 if( !wxDialog::TransferDataToWindow() )
127 return false;
128
129 SCH_SHEET_PATH instance = m_frame->GetCurrentSheet();
130 wxString variantName = m_frame->Schematic().GetCurrentVariant();
131
132 // Push a copy of each field into m_updateFields
133 for( SCH_FIELD& field : m_sheet->GetFields() )
134 {
135 SCH_FIELD field_copy( field );
136
137#ifdef __WINDOWS__
138 // Filenames are stored using unix notation, so convert to Windows notation
139 if( field_copy.GetId() == FIELD_T::SHEET_FILENAME )
140 {
141 wxString filename = field_copy.GetText();
142 filename.Replace( wxT( "/" ), wxT( "\\" ) );
143 field_copy.SetText( filename );
144 }
145#endif
146
147 if( !field_copy.IsMandatory() )
148 field_copy.SetText( m_sheet->GetFieldText( field.GetName(), &instance, variantName ) );
149
150 // change offset to be symbol-relative
151 field_copy.Offset( -m_sheet->GetPosition() );
152
153 m_fields->push_back( field_copy );
154 }
155
156 // notify the grid
157 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, m_fields->size() );
158 m_grid->ProcessTableMessage( msg );
159
160 // border width
161 m_borderWidth.SetValue( m_sheet->GetBorderWidth() );
162
163 // set up color swatches
164 KIGFX::COLOR4D borderColor = m_sheet->GetBorderColor();
165 KIGFX::COLOR4D backgroundColor = m_sheet->GetBackgroundColor();
166
167 m_borderSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
168 m_backgroundSwatch->SetDefaultColor( COLOR4D::UNSPECIFIED );
169
170 m_borderSwatch->SetSwatchColor( borderColor, false );
171 m_backgroundSwatch->SetSwatchColor( backgroundColor, false );
172
173 KIGFX::COLOR4D canvas = m_frame->GetColorSettings()->GetColor( LAYER_SCHEMATIC_BACKGROUND );
174 m_borderSwatch->SetSwatchBackground( canvas );
175 m_backgroundSwatch->SetSwatchBackground( canvas );
176
177 m_cbExcludeFromSim->SetValue( m_sheet->GetExcludedFromSim( &instance, variantName ) );
178 m_cbExcludeFromBom->SetValue( m_sheet->GetExcludedFromBOM( &instance, variantName ) );
179 m_cbExcludeFromBoard->SetValue( m_sheet->GetExcludedFromBoard( &instance, variantName ) );
180 m_cbDNP->SetValue( m_sheet->GetDNP( &instance, variantName ) );
181
182 instance.push_back( m_sheet );
183 m_pageNumberTextCtrl->ChangeValue( instance.GetPageNumber() );
184
185 return true;
186}
187
188
190{
191 if( !m_grid->CommitPendingChanges() || !m_grid->Validate() )
192 return false;
193
194 // Check for missing field names.
195 for( size_t i = 0; i < m_fields->size(); ++i )
196 {
197 SCH_FIELD& field = m_fields->at( i );
198
199 if( field.IsMandatory() )
200 continue;
201
202 if( field.GetName( false ).empty() && !field.GetText().empty() )
203 {
204 DisplayErrorMessage( this, _( "Fields must have a name." ) );
205
207 m_delayedFocusRow = (int) i;
208
209 return false;
210 }
211 }
212
213 return true;
214}
215
216
217static bool positioningChanged( const SCH_FIELD& a, const SCH_FIELD& b )
218{
219 if( a.GetPosition() != b.GetPosition() )
220 return true;
221
222 if( a.GetHorizJustify() != b.GetHorizJustify() )
223 return true;
224
225 if( a.GetVertJustify() != b.GetVertJustify() )
226 return true;
227
228 if( a.GetTextAngle() != b.GetTextAngle() )
229 return true;
230
231 return false;
232}
233
234
236{
238 return true;
239
241 return true;
242
243 return false;
244}
245
246
248{
249 wxCHECK( m_sheet && m_frame, false );
250
251 if( !wxDialog::TransferDataFromWindow() ) // Calls our Validate() method.
252 return false;
253
254 if( m_isUndoable )
255 *m_isUndoable = true;
256
257 // Sheet file names can be relative or absolute.
258 wxString sheetFileName = m_fields->GetField( FIELD_T::SHEET_FILENAME )->GetText();
259
260 // Ensure filepath is not empty. (In normal use will be caught by grid validators,
261 // but unedited data from existing files can be bad.)
262 if( sheetFileName.IsEmpty() )
263 {
264 DisplayError( this, _( "A sheet must have a valid file name." ) );
265 return false;
266 }
267
268 // Ensure the filename extension is OK. (In normal use will be caught by grid validators,
269 // but unedited data from existing files can be bad.)
270 sheetFileName = EnsureFileExtension( sheetFileName, FILEEXT::KiCadSchematicFileExtension );
271
272 // Ensure sheetFileName is legal
273 if( !IsFullFileNameValid( sheetFileName ) )
274 {
275 DisplayError( this, _( "A sheet must have a valid file name." ) );
276 return false;
277 }
278
279 wxFileName fn( sheetFileName );
280
281 wxString newRelativeFilename = fn.GetFullPath();
282
283 // Inside Eeschema, filenames are stored using unix notation
284 newRelativeFilename.Replace( wxT( "\\" ), wxT( "/" ) );
285
286 wxString oldFilename = m_sheet->GetField( FIELD_T::SHEET_FILENAME )->GetText();
287 oldFilename.Replace( wxT( "\\" ), wxT( "/" ) );
288
289 bool filename_changed = oldFilename != newRelativeFilename;
290
291 if( filename_changed || m_sheet->IsNew() )
292 {
293 SCH_SCREEN* currentScreen = m_frame->GetCurrentSheet().LastScreen();
294
295 wxCHECK( currentScreen, false );
296
297 bool clearFileName = false;
298
299 // This can happen for the root sheet when opening Eeschema in the stand alone mode.
300 if( currentScreen->GetFileName().IsEmpty() )
301 {
302 clearFileName = true;
303 currentScreen->SetFileName( m_frame->Prj().AbsolutePath( wxT( "noname.kicad_sch" ) ) );
304 }
305
306 wxFileName tmp( fn );
307 wxFileName screenFileName = currentScreen->GetFileName();
308
309 if( fn.IsAbsolute() && fn.MakeRelativeTo( screenFileName.GetPath() ) )
310 {
311 KICAD_MESSAGE_DIALOG makeRelDlg( this, _( "Use relative path for sheet file?" ),
312 _( "Sheet File Path" ),
313 wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION | wxCENTER );
314
315 makeRelDlg.SetExtendedMessage( _( "Using relative hierarchical sheet file name paths improves "
316 "schematic portability across systems and platforms. Using "
317 "absolute paths can result in portability issues." ) );
318 makeRelDlg.SetYesNoLabels( KICAD_MESSAGE_DIALOG::ButtonLabel( _( "Use Relative Path" ) ),
319 KICAD_MESSAGE_DIALOG::ButtonLabel( _( "Use Absolute Path" ) ) );
320
321 if( makeRelDlg.ShowModal() == wxID_YES )
322 {
323 wxLogTrace( tracePathsAndFiles, "\n Converted absolute path: '%s'"
324 "\n to relative path: '%s'",
325 tmp.GetPath(),
326 fn.GetPath() );
327 m_fields->GetField( FIELD_T::SHEET_FILENAME )->SetText( fn.GetFullPath() );
328 newRelativeFilename = fn.GetFullPath();
329 }
330 }
331
332 if( !onSheetFilenameChanged( newRelativeFilename ) )
333 {
334 if( clearFileName )
335 currentScreen->SetFileName( wxEmptyString );
336 else
338
339 return false;
340 }
342 {
344 }
345
346 if( clearFileName )
347 currentScreen->SetFileName( wxEmptyString );
348
349 // One last validity check (and potential repair) just to be sure to be sure
350 SCH_SHEET_LIST repairedList;
351 repairedList.BuildSheetList( &m_frame->Schematic().Root(), true );
352 }
353
354 wxString newSheetname = m_fields->GetField( FIELD_T::SHEET_NAME )->GetText();
355
356 if( ( newSheetname != m_sheet->GetName() ) && m_updateHierarchyNavigator )
358
359 if( newSheetname.IsEmpty() )
360 newSheetname = _( "Untitled Sheet" );
361
362 m_fields->GetField( FIELD_T::SHEET_NAME )->SetText( newSheetname );
363
364 m_sheet->SetName( newSheetname );
365 m_sheet->SetFileName( newRelativeFilename );
366
367 // change all field positions from relative to absolute
368 for( SCH_FIELD& m_field : *m_fields)
369 m_field.Offset( m_sheet->GetPosition() );
370
372 m_sheet->SetFieldsAutoplaced( AUTOPLACE_NONE );
373
374 SCH_SHEET_PATH instance = m_frame->GetCurrentSheet();
375 wxString variantName = m_frame->Schematic().GetCurrentVariant();
376
377 for( int ii = m_fields->GetNumberRows() - 1; ii >= 0; ii-- )
378 {
379 SCH_FIELD& field = m_fields->at( ii );
380
381 if( field.IsMandatory() )
382 continue;
383
384 const wxString& fieldName = field.GetCanonicalName();
385
386 if( field.IsEmpty() )
387 m_fields->erase( m_fields->begin() + ii );
388 else if( fieldName.IsEmpty() )
389 field.SetName( _( "untitled" ) );
390
391 SCH_FIELD* existingField = m_sheet->GetField( fieldName );
392 SCH_FIELD* tmp;
393
394 if( !existingField )
395 {
396 m_sheet->AddOptionalField( field );
397 }
398 else
399 {
400 wxString defaultText = m_sheet->Schematic()->ConvertRefsToKIIDs( existingField->GetText() );
401 tmp = const_cast<SCH_FIELD*>( existingField );
402
403 *tmp = field;
404
405 if( !variantName.IsEmpty() )
406 {
407 // Restore the default field text for existing fields.
408 tmp->SetText( defaultText, &instance );
409
410 tmp->SetText( m_sheet->Schematic()->ConvertRefsToKIIDs( field.GetText() ),
411 &instance, variantName );
412 }
413 }
414 }
415
416 m_sheet->SetBorderWidth( m_borderWidth.GetIntValue() );
417
418 COLOR_SETTINGS* colorSettings = m_frame->GetColorSettings();
419
420 if( colorSettings->GetOverrideSchItemColors()
421 && ( m_sheet->GetBorderColor() != m_borderSwatch->GetSwatchColor() ||
422 m_sheet->GetBackgroundColor() != m_backgroundSwatch->GetSwatchColor() ) )
423 {
424 wxPanel temp( this );
425 temp.Hide();
426 PANEL_EESCHEMA_COLOR_SETTINGS prefs( &temp );
427 wxString checkboxLabel = prefs.m_optOverrideColors->GetLabel();
428
429 KIDIALOG dlg( this, _( "Note: item colors are overridden in the current color theme." ),
431 dlg.ShowDetailedText( wxString::Format( _( "To see individual item colors uncheck '%s'\n"
432 "in Preferences > Schematic Editor > Colors." ),
433 checkboxLabel ) );
434 dlg.DoNotShowCheckbox( __FILE__, __LINE__ );
435 dlg.ShowModal();
436 }
437
438 m_sheet->SetBorderColor( m_borderSwatch->GetSwatchColor() );
439 m_sheet->SetBackgroundColor( m_backgroundSwatch->GetSwatchColor() );
440
441 m_sheet->SetExcludedFromSim( m_cbExcludeFromSim->GetValue(), &instance, variantName );
442 m_sheet->SetExcludedFromBOM( m_cbExcludeFromBom->GetValue(), &instance, variantName );
443 m_sheet->SetExcludedFromBoard( m_cbExcludeFromBoard->GetValue() );
444 m_sheet->SetDNP( m_cbDNP->GetValue(), &instance, variantName );
445
446 instance.push_back( m_sheet );
447
448 instance.SetPageNumber( m_pageNumberTextCtrl->GetValue() );
449
450 m_frame->TestDanglingEnds();
451
452 // Refresh all sheets in case ordering changed.
453 for( SCH_ITEM* item : m_frame->GetScreen()->Items().OfType( SCH_SHEET_T ) )
454 m_frame->UpdateItem( item );
455
456 return true;
457}
458
459
460bool DIALOG_SHEET_PROPERTIES::onSheetFilenameChanged( const wxString& aNewFilename )
461{
462 return m_frame->ChangeSheetFile( m_sheet, aNewFilename, m_clearAnnotationNewItems,
464}
465
466
468{
469 bool success = true;
470 wxGridCellEditor* editor = m_grid->GetCellEditor( event.GetRow(), event.GetCol() );
471 wxControl* control = editor->GetControl();
472
473 if( control && control->GetValidator() )
474 success = control->GetValidator()->Validate( control );
475
476 if( !success )
477 {
478 event.Veto();
479 m_delayedFocusRow = event.GetRow();
480 m_delayedFocusColumn = event.GetCol();
481 }
482 else if( event.GetCol() == FDC_NAME )
483 {
484 wxString newName = event.GetString();
485
486 for( int i = 0; i < m_grid->GetNumberRows(); ++i )
487 {
488 if( i == event.GetRow() )
489 continue;
490
491 if( newName.CmpNoCase( m_grid->GetCellValue( i, FDC_NAME ) ) == 0 )
492 {
493 DisplayError( this, wxString::Format( _( "Field name '%s' already in use." ),
494 newName ) );
495 event.Veto();
496 m_delayedFocusRow = event.GetRow();
497 m_delayedFocusColumn = event.GetCol();
498 break;
499 }
500 }
501 }
502
503 editor->DecRef();
504}
505
506
507void DIALOG_SHEET_PROPERTIES::OnAddField( wxCommandEvent& event )
508{
509 m_grid->OnAddRow(
510 [&]() -> std::pair<int, int>
511 {
513
514 newField.SetTextAngle( m_fields->GetField( FIELD_T::SHEET_NAME )->GetTextAngle() );
515 newField.SetVisible( false );
516 m_fields->push_back( newField );
517
518 // notify the grid
519 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_APPENDED, 1 );
520 m_grid->ProcessTableMessage( msg );
521 return { m_fields->size() - 1, FDC_NAME };
522 } );
523}
524
525
526void DIALOG_SHEET_PROPERTIES::OnDeleteField( wxCommandEvent& event )
527{
528 m_grid->OnDeleteRows(
529 [&]( int row )
530 {
531 if( row < m_fields->GetMandatoryRowCount() )
532 {
533 DisplayError( this, wxString::Format( _( "The first %d fields are mandatory." ),
534 m_fields->GetMandatoryRowCount() ) );
535 return false;
536 }
537
538 return true;
539 },
540 [&]( int row )
541 {
542 m_fields->erase( m_fields->begin() + row );
543
544 // notify the grid
545 wxGridTableMessage msg( m_fields, wxGRIDTABLE_NOTIFY_ROWS_DELETED, row, 1 );
546 m_grid->ProcessTableMessage( msg );
547 } );
548}
549
550
551void DIALOG_SHEET_PROPERTIES::OnMoveUp( wxCommandEvent& event )
552{
553 m_grid->OnMoveRowUp(
554 [&]( int row )
555 {
556 return row > m_fields->GetMandatoryRowCount();
557 },
558 [&]( int row )
559 {
560 std::swap( *( m_fields->begin() + row ), *( m_fields->begin() + row - 1 ) );
561 m_grid->ForceRefresh();
562 } );
563}
564
565
566void DIALOG_SHEET_PROPERTIES::OnMoveDown( wxCommandEvent& event )
567{
568 m_grid->OnMoveRowUp(
569 [&]( int row )
570 {
571 return row >= m_fields->GetMandatoryRowCount();
572 },
573 [&]( int row )
574 {
575 std::swap( *( m_fields->begin() + row ), *( m_fields->begin() + row + 1 ) );
576 m_grid->ForceRefresh();
577 } );
578}
579
580
581void DIALOG_SHEET_PROPERTIES::OnUpdateUI( wxUpdateUIEvent& event )
582{
583 std::bitset<64> shownColumns = m_grid->GetShownColumns();
584
585 if( shownColumns != m_shownColumns )
586 {
587 m_shownColumns = shownColumns;
588
589 if( !m_grid->IsCellEditControlShown() )
590 m_grid->SetGridWidthsDirty();
591 }
592
593 // Propagate changes in sheetname to displayed hierarchical path
594 int sheetnameRow = m_fields->GetFieldRow( FIELD_T::SHEET_NAME );
595 wxString path = m_frame->GetCurrentSheet().PathHumanReadable( false );
596
597 if( path.Last() != '/' )
598 path.Append( '/' );
599
600 wxGridCellEditor* editor = m_grid->GetCellEditor( sheetnameRow, FDC_VALUE );
601 wxControl* control = editor->GetControl();
602 wxTextEntry* textControl = dynamic_cast<wxTextEntry*>( control );
603 wxString sheetName;
604
605 if( textControl )
606 sheetName = textControl->GetValue();
607 else
608 sheetName = m_grid->GetCellValue( sheetnameRow, FDC_VALUE );
609
610 m_dummySheet.SetFields( *m_fields );
611 m_dummySheetNameField.SetText( sheetName );
612 path += m_dummySheetNameField.GetShownText( false );
613
614 editor->DecRef();
615
616 wxClientDC dc( m_hierarchicalPathLabel );
617 int width = m_sizerBottom->GetSize().x - m_stdDialogButtonSizer->GetSize().x
618 - m_hierarchicalPathLabel->GetSize().x
619 - 30;
620
621 path = wxControl::Ellipsize( path, dc, wxELLIPSIZE_START, width, wxELLIPSIZE_FLAGS_NONE );
622
623 if( m_hierarchicalPath->GetLabel() != path )
624 m_hierarchicalPath->SetLabel( path );
625
626 // Handle a delayed focus
627 if( m_delayedFocusRow >= 0 )
628 {
629 m_grid->SetFocus();
630 m_grid->MakeCellVisible( m_delayedFocusRow, m_delayedFocusColumn );
632
633 m_grid->EnableCellEditControl( true );
634 m_grid->ShowCellEditControl();
635
638 }
639}
wxBitmapBundle KiBitmapBundle(BITMAPS aBitmap, int aMinHeight)
Definition bitmap.cpp:110
static const COLOR4D UNSPECIFIED
For legacy support; used as a value to indicate color hasn't been set yet.
Definition color4d.h:402
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...
const EDA_ANGLE & GetTextAngle() const
Definition eda_text.h:147
void Offset(const VECTOR2I &aOffset)
Definition eda_text.cpp:608
GR_TEXT_H_ALIGN_T GetHorizJustify() const
Definition eda_text.h:200
virtual void SetVisible(bool aVisible)
Definition eda_text.cpp:400
GR_TEXT_V_ALIGN_T GetVertJustify() const
Definition eda_text.h:203
virtual void SetTextAngle(const EDA_ANGLE &aAngle)
Definition eda_text.cpp:313
SCH_FIELD * GetField(FIELD_T aFieldId)
Helper class to create more flexible dialogs, including 'do not show again' checkbox handling.
Definition kidialog.h:42
@ KD_WARNING
Definition kidialog.h:47
void DoNotShowCheckbox(wxString file, int line)
Shows the 'do not show again' checkbox.
Definition kidialog.cpp:55
int ShowModal() override
Definition kidialog.cpp:93
A color representation with 4 components: red, green, blue, alpha.
Definition color4d.h:105
Schematic editor (Eeschema) main window.
SCHEMATIC & Schematic() const
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:116
FIELD_T GetId() const
Definition sch_field.h:120
wxString GetCanonicalName() const
Get a non-language-specific name for a field which can be used for storage, variable look-up,...
bool IsEmpty()
Return true if both the name and value of the field are empty.
Definition sch_field.h:159
wxString GetName(bool aUseDefaultName=true) const
Return the field name (not translated).
void SetName(const wxString &aName)
void SetText(const wxString &aText) override
Base class for any item which can be embedded within the SCHEMATIC container class,...
Definition sch_item.h:168
const wxString & GetFileName() const
Definition sch_screen.h:154
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
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:629
The common library.
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:202
void DisplayError(wxWindow *aParent, const wxString &aText)
Display an error or warning message box with aMessage.
Definition confirm.cpp:177
This file is part of the common library.
#define KICAD_MESSAGE_DIALOG
Definition confirm.h:52
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:488
KICOMMON_API wxFont GetSmallInfoFont(wxWindow *aWindow)
const SCH_FIELD * FindField(const std::vector< SCH_FIELD > &aFields, FIELD_T aFieldId)
Definition sch_field.h:365
@ AUTOPLACE_NONE
Definition sch_item.h:70
bool IsFullFileNameValid(const wxString &aFullFilename)
Checks if a full filename is valid, i.e.
wxString GetUserFieldName(int aFieldNdx, bool aTranslateForHI)
#define DO_TRANSLATE
FIELD_T
The set of all field indices assuming an array like sequence that a SCH_COMPONENT or LIB_PART can hol...
std::string path
wxLogTrace helper definitions.
@ SCH_SHEET_T
Definition typeinfo.h:179
Custom text control validator definitions.
Definition of file extensions used in Kicad.