KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eda_draw_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) 2004-2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2008 Wayne Stambaugh <[email protected]>
6 * Copyright (C) 2004-2023 KiCad Developers, see AUTHORS.txt for contributors.
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
27#include <base_screen.h>
28#include <bitmaps.h>
29#include <confirm.h>
30#include <core/arraydim.h>
31#include <core/kicad_algo.h>
32#include <dialog_shim.h>
34#include <eda_draw_frame.h>
35#include <file_history.h>
37#include <id.h>
38#include <kiface_base.h>
39#include <kiplatform/ui.h>
40#include <lockfile.h>
41#include <macros.h>
42#include <math/vector2wx.h>
43#include <page_info.h>
44#include <paths.h>
45#include <pgm_base.h>
46#include <render_settings.h>
51#include <title_block.h>
52#include <tool/actions.h>
53#include <tool/action_toolbar.h>
54#include <tool/common_tools.h>
55#include <tool/grid_menu.h>
58#include <tool/tool_manager.h>
59#include <tool/tool_menu.h>
60#include <tool/zoom_menu.h>
61#include <trace_helpers.h>
62#include <view/view.h>
64#include <view/view_controls.h>
65#include <widgets/msgpanel.h>
68#include <wx/event.h>
69#include <wx/snglinst.h>
70#include <widgets/ui_common.h>
71#include <widgets/search_pane.h>
72#include <wx/dirdlg.h>
73#include <wx/filedlg.h>
74#include <wx/msgdlg.h>
75#include <wx/socket.h>
76
77#include <wx/snglinst.h>
78#include <wx/fdrepdlg.h>
79
80#define FR_HISTORY_LIST_CNT 10
81
82
83BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER )
86
87 EVT_ACTIVATE( EDA_DRAW_FRAME::onActivate )
88END_EVENT_TABLE()
89
90
91bool EDA_DRAW_FRAME::m_openGLFailureOccured = false;
92
93
94EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
95 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
96 long aStyle, const wxString& aFrameName,
97 const EDA_IU_SCALE& aIuScale ) :
98 KIWAY_PLAYER( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName, aIuScale ),
99 m_socketServer( nullptr ),
100 m_lastToolbarIconSize( 0 )
101{
102 m_mainToolBar = nullptr;
103 m_drawToolBar = nullptr;
104 m_optionsToolBar = nullptr;
105 m_auxiliaryToolBar = nullptr;
106 m_gridSelectBox = nullptr;
107 m_zoomSelectBox = nullptr;
108 m_searchPane = nullptr;
109 m_undoRedoCountMax = DEFAULT_MAX_UNDO_ITEMS;
110
112 m_canvas = nullptr;
113 m_toolDispatcher = nullptr;
114 m_messagePanel = nullptr;
115 m_currentScreen = nullptr;
116 m_showBorderAndTitleBlock = false; // true to display reference sheet.
117 m_gridColor = COLOR4D( DARKGRAY ); // Default grid color
118 m_drawBgColor = COLOR4D( BLACK ); // the background color of the draw canvas:
119 // BLACK for Pcbnew, BLACK or WHITE for Eeschema
120 m_colorSettings = nullptr;
121 m_msgFrameHeight = EDA_MSG_PANEL::GetRequiredHeight( this );
122 m_polarCoords = false;
123 m_findReplaceData = std::make_unique<EDA_SEARCH_DATA>();
124 m_hotkeyPopup = nullptr;
125 m_propertiesPanel = nullptr;
126 m_netInspectorPanel = nullptr;
127
128 SetUserUnits( EDA_UNITS::MILLIMETRES );
129
130 m_auimgr.SetFlags( wxAUI_MGR_DEFAULT );
131
132 if( ( aStyle & wxFRAME_NO_TASKBAR ) == 0 )
133 {
134 CreateStatusBar( 8 )->SetDoubleBuffered( true );
135
136 // set the size of the status bar subwindows:
137
138 wxWindow* stsbar = GetStatusBar();
139 int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
140
141 int dims[] =
142 {
143 // remainder of status bar on far left is set to a default or whatever is left over.
144 -1,
145
146 // When using GetTextSize() remember the width of character '1' is not the same
147 // as the width of '0' unless the font is fixed width, and it usually won't be.
148
149 // zoom:
150 KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x,
151
152 // cursor coords
153 KIUI::GetTextSize( wxT( "X 1234.1234 Y 1234.1234" ), stsbar ).x,
154
155 // delta distances
156 KIUI::GetTextSize( wxT( "dx 1234.1234 dy 1234.1234 dist 1234.1234" ), stsbar ).x,
157
158 // grid size
159 KIUI::GetTextSize( wxT( "grid X 1234.1234 Y 1234.1234" ), stsbar ).x,
160
161 // units display, Inches is bigger than mm
162 KIUI::GetTextSize( _( "Inches" ), stsbar ).x,
163
164 // Size for the "Current Tool" panel; longest string from SetTool()
165 KIUI::GetTextSize( wxT( "Add layer alignment target" ), stsbar ).x,
166
167 // constraint mode
168 KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x
169 };
170
171 for( size_t ii = 1; ii < arrayDim( dims ); ii++ )
172 dims[ii] += spacer;
173
174 SetStatusWidths( arrayDim( dims ), dims );
175 stsbar->SetFont( KIUI::GetStatusFont( this ) );
176 }
177
178 // Create child subwindows.
179 GetClientSize( &m_frameSize.x, &m_frameSize.y );
180 m_framePos.x = m_framePos.y = 0;
181 m_frameSize.y -= m_msgFrameHeight;
182
183 m_messagePanel = new EDA_MSG_PANEL( this, -1, wxPoint( 0, m_frameSize.y ),
184 wxSize( m_frameSize.x, m_msgFrameHeight ) );
185
186 m_messagePanel->SetBackgroundColour( COLOR4D( LIGHTGRAY ).ToColour() );
187
188 Bind( wxEVT_DPI_CHANGED,
189 [&]( wxDPIChangedEvent& )
190 {
191 wxMoveEvent dummy;
192 OnMove( dummy );
193
194 // we need to kludge the msg panel to the correct size again
195 // especially important even for first launches as the constructor of the window
196 // here usually doesn't have the correct dpi awareness yet
197 m_frameSize.y += m_msgFrameHeight;
198 m_msgFrameHeight = EDA_MSG_PANEL::GetRequiredHeight( this );
199 m_frameSize.y -= m_msgFrameHeight;
200
201 m_messagePanel->SetPosition( wxPoint( 0, m_frameSize.y ) );
202 m_messagePanel->SetSize( m_frameSize.x, m_msgFrameHeight );
203 } );
204}
205
206
208{
210
211 delete m_actions;
212 delete m_toolManager;
213 delete m_toolDispatcher;
214 delete m_canvas;
215
216 delete m_currentScreen;
217 m_currentScreen = nullptr;
218
219 m_auimgr.UnInit();
220
221 ReleaseFile();
222}
223
224
226{
227 if( m_file_checker.get() != nullptr )
228 m_file_checker->UnlockFile();
229}
230
231
232bool EDA_DRAW_FRAME::LockFile( const wxString& aFileName )
233{
234 // We need to explicitly reset here to get the deletion before
235 // we create a new unique_ptr that may be for the same file
236 m_file_checker.reset();
237
238 m_file_checker = std::make_unique<LOCKFILE>( aFileName );
239
240 if( !m_file_checker->Valid() && m_file_checker->IsLockedByMe() )
241 {
242 // If we cannot acquire the lock but we appear to be the one who
243 // locked it, check to see if there is another KiCad instance running.
244 // If there is not, then we can override the lock. This could happen if
245 // KiCad crashed or was interrupted
246 if( !Pgm().SingleInstance()->IsAnotherRunning() )
247 m_file_checker->OverrideLock();
248 }
249 // If the file is valid, return true. This could mean that the file is
250 // locked or it could mean that the file is read-only
251 return m_file_checker->Valid();
252}
253
254
256{
257 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PYTHON, false );
258
259 wxRect rect = GetScreenRect();
260 wxPoint center = rect.GetPosition() + rect.GetSize() / 2;
261
262 if( !frame )
263 {
264 frame = Kiway().Player( FRAME_PYTHON, true, Kiway().GetTop() );
265
266 // If we received an error in the CTOR due to Python-ness, don't crash
267 if( !frame )
268 return;
269
270 if( !frame->IsVisible() )
271 frame->Show( true );
272
273 // On Windows, Raise() does not bring the window on screen, when iconized
274 if( frame->IsIconized() )
275 frame->Iconize( false );
276
277 frame->Raise();
278 frame->SetPosition( center - frame->GetSize() / 2 );
279
280 return;
281 }
282
283 frame->Show( !frame->IsVisible() );
284 frame->SetPosition( center - frame->GetSize() / 2 );
285}
286
287
289{
290 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PYTHON, false );
291 return frame && frame->IsVisible();
292}
293
294
296{
297 // Notify all tools the units have changed
298 if( m_toolManager )
300
304}
305
306
308{
310 {
312 m_toolManager->GetTool<COMMON_TOOLS>()->ToggleUnits( dummy );
313 }
314 else
315 {
316 SetUserUnits( GetUserUnits() == EDA_UNITS::INCHES ? EDA_UNITS::MILLIMETRES
317 : EDA_UNITS::INCHES );
319
320 wxCommandEvent e( EDA_EVT_UNITS_CHANGED );
321 ProcessEventLocally( e );
322 }
323}
324
325
326void EDA_DRAW_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
327{
328 EDA_BASE_FRAME::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
329
330 COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
332
333 if( m_supportsAutoSave && m_autoSaveTimer->IsRunning() )
334 {
335 if( GetAutoSaveInterval() > 0 )
336 {
337 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
338 }
339 else
340 {
341 m_autoSaveTimer->Stop();
342 m_autoSavePending = false;
343 }
344 }
345
346 viewControls->LoadSettings();
347
348 m_galDisplayOptions.ReadCommonConfig( *settings, this );
349
350 GetToolManager()->RunAction( ACTIONS::gridPreset, config()->m_Window.grid.last_size_idx );
352
353 if( m_lastToolbarIconSize == 0
355 {
358 }
359
360#ifndef __WXMAC__
362
363 if( m_canvasType != GetCanvas()->GetBackend() )
364 {
365 // Try to switch (will automatically fallback if necessary)
368 bool success = newGAL == m_canvasType;
369
370 if( !success )
371 {
372 m_canvasType = newGAL;
373 m_openGLFailureOccured = true; // Store failure for other EDA_DRAW_FRAMEs
374 }
375 }
376#endif
377
378 // Notify all tools the preferences have changed
379 if( m_toolManager )
381}
382
383
385{
386 if( m_messagePanel )
388}
389
390
392{
395
396 if( m_gridSelectBox == nullptr )
397 return;
398
399 // Update grid values with the current units setting.
400 m_gridSelectBox->Clear();
401 wxArrayString gridsList;
402
403 wxCHECK( config(), /* void */ );
404
405 GRID_MENU::BuildChoiceList( &gridsList, config(), this );
406
407 for( const wxString& grid : gridsList )
408 m_gridSelectBox->Append( grid );
409
410 m_gridSelectBox->Append( wxT( "---" ) );
411 m_gridSelectBox->Append( _( "Edit Grids..." ) );
412
413 m_gridSelectBox->SetSelection( config()->m_Window.grid.last_size_idx );
414}
415
416
417void EDA_DRAW_FRAME::OnUpdateSelectGrid( wxUpdateUIEvent& aEvent )
418{
419 // No need to update the grid select box if it doesn't exist or the grid setting change
420 // was made using the select box.
421 if( m_gridSelectBox == nullptr )
422 return;
423
424 wxCHECK( config(), /* void */ );
425
426 int idx = config()->m_Window.grid.last_size_idx;
427 idx = alg::clamp( 0, idx, (int) m_gridSelectBox->GetCount() - 1 );
428
429 if( idx != m_gridSelectBox->GetSelection() )
430 m_gridSelectBox->SetSelection( idx );
431}
432
433
434
435void EDA_DRAW_FRAME::OnUpdateSelectZoom( wxUpdateUIEvent& aEvent )
436{
437 // No need to update the grid select box if it doesn't exist or the grid setting change
438 // was made using the select box.
439 if( m_zoomSelectBox == nullptr )
440 return;
441
442 double zoom = GetCanvas()->GetGAL()->GetZoomFactor();
443
444 wxCHECK( config(), /* void */ );
445
446 const std::vector<double>& zoomList = config()->m_Window.zoom_factors;
447 int curr_selection = m_zoomSelectBox->GetSelection();
448 int new_selection = 0; // select zoom auto
449 double last_approx = 1e9; // large value to start calculation
450
451 // Search for the nearest available value to the current zoom setting, and select it
452 for( size_t jj = 0; jj < zoomList.size(); ++jj )
453 {
454 double rel_error = std::fabs( zoomList[jj] - zoom ) / zoom;
455
456 if( rel_error < last_approx )
457 {
458 last_approx = rel_error;
459 // zoom IDs in m_zoomSelectBox start with 1 (leaving 0 for auto-zoom choice)
460 new_selection = jj+1;
461 }
462 }
463
464 if( curr_selection != new_selection )
465 m_zoomSelectBox->SetSelection( new_selection );
466}
467
469{
470 DisplayErrorMessage( this, wxT("EDA_DRAW_FRAME::PrintPage() error") );
471}
472
473
474void EDA_DRAW_FRAME::OnSelectGrid( wxCommandEvent& event )
475{
476 wxCHECK_RET( m_gridSelectBox, wxS( "m_gridSelectBox uninitialized" ) );
477
478 int idx = m_gridSelectBox->GetCurrentSelection();
479
480 if( idx == int( m_gridSelectBox->GetCount() ) - 2 )
481 {
482 // wxWidgets will check the separator, which we don't want.
483 // Re-check the current grid.
484 wxUpdateUIEvent dummy;
486 }
487 else if( idx == int( m_gridSelectBox->GetCount() ) - 1 )
488 {
489 // wxWidgets will check the Grid Settings... entry, which we don't want.
490 // Re-check the current grid.
491 wxUpdateUIEvent dummy;
493
494 // Give a time-slice to close the menu before opening the dialog.
495 // (Only matters on some versions of GTK.)
496 wxSafeYield();
497
499 }
500 else
501 {
503 }
504
506 m_canvas->Refresh();
507 // Needed on Windows because clicking on m_gridSelectBox remove the focus from m_canvas
508 // (Windows specific
510}
511
512
514{
515 wxCHECK( config(), true );
516
517 return config()->m_Window.grid.show;
518}
519
520
522{
523 wxCHECK( config(), /* void */ );
524
525 config()->m_Window.grid.show = aVisible;
526
527 // Update the display with the new grid
528 if( GetCanvas() )
529 {
530 // Check to ensure these exist, since this function could be called before
531 // the GAL and View have been created
532 if( GetCanvas()->GetGAL() )
533 GetCanvas()->GetGAL()->SetGridVisibility( aVisible );
534
535 if( GetCanvas()->GetView() )
537
538 GetCanvas()->Refresh();
539 }
540}
541
542
544{
545 wxCHECK( config(), false );
546
548}
549
550
552{
553 wxCHECK( config(), /* void */ );
554
555 config()->m_Window.grid.overrides_enabled = aOverride;
556}
557
558
560{
561 if( m_zoomSelectBox == nullptr )
562 return;
563
564 double zoom = m_canvas->GetGAL()->GetZoomFactor();
565
566 m_zoomSelectBox->Clear();
567 m_zoomSelectBox->Append( _( "Zoom Auto" ) );
568 m_zoomSelectBox->SetSelection( 0 );
569
570 wxCHECK( config(), /* void */ );
571
572 for( unsigned i = 0; i < config()->m_Window.zoom_factors.size(); ++i )
573 {
574 double current = config()->m_Window.zoom_factors[i];
575
576 m_zoomSelectBox->Append( wxString::Format( _( "Zoom %.2f" ), current ) );
577
578 if( zoom == current )
579 m_zoomSelectBox->SetSelection( i + 1 );
580 }
581}
582
583
584void EDA_DRAW_FRAME::OnSelectZoom( wxCommandEvent& event )
585{
586 wxCHECK_RET( m_zoomSelectBox, wxS( "m_zoomSelectBox uninitialized" ) );
587
588 int id = m_zoomSelectBox->GetCurrentSelection();
589
590 if( id < 0 || !( id < (int)m_zoomSelectBox->GetCount() ) )
591 return;
592
595 m_canvas->Refresh();
596 // Needed on Windows because clicking on m_zoomSelectBox remove the focus from m_canvas
597 // (Windows specific
599}
600
601
602void EDA_DRAW_FRAME::OnMove( wxMoveEvent& aEvent )
603{
604 // If the window is moved to a different display, the scaling factor may change
605 double oldFactor = m_galDisplayOptions.m_scaleFactor;
607
608 if( oldFactor != m_galDisplayOptions.m_scaleFactor && m_canvas )
609 {
610 wxSize clientSize = GetClientSize();
611 GetCanvas()->GetGAL()->ResizeScreen( clientSize.x, clientSize.y );
613 }
614
615 aEvent.Skip();
616}
617
618
620{
622 CONDITIONAL_MENU& aMenu = aToolMenu.GetMenu();
623
624 aMenu.AddSeparator( 1000 );
625
626 std::shared_ptr<ZOOM_MENU> zoomMenu = std::make_shared<ZOOM_MENU>( this );
627 zoomMenu->SetTool( commonTools );
628 aToolMenu.RegisterSubMenu( zoomMenu );
629
630 std::shared_ptr<GRID_MENU> gridMenu = std::make_shared<GRID_MENU>( this );
631 gridMenu->SetTool( commonTools );
632 aToolMenu.RegisterSubMenu( gridMenu );
633
634 aMenu.AddMenu( zoomMenu.get(), SELECTION_CONDITIONS::ShowAlways, 1000 );
635 aMenu.AddMenu( gridMenu.get(), SELECTION_CONDITIONS::ShowAlways, 1000 );
636}
637
638
639void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
640{
641 SetStatusText( msg, 6 );
642}
643
644
645void EDA_DRAW_FRAME::DisplayConstraintsMsg( const wxString& msg )
646{
647 SetStatusText( msg, 7 );
648}
649
650
652{
653 wxString msg;
654
657
658 msg.Printf( _( "grid %s" ),
659 gridSettings.grids[currentIdx].UserUnitsMessageText( this, false ) );
660
661 SetStatusText( msg, 4 );
662}
663
664
666{
667 wxString msg;
668
669 switch( GetUserUnits() )
670 {
671 case EDA_UNITS::INCHES: msg = _( "inches" ); break;
672 case EDA_UNITS::MILS: msg = _( "mils" ); break;
673 case EDA_UNITS::MILLIMETRES: msg = _( "mm" ); break;
674 default: msg = _( "Units" ); break;
675 }
676
677 SetStatusText( msg, 5 );
678}
679
680
681void EDA_DRAW_FRAME::OnSize( wxSizeEvent& SizeEv )
682{
683 EDA_BASE_FRAME::OnSize( SizeEv );
684
685 m_frameSize = GetClientSize( );
686
687 SizeEv.Skip();
688}
689
690
692{
693 SetStatusText( GetZoomLevelIndicator(), 1 );
694
695 // Absolute and relative cursor positions are handled by overloading this function and
696 // handling the internal to user units conversion at the appropriate level.
697
698 // refresh units display
700}
701
702
704{
705 // returns a human readable value which can be displayed as zoom
706 // level indicator in dialogs.
707 double zoom = m_canvas->GetGAL()->GetZoomFactor();
708 return wxString::Format( wxT( "Z %.2f" ), zoom );
709}
710
711
713{
715
717 WINDOW_SETTINGS* window = GetWindowSettings( aCfg );
718
719 // Read units used in dialogs and toolbars
720 SetUserUnits( static_cast<EDA_UNITS>( aCfg->m_System.units ) );
721
723
724 m_galDisplayOptions.ReadConfig( *cmnCfg, *window, this );
725
726 m_findReplaceData->findString = aCfg->m_FindReplace.find_string;
727 m_findReplaceData->replaceString = aCfg->m_FindReplace.replace_string;
728 m_findReplaceData->matchMode =
729 static_cast<EDA_SEARCH_MATCH_MODE>( aCfg->m_FindReplace.match_mode );
730 m_findReplaceData->matchCase = aCfg->m_FindReplace.match_case;
731 m_findReplaceData->searchAndReplace = aCfg->m_FindReplace.search_and_replace;
732
733 for( const wxString& s : aCfg->m_FindReplace.find_history )
735
736 for( const wxString& s : aCfg->m_FindReplace.replace_history )
738
740}
741
742
744{
746
747 WINDOW_SETTINGS* window = GetWindowSettings( aCfg );
748
749 aCfg->m_System.units = static_cast<int>( GetUserUnits() );
751
753
754 aCfg->m_FindReplace.search_and_replace = m_findReplaceData->searchAndReplace;
755
756 aCfg->m_FindReplace.find_string = m_findReplaceData->findString;
757 aCfg->m_FindReplace.replace_string = m_findReplaceData->replaceString;
758
759 aCfg->m_FindReplace.find_history.clear();
760 aCfg->m_FindReplace.replace_history.clear();
761
762 for( size_t i = 0; i < m_findStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
763 {
764 aCfg->m_FindReplace.find_history.push_back( m_findStringHistoryList[ i ].ToStdString() );
765 }
766
767 for( size_t i = 0; i < m_replaceStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
768 {
769 aCfg->m_FindReplace.replace_history.push_back(
770 m_replaceStringHistoryList[ i ].ToStdString() );
771 }
772
773 // Save the units used in this frame
774 if( m_toolManager )
775 {
777 {
778 aCfg->m_System.last_imperial_units = static_cast<int>( cmnTool->GetLastImperialUnits() );
779 aCfg->m_System.last_metric_units = static_cast<int>( cmnTool->GetLastMetricUnits() );
780 }
781 }
782}
783
784
785void EDA_DRAW_FRAME::AppendMsgPanel( const wxString& aTextUpper, const wxString& aTextLower,
786 int aPadding )
787{
789 m_messagePanel->AppendMessage( aTextUpper, aTextLower, aPadding );
790}
791
792
794{
797}
798
799
800void EDA_DRAW_FRAME::SetMsgPanel( const std::vector<MSG_PANEL_ITEM>& aList )
801{
803 {
805
806 for( const MSG_PANEL_ITEM& item : aList )
808 }
809}
810
811
812void EDA_DRAW_FRAME::SetMsgPanel( const wxString& aTextUpper, const wxString& aTextLower,
813 int aPadding )
814{
816 {
818 m_messagePanel->AppendMessage( aTextUpper, aTextLower, aPadding );
819 }
820}
821
822
824{
825 wxCHECK_RET( aItem, wxT( "Invalid EDA_ITEM pointer. Bad programmer." ) );
826
827 std::vector<MSG_PANEL_ITEM> items;
828 aItem->GetMsgPanelInfo( this, items );
829 SetMsgPanel( items );
830}
831
832
834{
835}
836
837
839{
840 GetCanvas()->SetEvtHandlerEnabled( true );
842}
843
844
846{
847 GetCanvas()->SwitchBackend( aCanvasType );
849
851}
852
853
855{
856#ifdef __WXMAC__
857 // Cairo renderer doesn't handle Retina displays so there's really only one game
858 // in town for Mac
860#endif
861
863 APP_SETTINGS_BASE* cfg = aCfg ? aCfg : Kiface().KifaceSettings();
864
865 if( cfg )
866 canvasType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type );
867
868 if( canvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE
869 || canvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST )
870 {
871 wxASSERT( false );
873 }
874
875 // Legacy canvas no longer supported. Switch to OpenGL, falls back to Cairo on failure
876 if( canvasType == EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE )
878
879 return canvasType;
880}
881
882
884{
885 // Not all classes derived from EDA_DRAW_FRAME can save the canvas type, because some
886 // have a fixed type, or do not have a option to set the canvas type (they inherit from
887 // a parent frame)
888 static std::vector<FRAME_T> s_allowedFrames =
889 {
894 };
895
896 if( !alg::contains( s_allowedFrames, m_ident ) )
897 return false;
898
899 if( aCanvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE
900 || aCanvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST )
901 {
902 wxASSERT( false );
903 return false;
904 }
905
906 if( APP_SETTINGS_BASE* cfg = Kiface().KifaceSettings() )
907 cfg->m_Graphics.canvas_type = static_cast<int>( aCanvasType );
908
909 return false;
910}
911
912
914{
915 const VECTOR2I& gridOrigin = GetGridOrigin();
916 VECTOR2D gridSize = GetCanvas()->GetGAL()->GetGridSize();
917
918 double xOffset = fmod( gridOrigin.x, gridSize.x );
919 int x = KiROUND( (aPosition.x - xOffset) / gridSize.x );
920 double yOffset = fmod( gridOrigin.y, gridSize.y );
921 int y = KiROUND( (aPosition.y - yOffset) / gridSize.y );
922
923 return VECTOR2I( KiROUND( x * gridSize.x + xOffset ), KiROUND( y * gridSize.y + yOffset ) );
924}
925
926
928{
929 const VECTOR2I& gridOrigin = GetGridOrigin();
930 VECTOR2D gridSize = GetCanvas()->GetGAL()->GetGridSize() / 2.0;
931
932 double xOffset = fmod( gridOrigin.x, gridSize.x );
933 int x = KiROUND( (aPosition.x - xOffset) / gridSize.x );
934 double yOffset = fmod( gridOrigin.y, gridSize.y );
935 int y = KiROUND( (aPosition.y - yOffset) / gridSize.y );
936
937 return VECTOR2I( KiROUND( x * gridSize.x + xOffset ), KiROUND( y * gridSize.y + yOffset ) );
938}
939
940
941const BOX2I EDA_DRAW_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
942{
943 return BOX2I();
944}
945
946
948{
949 // To be implemented by subclasses.
950}
951
952
953void EDA_DRAW_FRAME::Zoom_Automatique( bool aWarpPointer )
954{
956}
957
958
959// Find the first child dialog.
960std::vector<wxWindow*> EDA_DRAW_FRAME::findDialogs()
961{
962 std::vector<wxWindow*> dialogs;
963
964 for( wxWindow* window : GetChildren() )
965 {
966 if( dynamic_cast<DIALOG_SHIM*>( window ) )
967 dialogs.push_back( window );
968 }
969
970 return dialogs;
971}
972
973
975{
976 bool centerView = false;
978
979 // Center if we're off the current view, or within 10% of its edge
980 r.Inflate( - (int) r.GetWidth() / 10 );
981
982 if( !r.Contains( aPos ) )
983 centerView = true;
984
985 std::vector<BOX2D> dialogScreenRects;
986
987 for( wxWindow* dialog : findDialogs() )
988 {
989 dialogScreenRects.emplace_back( ToVECTOR2D( GetCanvas()->ScreenToClient( dialog->GetScreenPosition() ) ),
990 ToVECTOR2D( dialog->GetSize() ) );
991 }
992
993 // Center if we're behind an obscuring dialog, or within 10% of its edge
994 for( BOX2D rect : dialogScreenRects )
995 {
996 rect.Inflate( rect.GetWidth() / 10 );
997
998 if( rect.Contains( GetCanvas()->GetView()->ToScreen( aPos ) ) )
999 centerView = true;
1000 }
1001
1002 if( centerView )
1003 {
1004 try
1005 {
1006 GetCanvas()->GetView()->SetCenter( aPos, dialogScreenRects );
1007 }
1008 catch( const ClipperLib::clipperException& exc )
1009 {
1010 wxLogError( wxT( "Clipper library error '%s' occurred centering object." ),
1011 exc.what() );
1012 }
1013 }
1014
1016}
1017
1018
1019static const wxString productName = wxT( "KiCad E.D.A. " );
1020
1021
1022void PrintDrawingSheet( const RENDER_SETTINGS* aSettings, const PAGE_INFO& aPageInfo,
1023 const wxString& aSheetName, const wxString& aSheetPath,
1024 const wxString& aFileName, const TITLE_BLOCK& aTitleBlock,
1025 const std::map<wxString, wxString>* aProperties, int aSheetCount,
1026 const wxString& aPageNumber, double aMils2Iu, const PROJECT* aProject,
1027 const wxString& aSheetLayer, bool aIsFirstPage )
1028{
1029 DS_DRAW_ITEM_LIST drawList( unityScale );
1030
1031 drawList.SetDefaultPenSize( aSettings->GetDefaultPenWidth() );
1032 drawList.SetPlotterMilsToIUfactor( aMils2Iu );
1033 drawList.SetPageNumber( aPageNumber );
1034 drawList.SetSheetCount( aSheetCount );
1035 drawList.SetFileName( aFileName );
1036 drawList.SetSheetName( aSheetName );
1037 drawList.SetSheetPath( aSheetPath );
1038 drawList.SetSheetLayer( aSheetLayer );
1039 drawList.SetProject( aProject );
1040 drawList.SetIsFirstPage( aIsFirstPage );
1041 drawList.SetProperties( aProperties );
1042
1043 drawList.BuildDrawItemsList( aPageInfo, aTitleBlock );
1044
1045 // Draw item list
1046 drawList.Print( aSettings );
1047}
1048
1049
1051 const std::map<wxString, wxString>* aProperties,
1052 double aMils2Iu, const wxString &aFilename,
1053 const wxString &aSheetLayer )
1054{
1056 return;
1057
1058 wxDC* DC = aSettings->GetPrintDC();
1059 wxPoint origin = DC->GetDeviceOrigin();
1060
1061 if( origin.y > 0 )
1062 {
1063 DC->SetDeviceOrigin( 0, 0 );
1064 DC->SetAxisOrientation( true, false );
1065 }
1066
1068 aFilename, GetTitleBlock(), aProperties, aScreen->GetPageCount(),
1069 aScreen->GetPageNumber(), aMils2Iu, &Prj(), aSheetLayer,
1070 aScreen->GetVirtualPageNumber() == 1 );
1071
1072 if( origin.y > 0 )
1073 {
1074 DC->SetDeviceOrigin( origin.x, origin.y );
1075 DC->SetAxisOrientation( true, true );
1076 }
1077}
1078
1079
1081{
1082 // Virtual function. Base class implementation returns an empty string.
1083 return wxEmptyString;
1084}
1085
1086
1088{
1089 // Virtual function. Base class implementation returns an empty string.
1090 return wxEmptyString;
1091}
1092
1093
1094bool EDA_DRAW_FRAME::LibraryFileBrowser( bool doOpen, wxFileName& aFilename,
1095 const wxString& wildcard, const wxString& ext,
1096 bool isDirectory, bool aIsGlobal,
1097 const wxString& aGlobalPath )
1098{
1099 wxString prompt = doOpen ? _( "Select Library" ) : _( "New Library" );
1100 aFilename.SetExt( ext );
1101
1102 wxString projectDir = Prj().IsNullProject() ? aFilename.GetPath() : Prj().GetProjectPath();
1103 wxString defaultDir;
1104
1105 if( aIsGlobal )
1106 {
1107 if( !GetMruPath().IsEmpty() && !GetMruPath().StartsWith( projectDir ) )
1108 defaultDir = GetMruPath();
1109 else
1110 defaultDir = aGlobalPath;
1111 }
1112 else
1113 {
1114 if( !GetMruPath().IsEmpty() && GetMruPath().StartsWith( projectDir ) )
1115 defaultDir = GetMruPath();
1116 else
1117 defaultDir = projectDir;
1118 }
1119
1120 if( isDirectory && doOpen )
1121 {
1122 wxDirDialog dlg( this, prompt, defaultDir, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );
1123
1124 if( dlg.ShowModal() == wxID_CANCEL )
1125 return false;
1126
1127 aFilename = dlg.GetPath();
1128 aFilename.SetExt( ext );
1129 }
1130 else
1131 {
1132 // Ensure the file has a dummy name, otherwise GTK will display the regex from the filter
1133 if( aFilename.GetName().empty() )
1134 aFilename.SetName( wxS( "Library" ) );
1135
1136 wxFileDialog dlg( this, prompt, defaultDir, aFilename.GetFullName(),
1137 wildcard, doOpen ? wxFD_OPEN | wxFD_FILE_MUST_EXIST
1138 : wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT );
1139
1140 if( dlg.ShowModal() == wxID_CANCEL )
1141 return false;
1142
1143 aFilename = dlg.GetPath();
1144 aFilename.SetExt( ext );
1145 }
1146
1147 SetMruPath( aFilename.GetPath() );
1148
1149 return true;
1150}
1151
1152
1154{
1155 // Rebuild all toolbars, and update the checked state of check tools
1156 if( m_mainToolBar )
1158
1159 if( m_drawToolBar ) // Drawing tools (typically on right edge of window)
1161
1162 if( m_optionsToolBar ) // Options (typically on left edge of window)
1164
1165 if( m_auxiliaryToolBar ) // Additional tools under main toolbar
1167
1168
1169}
1170
1171
1173{
1174 if( m_mainToolBar )
1175 m_auimgr.GetPane( m_mainToolBar ).MaxSize( m_mainToolBar->GetSize() );
1176
1177 if( m_drawToolBar )
1178 m_auimgr.GetPane( m_drawToolBar ).MaxSize( m_drawToolBar->GetSize() );
1179
1180 if( m_optionsToolBar )
1181 m_auimgr.GetPane( m_optionsToolBar ).MaxSize( m_optionsToolBar->GetSize() );
1182
1183 if( m_auxiliaryToolBar )
1184 m_auimgr.GetPane( m_auxiliaryToolBar ).MaxSize( m_auxiliaryToolBar->GetSize() );
1185
1186 m_auimgr.Update();
1187}
1188
1189
1191{
1193
1194 if( m_searchPane )
1195 {
1196 wxAuiPaneInfo& search_pane_info = m_auimgr.GetPane( m_searchPane );
1197 search_pane_info.Caption( _( "Search" ) );
1198 }
1199
1200 if( m_propertiesPanel )
1201 {
1202 wxAuiPaneInfo& properties_pane_info = m_auimgr.GetPane( m_propertiesPanel );
1203 properties_pane_info.Caption( _( "Properties" ) );
1204 }
1205
1207 {
1208 wxAuiPaneInfo& net_inspector_panel_info = m_auimgr.GetPane( m_netInspectorPanel );
1209 net_inspector_panel_info.Caption( _( "Net Inspector" ) );
1210 }
1211}
1212
1213
1215{
1216 if( !m_propertiesPanel || !m_propertiesPanel->IsShownOnScreen() )
1217 return;
1218
1220}
1221
1222
1224{
1225 m_hotkeyPopup = new HOTKEY_CYCLE_POPUP( this );
1226}
1227
1228
1230{
1231 if( !m_colorSettings || aForceRefresh )
1232 {
1234
1235 const_cast<EDA_DRAW_FRAME*>( this )->m_colorSettings = colorSettings;
1236 }
1237
1238 return m_colorSettings;
1239}
1240
1241
1243{
1245
1246 if( cmnTool )
1247 {
1248 // Tell the tool what the units used last session
1249 cmnTool->SetLastUnits( static_cast<EDA_UNITS>( aCfg->m_System.last_imperial_units ) );
1250 cmnTool->SetLastUnits( static_cast<EDA_UNITS>( aCfg->m_System.last_metric_units ) );
1251 }
1252
1253 // Tell the tool what units the frame is currently using
1254 switch( static_cast<EDA_UNITS>( aCfg->m_System.units ) )
1255 {
1256 default:
1257 case EDA_UNITS::MILLIMETRES: m_toolManager->RunAction( ACTIONS::millimetersUnits ); break;
1258 case EDA_UNITS::INCHES: m_toolManager->RunAction( ACTIONS::inchesUnits ); break;
1259 case EDA_UNITS::MILS: m_toolManager->RunAction( ACTIONS::milsUnits ); break;
1260 }
1261}
1262
1263
1264void EDA_DRAW_FRAME::GetUnitPair( EDA_UNITS& aPrimaryUnit, EDA_UNITS& aSecondaryUnits )
1265{
1267
1268 aPrimaryUnit = GetUserUnits();
1269 aSecondaryUnits = EDA_UNITS::MILS;
1270
1271 if( EDA_UNIT_UTILS::IsImperialUnit( aPrimaryUnit ) )
1272 {
1273 if( cmnTool )
1274 aSecondaryUnits = cmnTool->GetLastMetricUnits();
1275 else
1276 aSecondaryUnits = EDA_UNITS::MILLIMETRES;
1277 }
1278 else
1279 {
1280 if( cmnTool )
1281 aSecondaryUnits = cmnTool->GetLastImperialUnits();
1282 else
1283 aSecondaryUnits = EDA_UNITS::MILS;
1284 }
1285}
1286
1287
1289{
1291
1292 // If we had an OpenGL failure this session, use the fallback GAL but don't update the
1293 // user preference silently:
1294
1297}
1298
1299
1300void EDA_DRAW_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
1301{
1302 // Force a refresh of the message panel to ensure that the text is the right color
1303 // when the window activates
1304 if( !IsIconized() )
1305 m_messagePanel->Refresh();
1306}
1307
1308
1309void EDA_DRAW_FRAME::onActivate( wxActivateEvent& aEvent )
1310{
1311 handleActivateEvent( aEvent );
1312
1313 aEvent.Skip();
1314}
1315
1316
1317bool EDA_DRAW_FRAME::SaveCanvasImageToFile( const wxString& aFileName,
1318 BITMAP_TYPE aBitmapType )
1319{
1320 bool retv = true;
1321
1322 // Make a screen copy of the canvas:
1323 wxSize image_size = GetCanvas()->GetClientSize();
1324
1325 wxClientDC dc( GetCanvas() );
1326 wxBitmap bitmap( image_size.x, image_size.y );
1327 wxMemoryDC memdc;
1328
1329 memdc.SelectObject( bitmap );
1330 memdc.Blit( 0, 0, image_size.x, image_size.y, &dc, 0, 0 );
1331 memdc.SelectObject( wxNullBitmap );
1332
1333 wxImage image = bitmap.ConvertToImage();
1334
1335 wxBitmapType type = wxBITMAP_TYPE_PNG;
1336 switch( aBitmapType )
1337 {
1338 case BITMAP_TYPE::PNG: type = wxBITMAP_TYPE_PNG; break;
1339 case BITMAP_TYPE::BMP: type = wxBITMAP_TYPE_BMP; break;
1340 case BITMAP_TYPE::JPG: type = wxBITMAP_TYPE_JPEG; break;
1341 }
1342
1343 if( !image.SaveFile( aFileName, type ) )
1344 retv = false;
1345
1346 image.Destroy();
1347 return retv;
1348}
1349
1350
1352{
1353#ifdef KICAD_IPC_API
1354 // TODO: Add user control over visibility and order
1355 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1356
1357 mgr.ButtonBindings().clear();
1358
1359 std::vector<const PLUGIN_ACTION*> actions = mgr.GetActionsForScope( PluginActionScope() );
1360
1361 for( auto& action : actions )
1362 {
1363 if( !action->show_button )
1364 continue;
1365
1366 const wxBitmapBundle& icon = KIPLATFORM::UI::IsDarkTheme() && action->icon_dark.IsOk()
1367 ? action->icon_dark
1368 : action->icon_light;
1369
1370 wxAuiToolBarItem* button = m_mainToolBar->AddTool( wxID_ANY, wxEmptyString, icon,
1371 action->name );
1372
1373 Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED,
1374 wxCommandEventHandler( EDA_DRAW_FRAME::OnApiPluginInvoke ) );
1375
1376 mgr.ButtonBindings().insert( { button->GetId(), action->identifier } );
1377 }
1378#endif
1379}
1380
1381
1382void EDA_DRAW_FRAME::OnApiPluginInvoke( wxCommandEvent& aEvent )
1383{
1384#ifdef KICAD_IPC_API
1385 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1386
1387 if( mgr.ButtonBindings().count( aEvent.GetId() ) )
1388 mgr.InvokeAction( mgr.ButtonBindings().at( aEvent.GetId() ) );
1389#endif
1390}
constexpr std::size_t arrayDim(T const (&)[N]) noexcept
Returns # of elements in an array.
Definition: arraydim.h:31
BASE_SCREEN class implementation.
constexpr EDA_IU_SCALE unityScale
Definition: base_units.h:111
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
BITMAP_TYPE
Definition: bitmap_types.h:43
BOX2< VECTOR2I > BOX2I
Definition: box2.h:877
static TOOL_ACTION gridProperties
Definition: actions.h:174
static TOOL_ACTION millimetersUnits
Definition: actions.h:180
static TOOL_ACTION updatePreferences
Definition: actions.h:207
static TOOL_ACTION gridPreset
Definition: actions.h:171
static TOOL_ACTION updateUnits
Definition: actions.h:181
static TOOL_ACTION milsUnits
Definition: actions.h:179
static TOOL_ACTION inchesUnits
Definition: actions.h:178
static TOOL_ACTION zoomFitScreen
Definition: actions.h:124
static TOOL_ACTION zoomPreset
Definition: actions.h:126
Responsible for loading plugin definitions for API-based plugins (ones that do not run inside KiCad i...
std::map< int, wxString > & ButtonBindings()
std::vector< const PLUGIN_ACTION * > GetActionsForScope(PLUGIN_ACTION_SCOPE aScope)
void InvokeAction(const wxString &aIdentifier)
APP_SETTINGS_BASE is a settings class that should be derived for each standalone KiCad application.
Definition: app_settings.h:92
WINDOW_SETTINGS m_Window
Definition: app_settings.h:172
FIND_REPLACE m_FindReplace
Definition: app_settings.h:160
Handles how to draw a screen (a board, a schematic ...)
Definition: base_screen.h:41
int GetPageCount() const
Definition: base_screen.h:72
int GetVirtualPageNumber() const
Definition: base_screen.h:75
const wxString & GetPageNumber() const
Definition: base_screen.cpp:71
size_type GetWidth() const
Definition: box2.h:204
bool Contains(const Vec &aPoint) const
Definition: box2.h:158
BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:541
Color settings are a bit different than most of the settings objects in that there can be more than o...
APPEARANCE m_Appearance
Handles action that are shared between different applications.
Definition: common_tools.h:38
void SetLastUnits(EDA_UNITS aUnit)
EDA_UNITS GetLastImperialUnits()
Definition: common_tools.h:77
EDA_UNITS GetLastMetricUnits()
Definition: common_tools.h:76
void AddSeparator(int aOrder=ANY_ORDER)
Add a separator to the menu.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
Definition: dialog_shim.h:88
Store the list of graphic items: rect, lines, polygons and texts to draw/plot the title block and fra...
Definition: ds_draw_item.h:401
void SetPlotterMilsToIUfactor(double aMils2Iu)
Set the scalar to convert pages units (mils) to plot units.
Definition: ds_draw_item.h:467
void BuildDrawItemsList(const PAGE_INFO &aPageInfo, const TITLE_BLOCK &aTitleBlock)
Drawing or plot the drawing sheet.
void SetSheetPath(const wxString &aSheetPath)
Set the sheet path to draw/plot.
Definition: ds_draw_item.h:454
void SetFileName(const wxString &aFileName)
Set the filename to draw/plot.
Definition: ds_draw_item.h:444
void SetDefaultPenSize(int aPenSize)
Definition: ds_draw_item.h:461
void Print(const RENDER_SETTINGS *aSettings)
Draws the item list created by BuildDrawItemsList.
void SetSheetName(const wxString &aSheetName)
Set the sheet name to draw/plot.
Definition: ds_draw_item.h:449
void SetIsFirstPage(bool aIsFirstPage)
Set if the page is the first page.
Definition: ds_draw_item.h:493
void SetProperties(const std::map< wxString, wxString > *aProps)
Set properties used for text variable resolution.
Definition: ds_draw_item.h:434
void SetSheetLayer(const wxString &aSheetLayer)
Set the sheet layer to draw/plot.
Definition: ds_draw_item.h:459
void SetSheetCount(int aSheetCount)
Set the value of the count of sheets, for basic inscriptions.
Definition: ds_draw_item.h:498
void SetPageNumber(const wxString &aPageNumber)
Set the value of the sheet number.
Definition: ds_draw_item.h:488
void SetProject(const PROJECT *aProject)
Definition: ds_draw_item.h:424
virtual APP_SETTINGS_BASE * config() const
Returns the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual WINDOW_SETTINGS * GetWindowSettings(APP_SETTINGS_BASE *aCfg)
Return a pointer to the window settings for this frame.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
wxTimer * m_autoSaveTimer
wxAuiManager m_auimgr
int GetMaxUndoItems() const
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
wxString GetMruPath() const
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
virtual void OnSize(wxSizeEvent &aEvent)
int GetAutoSaveInterval() const
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
void SetMruPath(const wxString &aPath)
bool m_isClosing
Set by NonUserClose() to indicate that the user did not request the current close.
The base class for create windows for drawing purpose.
virtual const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const
Returns bbox of document with option to not include some items.
wxArrayString m_replaceStringHistoryList
virtual void ClearMsgPanel()
Clear all messages from the message panel.
virtual void ReCreateVToolbar()
EDA_DRAW_PANEL_GAL * m_canvas
This the frame's interface to setting GAL display options.
virtual void ActivateGalCanvas()
Use to start up the GAL drawing canvas.
void SaveSettings(APP_SETTINGS_BASE *aCfg) override
Save common frame parameters to a configuration data file.
GAL_DISPLAY_OPTIONS_IMPL m_galDisplayOptions
virtual const TITLE_BLOCK & GetTitleBlock() const =0
virtual void PrintPage(const RENDER_SETTINGS *aSettings)
Print the page pointed by current screen, set by the calling print function.
void onActivate(wxActivateEvent &aEvent)
COLOR_SETTINGS * m_colorSettings
wxChoice * m_gridSelectBox
void AddStandardSubMenus(TOOL_MENU &aMenu)
Construct a "basic" menu for a tool, containing only items that apply to all tools (e....
void ReleaseFile()
Release the current file marked in use.
void OnToolbarSizeChanged()
Update toolbars if desired toolbar icon changed.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
void ScriptingConsoleEnableDisable()
Toggles the scripting console visibility.
virtual wxString GetFullScreenDesc() const
void OnSelectGrid(wxCommandEvent &event)
Command event handler for selecting grid sizes.
void DisplayToolMsg(const wxString &msg) override
std::unique_ptr< LOCKFILE > m_file_checker
bool IsScriptingConsoleVisible()
Gets the current visibility of the scripting console window.
void OnUpdateSelectZoom(wxUpdateUIEvent &aEvent)
Update the checked item in the zoom wxchoice.
virtual const PAGE_INFO & GetPageSettings() const =0
void DisplayUnitsMsg()
Display current unit pane in the status bar.
void setupUnits(APP_SETTINGS_BASE *aCfg)
void SetMsgPanel(const std::vector< MSG_PANEL_ITEM > &aList)
Clear the message panel and populates it with the contents of aList.
ACTION_TOOLBAR * m_optionsToolBar
void UpdateGridSelectBox()
Rebuild the grid combobox to respond to any changes in the GUI (units, user grid changes,...
bool LockFile(const wxString &aFileName)
Mark a schematic file as being in use.
virtual void HardRedraw()
Rebuild the GAL and redraws the screen.
bool LibraryFileBrowser(bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory=false, bool aIsGlobal=false, const wxString &aGlobalPath=wxEmptyString)
bool IsGridOverridden() const
void LoadSettings(APP_SETTINGS_BASE *aCfg) override
Load common frame parameters from a configuration file.
bool SaveCanvasImageToFile(const wxString &aFileName, BITMAP_TYPE aBitmapType)
Save the current view as an image file.
void UpdateZoomSelectBox()
Rebuild the grid combobox to respond to any changes in the GUI (units, user grid changes,...
virtual void SwitchCanvas(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Changes the current rendering backend.
virtual void OnSize(wxSizeEvent &event) override
Recalculate the size of toolbars and display panel when the frame size changes.
EDA_DRAW_PANEL_GAL::GAL_TYPE loadCanvasTypeSetting(APP_SETTINGS_BASE *aCfg=nullptr)
Returns the canvas type stored in the application settings.
const wxString GetZoomLevelIndicator() const
Return a human readable value for display in dialogs.
virtual void OnSelectZoom(wxCommandEvent &event)
Set the zoom factor when selected by the zoom list box in the main tool bar.
virtual void resolveCanvasType()
Determines the Canvas type to load (with prompt if required) and initializes m_canvasType.
static bool m_openGLFailureOccured
Has any failure occured when switching to OpenGL in any EDA_DRAW_FRAME?
BASE_SCREEN * m_currentScreen
current used SCREEN
virtual wxString GetScreenDesc() const
VECTOR2I GetNearestGridPosition(const VECTOR2I &aPosition) const
Return the nearest aGridSize location to aPosition.
EDA_MSG_PANEL * m_messagePanel
virtual const VECTOR2I & GetGridOrigin() const =0
Return the absolute coordinates of the origin of the snap grid.
virtual void ReCreateAuxiliaryToolbar()
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
virtual void ReCreateHToolbar()
void RecreateToolbars()
Rebuild all toolbars, and update the checked state of check tools.
bool saveCanvasTypeSetting(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Stores the canvas type in the application settings.
ACTION_TOOLBAR * m_mainToolBar
virtual void Zoom_Automatique(bool aWarpPointer)
Redraw the screen with best zoom level and the best centering that shows all the page or the board.
NET_INSPECTOR_PANEL * m_netInspectorPanel
virtual void SetGridVisibility(bool aVisible)
virtual void handleActivateEvent(wxActivateEvent &aEvent)
Handle a window activation event.
virtual void ReCreateOptToolbar()
virtual void OnApiPluginInvoke(wxCommandEvent &aEvent)
Handler for activating an API plugin (via toolbar or menu)
virtual void UpdateMsgPanel()
Redraw the message panel.
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const
Returns a pointer to the active color theme settings.
void ToggleUserUnits() override
virtual void CreateHotkeyPopup()
void UpdateStatusBar() override
Update the status bar information.
void GetUnitPair(EDA_UNITS &aPrimaryUnit, EDA_UNITS &aSecondaryUnits) override
Get the pair or units in current use.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, BASE_SCREEN *aScreen, const std::map< wxString, wxString > *aProperties, double aMils2Iu, const wxString &aFilename, const wxString &aSheetLayer=wxEmptyString)
Prints the drawing-sheet (frame and title block).
virtual EDA_DRAW_PANEL_GAL * GetCanvas() const
Return a pointer to GAL-based canvas of given EDA draw frame.
ACTION_TOOLBAR * m_drawToolBar
SEARCH_PANE * m_searchPane
void unitsChangeRefresh() override
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
void OnMove(wxMoveEvent &aEvent) override
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
bool IsGridVisible() const
std::vector< wxWindow * > findDialogs()
virtual void DisplayGridMsg()
Display current grid size in the status bar.
wxArrayString m_findStringHistoryList
wxChoice * m_zoomSelectBox
virtual PLUGIN_ACTION_SCOPE PluginActionScope() const
std::unique_ptr< EDA_SEARCH_DATA > m_findReplaceData
void DisplayConstraintsMsg(const wxString &msg)
void AppendMsgPanel(const wxString &aTextUpper, const wxString &aTextLower, int aPadding=6)
Append a message to the message panel.
virtual void SetGridOverrides(bool aOverride)
PROPERTIES_PANEL * m_propertiesPanel
virtual void addApiPluginTools()
Append actions from API plugins to the main toolbar.
bool m_showBorderAndTitleBlock
VECTOR2I GetNearestHalfGridPosition(const VECTOR2I &aPosition) const
Return the nearest aGridSize / 2 location to aPosition.
HOTKEY_CYCLE_POPUP * m_hotkeyPopup
The current canvas type.
void OnUpdateSelectGrid(wxUpdateUIEvent &aEvent)
Update the checked item in the grid wxchoice.
ACTION_TOOLBAR * m_auxiliaryToolBar
static constexpr GAL_TYPE GAL_FALLBACK
GAL_TYPE GetBackend() const
Return the type of backend currently used by GAL canvas.
KIGFX::VIEW_CONTROLS * GetViewControls() const
Return a pointer to the #VIEW_CONTROLS instance used in the panel.
virtual KIGFX::VIEW * GetView() const
Return a pointer to the #VIEW instance used in the panel.
virtual void Refresh(bool aEraseBackground=true, const wxRect *aRect=nullptr) override
@ GAL_TYPE_LAST
Sentinel, do not use as a parameter.
@ GAL_TYPE_OPENGL
OpenGL implementation.
@ GAL_TYPE_NONE
GAL not used (the legacy wxDC engine is used)
KIGFX::GAL * GetGAL() const
Return a pointer to the GAL instance used in the panel.
void SetFocus() override
virtual bool SwitchBackend(GAL_TYPE aGalType)
Switch method of rendering graphics.
void StartDrawing()
Begin drawing if it was stopped previously.
A base class for most all the KiCad significant classes used in schematics and boards.
Definition: eda_item.h:88
virtual void GetMsgPanelInfo(EDA_DRAW_FRAME *aFrame, std::vector< MSG_PANEL_ITEM > &aList)
Populate aList of MSG_PANEL_ITEM objects with it's internal state for display purposes.
Definition: eda_item.h:202
A panel to display various information messages.
Definition: msgpanel.h:101
void AppendMessage(const wxString &aUpperText, const wxString &aLowerText, int aPadding=6)
Append a message to the message panel.
Definition: msgpanel.cpp:93
void EraseMsgBox()
Definition: msgpanel.cpp:197
static int GetRequiredHeight(wxWindow *aWindow)
Return the required height (in pixels) of a EDA_MSG_PANEL.
Definition: msgpanel.cpp:62
void ReadConfig(COMMON_SETTINGS &aCommonConfig, WINDOW_SETTINGS &aWindowConfig, wxWindow *aWindow)
Read application and common configs.
void ReadCommonConfig(COMMON_SETTINGS &aCommonSettings, wxWindow *aWindow)
Read GAL config options from the common config store.
void WriteConfig(WINDOW_SETTINGS &aCfg)
static void BuildChoiceList(wxArrayString *aGridsList, APP_SETTINGS_BASE *aCfg, EDA_DRAW_FRAME *aParent)
Definition: grid_menu.cpp:83
Similar to EDA_VIEW_SWITCHER, this dialog is a popup that shows feedback when using a hotkey to cycle...
APP_SETTINGS_BASE * KifaceSettings() const
Definition: kiface_base.h:95
A color representation with 4 components: red, green, blue, alpha.
Definition: color4d.h:104
virtual void ResizeScreen(int aWidth, int aHeight)
Resize the canvas.
double GetZoomFactor() const
const VECTOR2D & GetGridSize() const
Return the grid size.
void SetGridVisibility(bool aVisibility)
Set the visibility setting of the grid.
Container for all the knowledge about how graphical objects are drawn on any output surface/device.
int GetDefaultPenWidth() const
wxDC * GetPrintDC() const
An interface for classes handling user events controlling the view behavior such as zooming,...
virtual void LoadSettings()
virtual void SetCrossHairCursorPosition(const VECTOR2D &aPosition, bool aWarpView=true)=0
Move the graphic crosshair cursor to the requested position expressed in world coordinates.
BOX2D GetViewport() const
Return the current viewport visible area rectangle.
Definition: view.cpp:512
void MarkDirty()
Force redraw of view on the next rendering.
Definition: view.h:643
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition: view.cpp:578
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition: view.h:619
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
Definition: kiway_holder.h:55
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
Definition: kiway_player.h:65
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:279
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition: kiway.cpp:406
EDA_MSG_PANEL items for displaying messages.
Definition: msgpanel.h:54
Describe the page size and margins of a paper page on which to eventually print or plot.
Definition: page_info.h:59
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:678
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:142
Container for project specific data.
Definition: project.h:62
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:135
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
Definition: project.cpp:153
virtual void UpdateData()=0
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieves a color settings object that applications can read colors from.
Hold the information shown in the lower right corner of a plot, printout, or editing view.
Definition: title_block.h:41
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:167
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:169
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:168
Generic, UI-independent tool event.
Definition: tool_event.h:167
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
Definition: tool_manager.h:150
APP_SETTINGS_BASE * GetSettings() const
Definition: tool_manager.h:400
Manage a CONDITIONAL_MENU and some number of CONTEXT_MENUs as sub-menus.
Definition: tool_menu.h:43
CONDITIONAL_MENU & GetMenu()
Definition: tool_menu.cpp:44
void RegisterSubMenu(std::shared_ptr< ACTION_MENU > aSubMenu)
Store a submenu of this menu model.
Definition: tool_menu.cpp:50
EDA_UNITS GetUserUnits() const
void SetUserUnits(EDA_UNITS aUnits)
@ LIGHTGRAY
Definition: color4d.h:47
@ DARKGRAY
Definition: color4d.h:46
@ BLACK
Definition: color4d.h:44
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition: confirm.cpp:186
This file is part of the common library.
#define _(s)
#define DEFAULT_MAX_UNDO_ITEMS
#define FR_HISTORY_LIST_CNT
Maximum size of the find/replace history stacks.
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, const PAGE_INFO &aPageInfo, const wxString &aSheetName, const wxString &aSheetPath, const wxString &aFileName, const TITLE_BLOCK &aTitleBlock, const std::map< wxString, wxString > *aProperties, int aSheetCount, const wxString &aPageNumber, double aMils2Iu, const PROJECT *aProject, const wxString &aSheetLayer, bool aIsFirstPage)
Print the border and title block.
static const wxString productName
EDA_SEARCH_MATCH_MODE
EDA_UNITS
Definition: eda_units.h:46
GERBVIEW_FRAME::OnZipFileHistory GERBVIEW_FRAME::OnSelectHighlightChoice EVT_UPDATE_UI(ID_TOOLBARH_GERBVIEW_SELECT_ACTIVE_LAYER, GERBVIEW_FRAME::OnUpdateLayerSelectBox) void GERBVIEW_FRAME
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:33
@ FRAME_PCB_EDITOR
Definition: frame_type.h:42
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ FRAME_SCH
Definition: frame_type.h:34
@ FRAME_PL_EDITOR
Definition: frame_type.h:59
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:43
@ FRAME_GERBER
Definition: frame_type.h:57
@ FRAME_PYTHON
Definition: frame_type.h:55
@ ID_ON_GRID_SELECT
Definition: id.h:145
@ ID_ON_ZOOM_SELECT
Definition: id.h:143
File locking utilities.
This file contains miscellaneous commonly used macros and functions.
Message panel definition file.
KICOMMON_API bool IsImperialUnit(EDA_UNITS aUnit)
Definition: eda_units.cpp:47
@ TARGET_NONCACHED
Auxiliary rendering target (noncached)
Definition: definitions.h:49
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition: gtk/ui.cpp:48
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
Definition: ui_common.cpp:130
KICOMMON_API 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:77
T clamp(T min, T value, T max)
Definition: kicad_algo.h:205
bool contains(const _Container &__container, _Value __value)
Returns true if the container contains the given value.
Definition: kicad_algo.h:100
PGM_BASE & Pgm()
The global Program "get" accessor.
Definition: pgm_base.cpp:1059
see class PGM_BASE
std::vector< FAB_LAYER_COLOR > dummy
std::vector< wxString > replace_history
Definition: app_settings.h:99
std::vector< wxString > find_history
Definition: app_settings.h:97
bool overrides_enabled
Definition: grid_settings.h:78
std::vector< GRID > grids
Definition: grid_settings.h:66
Stores the common settings that are saved and loaded for each window / frame.
Definition: app_settings.h:74
GRID_SETTINGS grid
Definition: app_settings.h:81
std::vector< double > zoom_factors
Definition: app_settings.h:78
wxLogTrace helper definitions.
Functions to provide common constants and other functions to assist in making a consistent UI.
constexpr ret_type KiROUND(fp_type v)
Round a floating point number to an integer using "round halfway cases away from zero".
Definition: util.h:118
VECTOR2< int > VECTOR2I
Definition: vector2d.h:602
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition: vector2wx.h:40