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-2020 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 
66 BEGIN_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 END_EVENT_TABLE()
78 
79 
80 PL_EDITOR_FRAME::PL_EDITOR_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
81  EDA_DRAW_FRAME( aKiway, aParent, FRAME_PL_EDITOR, wxT( "PlEditorFrame" ),
82  wxDefaultPosition, wxDefaultSize,
84  m_propertiesFrameWidth( 200 ),
85  m_originSelectBox( nullptr ),
86  m_originSelectChoice( 0 ),
87  m_pageSelectBox( nullptr ),
88  m_propertiesPagelayout( nullptr )
89 {
90  m_maximizeByDefault = true;
91  m_userUnits = EDA_UNITS::MILLIMETRES;
92 
93  m_showBorderAndTitleBlock = true; // true for reference drawings.
95  SetShowPageLimits( true );
96  m_aboutTitle = _( "KiCad Drawing Sheet Editor" );
97 
98  // Give an icon
99  wxIcon icon;
100  wxIconBundle icon_bundle;
101 
102  icon.CopyFromBitmap( KiBitmap( icon_pagelayout_editor_xpm ) );
103  icon_bundle.AddIcon( icon );
104  icon.CopyFromBitmap( KiBitmap( icon_pagelayout_editor_32_xpm ) );
105  icon_bundle.AddIcon( icon );
106  icon.CopyFromBitmap( KiBitmap( icon_pagelayout_editor_16_xpm ) );
107  icon_bundle.AddIcon( icon );
108 
109  SetIcons( icon_bundle );
110 
111  // Create GAL canvas
112  auto* drawPanel = new PL_DRAW_PANEL_GAL( this, -1, wxPoint( 0, 0 ), m_frameSize,
113  GetGalDisplayOptions(),
115  SetCanvas( drawPanel );
116 
117  LoadSettings( config() );
118 
119  wxSize pageSizeIU = GetPageLayout().GetPageSettings().GetSizeIU();
120  SetScreen( new BASE_SCREEN( pageSizeIU ) );
121 
122  setupTools();
123  setupUIConditions();
124  ReCreateMenuBar();
125  ReCreateHToolbar();
126  ReCreateVToolbar();
127  ReCreateOptToolbar();
128 
129  wxWindow* stsbar = GetStatusBar();
130  int dims[] = {
131 
132  // balance of status bar on far left is set to a default or whatever is left over.
133  -1,
134 
135  // When using GetTextSize() remember the width of '1' is not the same
136  // as the width of '0' unless the font is fixed width, and it usually won't be.
137 
138  // zoom:
139  KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x + 10,
140 
141  // cursor coords
142  KIUI::GetTextSize( wxT( "X 0234.567 Y 0234.567" ), stsbar ).x + 10,
143 
144  // delta distances
145  KIUI::GetTextSize( wxT( "dx 0234.567 dx 0234.567" ), stsbar ).x + 10,
146 
147  // grid size
148  KIUI::GetTextSize( wxT( "grid 0234.567" ), stsbar ).x + 10,
149 
150  // Coord origin (use the bigger message)
151  KIUI::GetTextSize( _( "coord origin: Right Bottom page corner" ), stsbar ).x + 10,
152 
153  // units display, Inches is bigger than mm
154  KIUI::GetTextSize( _( "Inches" ), stsbar ).x + 20
155  };
156 
157  SetStatusWidths( arrayDim( dims ), dims );
158 
159  m_auimgr.SetManagedWindow( this );
160 
161  CreateInfoBar();
162  m_propertiesPagelayout = new PROPERTIES_FRAME( this );
163 
164  // Rows; layers 4 - 6
165  m_auimgr.AddPane( m_mainToolBar, EDA_PANE().HToolbar().Name( "MainToolbar" )
166  .Top().Layer( 6 ) );
167  m_auimgr.AddPane( m_optionsToolBar, EDA_PANE().VToolbar().Name( "OptToolbar" )
168  .Left().Layer( 3 ) );
169  m_auimgr.AddPane( m_messagePanel, EDA_PANE().Messages().Name( "MsgPanel" )
170  .Bottom().Layer( 6 ) );
171 
172  // Columns; layers 1 - 3
173  m_auimgr.AddPane( m_drawToolBar, EDA_PANE().VToolbar().Name( "ToolsToolbar" )
174  .Right().Layer( 2 ) );
175 
176  m_auimgr.AddPane( m_propertiesPagelayout, EDA_PANE().Palette().Name( "Props" )
177  .Right().Layer( 3 )
178  .Caption( _( "Properties" ) )
179  .MinSize( m_propertiesPagelayout->GetMinSize() )
180  .BestSize( m_propertiesFrameWidth, -1 ) );
181 
182  // Center
183  m_auimgr.AddPane( GetCanvas(), EDA_PANE().Canvas().Name( "DrawFrame" )
184  .Center() );
185 
186  FinishAUIInitialization();
187 
188  resolveCanvasType();
189  SwitchCanvas( m_canvasType );
190 
191  // Add the exit key handler
192  setupUnits( config() );
193 
194  wxPoint originCoord = ReturnCoordOriginCorner();
195  SetGridOrigin( originCoord );
196 
197  // Initialize the current page layout
198 #if 0 //start with empty layout
201 #else // start with the default Kicad layout
203 #endif
204  OnNewPageLayout();
205 
206  // Ensure the window is on top
207  Raise();
208 }
209 
210 
212 {
213  // Shutdown all running tools
214  if( m_toolManager )
216 }
217 
218 
220 {
221  // Create the manager and dispatcher & route draw panel events to the dispatcher
223  m_toolManager->SetEnvironment( nullptr, GetCanvas()->GetView(),
224  GetCanvas()->GetViewControls(), config(), this );
225  m_actions = new PL_ACTIONS();
227 
229 
230  // Register tools
241 
242  // Run the selection tool, it is supposed to be always active
243  m_toolManager->InvokeTool( "plEditor.InteractiveSelection" );
244 }
245 
246 
248 {
250 
252  EDITOR_CONDITIONS cond( this );
253 
254  wxASSERT( mgr );
255 
256 #define ENABLE( x ) ACTION_CONDITIONS().Enable( x )
257 #define CHECK( x ) ACTION_CONDITIONS().Check( x )
258 
260  mgr->SetConditions( ACTIONS::undo, ENABLE( cond.UndoAvailable() ) );
261  mgr->SetConditions( ACTIONS::redo, ENABLE( cond.RedoAvailable() ) );
262 
268 
273 
277 
282 
283  // Not a tool, just a way to activate the action
285 
286  auto titleBlockNormalMode =
287  [] ( const SELECTION& )
288  {
289  return DS_DATA_MODEL::GetTheInstance().m_EditMode == false;
290  };
291 
292  auto titleBlockEditMode =
293  [] ( const SELECTION& )
294  {
295  return DS_DATA_MODEL::GetTheInstance().m_EditMode == true;
296  };
297 
298  mgr->SetConditions( PL_ACTIONS::layoutNormalMode, CHECK( titleBlockNormalMode ) );
299  mgr->SetConditions( PL_ACTIONS::layoutEditMode, CHECK( titleBlockEditMode ) );
300 
301 #undef CHECK
302 #undef ENABLE
303 }
304 
305 
306 bool PL_EDITOR_FRAME::OpenProjectFiles( const std::vector<wxString>& aFileSet, int aCtl )
307 {
308  wxString fn = aFileSet[0];
309 
310  if( !LoadPageLayoutDescrFile( fn ) )
311  {
312  wxMessageBox( wxString::Format( _( "Error when loading file \"%s\"" ), fn ) );
313  return false;
314  }
315  else
316  {
317  OnNewPageLayout();
318  return true;
319  }
320 }
321 
322 
324 {
325  return GetScreen() && GetScreen()->IsModify();
326 }
327 
328 
329 void PL_EDITOR_FRAME::OnExit( wxCommandEvent& aEvent )
330 {
331  if( aEvent.GetId() == wxID_EXIT )
332  Kiway().OnKiCadExit();
333 
334  if( aEvent.GetId() == wxID_CLOSE || Kiface().IsSingle() )
335  Close( false );
336 }
337 
338 
339 bool PL_EDITOR_FRAME::canCloseWindow( wxCloseEvent& aEvent )
340 {
341  // Shutdown blocks must be determined and vetoed as early as possible
343  && aEvent.GetId() == wxEVT_QUERY_END_SESSION
344  && IsContentModified() )
345  {
346  return false;
347  }
348 
349  if( IsContentModified() )
350  {
351  wxFileName filename = GetCurrentFileName();
352  wxString msg = _( "Save changes to \"%s\" before closing?" );
353 
354  if( !HandleUnsavedChanges( this, wxString::Format( msg, filename.GetFullName() ),
355  [&]() -> bool
356  {
357  return saveCurrentPageLayout();
358  } ) )
359  {
360  return false;
361  }
362  }
363 
364  return true;
365 }
366 
367 
369 {
370  // do not show the window because we do not want any paint event
371  Show( false );
372 
373  // clean up the data before the view is destroyed
375 
376  // On Linux, m_propertiesPagelayout must be destroyed
377  // before deleting the main frame to avoid a crash when closing
378  m_propertiesPagelayout->Destroy();
379  Destroy();
380 }
381 
382 
383 /* Handles the selection of tools, menu, and popup menu commands.
384  */
385 void PL_EDITOR_FRAME::OnSelectPage( wxCommandEvent& event )
386 {
387  KIGFX::VIEW* view = GetCanvas()->GetView();
388  view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGE1, m_pageSelectBox->GetSelection() == 0 );
389  view->SetLayerVisible( LAYER_DRAWINGSHEET_PAGEn, m_pageSelectBox->GetSelection() == 1 );
390  GetCanvas()->Refresh();
391 }
392 
393 
394 /* called when the user select one of the 4 page corner as corner
395  * reference (or the left top paper corner)
396  */
397 void PL_EDITOR_FRAME::OnSelectCoordOriginCorner( wxCommandEvent& event )
398 {
399  m_originSelectChoice = m_originSelectBox->GetSelection();
400  UpdateStatusBar(); // Update grid origin
402  GetCanvas()->Refresh();
403 }
404 
405 
406 void PL_EDITOR_FRAME::ToPrinter( bool doPreview )
407 {
408  // static print data and page setup data, to remember settings during the session
409  static wxPrintData* s_PrintData;
410  static wxPageSetupDialogData* s_pageSetupData = nullptr;
411 
412  const PAGE_INFO& pageInfo = GetPageSettings();
413 
414  if( s_PrintData == NULL ) // First print
415  {
416  s_PrintData = new wxPrintData();
417  s_PrintData->SetQuality( wxPRINT_QUALITY_HIGH ); // Default resolution = HIGH;
418  }
419 
420  if( !s_PrintData->Ok() )
421  {
422  wxMessageBox( _( "Error Init Printer info" ) );
423  return;
424  }
425 
426  if( s_pageSetupData == NULL )
427  s_pageSetupData = new wxPageSetupDialogData( *s_PrintData );
428 
429  s_pageSetupData->SetPaperId( pageInfo.GetPaperId() );
430  s_pageSetupData->GetPrintData().SetOrientation( pageInfo.GetWxOrientation() );
431 
432  if( pageInfo.IsCustom() )
433  {
434  if( pageInfo.IsPortrait() )
435  s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetWidthMils() ),
436  Mils2mm( pageInfo.GetHeightMils() ) ) );
437  else
438  s_pageSetupData->SetPaperSize( wxSize( Mils2mm( pageInfo.GetHeightMils() ),
439  Mils2mm( pageInfo.GetWidthMils() ) ) );
440  }
441 
442  *s_PrintData = s_pageSetupData->GetPrintData();
443 
444  if( doPreview )
445  InvokeDialogPrintPreview( this, s_PrintData );
446  else
447  InvokeDialogPrint( this, s_PrintData, s_pageSetupData );
448 }
449 
450 
451 const BOX2I PL_EDITOR_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
452 {
453  BOX2I rv( VECTOR2I( 0, 0 ), GetPageLayout().GetPageSettings().GetSizeIU() );
454  return rv;
455 }
456 
457 
459  PANEL_HOTKEYS_EDITOR* aHotkeysPanel )
460 {
461  wxTreebook* book = aParent->GetTreebook();
462 
463  book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) );
464  book->AddSubPage( new PANEL_GAL_DISPLAY_OPTIONS( this, aParent ), _( "Display Options" ) );
465  book->AddSubPage( new PANEL_PL_EDITOR_COLOR_SETTINGS( this, aParent->GetTreebook() ), _( "Colors" ) );
466 
467  aHotkeysPanel->AddHotKeys( GetToolManager() );
468 }
469 
470 
472 {
474 
475  if( aCfg->m_Window.grid.sizes.empty() )
476  {
477  aCfg->m_Window.grid.sizes = { "1.0 mm",
478  "0.50 mm",
479  "0.25 mm",
480  "0.20 mm",
481  "0.10 mm" };
482  }
483 
484  // Currently values read from config file are not used because the user cannot
485  // change this config
486  // if( aCfg->m_Window.zoom_factors.empty() )
487  {
489  }
490 
491  PL_EDITOR_SETTINGS* cfg = dynamic_cast<PL_EDITOR_SETTINGS*>( aCfg );
492  wxCHECK( cfg, /*void*/ );
493 
496 
498 
501 
502  PAGE_INFO pageInfo = GetPageSettings();
503  pageInfo.SetType( cfg->m_LastPaperSize, cfg->m_LastWasPortrait );
504  SetPageSettings( pageInfo );
505 }
506 
507 
509 {
511 
512  auto cfg = static_cast<PL_EDITOR_SETTINGS*>( aCfg );
513 
515 
516  cfg->m_PropertiesFrameWidth = m_propertiesFrameWidth;
517  cfg->m_CornerOrigin = m_originSelectChoice;
518  cfg->m_BlackBackground = GetDrawBgColor() == BLACK;
519  cfg->m_LastPaperSize = GetPageSettings().GetType();
520  cfg->m_LastWasPortrait = GetPageSettings().IsPortrait();
521  cfg->m_LastCustomWidth = PAGE_INFO::GetCustomWidthMils();
522  cfg->m_LastCustomHeight = PAGE_INFO::GetCustomHeightMils();
523 }
524 
525 
527 {
528  wxString title;
529  wxFileName file( GetCurrentFileName() );
530 
531  title.Printf( wxT( "%s \u2014 " ) + _( "Drawing Sheet Editor" ),
532  file.IsOk() ? file.GetName() : _( "no file selected" ) );
533  SetTitle( title );
534 }
535 
536 
538 {
540 }
541 
542 
543 void PL_EDITOR_FRAME::SetCurrentFileName( const wxString& aName )
544 {
546 }
547 
548 
549 void PL_EDITOR_FRAME::SetPageSettings( const PAGE_INFO& aPageSettings )
550 {
551  m_pageLayout.SetPageSettings( aPageSettings );
552 
553  if( GetScreen() )
554  GetScreen()->InitDataPoints( aPageSettings.GetSizeIU() );
555 }
556 
557 
559 {
560  return m_pageLayout.GetPageSettings();
561 }
562 
563 
564 const wxSize PL_EDITOR_FRAME::GetPageSizeIU() const
565 {
566  // this function is only needed because EDA_DRAW_FRAME is not compiled
567  // with either -DPCBNEW or -DEESCHEMA, so the virtual is used to route
568  // into an application specific source file.
569  return m_pageLayout.GetPageSettings().GetSizeIU();
570 }
571 
572 
574 {
575  return GetPageLayout().GetTitleBlock();
576 }
577 
578 
579 void PL_EDITOR_FRAME::SetTitleBlock( const TITLE_BLOCK& aTitleBlock )
580 {
581  m_pageLayout.SetTitleBlock( aTitleBlock );
582 }
583 
584 
585 void PL_EDITOR_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
586 {
587  EDA_DRAW_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
588 
589  SETTINGS_MANAGER& settingsManager = Pgm().GetSettingsManager();
590  PL_EDITOR_SETTINGS* cfg = settingsManager.GetAppSettings<PL_EDITOR_SETTINGS>();
591  COLOR_SETTINGS* colors = settingsManager.GetColorSettings( cfg->m_ColorTheme );
592 
594 
596  GetCanvas()->Refresh();
597 
599  Layout();
600  SendSizeEvent();
601 }
602 
603 
605 {
606  // calculate the position (in page, in iu) of the corner used as coordinate origin
607  // coordinate origin can be the paper Top Left corner, or each of 4 page corners
608  wxPoint originCoord;
609 
610  // To avoid duplicate code, we use a dummy segment starting at 0,0 in relative coord
612 
613  switch( m_originSelectChoice )
614  {
615  default:
616  case 0: // Origin = paper Left Top corner
617  break;
618 
619  case 1: // Origin = page Right Bottom corner
620  dummy.SetStart( 0, 0, RB_CORNER );
621  originCoord = dummy.GetStartPosUi();
622  break;
623 
624  case 2: // Origin = page Left Bottom corner
625  dummy.SetStart( 0, 0, LB_CORNER );
626  originCoord = dummy.GetStartPosUi();
627  break;
628 
629  case 3: // Origin = page Right Top corner
630  dummy.SetStart( 0, 0, RT_CORNER );
631  originCoord = dummy.GetStartPosUi();
632  break;
633 
634  case 4: // Origin = page Left Top corner
635  dummy.SetStart( 0, 0, LT_CORNER );
636  originCoord = dummy.GetStartPosUi();
637  break;
638  }
639 
640  return originCoord;
641 }
642 
643 
644 /*
645  * Display the grid status.
646  */
648 {
649  wxString line;
650  wxString gridformatter;
651 
652  switch( m_userUnits )
653  {
654  case EDA_UNITS::INCHES: gridformatter = "grid %.3f"; break;
655  case EDA_UNITS::MILLIMETRES: gridformatter = "grid %.4f"; break;
656  default: gridformatter = "grid %f"; break;
657  }
658 
659  double grid = To_User_Unit( m_userUnits, GetCanvas()->GetGAL()->GetGridSize().x );
660  line.Printf( gridformatter, grid );
661 
662  SetStatusText( line, 4 );
663 }
664 
665 
667 {
668  // Display Zoom level:
669  SetStatusText( GetZoomLevelIndicator(), 1 );
670 
671  // coordinate origin can be the paper Top Left corner, or each of 4 page corners
672  wxPoint originCoord = ReturnCoordOriginCorner();
673  SetGridOrigin( originCoord );
674 
675  // We need the orientation of axis (sign of coordinates)
676  int Xsign = 1;
677  int Ysign = 1;
678 
679  switch( m_originSelectChoice )
680  {
681  default:
682  case 0: // Origin = paper Left Top corner
683  break;
684 
685  case 1: // Origin = page Right Bottom corner
686  Xsign = -1;
687  Ysign = -1;
688  break;
689 
690  case 2: // Origin = page Left Bottom corner
691  Ysign = -1;
692  break;
693 
694  case 3: // Origin = page Right Top corner
695  Xsign = -1;
696  break;
697 
698  case 4: // Origin = page Left Top corner
699  break;
700  }
701 
702  // Display absolute coordinates:
704  VECTOR2D coord = cursorPos - originCoord;
705  double dXpos = To_User_Unit( GetUserUnits(), coord.x * Xsign );
706  double dYpos = To_User_Unit( GetUserUnits(), coord.y * Ysign );
707 
708  wxString absformatter = wxT( "X %.4g Y %.4g" );
709  wxString locformatter = wxT( "dx %.4g dy %.4g" );
710 
711  switch( GetUserUnits() )
712  {
713  case EDA_UNITS::INCHES: SetStatusText( _( "inches" ), 6 ); break;
714  case EDA_UNITS::MILS: SetStatusText( _( "mils" ), 6 ); break;
715  case EDA_UNITS::MILLIMETRES: SetStatusText( _( "mm" ), 6 ); break;
716  case EDA_UNITS::UNSCALED: SetStatusText( wxEmptyString, 6 ); break;
717  default: wxASSERT( false ); break;
718  }
719 
720  wxString line;
721 
722  // Display abs coordinates
723  line.Printf( absformatter, dXpos, dYpos );
724  SetStatusText( line, 2 );
725 
726  // Display relative coordinates:
727  if( GetScreen() )
728  {
729  double dx = cursorPos.x - GetScreen()->m_LocalOrigin.x;
730  double dy = cursorPos.y - GetScreen()->m_LocalOrigin.y;
731  dXpos = To_User_Unit( GetUserUnits(), dx * Xsign );
732  dYpos = To_User_Unit( GetUserUnits(), dy * Ysign );
733  line.Printf( locformatter, dXpos, dYpos );
734  SetStatusText( line, 3 );
735  }
736 
737  DisplayGridMsg();
738 
739  // Display corner reference for coord origin
740  line.Printf( _("coord origin: %s"),
741  m_originSelectBox->GetString( m_originSelectChoice ).GetData() );
742  SetStatusText( line, 5 );
743 
744  // Display units
745 }
746 
747 
749 {
752 
753  for( DS_DATA_ITEM* dataItem : model.GetItems() )
754  {
755  // Ensure the scaling factor (used only in printing) of bitmaps is up to date
756  if( dataItem->GetType() == DS_DATA_ITEM::DS_BITMAP )
757  {
758  BITMAP_BASE* bitmap = static_cast<DS_DATA_ITEM_BITMAP*>( dataItem )->m_ImageBitmap;
759  bitmap->SetPixelSizeIu( IU_PER_MILS * 1000 / bitmap->GetPPI() );
760  }
761  }
762 
763  PrintDrawingSheet( aSettings, GetScreen(), IU_PER_MILS, wxEmptyString );
764 
766  GetCanvas()->Refresh();
767 }
768 
769 
771 {
772  return static_cast<PL_DRAW_PANEL_GAL*>( EDA_DRAW_FRAME::GetCanvas() );
773 }
774 
775 
777 {
778  return m_toolManager->GetTool<PL_SELECTION_TOOL>()->GetSelection();
779 }
780 
781 
783 {
785 
787  PL_SELECTION& selection = selTool->GetSelection();
788  DS_DATA_ITEM* item = nullptr;
789 
790  if( selection.GetSize() == 1 )
791  item = static_cast<DS_DRAW_ITEM_BASE*>( selection.Front() )->GetPeer();
792 
795  GetCanvas()->Refresh();
796 }
797 
798 
800 {
801  DS_DATA_ITEM * item = NULL;
802 
803  switch( aType )
804  {
806  item = new DS_DATA_ITEM_TEXT( wxT( "Text") );
807  break;
808 
811  break;
812 
814  item = new DS_DATA_ITEM( DS_DATA_ITEM::DS_RECT );
815  break;
816 
818  item = new DS_DATA_ITEM_POLYGONS();
819  break;
820 
822  {
823  wxFileDialog fileDlg( this, _( "Choose Image" ), wxEmptyString, wxEmptyString,
824  _( "Image Files" ) + wxS( " " ) + wxImage::GetImageExtWildcard(),
825  wxFD_OPEN );
826 
827  if( fileDlg.ShowModal() != wxID_OK )
828  return NULL;
829 
830  wxString fullFilename = fileDlg.GetPath();
831 
832  if( !wxFileExists( fullFilename ) )
833  {
834  wxMessageBox( _( "Couldn't load image from \"%s\"" ), fullFilename );
835  break;
836  }
837 
838  BITMAP_BASE* image = new BITMAP_BASE();
839 
840  if( !image->ReadImageFile( fullFilename ) )
841  {
842  wxMessageBox( _( "Couldn't load image from \"%s\"" ), fullFilename );
843  delete image;
844  break;
845  }
846 
847  // Set the scale factor for pl_editor (it is set for eeschema by default)
848  image->SetPixelSizeIu( IU_PER_MILS * 1000.0 / image->GetPPI() );
849  item = new DS_DATA_ITEM_BITMAP( image );
850  }
851  break;
852  }
853 
854  if( item == NULL )
855  return NULL;
856 
858  item->SyncDrawItems( nullptr, GetCanvas()->GetView() );
859 
860  return item;
861 }
862 
863 
865 {
867  GetScreen()->ClrModify();
869 
872 
874 
876 
877  if( GetCurrentFileName().IsEmpty() )
878  {
879  // Default shutdown reason until a file is loaded
880  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "New page layout file is unsaved" ) );
881  }
882  else
883  {
884  KIPLATFORM::APP::SetShutdownBlockReason( this, _( "Page layout changes are unsaved" ) );
885  }
886 }
887 
888 
889 void PL_EDITOR_FRAME::ClearUndoORRedoList( UNDO_REDO_LIST whichList, int aItemCount )
890 {
891  if( aItemCount == 0 )
892  return;
893 
894  UNDO_REDO_CONTAINER& list = whichList == UNDO_LIST ? m_undoList : m_redoList;
895  unsigned icnt = list.m_CommandsList.size();
896 
897  if( aItemCount > 0 )
898  icnt = aItemCount;
899 
900  for( unsigned ii = 0; ii < icnt; ii++ )
901  {
902  if( list.m_CommandsList.size() == 0 )
903  break;
904 
905  PICKED_ITEMS_LIST* curr_cmd = list.m_CommandsList[0];
906  list.m_CommandsList.erase( list.m_CommandsList.begin() );
907 
908  curr_cmd->ClearListAndDeleteItems();
909  delete curr_cmd; // Delete command
910  }
911 }
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)
Function ToPrinter Open a dialog frame to print layers.
void ClearList()
Erase the list of items.
virtual void PrintPage(const RENDER_SETTINGS *aSettings) override
Virtual function PrintPage used to 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:208
bool IsContentModified() override
Get if the page layout has been modified but not saved.
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:587
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:56
void HardRedraw() override
Refresh the library tree and redraw the window.
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:80
PL_DRAW_PANEL_GAL * GetCanvas() const override
Return a pointer to GAL-based canvas of given EDA draw frame.
void 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.
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
Function ClearUndoORRedoList.
static TOOL_ACTION layoutEditMode
Definition: pl_actions.h:72
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:75
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:65
Definition: id.h:88
int GetHeightMils() const
Definition: page_info.h:133
UNDO_REDO_CONTAINER m_undoList
static TOOL_ACTION zoomTool
Definition: actions.h:102
static TOOL_ACTION placeImage
Definition: pl_actions.h:63
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
PROPERTIES_FRAME display properties of the current item.
PL_EDITOR_FRAME is 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:1412
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:99
static TOOL_ACTION millimetersUnits
Definition: actions.h:149
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:141
std::vector< DS_DATA_ITEM * > & GetItems()
static LIB_PART * dummy()
Used to draw a dummy shape when a LIB_PART is not found in library.
Definition: sch_symbol.cpp:69
#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:62
Manage TOOL_ACTION objects.
Definition: color4d.h:44
Gather all the actions that are shared by tools.
Definition: pl_actions.h:39
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.
void DisplayWorksheet()
Build and update the list of WS_DRAW_ITEM_xxx showing the frame layout.
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
static wxString m_PageLayoutDescrFileName
the name of the page layout descr file, or emty to used the default pagelayout
Definition: base_screen.h:89
wxTreebook * GetTreebook()
Definition: paged_dialog.h:52
void SetShutdownBlockReason(wxWindow *aWindow, const wxString &aReason)
Sets the block reason why the window/application is preventing OS shutdown.
Definition: gtk/app.cpp:51
void InitDataPoints(const wxSize &aPageSizeInternalUnits)
Definition: base_screen.cpp:47
Master controller class:
Definition: tool_manager.h:52
wxBitmap KiBitmap(BITMAP_DEF aBitmap)
Construct a wxBitmap from a memory record, held in a BITMAP_DEF.
Definition: bitmap.cpp:82
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:70
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.
#define NULL
bool IsSingle() const
Is this KIFACE_I running under single_top?
Definition: kiface_i.h:104
void AllowVoidList(bool Allow)
In KiCad applications, a page layout description is needed So if the list is empty,...
Definition: ds_data_model.h:81
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:58
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()
const BITMAP_OPAQUE icon_pagelayout_editor_xpm[1]
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:143
GAL not used (the legacy wxDC engine is used)
void OnExit(wxCommandEvent &aEvent)
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:147
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:54
for drawingsheetEditor previewing
KIFACE_I & Kiface()
Global KIFACE_I "get" accessor.
int Mils2mm(double x)
Convert mils to mm.
Definition: base_units.h:65
const BITMAP_OPAQUE icon_pagelayout_editor_16_xpm[1]
ACTIONS * m_actions
Definition: tools_holder.h:158
static TOOL_ACTION cut
Definition: actions.h:69
void OnNewPageLayout()
Must be called to initialize parameters when a new page layout description is loaded.
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
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:40
#define KICAD_DEFAULT_DRAWFRAME_STYLE
bool IsModify() const
Definition: base_screen.h:63
SELECTION & GetCurrentSelection() override
Get the current selection from the canvas area.
static TOOL_ACTION drawRectangle
Definition: pl_actions.h:64
void doCloseWindow() override
const BITMAP_OPAQUE icon_pagelayout_editor_32_xpm[1]
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.
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:148
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:159
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
Remove the aItemCount of old commands from aList and delete commands, pickers and picked items if nee...
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
#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:68
WINDOW_SETTINGS m_Window
Definition: app_settings.h:181
void SetCurrentFileName(const wxString &aName)
Stores the current layout descr 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:91
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
void UpdateTitleAndInfo()
Displays the short filename (if exists) loaded file on the caption of the main window.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:157
see class PGM_BASE
Drawing sheet structure type definitions.
Definition: ds_data_item.h:95
ACTION_MANAGER * GetActionManager()
Definition: tool_manager.h:197
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.
#define _(s)
Definition: 3d_actions.cpp:33
SELECTION_CONDITION UndoAvailable()
Create a functor that tests if there are any items in the undo queue.
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
void SetTitleBlock(const TITLE_BLOCK &aTitleBlock)
Tool responsible for drawing/placing items (lines, rectangles, text, etc.)
bool LoadPageLayoutDescrFile(const wxString &aFullFileName)
Function LoadPageLayoutDescrFile Loads a .kicad_wks page layout descr file.
void ClrModify()
Definition: base_screen.h:60
EDA_UNITS m_userUnits
Map containing the UI update handlers registered with wx for each action.
#define IU_PER_MILS
Definition: plotter.cpp:137
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
static TOOL_ACTION appendImportedWorksheet
Definition: pl_actions.h:66
bool Destroy() override
Our version of Destroy() which is virtual from wxWidgets.
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.
bool ReadImageFile(const wxString &aFullFilename)
Reads and stores in memory an image file.
static TOOL_ACTION deleteTool
Definition: actions.h:76
void CopyPrmsFromItemToPanel(DS_DATA_ITEM *aItem)
Definition: id.h:87
virtual COLOR4D GetDrawBgColor() const
static TOOL_ACTION undo
Definition: actions.h:67
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
static TOOL_ACTION layoutNormalMode
Definition: pl_actions.h:71
void setupUIConditions() override
Setup the UI conditions for the various actions and their controls in this frame.
static TOOL_ACTION toggleCursorStyle
Definition: actions.h:105
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)
DS_DATA_ITEM * AddPageLayoutItem(int aType)
Function AddPageLayoutItem Add a new item to the page layout item list.
const PL_EDITOR_LAYOUT & GetPageLayout() const
void Append(DS_DATA_ITEM *aItem)
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:71
static VRML_COLOR colors[VRML_COLOR_LAST]
wxChoice * m_originSelectBox
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:156
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:94
#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)