KiCad PCB EDA Suite
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-2021 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_i.h>
27 #include <pgm_base.h>
28 #include <bitmaps.h>
29 #include <core/arraydim.h>
30 #include <eda_item.h>
33 #include <widgets/paged_dialog.h>
35 #include <panel_hotkeys_editor.h>
36 #include <confirm.h>
37 #include <kiplatform/app.h>
38 #include <painter.h>
39 #include <tool/selection.h>
40 #include <tool/action_toolbar.h>
41 #include <tool/editor_conditions.h>
42 #include <tool/tool_dispatcher.h>
43 #include <tool/tool_manager.h>
44 #include <tool/common_control.h>
45 #include <tool/common_tools.h>
46 #include <tool/picker_tool.h>
47 #include <tool/zoom_tool.h>
48 #include <widgets/infobar.h>
50 
52 #include "pl_editor_frame.h"
53 #include "pl_editor_id.h"
54 #include "pl_editor_settings.h"
55 #include "properties_frame.h"
56 #include "tools/pl_actions.h"
58 #include "tools/pl_drawing_tools.h"
59 #include "tools/pl_edit_tool.h"
60 #include "tools/pl_point_editor.h"
63 #include <zoom_defines.h>
64 
65 #include <wx/filedlg.h>
66 #include <wx/print.h>
67 #include <wx/treebook.h>
68 
69 
70 BEGIN_EVENT_TABLE( PL_EDITOR_FRAME, EDA_DRAW_FRAME )
71  EVT_MENU( wxID_CLOSE, PL_EDITOR_FRAME::OnExit )
72  EVT_MENU( wxID_EXIT, PL_EDITOR_FRAME::OnExit )
73 
74  EVT_MENU( wxID_FILE, PL_EDITOR_FRAME::Files_io )
75 
78 
81 END_EVENT_TABLE()
82 
83 
84 PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
85  EDA_DRAW_FRAME( aKiway, aParent, FRAME_PL_EDITOR, wxT( "PlEditorFrame" ),
86  wxDefaultPosition, wxDefaultSize,
88  m_propertiesPagelayout( nullptr ),
89  m_propertiesFrameWidth( 200 ),
90  m_originSelectBox( nullptr ),
91  m_originSelectChoice( 0 ),
92  m_pageSelectBox( nullptr )
93 {
94  m_maximizeByDefault = true;
95  m_userUnits = EDA_UNITS::MILLIMETRES;
96 
97  m_showBorderAndTitleBlock = true; // true for reference drawings.
99  SetShowPageLimits( true );
100  m_aboutTitle = _( "KiCad Drawing Sheet Editor" );
101 
102  // Give an icon
103  wxIcon icon;
104  wxIconBundle icon_bundle;
105 
106  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor ) );
107  icon_bundle.AddIcon( icon );
108  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_32 ) );
109  icon_bundle.AddIcon( icon );
110  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_16 ) );
111  icon_bundle.AddIcon( icon );
112 
113  SetIcons( icon_bundle );
114 
115  // Create GAL canvas
116  auto* drawPanel = new PL_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
117  GetGalDisplayOptions(),
119  SetCanvas( drawPanel );
120 
121  LoadSettings( config() );
122 
123  wxSize pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU();
124  SetScreen( new BASE_SCREEN( pageSizeIU ) );
125 
126  setupTools();
127  setupUIConditions();
128  ReCreateMenuBar();
129  ReCreateHToolbar();
130  ReCreateVToolbar();
131  ReCreateOptToolbar();
132 
133  wxWindow* stsbar = GetStatusBar();
134  int dims[] = {
135 
136  // balance of status bar on far left is set to a default or whatever is left over.
137  -1,
138 
139  // When using GetTextSize() remember the width of '1' is not the same
140  // as the width of '0' unless the font is fixed width, and it usually won't be.
141 
142  // zoom:
143  KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x + 10,
144 
145  // cursor coords
146  KIUI::GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + 10,
147 
148  // delta distances
149  KIUI::GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + 10,
150 
151  // grid size
152  KIUI::GetTextSize( wxT( "grid 0234.567" ), stsbar ).x + 10,
153 
154  // Coord origin (use the bigger message)
155  KIUI::GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + 10,
156 
157  // units display, Inches is bigger than mm
158  KIUI::GetTextSize( _( "Inches" ), stsbar ).x + 20
159  };
160 
161  SetStatusWidths( arrayDim( dims ), dims );
162 
163  m_auimgr.SetManagedWindow( this );
164 
165  CreateInfoBar();
166  m_propertiesPagelayout = new PROPERTIES_FRAME( this );
167 
168  // Rows; layers 4 - 6
169  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
170  .Top().Layer( 6 ) );
171  m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
172  .Left().Layer( 3 ) );
173  m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
174  .Bottom().Layer( 6 ) );
175 
176  // Columns; layers 1 - 3
177  m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
178  .Right().Layer( 2 ) );
179 
180  m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" )
181  .Right().Layer( 3 )
182  .Caption( _( "Properties" ) )
183  .MinSize( m_propertiesPagelayout->GetMinSize() )
184  .BestSize( m_propertiesFrameWidth, -1 ) );
185 
186  // Center
187  m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
188  .Center() );
189 
190  FinishAUIInitialization();
191 
192  resolveCanvasType();
193  SwitchCanvas( m_canvasType );
194 
195  // Add the exit key handler
196  setupUnits( config() );
197 
198  wxPoint originCoord = ReturnCoordOriginCorner();
199  SetGridOrigin( originCoord );
200 
201  // Initialize the current drawing sheet
202 #if 0 //start with empty layout
205 #else // start with the default KiCad layout
207 #endif
208  OnNewDrawingSheet();
209 
210  // Ensure the window is on top
211  Raise();
212 
213  // Register a call to update the toolbar sizes. It can't be done immediately because
214  // it seems to require some sizes calculated that aren't yet (at least on GTK).
215  CallAfter( [&]()
216  {
217  // Ensure the controls on the toolbars all are correctly sized
218  UpdateToolbarControlSizes();
219  } );
220 }
221 
222 
224 {
225  // Ensure m_canvasType is up to date, to save it in config
227 
228  // Shutdown all running tools
229  if( m_toolManager )
231 }
232 
233 
235 {
236  // Create the manager and dispatcher & route draw panel events to the dispatcher
238  m_toolManager->SetEnvironment( nullptr, GetCanvas()->GetView(),
239  GetCanvas()->GetViewControls(), config(), this );
240  m_actions = new PL_ACTIONS();
242 
244 
245  // Register tools
256 
257  // Run the selection tool, it is supposed to be always active
258  m_toolManager->InvokeTool( "plEditor.InteractiveSelection" );
259 }
260 
261 
263 {
265 
267  EDITOR_CONDITIONS cond( this );
268 
269  wxASSERT( mgr );
270 
271 #define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
272 #define CHECK( x ) ACTION_CONDITIONS().Check( x )
273 
275  mgr->SetConditions( ACTIONS::undo, ENABLE( cond.UndoAvailable() ) );
276  mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) );
277 
283 
288 
290  CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) );
295 
304 
305  // Not a tool, just a way to activate the action
308 
309  auto titleBlockNormalMode =
310  [] ( const SELECTION& )
311  {
312  return DS_DATA_MODEL::GetTheInstance().m_EditMode == false;
313  };
314 
315  auto titleBlockEditMode =
316  [] ( const SELECTION& )
317  {
318  return DS_DATA_MODEL::GetTheInstance().m_EditMode == true;
319  };
320 
321  mgr->SetConditions( PL_ACTIONS::layoutNormalMode, CHECK( titleBlockNormalMode ) );
322  mgr->SetConditions( PL_ACTIONS::layoutEditMode, CHECK( titleBlockEditMode ) );
323 
324 #undef CHECK
325 #undef ENABLE
326 }
327 
328 
329 bool PL_EDITOR_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
330 {
331  wxString fn = aFileSet[0];
332 
333  if( !LoadDrawingSheetFile( fn ) )
334  {
335  wxMessageBox( wxString::Format( _( "Error when loading file \"%s\"" ), fn ) );
336  return false;
337  }
338  else
339  {
341  return true;
342  }
343 }
344 
345 
347 {
348  return GetScreen() && GetScreen()->IsContentModified();
349 }
350 
351 
352 void PL_EDITOR_FRAME::OnExit( wxCommandEvent& aEvent )
353 {
354  if( aEvent.GetId() == wxID_EXIT )
355  Kiway().OnKiCadExit();
356 
357  if( aEvent.GetId() == wxID_CLOSE || Kiface().IsSingle() )
358  Close( false );
359 }
360 
361 
362 bool PL_EDITOR_FRAME::canCloseWindow( wxCloseEvent& aEvent )
363 {
364  // Shutdown blocks must be determined and vetoed as early as possible
366  && aEvent.GetId() == wxEVT_QUERY_END_SESSION
367  && IsContentModified() )
368  {
369  return false;
370  }
371 
372  if( IsContentModified() )
373  {
374  wxFileName filename = GetCurrentFileName();
375  wxString msg = _( "Save changes to \"%s\" before closing?" );
376 
377  if( !HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
378  [&]() -> bool
379  {
380  return saveCurrentPageLayout();
381  } ) )
382  {
383  return false;
384  }
385  }
386 
387  return true;
388 }
389 
390 
392 {
393  // do not show the window because we do not want any paint event
394  Show( false );
395 
396  // clean up the data before the view is destroyed
398 
399  // On Linux, m_propertiesPagelayout must be destroyed
400  // before deleting the main frame to avoid a crash when closing
401  m_propertiesPagelayout->Destroy();
402  Destroy();
403 }
404 
405 
406 void PL_EDITOR_FRAME::OnSelectPage( wxCommandEvent& event )
407 {
408  KIGFX::VIEW* view = GetCanvas()->GetView();
409  view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGE1, m_pageSelectBox->GetSelection() == 0 );
410  view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGEn, m_pageSelectBox->GetSelection() == 1 );
411  GetCanvas()->Refresh();
412 }
413 
414 
415 void PL_EDITOR_FRAME::OnSelectCoordOriginCorner( wxCommandEvent& event )
416 {
417  m_originSelectChoice = m_originSelectBox->GetSelection();
418  UpdateStatusBar(); // Update grid origin
420  GetCanvas()->Refresh();
421 }
422 
423 
424 void PL_EDITOR_FRAME::ToPrinter( bool doPreview )
425 {
426  // static print data and page setup data, to remember settings during the session
427  static wxPrintData* s_PrintData;
428  static wxPageSetupDialogData* s_pageSetupData = nullptr;
429 
430  const PAGE_INFO& pageInfo = GetPageSettings();
431 
432  if( s_PrintData == nullptr ) // First print
433  {
434  s_PrintData = new wxPrintData();
435  s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH;
436  }
437 
438  if( !s_PrintData->Ok() )
439  {
440  wxMessageBox( _( "Error Init Printer info" ) );
441  return;
442  }
443 
444  if( s_pageSetupData == nullptr )
445  s_pageSetupData = new wxPageSetupDialogData( *s_PrintData );
446 
447  s_pageSetupData->SetPaperId( pageInfo.GetPaperId() );
448  s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() );
449 
450  if( pageInfo.IsCustom() )
451  {
452  if( pageInfo.IsPortrait() )
453  s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetWidthMils() ),
454  Mils2mm( pageInfo.GetHeightMils() ) ) );
455  else
456  s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetHeightMils() ),
457  Mils2mm( pageInfo.GetWidthMils() ) ) );
458  }
459 
460  *s_PrintData = s_pageSetupData->GetPrintData();
461 
462  if( doPreview )
463  InvokeDialogPrintPreview( this, s_PrintData );
464  else
465  InvokeDialogPrint( this, s_PrintData, s_pageSetupData );
466 }
467 
468 
469 const BOX2I PL_EDITOR_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
470 {
471  BOX2I rv( VECTOR2I( 0, 0 ), GetPageLayout().GetPageSettings().GetSizeIU() );
472  return rv;
473 }
474 
475 
477  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
478 {
479  wxTreebook* book = aParent->GetTreebook();
480 
481  book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) );
482  book->AddSubPage( new PANEL_GAL_DISPLAY_OPTIONS( this, aParent ), _( "Display Options" ) );
483  book->AddSubPage( new PANEL_PL_EDITOR_COLOR_SETTINGS( this, aParent->GetTreebook() ),
484  _( "Colors" ) );
485 
486  aHotkeysPanel->AddHotKeys( GetToolManager() );
487 }
488 
489 
491 {
493 
494  if( aCfg->m_Window.grid.sizes.empty() )
495  {
496  aCfg->m_Window.grid.sizes = { "1.0 mm",
497  "0.50 mm",
498  "0.25 mm",
499  "0.20 mm",
500  "0.10 mm" };
501  }
502 
503  // Currently values read from config file are not used because the user cannot
504  // change this config
505  // if( aCfg->m_Window.zoom_factors.empty() )
506  {
508  }
509 
510  PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
511  wxCHECK( cfg, /*void*/ );
512 
515 
517 
520 
521  PAGE_INFO pageInfo = GetPageSettings();
522  pageInfo.SetType( cfg->m_LastPaperSize, cfg->m_LastWasPortrait );
523  SetPageSettings( pageInfo );
524 }
525 
526 
528 {
530 
531  auto cfg = static_cast<PL_EDITOR_SETTINGS*>( aCfg );
532 
534 
535  cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth;
536  cfg->m_CornerOrigin = m_originSelectChoice;
537  cfg->m_BlackBackground = GetDrawBgColor() == BLACK;
538  cfg->m_LastPaperSize = GetPageSettings().GetType();
539  cfg->m_LastWasPortrait = GetPageSettings().IsPortrait();
540  cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils();
541  cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils();
542 }
543 
544 
546 {
547  wxString title;
548  wxFileName file( GetCurrentFileName() );
549 
550  if( file.IsOk() )
551  title = file.GetName();
552  else
553  title = _( "[no drawing sheet loaded]" );
554 
555  title += wxT( " \u2014 " ) + _( "Drawing Sheet Editor" ),
556 
557  SetTitle( title );
558 }
559 
560 
562 {
564 }
565 
566 
567 void PL_EDITOR_FRAME::SetCurrentFileName( const wxString& aName )
568 {
570 }
571 
572 
573 void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
574 {
575  m_pageLayout.SetPageSettings( aPageSettings );
576 
577  if( GetScreen() )
578  GetScreen()->InitDataPoints( aPageSettings.GetSizeIU() );
579 }
580 
581 
583 {
584  return m_pageLayout.GetPageSettings();
585 }
586 
587 
588 const wxSize PL_EDITOR_FRAME::GetPageSizeIU() const
589 {
590  // this function is only needed because EDA_DRAW_FRAME is not compiled
591  // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
592  // into an application specific source file.
593  return m_pageLayout.GetPageSettings().GetSizeIU();
594 }
595 
596 
598 {
599  return GetPageLayout().GetTitleBlock();
600 }
601 
602 
603 void PL_EDITOR_FRAME::SetTitleBlock( const TITLE_BLOCK& aTitleBlock )
604 {
605  m_pageLayout.SetTitleBlock( aTitleBlock );
606 }
607 
608 
609 void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
610 {
611  EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
612 
613  SETTINGS_MANAGER& settingsManager = Pgm().GetSettingsManager();
614  PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
615  COLOR_SETTINGS* colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
616 
617  GetCanvas()->GetView()->GetPainter()->GetSettings()->LoadColors( colors );
618 
620  GetCanvas()->Refresh();
621 
623  Layout();
624  SendSizeEvent();
625 }
626 
627 
629 {
630  // calculate the position (in page, in iu) of the corner used as coordinate origin
631  // coordinate origin can be the paper Top Left corner, or each of 4 page corners
632  wxPoint originCoord;
633 
634  // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
636 
637  switch( m_originSelectChoice )
638  {
639  default:
640  case 0: // Origin = paper Left Top corner
641  break;
642 
643  case 1: // Origin = page Right Bottom corner
644  dummy.SetStart( 0, 0, RB_CORNER );
645  originCoord = dummy.GetStartPosUi();
646  break;
647 
648  case 2: // Origin = page Left Bottom corner
649  dummy.SetStart( 0, 0, LB_CORNER );
650  originCoord = dummy.GetStartPosUi();
651  break;
652 
653  case 3: // Origin = page Right Top corner
654  dummy.SetStart( 0, 0, RT_CORNER );
655  originCoord = dummy.GetStartPosUi();
656  break;
657 
658  case 4: // Origin = page Left Top corner
659  dummy.SetStart( 0, 0, LT_CORNER );
660  originCoord = dummy.GetStartPosUi();
661  break;
662  }
663 
664  return originCoord;
665 }
666 
667 
669 {
670  wxString line;
671  wxString gridformatter;
672 
673  switch( m_userUnits )
674  {
675  case EDA_UNITS::INCHES: gridformatter = "grid %.3f"; break;
676  case EDA_UNITS::MILLIMETRES: gridformatter = "grid %.4f"; break;
677  default: gridformatter = "grid %f"; break;
678  }
679 
680  double grid = To_User_Unit( m_userUnits, GetCanvas()->GetGAL()->GetGridSize().x );
681  line.Printf( gridformatter, grid );
682 
683  SetStatusText( line, 4 );
684 }
685 
686 
688 {
689  // Display Zoom level:
690  SetStatusText( GetZoomLevelIndicator(), 1 );
691 
692  // coordinate origin can be the paper Top Left corner, or each of 4 page corners
693  wxPoint originCoord = ReturnCoordOriginCorner();
694  SetGridOrigin( originCoord );
695 
696  // We need the orientation of axis (sign of coordinates)
697  int Xsign = 1;
698  int Ysign = 1;
699 
700  switch( m_originSelectChoice )
701  {
702  default:
703  case 0: // Origin = paper Left Top corner
704  break;
705 
706  case 1: // Origin = page Right Bottom corner
707  Xsign = -1;
708  Ysign = -1;
709  break;
710 
711  case 2: // Origin = page Left Bottom corner
712  Ysign = -1;
713  break;
714 
715  case 3: // Origin = page Right Top corner
716  Xsign = -1;
717  break;
718 
719  case 4: // Origin = page Left Top corner
720  break;
721  }
722 
723  // Display absolute coordinates:
725  VECTOR2D coord = cursorPos - originCoord;
726  double dXpos = To_User_Unit( GetUserUnits(), coord.x * Xsign );
727  double dYpos = To_User_Unit( GetUserUnits(), coord.y * Ysign );
728 
729  wxString absformatter = wxT( "X %.4g Y %.4g" );
730  wxString locformatter = wxT( "dx %.4g dy %.4g" );
731 
732  switch( GetUserUnits() )
733  {
734  case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
735  case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
736  case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
737  case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
738  default: wxASSERT( false ); break;
739  }
740 
741  wxString line;
742 
743  // Display abs coordinates
744  line.Printf( absformatter, dXpos, dYpos );
745  SetStatusText( line, 2 );
746 
747  // Display relative coordinates:
748  if( GetScreen() )
749  {
750  double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
751  double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
752  dXpos = To_User_Unit( GetUserUnits(), dx * Xsign );
753  dYpos = To_User_Unit( GetUserUnits(), dy * Ysign );
754  line.Printf( locformatter, dXpos, dYpos );
755  SetStatusText( line, 3 );
756  }
757 
758  DisplayGridMsg();
759 
760  // Display corner reference for coord origin
761  line.Printf( _("coord origin: %s"),
762  m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
763  SetStatusText( line, 5 );
764 
765  // Display units
766 }
767 
768 
770 {
773 
774  for( DS_DATA_ITEM* dataItem : model.GetItems() )
775  {
776  // Ensure the scaling factor (used only in printing) of bitmaps is up to date
777  if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
778  {
779  BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
780  bitmap->SetPixelSizeIu( IU_PER_MILS * 1000 / bitmap->GetPPI() );
781  }
782  }
783 
784  PrintDrawingSheet( aSettings, GetScreen(), IU_PER_MILS, wxEmptyString );
785 
787  GetCanvas()->Refresh();
788 }
789 
790 
792 {
793  return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
794 }
795 
796 
798 {
799  return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
800 }
801 
802 
804 {
806 
808  PL_SELECTION& selection = selTool->GetSelection();
809  DS_DATA_ITEM* item = nullptr;
810 
811  if( selection.GetSize() == 1 )
812  item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
813 
816  GetCanvas()->Refresh();
817 }
818 
819 
821 {
822  DS_DATA_ITEM * item = nullptr;
823 
824  switch( aType )
825  {
827  item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
828  break;
829 
832  break;
833 
835  item = new DS_DATA_ITEM( DS_DATA_ITEM::DS_RECT );
836  break;
837 
839  item = new DS_DATA_ITEM_POLYGONS();
840  break;
841 
843  {
844  wxFileDialog fileDlg( this, _( "Choose Image" ), wxEmptyString, wxEmptyString,
845  _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
846  wxFD_OPEN );
847 
848  if( fileDlg.ShowModal() != wxID_OK )
849  return nullptr;
850 
851  wxString fullFilename = fileDlg.GetPath();
852 
853  if( !wxFileExists( fullFilename ) )
854  {
855  wxMessageBox( _( "Couldn't load image from \"%s\"" ), fullFilename );
856  break;
857  }
858 
859  BITMAP_BASE* image = new BITMAP_BASE();
860 
861  if( !image->ReadImageFile( fullFilename ) )
862  {
863  wxMessageBox( _( "Couldn't load image from \"%s\"" ), fullFilename );
864  delete image;
865  break;
866  }
867 
868  // Set the scale factor for pl_editor (it is set for Eeschema by default)
869  image->SetPixelSizeIu( IU_PER_MILS * 1000.0 / image->GetPPI() );
870  item = new DS_DATA_ITEM_BITMAP( image );
871  }
872  break;
873  }
874 
875  if( item == nullptr )
876  return nullptr;
877 
879  item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
880 
881  return item;
882 }
883 
884 
886 {
888  GetScreen()->SetContentModified( false );
890 
893 
895 
897 
898  if( GetCurrentFileName().IsEmpty() )
899  {
900  // Default shutdown reason until a file is loaded
901  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New drawing sheet file is unsaved" ) );
902  }
903  else
904  {
905  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Drawing sheet changes are unsaved" ) );
906  }
907 }
908 
909 
910 void PL_EDITOR_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount )
911 {
912  if( aItemCount == 0 )
913  return;
914 
915  UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
916  unsigned icnt = list.m_CommandsList.size();
917 
918  if( aItemCount > 0 )
919  icnt = aItemCount;
920 
921  for( unsigned ii = 0; ii < icnt; ii++ )
922  {
923  if( list.m_CommandsList.size() == 0 )
924  break;
925 
926  PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
927  list.m_CommandsList.erase( list.m_CommandsList.begin() );
928 
929  curr_cmd->ClearListAndDeleteItems();
930  delete curr_cmd; // Delete command
931  }
932 }
933 
934 
936 {
937  return m_pageSelectBox->GetSelection() == 0;
938 }
void ShutdownAllTools()
Shutdown all tools with a currently registered event loop in this tool manager by waking them up with...
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
void OnFileHistory(wxCommandEvent &event)
void ToPrinter(bool doPreview)
Open a dialog frame to print layers.
void ClearList()
Erase the list of items.
virtual void PrintPage(const RENDER_SETTINGS *aSettings) override
Print a page.
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:207
for drawingsheetEditor previewing
Handle the graphic items list to draw/plot the frame and title block.
Definition: ds_data_model.h:38
void OnKiCadExit()
Definition: kiway.cpp:615
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:53
void HardRedraw() override
Refresh the library tree and redraw the window.
bool IsContentModified() const
Definition: base_screen.h:60
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
wxPrintOrientation GetWxOrientation() const
Definition: page_info.h:122
void SetVirtualPageNumber(int aPageNumber)
Definition: base_screen.h:76
PL_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
const PAGE_INFO & GetPageSettings() const override
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
static int GetCustomHeightMils()
Definition: page_info.h:165
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_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...
static TOOL_ACTION layoutEditMode
Definition: pl_actions.h:68
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock) override
This file is part of the common library.
static TOOL_ACTION doDelete
Definition: actions.h:72
SELECTION_CONDITION FullscreenCursor()
Create a functor testing if the cursor is full screen in a frame.
#define CHECK(x)
static TOOL_ACTION drawLine
Definition: pl_actions.h:61
Definition: id.h:87
int GetHeightMils() const
Definition: page_info.h:133
UNDO_REDO_CONTAINER m_undoList
static TOOL_ACTION zoomTool
Definition: actions.h:99
static TOOL_ACTION placeImage
Definition: pl_actions.h:59
static bool Idle(const SELECTION &aSelection)
Test if there no items selected or being edited.
wxPoint ReturnCoordOriginCorner() const
Calculate the position (in page, in iu) of the corner used as coordinate origin of items.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
PROPERTIES_FRAME display properties of the current item.
The main window used in the drawing sheet editor.
void UpdateStatusBar() override
Update the status bar information.
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
void UpdateAllItems(int aUpdateFlags)
Update all items in the view according to the given flags.
Definition: view.cpp:1416
SELECTION_CONDITION CurrentTool(const TOOL_ACTION &aTool)
Create a functor testing if the specified tool is the current active tool in the frame.
bool canCloseWindow(wxCloseEvent &aCloseEvent) override
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.
void OnClearFileHistory(wxCommandEvent &aEvent)
static void SetCustomWidthMils(int aWidthInMils)
Set the width of Custom page in mils for any custom page constructed or made via SetType() after maki...
Definition: page_info.cpp:231
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:119
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
virtual void SetDrawBgColor(COLOR4D aColor)
static TOOL_ACTION zoomFitScreen
Definition: actions.h:96
static TOOL_ACTION millimetersUnits
Definition: actions.h:146
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
int InvokeDialogPrintPreview(PL_EDITOR_FRAME *aCaller, wxPrintData *aPrintData)
Create and show a print preview dialog returns 1 if OK, 0 , there is a problem.
bool RunAction(const std::string &aActionName, bool aNow=false, T aParam=NULL)
Run the specified action.
Definition: tool_manager.h:143
std::vector< DS_DATA_ITEM * > & GetItems()
#define PL_EDITOR_FRAME_NAME
void AddHotKeys(TOOL_MANAGER *aToolMgr)
const wxString & GetType() const
Definition: page_info.h:94
SELECTION_CONDITION RedoAvailable()
Create a functor that tests if there are any items in the redo queue.
static TOOL_ACTION placeText
Definition: pl_actions.h:58
Manage TOOL_ACTION objects.
Definition: color4d.h:44
Gather all the actions that are shared by tools.
Definition: pl_actions.h:35
void DisplayDrawingSheet()
Build and update the list of WS_DRAW_ITEM_xxx showing the frame layout.
bool IsCustom() const
Definition: page_info.cpp:180
Color has changed.
Definition: view_item.h:53
The base class for create windows for drawing purpose.
VECTOR2< int > VECTOR2I
Definition: vector2d.h:623
KIWAY Kiway & Pgm(), KFCTL_STANDALONE
The global Program "get" accessor.
Definition: single_top.cpp:106
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:40
const wxSize GetPageSizeIU() const override
Works off of GetPageSettings() to return the size of the paper page in the internal units of this par...
static bool NotEmpty(const SELECTION &aSelection)
Test if there are any items selected.
Class that groups generic conditions for editor states.
std::vector< double > zoom_factors
Definition: app_settings.h:86
PAGE_INFO & GetPageSettings()
bool InvokeTool(TOOL_ID aToolId)
Call a tool by sending a tool activation event to tool of given ID.
PL_SELECTION & GetSelection()
Return the set of currently selected items.
PAINTER * GetPainter() const
Return the painter object used by the view for drawing #VIEW_ITEMS.
Definition: view.h:207
wxPaperSize GetPaperId() const
Definition: page_info.h:127
virtual void SyncDrawItems(DS_DRAW_ITEM_LIST *aCollector, KIGFX::VIEW *aView)
This class handle bitmap images in KiCad.
Definition: bitmap_base.h:51
wxTreebook * GetTreebook()
Definition: paged_dialog.h:37
static LIB_SYMBOL * dummy()
Used to draw a dummy shape when a LIB_SYMBOL is not found in library.
Definition: sch_symbol.cpp:70
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: gtk/app.cpp:83
void InitDataPoints(const wxSize &aPageSizeInternalUnits)
Definition: base_screen.cpp:46
Master controller class:
Definition: tool_manager.h:54
EVT_MENU_RANGE(ID_GERBVIEW_DRILL_FILE1, ID_GERBVIEW_DRILL_FILEMAX, GERBVIEW_FRAME::OnDrlFileHistory) EVT_MENU_RANGE(ID_GERBVIEW_ZIP_FILE1
A holder to handle a list of undo (or redo) commands.
static TOOL_ACTION copy
Definition: actions.h:67
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
static DS_DATA_MODEL & GetTheInstance()
static function: returns the instance of DS_DATA_MODEL used in the application
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
wxString GetCurrentFileName() const override
void SetPageSettings(const PAGE_INFO &) override
std::vector< wxString > sizes
Definition: app_settings.h:52
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:99
SELECTION_CONDITION GridVisible()
Create a functor testing if the grid is visible in a frame.
bool IsSingle() const
Is this KIFACE_I running under single_top?
Definition: kiface_i.h:104
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
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:59
SELECTION_CONDITION Units(EDA_UNITS aUnit)
Create a functor that tests if the frame has the specified units.
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
TITLE_BLOCK & GetTitleBlock()
bool OpenProjectFiles(const std::vector< wxString > &aFileSet, int aCtl) override
Open a project or set of files given by aFileList.
GRID_SETTINGS grid
Definition: app_settings.h:89
static TOOL_ACTION toggleGrid
Definition: actions.h:140
GAL not used (the legacy wxDC engine is used)
void OnExit(wxCommandEvent &aEvent)
Event handler for the wxID_EXIT and wxID_CLOSE events.
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:53
static TOOL_ACTION inchesUnits
Definition: actions.h:144
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:40
void OnSelectCoordOriginCorner(wxCommandEvent &event)
Called when the user select one of the 4 page corner as corner reference (or the left top paper corne...
static TOOL_ACTION save
Definition: actions.h:51
for drawingsheetEditor previewing
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
bool IsContentModified() const override
Get if the drawing sheet has been modified but not saved.
ACTIONS * m_actions
Definition: tools_holder.h:157
static TOOL_ACTION cut
Definition: actions.h:66
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:258
const TITLE_BLOCK & GetTitleBlock() const override
#define _(s)
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
AppSettings * GetAppSettings(bool aLoadNow=true)
Returns a handle to the a given settings by type If the settings have already been loaded,...
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:387
bool SupportsShutdownBlockReason()
Whether or not the window supports setting a shutdown block reason.
Definition: gtk/app.cpp:72
#define KICAD_DEFAULT_DRAWFRAME_STYLE
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
static TOOL_ACTION drawRectangle
Definition: pl_actions.h:60
void doCloseWindow() override
A holder to handle information on schematic or board items.
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, BASE_SCREEN *aScreen, double aMils2Iu, const wxString &aFilename, const wxString &aSheetLayer=wxEmptyString)
Prints the drawing-sheet (frame and title block).
PL_EDITOR_LAYOUT m_pageLayout
bool GetPageNumberOption() const
Drawing sheet editor can show the title block using a page number 1 or another number.
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:105
Handle actions that are shared between different applications.
Specialization of the wxAuiPaneInfo class for KiCad panels.
void OnSelectPage(wxCommandEvent &event)
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...
UNDO_REDO_CONTAINER m_redoList
static TOOL_ACTION milsUnits
Definition: actions.h:145
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=NULL) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:158
void SetPixelSizeIu(double aPixSize)
Definition: bitmap_base.h:68
Handles action that are shared between different applications.
Definition: common_tools.h:37
void InstallPreferences(PAGED_DIALOG *aParent, PANEL_HOTKEYS_EDITOR *aHotkeysPanel) override
Allow a frame to load its preference panels (if any) into the preferences dialog.
wxChoice * m_pageSelectBox
const wxString GetZoomLevelIndicator() const
Return a human readable value for display in dialogs.
UNDO_REDO_LIST
Specifies whether we are interacting with the undo or redo stacks.
Definition: color4d.h:48
void Format(OUTPUTFORMATTER *out, int aNestLevel, int aCtl, const CPTREE &aTree)
Output a PTREE into s-expression format via an OUTPUTFORMATTER derivative.
Definition: ptree.cpp:200
void SetContentModified(bool aModified=true)
Definition: base_screen.h:59
#define ENABLE(x)
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
void SetPageSettings(const PAGE_INFO &aPageSettings)
virtual RENDER_SETTINGS * GetSettings()=0
Return a pointer to current settings that are going to be used when drawing items.
static TOOL_ACTION redo
Definition: actions.h:65
WINDOW_SETTINGS m_Window
Definition: app_settings.h:181
void SetCurrentFileName(const wxString &aName)
Store the current layout description file filename.
double To_User_Unit(EDA_UNITS aUnit, double aValue)
Function To_User_Unit convert aValue in internal units to the appropriate user units defined by aUnit...
Definition: base_units.cpp:68
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void UpdateTitleAndInfo()
Display the short filename (if exists) loaded file on the caption of the main window.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:156
see class PGM_BASE
Drawing sheet structure type definitions.
Definition: ds_data_item.h:95
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).
bool IsPortrait() const
Definition: page_info.h:117
void SetEventDispatcher(TOOL_DISPATCHER *aEventDispatcher)
Set a dispatcher that processes events and forwards them to tools.
static TOOL_ACTION appendImportedDrawingSheet
Definition: pl_actions.h:62
SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
static wxString m_DrawingSheetFileName
the name of the drawing sheet file, or empty to use the default drawing sheet
Definition: base_screen.h:85
PROPERTIES_FRAME * m_propertiesPagelayout
The last filename chosen to be proposed to the user.
void DisplayGridMsg() override
Display current grid size in the status bar.
void SetGridOrigin(const wxPoint &aPoint) override
int Mils2mm(double x)
Convert mils to mm.
Definition: base_units.cpp:62
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Tool responsible for drawing/placing items (lines, rectangles, text, etc.)
EDA_UNITS m_userUnits
Map containing the UI update handlers registered with wx for each action.
#define IU_PER_MILS
Definition: plotter.cpp:137
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.
static bool ShowNever(const SELECTION &aSelection)
Always returns false.
Handle actions specific to the drawing sheet editor.
static int GetCustomWidthMils()
Definition: page_info.h:160
ACTION_MANAGER * GetActionManager() const
Definition: tool_manager.h:199
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
void OnNewDrawingSheet()
Must be called to initialize parameters when a new drawing sheet is loaded.
Color settings are a bit different than most of the settings objects in that there can be more than o...
const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const override
Returns bbox of document with option to not include some items.
static TOOL_ACTION deleteTool
Definition: actions.h:73
void CopyPrmsFromItemToPanel(DS_DATA_ITEM *aItem)
Definition: id.h:86
virtual COLOR4D GetDrawBgColor() const
static TOOL_ACTION undo
Definition: actions.h:64
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:54
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
static TOOL_ACTION layoutNormalMode
Definition: pl_actions.h:67
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:102
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
void InitTools()
Initializes all registered tools.
Hold a (potentially large) number of VIEW_ITEMs and renders them on a graphics device provided by the...
Definition: view.h:67
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
virtual void LoadColors(const COLOR_SETTINGS *aSettings)
const PL_EDITOR_LAYOUT & GetPageLayout() const
void Append(DS_DATA_ITEM *aItem)
DS_DATA_ITEM * AddDrawingSheetItem(int aType)
Add a new item to the drawing sheet item list.
virtual BASE_SCREEN * GetScreen() const
Return a pointer to a BASE_SCREEN or one of its derivatives.
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
static TOOL_ACTION paste
Definition: actions.h:68
wxChoice * m_originSelectBox
bool LoadDrawingSheetFile(const wxString &aFullFileName)
Load a .kicad_wks drawing sheet file.
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
static void SetCustomHeightMils(int aHeightInMils)
Set the height of Custom page in mils for any custom page constructed or made via SetType() after mak...
Definition: page_info.cpp:237
void ClearListAndDeleteItems()
Delete the list of pickers AND the data pointed by #m_PickedItem or #m_PickedItemLink according to th...
static TOOL_ACTION selectionTool
Definition: actions.h:153
int GetPPI() const
Definition: bitmap_base.h:135
VECTOR2D GetCursorPosition() const
Return the current cursor position in world coordinates.
int GetWidthMils() const
Definition: page_info.h:130
VECTOR2D m_LocalOrigin
Relative Screen cursor coordinate (on grid) in user units.
Definition: base_screen.h:90
#define ZOOM_LIST_PL_EDITOR
Definition: zoom_defines.h:35
void RegisterTool(TOOL_BASE *aTool)
Add a tool to the manager set and sets it up.
Tool that displays edit points allowing to modify items by dragging the points.
wxString m_ColorTheme
Active color theme name.
Definition: app_settings.h:184
void Files_io(wxCommandEvent &event)