KiCad PCB EDA Suite
Loading...
Searching...
No Matches
pl_editor_frame.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) 2013 CERN
5 * Copyright (C) 2017-2023 KiCad Developers, see AUTHORS.txt for contributors.
6 * @author Jean-Pierre Charras, jp.charras at wanadoo.fr
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * as published by the Free Software Foundation; either version 2
11 * of the License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, you may find one here:
20 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
21 * or you may search the http://www.gnu.org website for the version 2 license,
22 * or you may write to the Free Software Foundation, Inc.,
23 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <kiface_base.h>
27#include <pgm_base.h>
28#include <bitmaps.h>
29#include <core/arraydim.h>
33#include <confirm.h>
34#include <kiplatform/app.h>
36#include <gal/painter.h>
38#include <tool/selection.h>
39#include <tool/action_toolbar.h>
42#include <tool/tool_manager.h>
43#include <tool/common_control.h>
44#include <tool/common_tools.h>
45#include <tool/picker_tool.h>
46#include <tool/zoom_tool.h>
48#include "pl_editor_frame.h"
49#include "pl_editor_id.h"
50#include "pl_editor_settings.h"
51#include "properties_frame.h"
52#include "tools/pl_actions.h"
55#include "tools/pl_edit_tool.h"
59#include <zoom_defines.h>
60
61#include <wx/filedlg.h>
62#include <wx/print.h>
63#include <wx/treebook.h>
64
65
66BEGIN_EVENT_TABLE( PL_EDITOR_FRAME, EDA_DRAW_FRAME )
67 EVT_MENU( wxID_CLOSE, PL_EDITOR_FRAME::OnExit )
68 EVT_MENU( wxID_EXIT, PL_EDITOR_FRAME::OnExit )
69
70 EVT_MENU( wxID_FILE, PL_EDITOR_FRAME::Files_io )
71
74
77
78 // Drop files event
79 EVT_DROP_FILES( PL_EDITOR_FRAME::OnDropFiles )
80END_EVENT_TABLE()
81
82
83PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
84 EDA_DRAW_FRAME( aKiway, aParent, FRAME_PL_EDITOR, wxT( "PlEditorFrame" ),
85 wxDefaultPosition, wxDefaultSize,
87 m_propertiesPagelayout( nullptr ),
88 m_propertiesFrameWidth( 200 ),
89 m_originSelectBox( nullptr ),
90 m_originSelectChoice( 0 ),
91 m_pageSelectBox( nullptr ),
92 m_mruImagePath( wxEmptyString )
93{
94 m_maximizeByDefault = true;
95 SetUserUnits( EDA_UNITS::MILLIMETRES );
96
97 m_showBorderAndTitleBlock = true; // true for reference drawings.
99 m_aboutTitle = _HKI( "KiCad Drawing Sheet Editor" );
100
101 // Give an icon
102 wxIcon icon;
103 wxIconBundle icon_bundle;
104
105 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor ) );
106 icon_bundle.AddIcon( icon );
107 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_32 ) );
108 icon_bundle.AddIcon( icon );
109 icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_16 ) );
110 icon_bundle.AddIcon( icon );
111
112 SetIcons( icon_bundle );
113
114 // Create GAL canvas
115 auto* drawPanel = new PL_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
116 GetGalDisplayOptions(),
118 SetCanvas( drawPanel );
119
120 LoadSettings( config() );
121
122 m_acceptedExts.emplace( DrawingSheetFileExtension, nullptr );
123 DragAcceptFiles( true );
124
125 VECTOR2I pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU( drawSheetIUScale.IU_PER_MILS );
126 SetScreen( new BASE_SCREEN( pageSizeIU ) );
127
128 setupTools();
129 setupUIConditions();
130 ReCreateMenuBar();
131 ReCreateHToolbar();
132 ReCreateVToolbar();
133 ReCreateOptToolbar();
134
135 wxWindow* stsbar = GetStatusBar();
136 int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
137
138 int dims[] = {
139
140 // balance of status bar on far left is set to a default or whatever is left over.
141 -1,
142
143 // When using GetTextSize() remember the width of '1' is not the same
144 // as the width of '0' unless the font is fixed width, and it usually won't be.
145
146 // zoom:
147 KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x + spacer,
148
149 // cursor coords
150 KIUI::GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + spacer,
151
152 // delta distances
153 KIUI::GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + spacer,
154
155 // grid size
156 KIUI::GetTextSize( wxT( "grid 0234.567" ), stsbar ).x + spacer,
157
158 // Coord origin (use the bigger message)
159 KIUI::GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + spacer,
160
161 // units display, Inches is bigger than mm
162 KIUI::GetTextSize( _( "Inches" ), stsbar ).x + spacer,
163
164 // constraint mode
165 KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x + spacer
166 };
167
168 SetStatusWidths( arrayDim( dims ), dims );
169
170 m_auimgr.SetManagedWindow( this );
171
172 CreateInfoBar();
173 m_propertiesPagelayout = new PROPERTIES_FRAME( this );
174
175 // Rows; layers 4 - 6
176 m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
177 .Top().Layer( 6 ) );
178 m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
179 .Left().Layer( 3 ) );
180 m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
181 .Bottom().Layer( 6 ) );
182
183 // Columns; layers 1 - 3
184 m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
185 .Right().Layer( 2 ) );
186
187 m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" )
188 .Right().Layer( 3 )
189 .Caption( _( "Properties" ) )
190 .MinSize( m_propertiesPagelayout->GetMinSize() )
191 .BestSize( m_propertiesFrameWidth, -1 ) );
192
193 // Center
194 m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
195 .Center() );
196
197 FinishAUIInitialization();
198
199 resolveCanvasType();
200 SwitchCanvas( m_canvasType );
201
202 // Add the exit key handler
203 setupUnits( config() );
204
205 VECTOR2I originCoord = ReturnCoordOriginCorner();
206 SetGridOrigin( originCoord );
207
208 // Initialize the current drawing sheet
209#if 0 //start with empty layout
212#else // start with the default KiCad layout
214#endif
215 OnNewDrawingSheet();
216
217 // Ensure the window is on top
218 Raise();
219
220 // Register a call to update the toolbar sizes. It can't be done immediately because
221 // it seems to require some sizes calculated that aren't yet (at least on GTK).
222 CallAfter( [&]()
223 {
224 // Ensure the controls on the toolbars all are correctly sized
225 UpdateToolbarControlSizes();
226 } );
227}
228
229
231{
232 // Ensure m_canvasType is up to date, to save it in config
234
235 // Shutdown all running tools
236 if( m_toolManager )
238}
239
240
242{
243 // Create the manager and dispatcher & route draw panel events to the dispatcher
245 m_toolManager->SetEnvironment( nullptr, GetCanvas()->GetView(),
246 GetCanvas()->GetViewControls(), config(), this );
247 m_actions = new PL_ACTIONS();
249
251
252 // Register tools
263
264 // Run the selection tool, it is supposed to be always active
265 m_toolManager->InvokeTool( "plEditor.InteractiveSelection" );
266}
267
268
270{
272
274 EDITOR_CONDITIONS cond( this );
275
276 wxASSERT( mgr );
277
278#define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
279#define CHECK( x ) ACTION_CONDITIONS().Check( x )
280
284
287 mgr->SetConditions( ACTIONS::millimetersUnits, CHECK( cond.Units( EDA_UNITS::MILLIMETRES ) ) );
288 mgr->SetConditions( ACTIONS::inchesUnits, CHECK( cond.Units( EDA_UNITS::INCHES ) ) );
289 mgr->SetConditions( ACTIONS::milsUnits, CHECK( cond.Units( EDA_UNITS::MILS ) ) );
290
295
302
311
312 // Not a tool, just a way to activate the action
315
316 auto titleBlockNormalMode =
317 [] ( const SELECTION& )
318 {
320 };
321
322 auto titleBlockEditMode =
323 [] ( const SELECTION& )
324 {
326 };
327
328 mgr->SetConditions( PL_ACTIONS::layoutNormalMode, CHECK( titleBlockNormalMode ) );
329 mgr->SetConditions( PL_ACTIONS::layoutEditMode, CHECK( titleBlockEditMode ) );
330
331#undef CHECK
332#undef ENABLE
333}
334
335
336bool PL_EDITOR_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
337{
338 wxString fn = aFileSet[0];
339
340 if( !LoadDrawingSheetFile( fn ) )
341 {
342 wxMessageBox( wxString::Format( _( "Error loading drawing sheet '%s'." ), fn ) );
343 return false;
344 }
345 else
346 {
348 return true;
349 }
350}
351
352
354{
355 // Must be called after a change in order to set the "modify" flag and update
356 // the frame title.
358
360
362}
363
364
366{
367 return GetScreen() && GetScreen()->IsContentModified();
368}
369
370
371void PL_EDITOR_FRAME::OnExit( wxCommandEvent& aEvent )
372{
373 if( aEvent.GetId() == wxID_EXIT )
374 Kiway().OnKiCadExit();
375
376 if( aEvent.GetId() == wxID_CLOSE || Kiface().IsSingle() )
377 Close( false );
378}
379
380
381bool PL_EDITOR_FRAME::canCloseWindow( wxCloseEvent& aEvent )
382{
383 // Shutdown blocks must be determined and vetoed as early as possible
385 && aEvent.GetId() == wxEVT_QUERY_END_SESSION
386 && IsContentModified() )
387 {
388 return false;
389 }
390
391 if( IsContentModified() )
392 {
393 wxFileName filename = GetCurrentFileName();
394 wxString msg = _( "Save changes to '%s' before closing?" );
395
396 if( !HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
397 [&]() -> bool
398 {
399 return saveCurrentPageLayout();
400 } ) )
401 {
402 return false;
403 }
404 }
405
406 return true;
407}
408
409
411{
412 // do not show the window because we do not want any paint event
413 Show( false );
414
415 // clean up the data before the view is destroyed
417
418 // On Linux, m_propertiesPagelayout must be destroyed
419 // before deleting the main frame to avoid a crash when closing
420 m_propertiesPagelayout->Destroy();
421 Destroy();
422}
423
424
425void PL_EDITOR_FRAME::OnSelectPage( wxCommandEvent& event )
426{
427 KIGFX::VIEW* view = GetCanvas()->GetView();
428 view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGE1, m_pageSelectBox->GetSelection() == 0 );
429 view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGEn, m_pageSelectBox->GetSelection() == 1 );
430 GetCanvas()->Refresh();
431}
432
433
435{
436 m_originSelectChoice = m_originSelectBox->GetSelection();
437 UpdateStatusBar(); // Update grid origin
439 GetCanvas()->Refresh();
440}
441
442
443void PL_EDITOR_FRAME::ToPrinter( bool doPreview )
444{
445 // static print data and page setup data, to remember settings during the session
446 static wxPrintData* s_PrintData;
447 static wxPageSetupDialogData* s_pageSetupData = nullptr;
448
449 const PAGE_INFO& pageInfo = GetPageSettings();
450
451 if( s_PrintData == nullptr ) // First print
452 {
453 s_PrintData = new wxPrintData();
454 s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH;
455 }
456
457 if( !s_PrintData->Ok() )
458 {
459 wxMessageBox( _( "Error Init Printer info" ) );
460 return;
461 }
462
463 if( s_pageSetupData == nullptr )
464 s_pageSetupData = new wxPageSetupDialogData( *s_PrintData );
465
466 s_pageSetupData->SetPaperId( pageInfo.GetPaperId() );
467 s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() );
468
469 if( pageInfo.IsCustom() )
470 {
471 if( pageInfo.IsPortrait() )
472 s_pageSetupData->SetPaperSize( wxSize( EDA_UNIT_UTILS::Mils2mm( pageInfo.GetWidthMils() ),
473 EDA_UNIT_UTILS::Mils2mm( pageInfo.GetHeightMils() ) ) );
474 else
475 s_pageSetupData->SetPaperSize( wxSize( EDA_UNIT_UTILS::Mils2mm( pageInfo.GetHeightMils() ),
476 EDA_UNIT_UTILS::Mils2mm( pageInfo.GetWidthMils() ) ) );
477 }
478
479 *s_PrintData = s_pageSetupData->GetPrintData();
480
481 if( doPreview )
482 InvokeDialogPrintPreview( this, s_PrintData );
483 else
484 InvokeDialogPrint( this, s_PrintData, s_pageSetupData );
485}
486
487
488const BOX2I PL_EDITOR_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
489{
491 return rv;
492}
493
494
496{
498
499 if( aCfg->m_Window.grid.grids.empty() )
500 {
501 aCfg->m_Window.grid.grids = { GRID{ wxEmptyString, wxS( "5.00 mm" ), wxS( "5.00 mm" ) },
502 GRID{ wxEmptyString, wxS( "2.50 mm" ), wxS( "2.50 mm" ) },
503 GRID{ wxEmptyString, wxS( "2.00 mm" ), wxS( "2.00 mm" ) },
504 GRID{ wxEmptyString, wxS( "1.00 mm" ), wxS( "1.00 mm" ) },
505 GRID{ wxEmptyString, wxS( "0.50 mm" ), wxS( "0.50 mm" ) },
506 GRID{ wxEmptyString, wxS( "0.25 mm" ), wxS( "0.25 mm" ) },
507 GRID{ wxEmptyString, wxS( "0.20 mm" ), wxS( "0.20 mm" ) },
508 GRID{ wxEmptyString, wxS( "0.10 mm" ), wxS( "0.10 mm" ) } };
509 }
510
511 // Currently values read from config file are not used because the user cannot
512 // change this config
513 // if( aCfg->m_Window.zoom_factors.empty() )
514 {
516 }
517
518 PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
519 wxCHECK( cfg, /*void*/ );
520
523
525
528
529 PAGE_INFO pageInfo = GetPageSettings();
530 pageInfo.SetType( cfg->m_LastPaperSize, cfg->m_LastWasPortrait );
531 SetPageSettings( pageInfo );
532}
533
534
536{
538
539 auto cfg = static_cast<PL_EDITOR_SETTINGS*>( aCfg );
540
542
543 cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth;
544 cfg->m_CornerOrigin = m_originSelectChoice;
545 cfg->m_BlackBackground = GetDrawBgColor() == BLACK;
546 cfg->m_LastPaperSize = GetPageSettings().GetType();
547 cfg->m_LastWasPortrait = GetPageSettings().IsPortrait();
548 cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils();
549 cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils();
550}
551
552
554{
555 wxString title;
556 wxFileName file( GetCurrentFileName() );
557
558 if( IsContentModified() )
559 title = wxT( "*" );
560
561 if( file.IsOk() )
562 title += file.GetName();
563 else
564 title += _( "[no drawing sheet loaded]" );
565
566 title += wxT( " \u2014 " ) + _( "Drawing Sheet Editor" ),
567
568 SetTitle( title );
569}
570
571
573{
575}
576
577
578void PL_EDITOR_FRAME::SetCurrentFileName( const wxString& aName )
579{
581}
582
583
584void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
585{
586 m_pageLayout.SetPageSettings( aPageSettings );
587
588 if( GetScreen() )
590}
591
592
594{
596}
597
598
600{
601 // this function is only needed because EDA_DRAW_FRAME is not compiled
602 // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
603 // into an application specific source file.
605}
606
607
609{
610 return GetPageLayout().GetTitleBlock();
611}
612
613
615{
616 m_pageLayout.SetTitleBlock( aTitleBlock );
617}
618
619
620void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
621{
622 EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
623
624 SETTINGS_MANAGER& settingsManager = Pgm().GetSettingsManager();
625 PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
626 COLOR_SETTINGS* colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
627
628 // Update gal display options like cursor shape, grid options:
630
631 GetCanvas()->GetView()->GetPainter()->GetSettings()->LoadColors( colors );
632
635
637 Layout();
638 SendSizeEvent();
639}
640
641
643{
644 // calculate the position (in page, in iu) of the corner used as coordinate origin
645 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
646 VECTOR2I originCoord;
647
648 // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
650
651 switch( m_originSelectChoice )
652 {
653 default:
654 case 0: // Origin = paper Left Top corner
655 break;
656
657 case 1: // Origin = page Right Bottom corner
658 dummy.SetStart( 0, 0, RB_CORNER );
659 originCoord = dummy.GetStartPosIU();
660 break;
661
662 case 2: // Origin = page Left Bottom corner
663 dummy.SetStart( 0, 0, LB_CORNER );
664 originCoord = dummy.GetStartPosIU();
665 break;
666
667 case 3: // Origin = page Right Top corner
668 dummy.SetStart( 0, 0, RT_CORNER );
669 originCoord = dummy.GetStartPosIU();
670 break;
671
672 case 4: // Origin = page Left Top corner
673 dummy.SetStart( 0, 0, LT_CORNER );
674 originCoord = dummy.GetStartPosIU();
675 break;
676 }
677
678 return originCoord;
679}
680
681
683{
684 wxString line;
685 wxString gridformatter;
686
687 switch( GetUserUnits() )
688 {
689 case EDA_UNITS::INCHES: gridformatter = wxS( "grid %.3f" ); break;
690 case EDA_UNITS::MILLIMETRES: gridformatter = wxS( "grid %.4f" ); break;
691 default: gridformatter = wxS( "grid %f" ); break;
692 }
693
695 GetCanvas()->GetGAL()->GetGridSize().x );
696 line.Printf( gridformatter, grid );
697
698 SetStatusText( line, 4 );
699}
700
701
703{
704 // Display Zoom level:
705 SetStatusText( GetZoomLevelIndicator(), 1 );
706
707 // coordinate origin can be the paper Top Left corner, or each of 4 page corners
708 VECTOR2I originCoord = ReturnCoordOriginCorner();
709 SetGridOrigin( originCoord );
710
711 // We need the orientation of axis (sign of coordinates)
712 int Xsign = 1;
713 int Ysign = 1;
714
715 switch( m_originSelectChoice )
716 {
717 default:
718 case 0: // Origin = paper Left Top corner
719 break;
720
721 case 1: // Origin = page Right Bottom corner
722 Xsign = -1;
723 Ysign = -1;
724 break;
725
726 case 2: // Origin = page Left Bottom corner
727 Ysign = -1;
728 break;
729
730 case 3: // Origin = page Right Top corner
731 Xsign = -1;
732 break;
733
734 case 4: // Origin = page Left Top corner
735 break;
736 }
737
738 // Display absolute coordinates:
740 VECTOR2D coord = cursorPos - originCoord;
741 double dXpos =
743 double dYpos =
745
746 wxString absformatter = wxT( "X %.4g Y %.4g" );
747 wxString locformatter = wxT( "dx %.4g dy %.4g" );
748
749 switch( GetUserUnits() )
750 {
751 case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
752 case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
753 case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
754 case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
755 default: wxASSERT( false ); break;
756 }
757
758 wxString line;
759
760 // Display abs coordinates
761 line.Printf( absformatter, dXpos, dYpos );
762 SetStatusText( line, 2 );
763
764 // Display relative coordinates:
765 if( GetScreen() )
766 {
767 double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
768 double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
771 line.Printf( locformatter, dXpos, dYpos );
772 SetStatusText( line, 3 );
773 }
774
776
777 // Display corner reference for coord origin
778 line.Printf( _("coord origin: %s"),
779 m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
780 SetStatusText( line, 5 );
781}
782
783
785{
788
789 for( DS_DATA_ITEM* dataItem : model.GetItems() )
790 {
791 // Ensure the scaling factor (used only in printing) of bitmaps is up to date
792 if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
793 {
794 BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
795 bitmap->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000 / bitmap->GetPPI() );
796 }
797 }
798
800 wxEmptyString );
801
803 GetCanvas()->Refresh();
804}
805
806
808{
809 return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
810}
811
812
814{
815 return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
816}
817
818
820{
822
824 PL_SELECTION& selection = selTool->GetSelection();
825 DS_DATA_ITEM* item = nullptr;
826
827 if( selection.GetSize() == 1 )
828 item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
829
833 GetCanvas()->Refresh();
834}
835
836
838{
839 DS_DATA_ITEM * item = nullptr;
840
841 switch( aType )
842 {
844 item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
845 break;
846
849 break;
850
853 break;
854
856 item = new DS_DATA_ITEM_POLYGONS();
857 break;
858
860 {
861 wxFileDialog fileDlg( this, _( "Choose Image" ), m_mruImagePath, wxEmptyString,
862 _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
863 wxFD_OPEN );
864
865 if( fileDlg.ShowModal() != wxID_OK )
866 return nullptr;
867
868 wxString fullFilename = fileDlg.GetPath();
869 m_mruImagePath = wxPathOnly( fullFilename );
870
871 if( !wxFileExists( fullFilename ) )
872 {
873 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
874 break;
875 }
876
878
879 if( !image->ReadImageFile( fullFilename ) )
880 {
881 wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
882 delete image;
883 break;
884 }
885
886 // Set the scale factor for pl_editor (it is set for Eeschema by default)
887 image->SetPixelSizeIu( drawSheetIUScale.IU_PER_MILS * 1000.0 / image->GetPPI() );
888 item = new DS_DATA_ITEM_BITMAP( image );
889 }
890 break;
891 }
892
893 if( item == nullptr )
894 return nullptr;
895
897 item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
898
899 return item;
900}
901
902
904{
906 GetScreen()->SetContentModified( false );
908
911
913
915
916 if( GetCurrentFileName().IsEmpty() )
917 {
918 // Default shutdown reason until a file is loaded
919 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New drawing sheet file is unsaved" ) );
920 }
921 else
922 {
923 KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Drawing sheet changes are unsaved" ) );
924 }
925}
926
927
929{
930 if( aItemCount == 0 )
931 return;
932
933 UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
934 unsigned icnt = list.m_CommandsList.size();
935
936 if( aItemCount > 0 )
937 icnt = aItemCount;
938
939 for( unsigned ii = 0; ii < icnt; ii++ )
940 {
941 if( list.m_CommandsList.size() == 0 )
942 break;
943
944 PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
945 list.m_CommandsList.erase( list.m_CommandsList.begin() );
946
947 curr_cmd->ClearListAndDeleteItems( []( EDA_ITEM* aItem )
948 {
949 delete aItem;
950 } );
951 delete curr_cmd; // Delete command
952 }
953}
954
955
957{
958 return m_pageSelectBox->GetSelection() == 0;
959}
960
961#if 1
963{
965
966 std::vector<MSG_PANEL_ITEM> msgItems;
967 msgItems.emplace_back( _( "Page Width" ), MessageTextFromValue( size.x ) );
968 msgItems.emplace_back( _( "Page Height" ), MessageTextFromValue( size.y ) );
969
970 SetMsgPanel( msgItems );
971}
972#endif
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
constexpr EDA_IU_SCALE drawSheetIUScale
Definition: base_units.h:110
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
wxBitmap KiBitmap(BITMAPS aBitmap, int aHeightTag)
Construct a wxBitmap from an image identifier Returns the image from the active theme if the image ha...
Definition: bitmap.cpp:104
@ icon_pagelayout_editor
@ icon_pagelayout_editor_16
@ icon_pagelayout_editor_32
static TOOL_ACTION toggleGrid
Definition: actions.h:148
static TOOL_ACTION paste
Definition: actions.h:69
static TOOL_ACTION millimetersUnits
Definition: actions.h:156
static TOOL_ACTION copy
Definition: actions.h:68
static TOOL_ACTION milsUnits
Definition: actions.h:155
static TOOL_ACTION undo
Definition: actions.h:65
static TOOL_ACTION inchesUnits
Definition: actions.h:154
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:108
static TOOL_ACTION doDelete
Definition: actions.h:74
static TOOL_ACTION selectionTool
Definition: actions.h:163
static TOOL_ACTION save
Definition: actions.h:51
static TOOL_ACTION zoomFitScreen
Definition: actions.h:100
static TOOL_ACTION redo
Definition: actions.h:66
static TOOL_ACTION deleteTool
Definition: actions.h:75
static TOOL_ACTION zoomTool
Definition: actions.h:103
static TOOL_ACTION cut
Definition: actions.h:67
Manage TOOL_ACTION objects.
void SetConditions(const TOOL_ACTION &aAction, const ACTION_CONDITIONS &aConditions)
Set the conditions the UI elements for activating a specific tool action should use for determining t...
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
WINDOW_SETTINGS m_Window
Definition: app_settings.h:169
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:172
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:41
bool IsContentModified() const
Definition: base_screen.h:60
void SetVirtualPageNumber(int aPageNumber)
Definition: base_screen.h:76
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition: base_screen.h:85
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition: base_screen.h:90
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
void InitDataPoints(const VECTOR2I &aPageSizeInternalUnits)
Definition: base_screen.cpp:46
This class handle bitmap images in KiCad.
Definition: bitmap_base.h:48
void SetPixelSizeIu(double aPixSize)
Definition: bitmap_base.h:65
int GetPPI() const
Definition: bitmap_base.h:117
Color settings are a bit different than most of the settings objects in that there can be more than o...
Handle actions that are shared between different applications.
Handles action that are shared between different applications.
Definition: common_tools.h:38
Drawing sheet structure type definitions.
Definition: ds_data_item.h:96
virtual void SyncDrawItems(DS_DRAW_ITEM_LIST *aCollector, KIGFX::VIEW *aView)
Handle the graphic items list to draw/plot the frame and title block.
Definition: ds_data_model.h:39
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
void Append(DS_DATA_ITEM *aItem)
void AllowVoidList(bool Allow)
In KiCad applications, a drawing sheet is needed So if the list is empty, a default drawing sheet is ...
Definition: ds_data_model.h:83
void ClearList()
Erase the list of items.
std::vector< DS_DATA_ITEM * > & GetItems()
bool LoadDrawingSheet(const wxString &aFullFileName=wxEmptyString, bool Append=false)
Populates the list with a custom layout or the default layout if no custom layout is available.
Base class to handle basic graphic items.
Definition: ds_draw_item.h:59
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
UNDO_REDO_CONTAINER m_undoList
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
UNDO_REDO_CONTAINER m_redoList
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handles event fired when a file is dropped to the window.
The base class for create windows for drawing purpose.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
const wxString GetZoomLevelIndicator() const
Return a human readable value for display in dialogs.
GAL_DISPLAY_OPTIONS_IMPL & GetGalDisplayOptions()
Return a reference to the gal rendering options used by GAL for rendering.
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
virtual void SetDrawBgColor(const COLOR4D &aColor)
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, BASE_SCREEN *aScreen, const std::map< wxString, wxString > *aProperties, double aMils2Iu, const wxString &aFilename, const wxString &aSheetLayer=wxEmptyString)
Prints the drawing-sheet (frame and title block).
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
virtual COLOR4D GetDrawBgColor() const
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
void ForceRefresh()
Force a redraw.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
@ GAL_TYPE_NONE
GAL not used (the legacy wxDC engine is used)
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:85
Specialization of the wxAuiPaneInfo class for KiCad panels.
Class that groups generic conditions for editor states.
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
virtual SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
SELECTION_CONDITION Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
SELECTION_CONDITION FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
void ReadWindowSettings(WINDOW_SETTINGS &aCfg)
Read GAL config options from application-level config.
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
virtual void LoadColors(const COLOR_SETTINGS *aSettings)
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:68
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:395
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1500
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:215
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:279
void OnKiCadExit()
Definition: kiway.cpp:737
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:58
static void SetCustomWidthMils(double aWidthInMils)
Set the width of Custom page in mils for any custom page constructed or made via SetType() after maki...
Definition: page_info.cpp:235
wxPrintOrientation GetWxOrientation() const
Definition: page_info.h:126
static double GetCustomHeightMils()
Definition: page_info.h:195
const VECTOR2D GetSizeIU(double aIUScale) const
Gets the page size in internal units.
Definition: page_info.h:170
double GetHeightMils() const
Definition: page_info.h:140
wxPaperSize GetPaperId() const
Definition: page_info.h:131
const wxString & GetType() const
Definition: page_info.h:98
double GetWidthMils() const
Definition: page_info.h:135
bool IsCustom() const
Definition: page_info.cpp:183
bool IsPortrait() const
Definition: page_info.h:121
static double GetCustomWidthMils()
Definition: page_info.h:190
static void SetCustomHeightMils(double aHeightInMils)
Set the height of Custom page in mils for any custom page constructed or made via SetType() after mak...
Definition: page_info.cpp:241
bool SetType(const wxString &aStandardPageDescriptionName, bool aIsPortrait=false)
Set the name of the page type and also the sizes and margins commonly associated with that type name.
Definition: page_info.cpp:122
A holder to handle information on schematic or board items.
void ClearListAndDeleteItems(std::function< void(EDA_ITEM *)> aItemDeleter)
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
Gather all the actions that are shared by tools.
Definition: pl_actions.h:36
static TOOL_ACTION placeImage
Definition: pl_actions.h:59
static TOOL_ACTION drawRectangle
Definition: pl_actions.h:60
static TOOL_ACTION layoutNormalMode
Definition: pl_actions.h:67
static TOOL_ACTION placeText
Definition: pl_actions.h:58
static TOOL_ACTION layoutEditMode
Definition: pl_actions.h:68
static TOOL_ACTION appendImportedDrawingSheet
Definition: pl_actions.h:62
static TOOL_ACTION drawLine
Definition: pl_actions.h:61
Tool responsible for drawing/placing items (lines, rectangles, text, etc.)
void DisplayDrawingSheet()
Build and update the list of WS_DRAW_ITEM_xxx showing the frame layout.
Handle actions specific to the drawing sheet editor.
The main window used in the drawing sheet editor.
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl) override
Open a project or set of files given by aFileList.
void OnNewDrawingSheet()
Must be called to initialize parameters when a new drawing sheet is loaded.
void OnModify() override
Must be called after a change in order to set the "modify" flag.
void SetCurrentFileName(const wxString &aName)
Store the current layout description file filename.
bool IsContentModified() const override
Get if the drawing sheet has been modified but not saved.
void Files_io(wxCommandEvent &event)
void ToPrinter(bool doPreview)
Open a dialog frame to print layers.
void UpdateMsgPanelInfo()
Display the size of the sheet to the message panel.
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
wxString m_mruImagePath
void doCloseWindow() override
VECTOR2I ReturnCoordOriginCorner() const
Calculate the position (in page, in iu) of the corner used as coordinate origin of items.
void OnClearFileHistory(wxCommandEvent &aEvent)
void SetPageSettings(const PAGE_INFO &) override
DS_DATA_ITEM * AddDrawingSheetItem(int aType)
Add a new item to the drawing sheet item list.
wxString GetCurrentFileName() const override
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
void OnFileHistory(wxCommandEvent &event)
void UpdateStatusBar() override
Update the status bar information.
void SetGridOrigin(const VECTOR2I &aPoint) override
void OnSelectPage(wxCommandEvent &event)
const TITLE_BLOCK & GetTitleBlock() const override
void UpdateTitleAndInfo()
Display the short filename (if exists) loaded file on the caption of the main window.
const VECTOR2I GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
virtual void PrintPage(const RENDER_SETTINGS *aSettings) override
Print a page.
void OnSelectCoordOriginCorner(wxCommandEvent &event)
Called when the user select one of the 4 page corner as corner reference (or the left top paper corne...
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
PL_EDITOR_LAYOUT m_pageLayout
bool GetPageNumberOption() const
Drawing sheet editor can show the title block using a page number 1 or another number.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
void HardRedraw() override
Refresh the library tree and redraw the window.
void DisplayGridMsg() override
Display current grid size in the status bar.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
wxChoice * m_originSelectBox
const PAGE_INFO & GetPageSettings() const override
const PL_EDITOR_LAYOUT & GetPageLayout() const
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
PROPERTIES_FRAME * m_propertiesPagelayout
The last filename chosen to be proposed to the user.
wxChoice * m_pageSelectBox
PL_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void ClearUndoORRedoList(UNDO_REDO_LIST whichList, int aItemCount=-1) override
Remove the aItemCount of old commands from aList and delete commands, pickers and picked items if nee...
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
void OnExit(wxCommandEvent &aEvent)
Event handler for the wxID_EXIT and wxID_CLOSE events.
bool LoadDrawingSheetFile(const wxString &aFullFileName)
Load a .kicad_wks drawing sheet file.
void SetPageSettings(const PAGE_INFO &aPageSettings)
TITLE_BLOCK & GetTitleBlock()
PAGE_INFO & GetPageSettings()
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Tool that displays edit points allowing to modify items by dragging the points.
PL_SELECTION & GetSelection()
Return the set of currently selected items.
PROPERTIES_FRAME display properties of the current item.
void CopyPrmsFromItemToPanel(DS_DATA_ITEM *aItem)
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
static bool ShowNever(const SELECTION &aSelection)
Always returns false.
T * GetAppSettings()
Returns a handle to the a given settings by type If the settings have already been loaded,...
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:41
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:165
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:167
ACTIONS * m_actions
Definition: tools_holder.h:166
Master controller class:
Definition: tool_manager.h:57
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:145
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:289
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
void SetEnvironment(EDA_ITEM *aModel, KIGFX::VIEW *aView, KIGFX::VIEW_CONTROLS *aViewControls, APP_SETTINGS_BASE *aSettings, TOOLS_HOLDER *aFrame)
Set the work environment (model, view, view controls and the parent window).
void InitTools()
Initializes all registered tools.
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
A holder to handle a list of undo (or redo) commands.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
wxString MessageTextFromValue(double aValue, bool aAddUnitLabel=true, EDA_DATA_TYPE aType=EDA_DATA_TYPE::DISTANCE) const
A lower-precision version of StringFromValue().
EDA_UNITS GetUserUnits() const
@ WHITE
Definition: color4d.h:48
@ BLACK
Definition: color4d.h:44
bool HandleUnsavedChanges(wxWindow *aParent, const wxString &aMessage, const std::function< bool()> &aSaveFunction)
Display a dialog with Save, Cancel and Discard Changes buttons.
Definition: confirm.cpp:240
This file is part of the common library.
#define CHECK(x)
#define ENABLE(x)
#define _HKI(x)
int InvokeDialogPrintPreview(PL_EDITOR_FRAME *aCaller, wxPrintData *aPrintData)
Create and show a print preview dialog returns 1 if OK, 0 , there is a problem.
int InvokeDialogPrint(PL_EDITOR_FRAME *aCaller, wxPrintData *aPrintData, wxPageSetupDialogData *aPageSetupData)
Create and show a print dialog returns 1 if OK, 0 , there is a problem.
@ RB_CORNER
Definition: ds_data_item.h:49
@ RT_CORNER
Definition: ds_data_item.h:50
@ LT_CORNER
Definition: ds_data_item.h:52
@ LB_CORNER
Definition: ds_data_item.h:51
#define _(s)
#define KICAD_DEFAULT_DRAWFRAME_STYLE
#define PL_EDITOR_FRAME_NAME
GERBVIEW_FRAME::OnZipFileHistory GERBVIEW_FRAME::OnSelectDisplayMode EVT_CHOICE(ID_GBR_AUX_TOOLBAR_PCB_APERATTRIBUTES_CHOICE, GERBVIEW_FRAME::OnSelectHighlightChoice) EVT_UPDATE_UI(ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
@ FRAME_PL_EDITOR
Definition: frame_type.h:59
const std::string DrawingSheetFileExtension
@ ID_FILE_LIST_CLEAR
Definition: id.h:87
@ ID_FILEMAX
Definition: id.h:85
@ ID_FILE1
Definition: id.h:84
KIWAY Kiway
@ LAYER_DRAWINGSHEET_PAGEn
for drawingsheetEditor previewing
Definition: layer_ids.h:248
@ LAYER_DRAWINGSHEET_PAGE1
for drawingsheetEditor previewing
Definition: layer_ids.h:247
KICOMMON_API double ToUserUnit(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnit, double aValue)
Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit...
Definition: eda_units.cpp:243
KICOMMON_API int Mils2mm(double aVal)
Convert mils to mm.
Definition: eda_units.cpp:66
@ COLOR
Color has changed.
Definition: view_item.h:53
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: gtk/app.cpp:90
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: gtk/app.cpp:79
wxSize GetTextSize(const wxString &aSingleLine, wxWindow *aWindow)
Return the size of aSingleLine of text when it is rendered in aWindow using whatever font is currentl...
Definition: ui_common.cpp:74
see class PGM_BASE
@ ID_SELECT_PAGE_NUMBER
Definition: pl_editor_id.h:39
@ ID_SELECT_COORDINATE_ORIGIN
Definition: pl_editor_id.h:38
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:119
std::vector< FAB_LAYER_COLOR > dummy
const double IU_PER_MILS
Definition: base_units.h:78
std::vector< GRID > grids
Definition: grid_settings.h:66
Common grid settings, available to every frame.
Definition: grid_settings.h:34
GRID_SETTINGS grid
Definition: app_settings.h:81
std::vector< double > zoom_factors
Definition: app_settings.h:78
VECTOR2< int > VECTOR2I
Definition: vector2d.h:588
Definition of file extensions used in Kicad.
#define ZOOM_LIST_PL_EDITOR
Definition: zoom_defines.h:38