KiCad PCB EDA Suite
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
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 <stambaughw@gmail.com>
6 * Copyright The 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_helper.h>
56#include <tool/grid_menu.h>
59#include <tool/tool_manager.h>
60#include <tool/tool_menu.h>
61#include <tool/zoom_menu.h>
62#include <trace_helpers.h>
63#include <view/view.h>
65#include <view/view_controls.h>
66#include <widgets/msgpanel.h>
69#include <wx/event.h>
70#include <wx/snglinst.h>
71#include <widgets/ui_common.h>
72#include <widgets/search_pane.h>
73#include <wx/dirdlg.h>
74#include <wx/filedlg.h>
75#include <wx/debug.h>
76#include <wx/socket.h>
77
78#include <wx/snglinst.h>
79#include <wx/fdrepdlg.h>
80
81#define FR_HISTORY_LIST_CNT 10
82
83
84BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER )
87
88 EVT_ACTIVATE( EDA_DRAW_FRAME::onActivate )
89END_EVENT_TABLE()
90
91
92bool EDA_DRAW_FRAME::m_openGLFailureOccured = false;
93
94
95EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
96 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
97 long aStyle, const wxString& aFrameName,
98 const EDA_IU_SCALE& aIuScale ) :
99 KIWAY_PLAYER( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName,
100 aIuScale ),
101 m_socketServer( nullptr ),
102 m_lastToolbarIconSize( 0 )
103{
104 m_gridSelectBox = nullptr;
105 m_zoomSelectBox = nullptr;
106 m_searchPane = nullptr;
107 m_undoRedoCountMax = DEFAULT_MAX_UNDO_ITEMS;
108
110 m_canvas = nullptr;
111 m_toolDispatcher = nullptr;
112 m_messagePanel = nullptr;
113 m_currentScreen = nullptr;
114 m_showBorderAndTitleBlock = false; // true to display reference sheet.
115 m_gridColor = COLOR4D( DARKGRAY ); // Default grid color
116 m_drawBgColor = COLOR4D( BLACK ); // the background color of the draw canvas:
117 // BLACK for Pcbnew, BLACK or WHITE for Eeschema
118 m_colorSettings = nullptr;
119 m_polarCoords = false;
120 m_findReplaceData = std::make_unique<EDA_SEARCH_DATA>();
121 m_hotkeyPopup = nullptr;
122 m_propertiesPanel = nullptr;
123 m_netInspectorPanel = nullptr;
124
125 SetUserUnits( EDA_UNITS::MM );
126
127 m_auimgr.SetFlags( wxAUI_MGR_DEFAULT );
128
129 if( ( aStyle & wxFRAME_NO_TASKBAR ) == 0 )
130 {
131 CreateStatusBar( 8 )->SetDoubleBuffered( true );
132
133 GetStatusBar()->SetFont( KIUI::GetStatusFont( this ) );
134
135 // set the size of the status bar subwindows:
136 updateStatusBarWidths();
137 }
138
139 m_messagePanel = new EDA_MSG_PANEL( this, -1, wxPoint( 0, m_frameSize.y ), wxDefaultSize );
140 m_messagePanel->SetBackgroundColour( COLOR4D( LIGHTGRAY ).ToColour() );
141 m_msgFrameHeight = m_messagePanel->GetBestSize().y;
142
143 // Create child subwindows.
144 GetClientSize( &m_frameSize.x, &m_frameSize.y );
145 m_framePos.x = m_framePos.y = 0;
146 m_frameSize.y -= m_msgFrameHeight;
147
148 m_messagePanel->SetSize( m_frameSize.x, m_msgFrameHeight );
149
150 Bind( wxEVT_DPI_CHANGED,
151 [&]( wxDPIChangedEvent& )
152 {
153 if( ( GetWindowStyle() & wxFRAME_NO_TASKBAR ) == 0 )
154 updateStatusBarWidths();
155
156 wxMoveEvent dummy;
157 OnMove( dummy );
158
159 // we need to kludge the msg panel to the correct size again
160 // especially important even for first launches as the constructor of the window
161 // here usually doesn't have the correct dpi awareness yet
162 m_frameSize.y += m_msgFrameHeight;
163 m_msgFrameHeight = m_messagePanel->GetBestSize().y;
164 m_frameSize.y -= m_msgFrameHeight;
165
166 m_messagePanel->SetPosition( wxPoint( 0, m_frameSize.y ) );
167 m_messagePanel->SetSize( m_frameSize.x, m_msgFrameHeight );
168
169 // Don't skip, otherwise the frame gets too big
170 } );
171}
172
173
175{
178
179 delete m_actions;
180 delete m_toolManager;
181 delete m_toolDispatcher;
182 delete m_canvas;
183
184 delete m_currentScreen;
185 m_currentScreen = nullptr;
186
187 m_auimgr.UnInit();
188
189 ReleaseFile();
190}
191
192
194{
196
197 // Grid selection
198 auto gridSelectorFactory =
199 [this]( ACTION_TOOLBAR* aToolbar )
200 {
201 if( !m_gridSelectBox )
202 {
203 m_gridSelectBox = new wxChoice( aToolbar, ID_ON_GRID_SELECT, wxDefaultPosition,
204 wxDefaultSize, 0, nullptr );
205 }
206
208
209 aToolbar->Add( m_gridSelectBox );
210 };
211
213
214 // Zoom selection
215 auto zoomSelectorFactory =
216 [this]( ACTION_TOOLBAR* aToolbar )
217 {
218 if( !m_zoomSelectBox )
219 {
220 m_zoomSelectBox = new wxChoice( aToolbar, ID_ON_ZOOM_SELECT, wxDefaultPosition,
221 wxDefaultSize, 0, nullptr );
222 }
223
225 aToolbar->Add( m_zoomSelectBox );
226 };
227
229}
230
231
233{
234 if( m_file_checker.get() != nullptr )
235 m_file_checker->UnlockFile();
236}
237
238
239bool EDA_DRAW_FRAME::LockFile( const wxString& aFileName )
240{
241 // We need to explicitly reset here to get the deletion before
242 // we create a new unique_ptr that may be for the same file
243 m_file_checker.reset();
244
245 m_file_checker = std::make_unique<LOCKFILE>( aFileName );
246
247 if( !m_file_checker->Valid() && m_file_checker->IsLockedByMe() )
248 {
249 // If we cannot acquire the lock but we appear to be the one who
250 // locked it, check to see if there is another KiCad instance running.
251 // If there is not, then we can override the lock. This could happen if
252 // KiCad crashed or was interrupted
253 if( !Pgm().SingleInstance()->IsAnotherRunning() )
254 m_file_checker->OverrideLock();
255 }
256 // If the file is valid, return true. This could mean that the file is
257 // locked or it could mean that the file is read-only
258 return m_file_checker->Valid();
259}
260
261
263{
264 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PYTHON, false );
265
266 wxRect rect = GetScreenRect();
267 wxPoint center = rect.GetPosition() + rect.GetSize() / 2;
268
269 if( !frame )
270 {
271 frame = Kiway().Player( FRAME_PYTHON, true, Kiway().GetTop() );
272
273 // If we received an error in the CTOR due to Python-ness, don't crash
274 if( !frame )
275 return;
276
277 if( !frame->IsVisible() )
278 frame->Show( true );
279
280 // On Windows, Raise() does not bring the window on screen, when iconized
281 if( frame->IsIconized() )
282 frame->Iconize( false );
283
284 frame->Raise();
285 frame->SetPosition( center - frame->GetSize() / 2 );
286
287 return;
288 }
289
290 frame->Show( !frame->IsVisible() );
291 frame->SetPosition( center - frame->GetSize() / 2 );
292}
293
294
296{
297 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PYTHON, false );
298 return frame && frame->IsVisible();
299}
300
301
303{
304 // Notify all tools the units have changed
305 if( m_toolManager )
307
311}
312
313
315{
317 {
319 m_toolManager->GetTool<COMMON_TOOLS>()->ToggleUnits( dummy );
320 }
321 else
322 {
323 SetUserUnits( GetUserUnits() == EDA_UNITS::INCH ? EDA_UNITS::MM : EDA_UNITS::INCH );
325
326 wxCommandEvent e( EDA_EVT_UNITS_CHANGED );
327 ProcessEventLocally( e );
328 }
329}
330
331
333{
335
336 COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
338
339 if( m_supportsAutoSave && m_autoSaveTimer->IsRunning() )
340 {
341 if( GetAutoSaveInterval() > 0 )
342 {
343 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
344 }
345 else
346 {
347 m_autoSaveTimer->Stop();
348 m_autoSavePending = false;
349 }
350 }
351
352 viewControls->LoadSettings();
353
354 m_galDisplayOptions.ReadCommonConfig( *settings, this );
355
356 GetToolManager()->RunAction( ACTIONS::gridPreset, config()->m_Window.grid.last_size_idx );
358
359 if( m_lastToolbarIconSize == 0
361 {
364 }
365
366#ifndef __WXMAC__
368
369 if( m_canvasType != GetCanvas()->GetBackend() )
370 {
371 // Try to switch (will automatically fallback if necessary)
374 bool success = newGAL == m_canvasType;
375
376 if( !success )
377 {
378 m_canvasType = newGAL;
379 m_openGLFailureOccured = true; // Store failure for other EDA_DRAW_FRAMEs
380 }
381 }
382#endif
383
384 // Notify all tools the preferences have changed
385 if( m_toolManager )
387}
388
389
391{
392 if( m_messagePanel )
394}
395
396
398{
401
402 if( m_gridSelectBox == nullptr )
403 return;
404
405 // Update grid values with the current units setting.
406 m_gridSelectBox->Clear();
407 wxArrayString gridsList;
408
409 wxCHECK( config(), /* void */ );
410
411 GRID_MENU::BuildChoiceList( &gridsList, config(), this );
412
413 for( const wxString& grid : gridsList )
414 m_gridSelectBox->Append( grid );
415
416 m_gridSelectBox->Append( wxT( "---" ) );
417 m_gridSelectBox->Append( _( "Edit Grids..." ) );
418
419 m_gridSelectBox->SetSelection( config()->m_Window.grid.last_size_idx );
420}
421
422
423void EDA_DRAW_FRAME::OnUpdateSelectGrid( wxUpdateUIEvent& aEvent )
424{
425 // No need to update the grid select box if it doesn't exist or the grid setting change
426 // was made using the select box.
427 if( m_gridSelectBox == nullptr )
428 return;
429
430 wxCHECK( config(), /* void */ );
431
432 int idx = config()->m_Window.grid.last_size_idx;
433 idx = std::clamp( idx, 0, (int) m_gridSelectBox->GetCount() - 1 );
434
435 if( idx != m_gridSelectBox->GetSelection() )
436 m_gridSelectBox->SetSelection( idx );
437}
438
439
440
441void EDA_DRAW_FRAME::OnUpdateSelectZoom( wxUpdateUIEvent& aEvent )
442{
443 // No need to update the grid select box if it doesn't exist or the grid setting change
444 // was made using the select box.
445 if( m_zoomSelectBox == nullptr )
446 return;
447
448 double zoom = GetCanvas()->GetGAL()->GetZoomFactor();
449
450 wxCHECK( config(), /* void */ );
451
452 const std::vector<double>& zoomList = config()->m_Window.zoom_factors;
453 int curr_selection = m_zoomSelectBox->GetSelection();
454 int new_selection = 0; // select zoom auto
455 double last_approx = 1e9; // large value to start calculation
456
457 // Search for the nearest available value to the current zoom setting, and select it
458 for( size_t jj = 0; jj < zoomList.size(); ++jj )
459 {
460 double rel_error = std::fabs( zoomList[jj] - zoom ) / zoom;
461
462 if( rel_error < last_approx )
463 {
464 last_approx = rel_error;
465
466 // zoom IDs in m_zoomSelectBox start with 1 (leaving 0 for auto-zoom choice)
467 new_selection = jj + 1;
468 }
469 }
470
471 if( curr_selection != new_selection )
472 m_zoomSelectBox->SetSelection( new_selection );
473}
474
475
476void EDA_DRAW_FRAME::OnSelectGrid( wxCommandEvent& event )
477{
478 wxCHECK_RET( m_gridSelectBox, wxS( "m_gridSelectBox uninitialized" ) );
479
480 int idx = m_gridSelectBox->GetCurrentSelection();
481
482 if( idx == int( m_gridSelectBox->GetCount() ) - 2 )
483 {
484 // wxWidgets will check the separator, which we don't want.
485 // Re-check the current grid.
486 wxUpdateUIEvent dummy;
488 }
489 else if( idx == int( m_gridSelectBox->GetCount() ) - 1 )
490 {
491 // wxWidgets will check the Grid Settings... entry, which we don't want.
492 // Re-check the current grid.
493 wxUpdateUIEvent dummy;
495
496 // Give a time-slice to close the menu before opening the dialog.
497 // (Only matters on some versions of GTK.)
498 wxSafeYield();
499
501 }
502 else
503 {
505 }
506
508 m_canvas->Refresh();
509
510 // Needed on Windows because clicking on m_gridSelectBox remove the focus from m_canvas
511 // (Windows specific
513}
514
515
517{
518 wxCHECK( config(), true );
519
520 return config()->m_Window.grid.show;
521}
522
523
525{
526 wxCHECK( config(), /* void */ );
527
528 config()->m_Window.grid.show = aVisible;
529
530 // Update the display with the new grid
531 if( GetCanvas() )
532 {
533 // Check to ensure these exist, since this function could be called before
534 // the GAL and View have been created
535 if( GetCanvas()->GetGAL() )
536 GetCanvas()->GetGAL()->SetGridVisibility( aVisible );
537
538 if( GetCanvas()->GetView() )
540
541 GetCanvas()->Refresh();
542 }
543}
544
545
547{
548 wxCHECK( config(), false );
549
551}
552
553
555{
556 wxCHECK( config(), /* void */ );
557
558 config()->m_Window.grid.overrides_enabled = aOverride;
559}
560
561
562std::unique_ptr<GRID_HELPER> EDA_DRAW_FRAME::MakeGridHelper()
563{
564 return nullptr;
565}
566
567
569{
570 if( m_zoomSelectBox == nullptr )
571 return;
572
573 double zoom = m_canvas->GetGAL()->GetZoomFactor();
574
575 m_zoomSelectBox->Clear();
576 m_zoomSelectBox->Append( _( "Zoom Auto" ) );
577 m_zoomSelectBox->SetSelection( 0 );
578
579 wxCHECK( config(), /* void */ );
580
581 for( unsigned i = 0; i < config()->m_Window.zoom_factors.size(); ++i )
582 {
583 double current = config()->m_Window.zoom_factors[i];
584
585 m_zoomSelectBox->Append( wxString::Format( _( "Zoom %.2f" ), current ) );
586
587 if( zoom == current )
588 m_zoomSelectBox->SetSelection( i + 1 );
589 }
590}
591
592
593void EDA_DRAW_FRAME::OnSelectZoom( wxCommandEvent& event )
594{
595 wxCHECK_RET( m_zoomSelectBox, wxS( "m_zoomSelectBox uninitialized" ) );
596
597 int id = m_zoomSelectBox->GetCurrentSelection();
598
599 if( id < 0 || !( id < (int)m_zoomSelectBox->GetCount() ) )
600 return;
601
604 m_canvas->Refresh();
605
606 // Needed on Windows because clicking on m_zoomSelectBox remove the focus from m_canvas
607 // (Windows specific
609}
610
611
612void EDA_DRAW_FRAME::OnMove( wxMoveEvent& aEvent )
613{
614 // If the window is moved to a different display, the scaling factor may change
615 double oldFactor = m_galDisplayOptions.m_scaleFactor;
617
618 if( oldFactor != m_galDisplayOptions.m_scaleFactor && m_canvas )
619 {
620 wxSize clientSize = GetClientSize();
621 GetCanvas()->GetGAL()->ResizeScreen( clientSize.x, clientSize.y );
623 }
624
625 aEvent.Skip();
626}
627
628
630{
632 CONDITIONAL_MENU& aMenu = aToolMenu.GetMenu();
633
634 aMenu.AddSeparator( 1000 );
635
636 std::shared_ptr<ZOOM_MENU> zoomMenu = std::make_shared<ZOOM_MENU>( this );
637 zoomMenu->SetTool( commonTools );
638 aToolMenu.RegisterSubMenu( zoomMenu );
639
640 std::shared_ptr<GRID_MENU> gridMenu = std::make_shared<GRID_MENU>( this );
641 gridMenu->SetTool( commonTools );
642 aToolMenu.RegisterSubMenu( gridMenu );
643
644 aMenu.AddMenu( zoomMenu.get(), SELECTION_CONDITIONS::ShowAlways, 1000 );
645 aMenu.AddMenu( gridMenu.get(), SELECTION_CONDITIONS::ShowAlways, 1000 );
646}
647
648
649void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
650{
651 SetStatusText( msg, 6 );
652}
653
654
655void EDA_DRAW_FRAME::DisplayConstraintsMsg( const wxString& msg )
656{
657 SetStatusText( msg, 7 );
658}
659
660
662{
663 wxString msg;
664
667
668 msg.Printf( _( "grid %s" ),
669 gridSettings.grids[currentIdx].UserUnitsMessageText( this, false ) );
670
671 SetStatusText( msg, 4 );
672}
673
674
676{
677 wxString msg;
678
679 switch( GetUserUnits() )
680 {
681 case EDA_UNITS::INCH: msg = _( "inches" ); break;
682 case EDA_UNITS::MILS: msg = _( "mils" ); break;
683 case EDA_UNITS::MM: msg = _( "mm" ); break;
684 default: msg = _( "Units" ); break;
685 }
686
687 SetStatusText( msg, 5 );
688}
689
690
691void EDA_DRAW_FRAME::OnSize( wxSizeEvent& SizeEv )
692{
693 EDA_BASE_FRAME::OnSize( SizeEv );
694
695 m_frameSize = GetClientSize( );
696
697 SizeEv.Skip();
698}
699
700
702{
703 wxWindow* stsbar = GetStatusBar();
704 int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
705
706 int dims[] = {
707 // remainder of status bar on far left is set to a default or whatever is left over.
708 -1,
709
710 // When using GetTextSize() remember the width of character '1' is not the same
711 // as the width of '0' unless the font is fixed width, and it usually won't be.
712
713 // zoom:
714 KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x,
715
716 // cursor coords
717 KIUI::GetTextSize( wxT( "X 1234.1234 Y 1234.1234" ), stsbar ).x,
718
719 // delta distances
720 KIUI::GetTextSize( wxT( "dx 1234.1234 dy 1234.1234 dist 1234.1234" ), stsbar ).x,
721
722 // grid size
723 KIUI::GetTextSize( wxT( "grid X 1234.1234 Y 1234.1234" ), stsbar ).x,
724
725 // units display, Inches is bigger than mm
726 KIUI::GetTextSize( _( "Inches" ), stsbar ).x,
727
728 // Size for the "Current Tool" panel; longest string from SetTool()
729 KIUI::GetTextSize( wxT( "Add layer alignment target" ), stsbar ).x,
730
731 // constraint mode
732 KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x
733 };
734
735 for( size_t ii = 1; ii < arrayDim( dims ); ii++ )
736 dims[ii] += spacer;
737
738 SetStatusWidths( arrayDim( dims ), dims );
739}
740
741
743{
744 SetStatusText( GetZoomLevelIndicator(), 1 );
745
746 // Absolute and relative cursor positions are handled by overloading this function and
747 // handling the internal to user units conversion at the appropriate level.
748
749 // refresh units display
751}
752
753
755{
756 // returns a human readable value which can be displayed as zoom
757 // level indicator in dialogs.
758 double zoom = m_canvas->GetGAL()->GetZoomFactor();
759 return wxString::Format( wxT( "Z %.2f" ), zoom );
760}
761
762
764{
766
768 WINDOW_SETTINGS* window = GetWindowSettings( aCfg );
769
770 // Read units used in dialogs and toolbars
771 SetUserUnits( static_cast<EDA_UNITS>( aCfg->m_System.units ) );
772
774
775 m_galDisplayOptions.ReadConfig( *cmnCfg, *window, this );
776
777 m_findReplaceData->findString = aCfg->m_FindReplace.find_string;
778 m_findReplaceData->replaceString = aCfg->m_FindReplace.replace_string;
779 m_findReplaceData->matchMode =
780 static_cast<EDA_SEARCH_MATCH_MODE>( aCfg->m_FindReplace.match_mode );
781 m_findReplaceData->matchCase = aCfg->m_FindReplace.match_case;
782 m_findReplaceData->searchAndReplace = aCfg->m_FindReplace.search_and_replace;
783
784 for( const wxString& s : aCfg->m_FindReplace.find_history )
786
787 for( const wxString& s : aCfg->m_FindReplace.replace_history )
789
791}
792
793
795{
797
798 WINDOW_SETTINGS* window = GetWindowSettings( aCfg );
799
800 aCfg->m_System.units = static_cast<int>( GetUserUnits() );
802
804
805 aCfg->m_FindReplace.search_and_replace = m_findReplaceData->searchAndReplace;
806
807 aCfg->m_FindReplace.find_string = m_findReplaceData->findString;
808 aCfg->m_FindReplace.replace_string = m_findReplaceData->replaceString;
809
810 aCfg->m_FindReplace.find_history.clear();
811 aCfg->m_FindReplace.replace_history.clear();
812
813 for( size_t i = 0; i < m_findStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
814 {
815 aCfg->m_FindReplace.find_history.push_back( m_findStringHistoryList[ i ].ToStdString() );
816 }
817
818 for( size_t i = 0; i < m_replaceStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
819 {
820 aCfg->m_FindReplace.replace_history.push_back(
821 m_replaceStringHistoryList[ i ].ToStdString() );
822 }
823
824 // Save the units used in this frame
825 if( m_toolManager )
826 {
828 {
830 static_cast<int>( cmnTool->GetLastImperialUnits() );
831 aCfg->m_System.last_metric_units = static_cast<int>( cmnTool->GetLastMetricUnits() );
832 }
833 }
834}
835
836
837void EDA_DRAW_FRAME::AppendMsgPanel( const wxString& aTextUpper, const wxString& aTextLower,
838 int aPadding )
839{
841 m_messagePanel->AppendMessage( aTextUpper, aTextLower, aPadding );
842}
843
844
846{
849}
850
851
852void EDA_DRAW_FRAME::SetMsgPanel( const std::vector<MSG_PANEL_ITEM>& aList )
853{
855 {
857
858 for( const MSG_PANEL_ITEM& item : aList )
860 }
861}
862
863
864void EDA_DRAW_FRAME::SetMsgPanel( const wxString& aTextUpper, const wxString& aTextLower,
865 int aPadding )
866{
868 {
870 m_messagePanel->AppendMessage( aTextUpper, aTextLower, aPadding );
871 }
872}
873
874
876{
877 wxCHECK_RET( aItem, wxT( "Invalid EDA_ITEM pointer. Bad programmer." ) );
878
879 std::vector<MSG_PANEL_ITEM> items;
880 aItem->GetMsgPanelInfo( this, items );
881 SetMsgPanel( items );
882}
883
884
886{
887}
888
889
891{
892 GetCanvas()->SetEvtHandlerEnabled( true );
894}
895
896
898{
899 GetCanvas()->SwitchBackend( aCanvasType );
901
903}
904
905
907{
908#ifdef __WXMAC__
909 // Cairo renderer doesn't handle Retina displays so there's really only one game
910 // in town for Mac
912#endif
913
915 APP_SETTINGS_BASE* cfg = aCfg ? aCfg : Kiface().KifaceSettings();
916
917 if( cfg )
918 canvasType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type );
919
920 if( canvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE
921 || canvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST )
922 {
923 wxASSERT( false );
925 }
926
927 // Legacy canvas no longer supported. Switch to OpenGL, falls back to Cairo on failure
928 if( canvasType == EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE )
930
931 return canvasType;
932}
933
934
936{
937 // Not all classes derived from EDA_DRAW_FRAME can save the canvas type, because some
938 // have a fixed type, or do not have a option to set the canvas type (they inherit from
939 // a parent frame)
940 static std::vector<FRAME_T> s_allowedFrames =
941 {
946 };
947
948 if( !alg::contains( s_allowedFrames, m_ident ) )
949 return false;
950
951 if( aCanvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE
952 || aCanvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST )
953 {
954 wxASSERT( false );
955 return false;
956 }
957
958 if( APP_SETTINGS_BASE* cfg = Kiface().KifaceSettings() )
959 cfg->m_Graphics.canvas_type = static_cast<int>( aCanvasType );
960
961 return false;
962}
963
964
966{
967 const VECTOR2I& gridOrigin = GetGridOrigin();
968 VECTOR2D gridSize = GetCanvas()->GetGAL()->GetGridSize();
969
970 double xOffset = fmod( gridOrigin.x, gridSize.x );
971 int x = KiROUND( (aPosition.x - xOffset) / gridSize.x );
972 double yOffset = fmod( gridOrigin.y, gridSize.y );
973 int y = KiROUND( (aPosition.y - yOffset) / gridSize.y );
974
975 return VECTOR2I( KiROUND( x * gridSize.x + xOffset ), KiROUND( y * gridSize.y + yOffset ) );
976}
977
978
980{
981 const VECTOR2I& gridOrigin = GetGridOrigin();
982 VECTOR2D gridSize = GetCanvas()->GetGAL()->GetGridSize() / 2.0;
983
984 double xOffset = fmod( gridOrigin.x, gridSize.x );
985 int x = KiROUND( (aPosition.x - xOffset) / gridSize.x );
986 double yOffset = fmod( gridOrigin.y, gridSize.y );
987 int y = KiROUND( (aPosition.y - yOffset) / gridSize.y );
988
989 return VECTOR2I( KiROUND( x * gridSize.x + xOffset ), KiROUND( y * gridSize.y + yOffset ) );
990}
991
992
993const BOX2I EDA_DRAW_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
994{
995 return BOX2I();
996}
997
998
1000{
1001 // To be implemented by subclasses.
1002}
1003
1004
1005void EDA_DRAW_FRAME::Zoom_Automatique( bool aWarpPointer )
1006{
1008}
1009
1010
1011std::vector<wxWindow*> EDA_DRAW_FRAME::findDialogs()
1012{
1013 std::vector<wxWindow*> dialogs;
1014
1015 for( wxWindow* window : GetChildren() )
1016 {
1017 if( dynamic_cast<DIALOG_SHIM*>( window ) )
1018 dialogs.push_back( window );
1019 }
1020
1021 return dialogs;
1022}
1023
1024
1026{
1027 bool centerView = false;
1028 BOX2D r = GetCanvas()->GetView()->GetViewport();
1029
1030 // Center if we're off the current view, or within 10% of its edge
1031 r.Inflate( - (int) r.GetWidth() / 10 );
1032
1033 if( !r.Contains( aPos ) )
1034 centerView = true;
1035
1036 std::vector<BOX2D> dialogScreenRects;
1037
1038 for( wxWindow* dialog : findDialogs() )
1039 {
1040 dialogScreenRects.emplace_back(
1041 ToVECTOR2D( GetCanvas()->ScreenToClient( dialog->GetScreenPosition() ) ),
1042 ToVECTOR2D( dialog->GetSize() ) );
1043 }
1044
1045 // Center if we're behind an obscuring dialog, or within 10% of its edge
1046 for( BOX2D rect : dialogScreenRects )
1047 {
1048 rect.Inflate( rect.GetWidth() / 10 );
1049
1050 if( rect.Contains( GetCanvas()->GetView()->ToScreen( aPos ) ) )
1051 centerView = true;
1052 }
1053
1054 if( centerView )
1055 {
1056 try
1057 {
1058 GetCanvas()->GetView()->SetCenter( aPos, dialogScreenRects );
1059 }
1060 catch( const Clipper2Lib::Clipper2Exception& e )
1061 {
1062 wxFAIL_MSG( wxString::Format( wxT( "Clipper2 exception occurred centering object: %s" ),
1063 e.what() ) );
1064 }
1065 }
1066
1068}
1069
1070
1071static const wxString productName = wxT( "KiCad E.D.A. " );
1072
1073
1074void PrintDrawingSheet( const RENDER_SETTINGS* aSettings, const PAGE_INFO& aPageInfo,
1075 const wxString& aSheetName, const wxString& aSheetPath,
1076 const wxString& aFileName, const TITLE_BLOCK& aTitleBlock,
1077 const std::map<wxString, wxString>* aProperties, int aSheetCount,
1078 const wxString& aPageNumber, double aMils2Iu, const PROJECT* aProject,
1079 const wxString& aSheetLayer, bool aIsFirstPage )
1080{
1081 DS_DRAW_ITEM_LIST drawList( unityScale );
1082
1083 drawList.SetDefaultPenSize( aSettings->GetDefaultPenWidth() );
1084 drawList.SetPlotterMilsToIUfactor( aMils2Iu );
1085 drawList.SetPageNumber( aPageNumber );
1086 drawList.SetSheetCount( aSheetCount );
1087 drawList.SetFileName( aFileName );
1088 drawList.SetSheetName( aSheetName );
1089 drawList.SetSheetPath( aSheetPath );
1090 drawList.SetSheetLayer( aSheetLayer );
1091 drawList.SetProject( aProject );
1092 drawList.SetIsFirstPage( aIsFirstPage );
1093 drawList.SetProperties( aProperties );
1094
1095 drawList.BuildDrawItemsList( aPageInfo, aTitleBlock );
1096
1097 // Draw item list
1098 drawList.Print( aSettings );
1099}
1100
1101
1103 const std::map<wxString, wxString>* aProperties,
1104 double aMils2Iu, const wxString &aFilename,
1105 const wxString &aSheetLayer )
1106{
1108 return;
1109
1110 wxDC* DC = aSettings->GetPrintDC();
1111 wxPoint origin = DC->GetDeviceOrigin();
1112
1113 if( origin.y > 0 )
1114 {
1115 DC->SetDeviceOrigin( 0, 0 );
1116 DC->SetAxisOrientation( true, false );
1117 }
1118
1120 aFilename, GetTitleBlock(), aProperties, aScreen->GetPageCount(),
1121 aScreen->GetPageNumber(), aMils2Iu, &Prj(), aSheetLayer,
1122 aScreen->GetVirtualPageNumber() == 1 );
1123
1124 if( origin.y > 0 )
1125 {
1126 DC->SetDeviceOrigin( origin.x, origin.y );
1127 DC->SetAxisOrientation( true, true );
1128 }
1129}
1130
1131
1133{
1134 // Virtual function. Base class implementation returns an empty string.
1135 return wxEmptyString;
1136}
1137
1138
1140{
1141 // Virtual function. Base class implementation returns an empty string.
1142 return wxEmptyString;
1143}
1144
1145
1146bool EDA_DRAW_FRAME::LibraryFileBrowser( bool doOpen, wxFileName& aFilename,
1147 const wxString& wildcard, const wxString& ext,
1148 bool isDirectory, bool aIsGlobal,
1149 const wxString& aGlobalPath )
1150{
1151 wxString prompt = doOpen ? _( "Select Library" ) : _( "New Library" );
1152 aFilename.SetExt( ext );
1153
1154 wxString projectDir = Prj().IsNullProject() ? aFilename.GetPath() : Prj().GetProjectPath();
1155 wxString defaultDir;
1156
1157 if( aIsGlobal )
1158 {
1159 if( !GetMruPath().IsEmpty() && !GetMruPath().StartsWith( projectDir ) )
1160 defaultDir = GetMruPath();
1161 else
1162 defaultDir = aGlobalPath;
1163 }
1164 else
1165 {
1166 if( !GetMruPath().IsEmpty() && GetMruPath().StartsWith( projectDir ) )
1167 defaultDir = GetMruPath();
1168 else
1169 defaultDir = projectDir;
1170 }
1171
1172 if( isDirectory && doOpen )
1173 {
1174 wxDirDialog dlg( this, prompt, defaultDir, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );
1175
1176 if( dlg.ShowModal() == wxID_CANCEL )
1177 return false;
1178
1179 aFilename = dlg.GetPath();
1180 aFilename.SetExt( ext );
1181 }
1182 else
1183 {
1184 // Ensure the file has a dummy name, otherwise GTK will display the regex from the filter
1185 if( aFilename.GetName().empty() )
1186 aFilename.SetName( wxS( "Library" ) );
1187
1188 wxFileDialog dlg( this, prompt, defaultDir, aFilename.GetFullName(),
1189 wildcard, doOpen ? wxFD_OPEN | wxFD_FILE_MUST_EXIST
1190 : wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT );
1191
1192 if( dlg.ShowModal() == wxID_CANCEL )
1193 return false;
1194
1195 aFilename = dlg.GetPath();
1196 aFilename.SetExt( ext );
1197 }
1198
1199 SetMruPath( aFilename.GetPath() );
1200
1201 return true;
1202}
1203
1204
1206{
1208
1209 if( m_searchPane )
1210 {
1211 wxAuiPaneInfo& search_pane_info = m_auimgr.GetPane( m_searchPane );
1212 search_pane_info.Caption( _( "Search" ) );
1213 }
1214
1215 if( m_propertiesPanel )
1216 {
1217 wxAuiPaneInfo& properties_pane_info = m_auimgr.GetPane( m_propertiesPanel );
1218 properties_pane_info.Caption( _( "Properties" ) );
1219 }
1220
1222 {
1223 wxAuiPaneInfo& net_inspector_panel_info = m_auimgr.GetPane( m_netInspectorPanel );
1224 net_inspector_panel_info.Caption( _( "Net Inspector" ) );
1225 }
1226}
1227
1228
1230{
1231 if( m_isClosing || !m_propertiesPanel || !m_propertiesPanel->IsShownOnScreen() )
1232 return;
1233
1235}
1236
1237
1239{
1240 m_hotkeyPopup = new HOTKEY_CYCLE_POPUP( this );
1241}
1242
1243
1245{
1246 if( !m_colorSettings || aForceRefresh )
1247 {
1249
1250 const_cast<EDA_DRAW_FRAME*>( this )->m_colorSettings = colorSettings;
1251 }
1252
1253 return m_colorSettings;
1254}
1255
1256
1258{
1260
1261 if( cmnTool )
1262 {
1263 // Tell the tool what the units used last session
1264 cmnTool->SetLastUnits( static_cast<EDA_UNITS>( aCfg->m_System.last_imperial_units ) );
1265 cmnTool->SetLastUnits( static_cast<EDA_UNITS>( aCfg->m_System.last_metric_units ) );
1266 }
1267
1268 // Tell the tool what units the frame is currently using
1269 switch( static_cast<EDA_UNITS>( aCfg->m_System.units ) )
1270 {
1271 default:
1272 case EDA_UNITS::MM: m_toolManager->RunAction( ACTIONS::millimetersUnits ); break;
1273 case EDA_UNITS::INCH: m_toolManager->RunAction( ACTIONS::inchesUnits ); break;
1274 case EDA_UNITS::MILS: m_toolManager->RunAction( ACTIONS::milsUnits ); break;
1275 }
1276}
1277
1278
1279void EDA_DRAW_FRAME::GetUnitPair( EDA_UNITS& aPrimaryUnit, EDA_UNITS& aSecondaryUnits )
1280{
1282
1283 aPrimaryUnit = GetUserUnits();
1284 aSecondaryUnits = EDA_UNITS::MILS;
1285
1286 if( EDA_UNIT_UTILS::IsImperialUnit( aPrimaryUnit ) )
1287 {
1288 if( cmnTool )
1289 aSecondaryUnits = cmnTool->GetLastMetricUnits();
1290 else
1291 aSecondaryUnits = EDA_UNITS::MM;
1292 }
1293 else
1294 {
1295 if( cmnTool )
1296 aSecondaryUnits = cmnTool->GetLastImperialUnits();
1297 else
1298 aSecondaryUnits = EDA_UNITS::MILS;
1299 }
1300}
1301
1302
1304{
1306
1307 // If we had an OpenGL failure this session, use the fallback GAL but don't update the
1308 // user preference silently:
1309
1312}
1313
1314
1315void EDA_DRAW_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
1316{
1317 // Force a refresh of the message panel to ensure that the text is the right color
1318 // when the window activates
1319 if( !IsIconized() )
1320 m_messagePanel->Refresh();
1321}
1322
1323
1324void EDA_DRAW_FRAME::onActivate( wxActivateEvent& aEvent )
1325{
1326 handleActivateEvent( aEvent );
1327
1328 aEvent.Skip();
1329}
1330
1331
1332bool EDA_DRAW_FRAME::SaveCanvasImageToFile( const wxString& aFileName,
1333 BITMAP_TYPE aBitmapType )
1334{
1335 bool retv = true;
1336
1337 // Make a screen copy of the canvas:
1338 wxSize image_size = GetCanvas()->GetClientSize();
1339
1340 wxClientDC dc( GetCanvas() );
1341 wxBitmap bitmap( image_size.x, image_size.y );
1342 wxMemoryDC memdc;
1343
1344 memdc.SelectObject( bitmap );
1345 memdc.Blit( 0, 0, image_size.x, image_size.y, &dc, 0, 0 );
1346 memdc.SelectObject( wxNullBitmap );
1347
1348 wxImage image = bitmap.ConvertToImage();
1349
1350 wxBitmapType type = wxBITMAP_TYPE_PNG;
1351 switch( aBitmapType )
1352 {
1353 case BITMAP_TYPE::PNG: type = wxBITMAP_TYPE_PNG; break;
1354 case BITMAP_TYPE::BMP: type = wxBITMAP_TYPE_BMP; break;
1355 case BITMAP_TYPE::JPG: type = wxBITMAP_TYPE_JPEG; break;
1356 }
1357
1358 if( !image.SaveFile( aFileName, type ) )
1359 retv = false;
1360
1361 image.Destroy();
1362 return retv;
1363}
1364
1365
1367 APP_SETTINGS_BASE* aCfg )
1368{
1369 wxCHECK( aCfg, aAction.show_button );
1370
1371 for( const auto& [identifier, visible] : aCfg->m_Plugins.actions )
1372 {
1373 if( identifier == aAction.identifier )
1374 return visible;
1375 }
1376
1377 return aAction.show_button;
1378}
1379
1380
1381std::vector<const PLUGIN_ACTION*> EDA_DRAW_FRAME::GetOrderedPluginActions(
1383{
1384 std::vector<const PLUGIN_ACTION*> actions;
1385 wxCHECK( aCfg, actions );
1386
1387#ifdef KICAD_IPC_API
1388
1389 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1390 std::vector<const PLUGIN_ACTION*> unsorted = mgr.GetActionsForScope( aScope );
1391 std::map<wxString, const PLUGIN_ACTION*> actionMap;
1392 std::set<const PLUGIN_ACTION*> handled;
1393
1394 for( const PLUGIN_ACTION* action : unsorted )
1395 actionMap[action->identifier] = action;
1396
1397 for( const auto& identifier : aCfg->m_Plugins.actions | std::views::keys )
1398 {
1399 if( actionMap.contains( identifier ) )
1400 {
1401 const PLUGIN_ACTION* action = actionMap[ identifier ];
1402 actions.emplace_back( action );
1403 handled.insert( action );
1404 }
1405 }
1406
1407 for( const auto& action : actionMap | std::views::values )
1408 {
1409 if( !handled.contains( action ) )
1410 actions.emplace_back( action );
1411 }
1412
1413#endif
1414
1415 return actions;
1416}
1417
1418
1420{
1421#ifdef KICAD_IPC_API
1422 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1423
1424 mgr.ButtonBindings().clear();
1425
1426 std::vector<const PLUGIN_ACTION*> actions =
1428
1429 for( const PLUGIN_ACTION* action : actions )
1430 {
1431 if( !IsPluginActionButtonVisible( *action, config() ) )
1432 continue;
1433
1434 const wxBitmapBundle& icon = KIPLATFORM::UI::IsDarkTheme() && action->icon_dark.IsOk()
1435 ? action->icon_dark
1436 : action->icon_light;
1437
1438 wxAuiToolBarItem* button = aToolbar->AddTool( wxID_ANY, wxEmptyString, icon,
1439 action->name );
1440
1441 Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED,
1442 wxCommandEventHandler( EDA_DRAW_FRAME::OnApiPluginInvoke ) );
1443
1444 mgr.ButtonBindings().insert( { button->GetId(), action->identifier } );
1445 }
1446#endif
1447}
1448
1449
1450void EDA_DRAW_FRAME::OnApiPluginInvoke( wxCommandEvent& aEvent )
1451{
1452#ifdef KICAD_IPC_API
1453 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1454
1455 if( mgr.ButtonBindings().count( aEvent.GetId() ) )
1456 mgr.InvokeAction( mgr.ButtonBindings().at( aEvent.GetId() ) );
1457#endif
1458}
PLUGIN_ACTION_SCOPE
Definition: api_plugin.h:56
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:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition: box2.h:990
static TOOL_ACTION gridProperties
Definition: actions.h:193
static TOOL_ACTION millimetersUnits
Definition: actions.h:199
static TOOL_ACTION updatePreferences
Definition: actions.h:227
static TOOL_ACTION gridPreset
Definition: actions.h:190
static TOOL_ACTION updateUnits
Definition: actions.h:200
static TOOL_ACTION milsUnits
Definition: actions.h:198
static TOOL_ACTION inchesUnits
Definition: actions.h:197
static TOOL_ACTION zoomFitScreen
Definition: actions.h:134
static TOOL_ACTION zoomPreset
Definition: actions.h:137
static ACTION_TOOLBAR_CONTROL gridSelect
static ACTION_TOOLBAR_CONTROL zoomSelect
Define the structure of a toolbar with buttons that invoke ACTIONs.
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:213
FIND_REPLACE m_FindReplace
Definition: app_settings.h:195
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:70
constexpr BOX2< Vec > & Inflate(coord_type dx, coord_type dy)
Inflates the rectangle horizontally by dx and vertically by dy.
Definition: box2.h:558
constexpr size_type GetWidth() const
Definition: box2.h:214
constexpr bool Contains(const Vec &aPoint) const
Definition: box2.h:168
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:79
EDA_UNITS GetLastMetricUnits()
Definition: common_tools.h:78
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:52
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:468
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:455
void SetFileName(const wxString &aFileName)
Set the filename to draw/plot.
Definition: ds_draw_item.h:445
void SetDefaultPenSize(int aPenSize)
Definition: ds_draw_item.h:462
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:450
void SetIsFirstPage(bool aIsFirstPage)
Set if the page is the first page.
Definition: ds_draw_item.h:494
void SetProperties(const std::map< wxString, wxString > *aProps)
Set properties used for text variable resolution.
Definition: ds_draw_item.h:435
void SetSheetLayer(const wxString &aSheetLayer)
Set the sheet layer to draw/plot.
Definition: ds_draw_item.h:460
void SetSheetCount(int aSheetCount)
Set the value of the count of sheets, for basic inscriptions.
Definition: ds_draw_item.h:499
void SetPageNumber(const wxString &aPageNumber)
Set the value of the sheet number.
Definition: ds_draw_item.h:489
void SetProject(const PROJECT *aProject)
Definition: ds_draw_item.h:425
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
virtual WINDOW_SETTINGS * GetWindowSettings(APP_SETTINGS_BASE *aCfg)
Return a pointer to the window settings for this frame.
void OnToolbarSizeChanged()
Update toolbars if desired toolbar icon changed.
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
void RegisterCustomToolbarControlFactory(const ACTION_TOOLBAR_CONTROL &aControlDesc, const ACTION_TOOLBAR_CONTROL_FACTORY &aControlFactory)
Register a creation factory for toolbar controls that are present in this frame.
virtual void configureToolbars()
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
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 the close window event handler after frames are asked if they can close.
The base class for create windows for drawing purpose.
virtual const BOX2I GetDocumentExtents(bool aIncludeAllVisible=true) const
Return bounding box of document with option to not include some items.
wxArrayString m_replaceStringHistoryList
virtual void ClearMsgPanel()
Clear all messages from the message panel.
static std::vector< const PLUGIN_ACTION * > GetOrderedPluginActions(PLUGIN_ACTION_SCOPE aScope, APP_SETTINGS_BASE *aCfg)
Return ordered list of plugin actions for display in the toolbar.
void configureToolbars() override
EDA_DRAW_PANEL_GAL * m_canvas
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
This the frame's interface to setting GAL display options.
virtual const TITLE_BLOCK & GetTitleBlock() const =0
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.
EDA_DRAW_PANEL_GAL::GAL_TYPE m_canvasType
The current canvas type.
void ScriptingConsoleEnableDisable()
Toggle 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()
Get 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.
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)
Change 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)
Return 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()
Determine the canvas type to load (with prompt if required) and initializes m_canvasType.
static bool m_openGLFailureOccured
Has any failure occurred 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.
void FocusOnLocation(const VECTOR2I &aPos)
Useful to focus on a particular location, in find functions.
bool saveCanvasTypeSetting(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Store the canvas type in the application settings.
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 AddApiPluginTools(ACTION_TOOLBAR *aToolbar)
Append actions from API plugins to the given toolbar.
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 updateStatusBarWidths()
void PrintDrawingSheet(const RENDER_SETTINGS *aSettings, BASE_SCREEN *aScreen, const std::map< wxString, wxString > *aProperties, double aMils2Iu, const wxString &aFilename, const wxString &aSheetLayer=wxEmptyString)
Print 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.
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
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 std::unique_ptr< GRID_HELPER > MakeGridHelper()
virtual PLUGIN_ACTION_SCOPE PluginActionScope() const
std::unique_ptr< EDA_SEARCH_DATA > m_findReplaceData
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
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
bool m_showBorderAndTitleBlock
VECTOR2I GetNearestHalfGridPosition(const VECTOR2I &aPosition) const
Return the nearest aGridSize / 2 location to aPosition.
HOTKEY_CYCLE_POPUP * m_hotkeyPopup
void OnUpdateSelectGrid(wxUpdateUIEvent &aEvent)
Update the checked item in the grid wxchoice.
static bool IsPluginActionButtonVisible(const PLUGIN_ACTION &aAction, APP_SETTINGS_BASE *aCfg)
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:95
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:208
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:114
void EraseMsgBox()
Definition: msgpanel.cpp:218
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()
Load new settings from program common settings.
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:520
void MarkDirty()
Force redraw of view on the next rendering.
Definition: view.h:655
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition: view.cpp:586
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition: view.h:635
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:285
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:687
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
Container for project specific data.
Definition: project.h:64
virtual const wxString GetProjectPath() const
Return the full path of the project.
Definition: project.cpp:146
virtual bool IsNullProject() const
Check if this project is a null project (i.e.
Definition: project.cpp:164
virtual void UpdateData()=0
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
COLOR_SETTINGS * GetColorSettings(const wxString &aName="user")
Retrieve 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:171
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:173
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
Definition: tools_holder.h:55
ACTIONS * m_actions
Definition: tools_holder.h:172
Generic, UI-independent tool event.
Definition: tool_event.h:168
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:404
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
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
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
Common command IDs shared by more than one of the KiCad applications.
@ ID_ON_GRID_SELECT
Definition: id.h:137
@ ID_ON_ZOOM_SELECT
Definition: id.h:135
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:38
bool IsDarkTheme()
Determine if the desktop interface is currently using a dark theme or a light theme.
Definition: wxgtk/ui.cpp:48
KICOMMON_API wxFont GetStatusFont(wxWindow *aWindow)
Definition: ui_common.cpp:132
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:78
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:1071
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
std::vector< std::pair< wxString, bool > > actions
Ordered list of plugin actions mapped to whether or not they are shown in the toolbar.
Definition: app_settings.h:181
bool overrides_enabled
Definition: grid_settings.h:78
std::vector< GRID > grids
Definition: grid_settings.h:66
An action performed by a plugin via the IPC API (not to be confused with ACTION_PLUGIN,...
Definition: api_plugin.h:82
wxString identifier
Definition: api_plugin.h:87
bool show_button
Definition: api_plugin.h:90
Store 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
VECTOR2I center
wxLogTrace helper definitions.
Functions to provide common constants and other functions to assist in making a consistent UI.
VECTOR2< int32_t > VECTOR2I
Definition: vector2d.h:695
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition: vector2wx.h:40