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_base.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  m_mruImagePath( wxEmptyString )
94 {
95  m_maximizeByDefault = true;
96  m_userUnits = EDA_UNITS::MILLIMETRES;
97 
98  m_showBorderAndTitleBlock = true; // true for reference drawings.
100  SetShowPageLimits( true );
101  m_aboutTitle = _( "KiCad Drawing Sheet Editor" );
102 
103  // Give an icon
104  wxIcon icon;
105  wxIconBundle icon_bundle;
106 
107  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor ) );
108  icon_bundle.AddIcon( icon );
109  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_32 ) );
110  icon_bundle.AddIcon( icon );
111  icon.CopyFromBitmap( KiBitmap( BITMAPS::icon_pagelayout_editor_16 ) );
112  icon_bundle.AddIcon( icon );
113 
114  SetIcons( icon_bundle );
115 
116  // Create GAL canvas
117  auto* drawPanel = new PL_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
118  GetGalDisplayOptions(),
120  SetCanvas( drawPanel );
121 
122  LoadSettings( config() );
123 
124  wxSize pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU();
125  SetScreen( new BASE_SCREEN( pageSizeIU ) );
126 
127  setupTools();
128  setupUIConditions();
129  ReCreateMenuBar();
130  ReCreateHToolbar();
131  ReCreateVToolbar();
132  ReCreateOptToolbar();
133 
134  wxWindow* stsbar = GetStatusBar();
135  int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
136 
137  int dims[] = {
138 
139  // balance of status bar on far left is set to a default or whatever is left over.
140  -1,
141 
142  // When using GetTextSize() remember the width of '1' is not the same
143  // as the width of '0' unless the font is fixed width, and it usually won't be.
144 
145  // zoom:
146  KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x + spacer,
147 
148  // cursor coords
149  KIUI::GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + spacer,
150 
151  // delta distances
152  KIUI::GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + spacer,
153 
154  // grid size
155  KIUI::GetTextSize( wxT( "grid 0234.567" ), stsbar ).x + spacer,
156 
157  // Coord origin (use the bigger message)
158  KIUI::GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + spacer,
159 
160  // units display, Inches is bigger than mm
161  KIUI::GetTextSize( _( "Inches" ), stsbar ).x + spacer,
162 
163  // constraint mode
164  KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x + spacer
165  };
166 
167  SetStatusWidths( arrayDim( dims ), dims );
168 
169  m_auimgr.SetManagedWindow( this );
170 
171  CreateInfoBar();
172  m_propertiesPagelayout = new PROPERTIES_FRAME( this );
173 
174  // Rows; layers 4 - 6
175  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
176  .Top().Layer( 6 ) );
177  m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
178  .Left().Layer( 3 ) );
179  m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
180  .Bottom().Layer( 6 ) );
181 
182  // Columns; layers 1 - 3
183  m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
184  .Right().Layer( 2 ) );
185 
186  m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" )
187  .Right().Layer( 3 )
188  .Caption( _( "Properties" ) )
189  .MinSize( m_propertiesPagelayout->GetMinSize() )
190  .BestSize( m_propertiesFrameWidth, -1 ) );
191 
192  // Center
193  m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
194  .Center() );
195 
196  FinishAUIInitialization();
197 
198  resolveCanvasType();
199  SwitchCanvas( m_canvasType );
200 
201  // Add the exit key handler
202  setupUnits( config() );
203 
204  wxPoint originCoord = ReturnCoordOriginCorner();
205  SetGridOrigin( originCoord );
206 
207  // Initialize the current drawing sheet
208 #if 0 //start with empty layout
211 #else // start with the default KiCad layout
213 #endif
214  OnNewDrawingSheet();
215 
216  // Ensure the window is on top
217  Raise();
218 
219  // Register a call to update the toolbar sizes. It can't be done immediately because
220  // it seems to require some sizes calculated that aren't yet (at least on GTK).
221  CallAfter( [&]()
222  {
223  // Ensure the controls on the toolbars all are correctly sized
224  UpdateToolbarControlSizes();
225  } );
226 }
227 
228 
230 {
231  // Ensure m_canvasType is up to date, to save it in config
233 
234  // Shutdown all running tools
235  if( m_toolManager )
237 }
238 
239 
241 {
242  // Create the manager and dispatcher & route draw panel events to the dispatcher
244  m_toolManager->SetEnvironment( nullptr, GetCanvas()->GetView(),
245  GetCanvas()->GetViewControls(), config(), this );
246  m_actions = new PL_ACTIONS();
248 
250 
251  // Register tools
262 
263  // Run the selection tool, it is supposed to be always active
264  m_toolManager->InvokeTool( "plEditor.InteractiveSelection" );
265 }
266 
267 
269 {
271 
273  EDITOR_CONDITIONS cond( this );
274 
275  wxASSERT( mgr );
276 
277 #define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
278 #define CHECK( x ) ACTION_CONDITIONS().Check( x )
279 
281  mgr->SetConditions( ACTIONS::undo, ENABLE( cond.UndoAvailable() ) );
282  mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) );
283 
289 
294 
296  CHECK( cond.CurrentTool( ACTIONS::zoomTool ) ) );
301 
310 
311  // Not a tool, just a way to activate the action
314 
315  auto titleBlockNormalMode =
316  [] ( const SELECTION& )
317  {
318  return DS_DATA_MODEL::GetTheInstance().m_EditMode == false;
319  };
320 
321  auto titleBlockEditMode =
322  [] ( const SELECTION& )
323  {
324  return DS_DATA_MODEL::GetTheInstance().m_EditMode == true;
325  };
326 
327  mgr->SetConditions( PL_ACTIONS::layoutNormalMode, CHECK( titleBlockNormalMode ) );
328  mgr->SetConditions( PL_ACTIONS::layoutEditMode, CHECK( titleBlockEditMode ) );
329 
330 #undef CHECK
331 #undef ENABLE
332 }
333 
334 
335 bool PL_EDITOR_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
336 {
337  wxString fn = aFileSet[0];
338 
339  if( !LoadDrawingSheetFile( fn ) )
340  {
341  wxMessageBox( wxString::Format( _( "Error loading drawing sheet '%s'." ), fn ) );
342  return false;
343  }
344  else
345  {
347  return true;
348  }
349 }
350 
351 
353 {
354  return GetScreen() && GetScreen()->IsContentModified();
355 }
356 
357 
358 void PL_EDITOR_FRAME::OnExit( wxCommandEvent& aEvent )
359 {
360  if( aEvent.GetId() == wxID_EXIT )
361  Kiway().OnKiCadExit();
362 
363  if( aEvent.GetId() == wxID_CLOSE || Kiface().IsSingle() )
364  Close( false );
365 }
366 
367 
368 bool PL_EDITOR_FRAME::canCloseWindow( wxCloseEvent& aEvent )
369 {
370  // Shutdown blocks must be determined and vetoed as early as possible
372  && aEvent.GetId() == wxEVT_QUERY_END_SESSION
373  && IsContentModified() )
374  {
375  return false;
376  }
377 
378  if( IsContentModified() )
379  {
380  wxFileName filename = GetCurrentFileName();
381  wxString msg = _( "Save changes to '%s' before closing?" );
382 
383  if( !HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
384  [&]() -> bool
385  {
386  return saveCurrentPageLayout();
387  } ) )
388  {
389  return false;
390  }
391  }
392 
393  return true;
394 }
395 
396 
398 {
399  // do not show the window because we do not want any paint event
400  Show( false );
401 
402  // clean up the data before the view is destroyed
404 
405  // On Linux, m_propertiesPagelayout must be destroyed
406  // before deleting the main frame to avoid a crash when closing
407  m_propertiesPagelayout->Destroy();
408  Destroy();
409 }
410 
411 
412 void PL_EDITOR_FRAME::OnSelectPage( wxCommandEvent& event )
413 {
414  KIGFX::VIEW* view = GetCanvas()->GetView();
415  view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGE1, m_pageSelectBox->GetSelection() == 0 );
416  view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGEn, m_pageSelectBox->GetSelection() == 1 );
417  GetCanvas()->Refresh();
418 }
419 
420 
421 void PL_EDITOR_FRAME::OnSelectCoordOriginCorner( wxCommandEvent& event )
422 {
423  m_originSelectChoice = m_originSelectBox->GetSelection();
424  UpdateStatusBar(); // Update grid origin
426  GetCanvas()->Refresh();
427 }
428 
429 
430 void PL_EDITOR_FRAME::ToPrinter( bool doPreview )
431 {
432  // static print data and page setup data, to remember settings during the session
433  static wxPrintData* s_PrintData;
434  static wxPageSetupDialogData* s_pageSetupData = nullptr;
435 
436  const PAGE_INFO& pageInfo = GetPageSettings();
437 
438  if( s_PrintData == nullptr ) // First print
439  {
440  s_PrintData = new wxPrintData();
441  s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH;
442  }
443 
444  if( !s_PrintData->Ok() )
445  {
446  wxMessageBox( _( "Error Init Printer info" ) );
447  return;
448  }
449 
450  if( s_pageSetupData == nullptr )
451  s_pageSetupData = new wxPageSetupDialogData( *s_PrintData );
452 
453  s_pageSetupData->SetPaperId( pageInfo.GetPaperId() );
454  s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() );
455 
456  if( pageInfo.IsCustom() )
457  {
458  if( pageInfo.IsPortrait() )
459  s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetWidthMils() ),
460  Mils2mm( pageInfo.GetHeightMils() ) ) );
461  else
462  s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetHeightMils() ),
463  Mils2mm( pageInfo.GetWidthMils() ) ) );
464  }
465 
466  *s_PrintData = s_pageSetupData->GetPrintData();
467 
468  if( doPreview )
469  InvokeDialogPrintPreview( this, s_PrintData );
470  else
471  InvokeDialogPrint( this, s_PrintData, s_pageSetupData );
472 }
473 
474 
475 const BOX2I PL_EDITOR_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
476 {
477  BOX2I rv( VECTOR2I( 0, 0 ), GetPageLayout().GetPageSettings().GetSizeIU() );
478  return rv;
479 }
480 
481 
483  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
484 {
485  wxTreebook* book = aParent->GetTreebook();
486 
487  book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) );
488  book->AddSubPage( new PANEL_GAL_DISPLAY_OPTIONS( this, aParent ), _( "Display Options" ) );
489  book->AddSubPage( new PANEL_PL_EDITOR_COLOR_SETTINGS( this, aParent->GetTreebook() ),
490  _( "Colors" ) );
491 
492  aHotkeysPanel->AddHotKeys( GetToolManager() );
493 }
494 
495 
497 {
499 
500  if( aCfg->m_Window.grid.sizes.empty() )
501  {
502  aCfg->m_Window.grid.sizes = { "5.00 mm",
503  "2.50 mm",
504  "2.00 mm",
505  "1.00 mm",
506  "0.50 mm",
507  "0.25 mm",
508  "0.20 mm",
509  "0.10 mm" };
510  }
511 
512  // Currently values read from config file are not used because the user cannot
513  // change this config
514  // if( aCfg->m_Window.zoom_factors.empty() )
515  {
517  }
518 
519  PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
520  wxCHECK( cfg, /*void*/ );
521 
524 
526 
529 
530  PAGE_INFO pageInfo = GetPageSettings();
531  pageInfo.SetType( cfg->m_LastPaperSize, cfg->m_LastWasPortrait );
532  SetPageSettings( pageInfo );
533 }
534 
535 
537 {
539 
540  auto cfg = static_cast<PL_EDITOR_SETTINGS*>( aCfg );
541 
543 
544  cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth;
545  cfg->m_CornerOrigin = m_originSelectChoice;
546  cfg->m_BlackBackground = GetDrawBgColor() == BLACK;
547  cfg->m_LastPaperSize = GetPageSettings().GetType();
548  cfg->m_LastWasPortrait = GetPageSettings().IsPortrait();
549  cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils();
550  cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils();
551 }
552 
553 
555 {
556  wxString title;
557  wxFileName file( GetCurrentFileName() );
558 
559  if( file.IsOk() )
560  title = file.GetName();
561  else
562  title = _( "[no drawing sheet loaded]" );
563 
564  title += wxT( " \u2014 " ) + _( "Drawing Sheet Editor" ),
565 
566  SetTitle( title );
567 }
568 
569 
571 {
573 }
574 
575 
576 void PL_EDITOR_FRAME::SetCurrentFileName( const wxString& aName )
577 {
579 }
580 
581 
582 void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
583 {
584  m_pageLayout.SetPageSettings( aPageSettings );
585 
586  if( GetScreen() )
587  GetScreen()->InitDataPoints( aPageSettings.GetSizeIU() );
588 }
589 
590 
592 {
593  return m_pageLayout.GetPageSettings();
594 }
595 
596 
597 const wxSize PL_EDITOR_FRAME::GetPageSizeIU() const
598 {
599  // this function is only needed because EDA_DRAW_FRAME is not compiled
600  // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
601  // into an application specific source file.
602  return m_pageLayout.GetPageSettings().GetSizeIU();
603 }
604 
605 
607 {
608  return GetPageLayout().GetTitleBlock();
609 }
610 
611 
612 void PL_EDITOR_FRAME::SetTitleBlock( const TITLE_BLOCK& aTitleBlock )
613 {
614  m_pageLayout.SetTitleBlock( aTitleBlock );
615 }
616 
617 
618 void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
619 {
620  EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
621 
622  SETTINGS_MANAGER& settingsManager = Pgm().GetSettingsManager();
623  PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
624  COLOR_SETTINGS* colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
625 
626  GetCanvas()->GetView()->GetPainter()->GetSettings()->LoadColors( colors );
627 
629  GetCanvas()->Refresh();
630 
632  Layout();
633  SendSizeEvent();
634 }
635 
636 
638 {
639  // calculate the position (in page, in iu) of the corner used as coordinate origin
640  // coordinate origin can be the paper Top Left corner, or each of 4 page corners
641  wxPoint originCoord;
642 
643  // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
645 
646  switch( m_originSelectChoice )
647  {
648  default:
649  case 0: // Origin = paper Left Top corner
650  break;
651 
652  case 1: // Origin = page Right Bottom corner
653  dummy.SetStart( 0, 0, RB_CORNER );
654  originCoord = dummy.GetStartPosUi();
655  break;
656 
657  case 2: // Origin = page Left Bottom corner
658  dummy.SetStart( 0, 0, LB_CORNER );
659  originCoord = dummy.GetStartPosUi();
660  break;
661 
662  case 3: // Origin = page Right Top corner
663  dummy.SetStart( 0, 0, RT_CORNER );
664  originCoord = dummy.GetStartPosUi();
665  break;
666 
667  case 4: // Origin = page Left Top corner
668  dummy.SetStart( 0, 0, LT_CORNER );
669  originCoord = dummy.GetStartPosUi();
670  break;
671  }
672 
673  return originCoord;
674 }
675 
676 
678 {
679  wxString line;
680  wxString gridformatter;
681 
682  switch( m_userUnits )
683  {
684  case EDA_UNITS::INCHES: gridformatter = "grid %.3f"; break;
685  case EDA_UNITS::MILLIMETRES: gridformatter = "grid %.4f"; break;
686  default: gridformatter = "grid %f"; break;
687  }
688 
689  double grid = To_User_Unit( m_userUnits, GetCanvas()->GetGAL()->GetGridSize().x );
690  line.Printf( gridformatter, grid );
691 
692  SetStatusText( line, 4 );
693 }
694 
695 
697 {
698  // Display Zoom level:
699  SetStatusText( GetZoomLevelIndicator(), 1 );
700 
701  // coordinate origin can be the paper Top Left corner, or each of 4 page corners
702  wxPoint originCoord = ReturnCoordOriginCorner();
703  SetGridOrigin( originCoord );
704 
705  // We need the orientation of axis (sign of coordinates)
706  int Xsign = 1;
707  int Ysign = 1;
708 
709  switch( m_originSelectChoice )
710  {
711  default:
712  case 0: // Origin = paper Left Top corner
713  break;
714 
715  case 1: // Origin = page Right Bottom corner
716  Xsign = -1;
717  Ysign = -1;
718  break;
719 
720  case 2: // Origin = page Left Bottom corner
721  Ysign = -1;
722  break;
723 
724  case 3: // Origin = page Right Top corner
725  Xsign = -1;
726  break;
727 
728  case 4: // Origin = page Left Top corner
729  break;
730  }
731 
732  // Display absolute coordinates:
734  VECTOR2D coord = cursorPos - originCoord;
735  double dXpos = To_User_Unit( GetUserUnits(), coord.x * Xsign );
736  double dYpos = To_User_Unit( GetUserUnits(), coord.y * Ysign );
737 
738  wxString absformatter = wxT( "X %.4g Y %.4g" );
739  wxString locformatter = wxT( "dx %.4g dy %.4g" );
740 
741  switch( GetUserUnits() )
742  {
743  case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
744  case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
745  case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
746  case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
747  default: wxASSERT( false ); break;
748  }
749 
750  wxString line;
751 
752  // Display abs coordinates
753  line.Printf( absformatter, dXpos, dYpos );
754  SetStatusText( line, 2 );
755 
756  // Display relative coordinates:
757  if( GetScreen() )
758  {
759  double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
760  double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
761  dXpos = To_User_Unit( GetUserUnits(), dx * Xsign );
762  dYpos = To_User_Unit( GetUserUnits(), dy * Ysign );
763  line.Printf( locformatter, dXpos, dYpos );
764  SetStatusText( line, 3 );
765  }
766 
767  DisplayGridMsg();
768 
769  // Display corner reference for coord origin
770  line.Printf( _("coord origin: %s"),
771  m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
772  SetStatusText( line, 5 );
773 
774  // Display units
775 }
776 
777 
779 {
782 
783  for( DS_DATA_ITEM* dataItem : model.GetItems() )
784  {
785  // Ensure the scaling factor (used only in printing) of bitmaps is up to date
786  if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
787  {
788  BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
789  bitmap->SetPixelSizeIu( IU_PER_MILS * 1000 / bitmap->GetPPI() );
790  }
791  }
792 
793  PrintDrawingSheet( aSettings, GetScreen(), IU_PER_MILS, wxEmptyString );
794 
796  GetCanvas()->Refresh();
797 }
798 
799 
801 {
802  return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
803 }
804 
805 
807 {
808  return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
809 }
810 
811 
813 {
815 
817  PL_SELECTION& selection = selTool->GetSelection();
818  DS_DATA_ITEM* item = nullptr;
819 
820  if( selection.GetSize() == 1 )
821  item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
822 
825  GetCanvas()->Refresh();
826 }
827 
828 
830 {
831  DS_DATA_ITEM * item = nullptr;
832 
833  switch( aType )
834  {
836  item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
837  break;
838 
841  break;
842 
844  item = new DS_DATA_ITEM( DS_DATA_ITEM::DS_RECT );
845  break;
846 
848  item = new DS_DATA_ITEM_POLYGONS();
849  break;
850 
852  {
853  wxFileDialog fileDlg( this, _( "Choose Image" ), m_mruImagePath, wxEmptyString,
854  _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
855  wxFD_OPEN );
856 
857  if( fileDlg.ShowModal() != wxID_OK )
858  return nullptr;
859 
860  wxString fullFilename = fileDlg.GetPath();
861  m_mruImagePath = wxPathOnly( fullFilename );
862 
863  if( !wxFileExists( fullFilename ) )
864  {
865  wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
866  break;
867  }
868 
869  BITMAP_BASE* image = new BITMAP_BASE();
870 
871  if( !image->ReadImageFile( fullFilename ) )
872  {
873  wxMessageBox( _( "Could not load image from '%s'." ), fullFilename );
874  delete image;
875  break;
876  }
877 
878  // Set the scale factor for pl_editor (it is set for Eeschema by default)
879  image->SetPixelSizeIu( IU_PER_MILS * 1000.0 / image->GetPPI() );
880  item = new DS_DATA_ITEM_BITMAP( image );
881  }
882  break;
883  }
884 
885  if( item == nullptr )
886  return nullptr;
887 
889  item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
890 
891  return item;
892 }
893 
894 
896 {
898  GetScreen()->SetContentModified( false );
900 
903 
905 
907 
908  if( GetCurrentFileName().IsEmpty() )
909  {
910  // Default shutdown reason until a file is loaded
911  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New drawing sheet file is unsaved" ) );
912  }
913  else
914  {
915  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Drawing sheet changes are unsaved" ) );
916  }
917 }
918 
919 
920 void PL_EDITOR_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount )
921 {
922  if( aItemCount == 0 )
923  return;
924 
925  UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
926  unsigned icnt = list.m_CommandsList.size();
927 
928  if( aItemCount > 0 )
929  icnt = aItemCount;
930 
931  for( unsigned ii = 0; ii < icnt; ii++ )
932  {
933  if( list.m_CommandsList.size() == 0 )
934  break;
935 
936  PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
937  list.m_CommandsList.erase( list.m_CommandsList.begin() );
938 
939  curr_cmd->ClearListAndDeleteItems();
940  delete curr_cmd; // Delete command
941  }
942 }
943 
944 
946 {
947  return m_pageSelectBox->GetSelection() == 0;
948 }
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:239
Handle the graphic items list to draw/plot the frame and title block.
Definition: ds_data_model.h:38
void OnKiCadExit()
Definition: kiway.cpp:636
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)
for drawingsheetEditor previewing
Definition: layer_ids.h:249
static TOOL_ACTION drawLine
Definition: pl_actions.h:61
Definition: id.h:87
int GetHeightMils() const
Definition: page_info.h:133
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
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:1482
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.
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:48
The base class for create windows for drawing purpose.
VECTOR2< int > VECTOR2I
Definition: vector2d.h:622
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:208
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:72
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.
for drawingsheetEditor previewing
Definition: layer_ids.h:250
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.
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:70
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
bool IsContentModified() const override
Get if the drawing sheet has been modified but not saved.
T * GetAppSettings(bool aLoadNow=true)
Returns a handle to the a given settings by type If the settings have already been loaded,...
ACTIONS * m_actions
Definition: tools_holder.h:159
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:260
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
void SetLayerVisible(int aLayer, bool aVisible=true)
Control the visibility of a particular layer.
Definition: view.h:388
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
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:160
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.
wxString m_mruImagePath
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:158
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.)
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
Update the board display after modifying it by a python script (note: it is automatically called by a...
EDA_UNITS m_userUnits
Map containing the UI update handlers registered with wx for each action.
#define IU_PER_MILS
Definition: plotter.cpp:130
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:68
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 IsSingle() const
Is this KIFACE running under single_top?
Definition: kiface_base.h:104
bool LoadDrawingSheetFile(const wxString &aFullFileName)
Load a .kicad_wks drawing sheet file.
EDA_UNITS GetUserUnits() const
Return the user units currently in use.
virtual void SetDrawBgColor(const COLOR4D &aColor)
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)