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 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/kistatusbar.h>
67#include <widgets/msgpanel.h>
71#include <wx/event.h>
72#include <wx/snglinst.h>
73#include <widgets/ui_common.h>
74#include <widgets/search_pane.h>
75#include <wx/dirdlg.h>
76#include <wx/filedlg.h>
77#include <wx/debug.h>
78#include <wx/socket.h>
79
80#include <wx/snglinst.h>
81#include <wx/fdrepdlg.h>
82
83#define FR_HISTORY_LIST_CNT 10
84
85
86BEGIN_EVENT_TABLE( EDA_DRAW_FRAME, KIWAY_PLAYER )
89
90 EVT_ACTIVATE( EDA_DRAW_FRAME::onActivate )
91END_EVENT_TABLE()
92
93
94bool EDA_DRAW_FRAME::m_openGLFailureOccured = false;
95
96
97EDA_DRAW_FRAME::EDA_DRAW_FRAME( KIWAY* aKiway, wxWindow* aParent, FRAME_T aFrameType,
98 const wxString& aTitle, const wxPoint& aPos, const wxSize& aSize,
99 long aStyle, const wxString& aFrameName, const EDA_IU_SCALE& aIuScale ) :
100 KIWAY_PLAYER( aKiway, aParent, aFrameType, aTitle, aPos, aSize, aStyle, aFrameName, aIuScale ),
101 m_socketServer( nullptr ),
103{
104 m_gridSelectBox = nullptr;
105 m_zoomSelectBox = nullptr;
106 m_overrideLocksCb = nullptr;
107 m_searchPane = nullptr;
109
111 m_canvas = nullptr;
112 m_toolDispatcher = nullptr;
113 m_messagePanel = nullptr;
114 m_currentScreen = nullptr;
115 m_showBorderAndTitleBlock = false; // true to display reference sheet.
116 m_gridColor = COLOR4D( DARKGRAY ); // Default grid color
117 m_drawBgColor = COLOR4D( BLACK ); // the background color of the draw canvas:
118 // BLACK for Pcbnew, BLACK or WHITE for Eeschema
119 m_colorSettings = nullptr;
120 m_polarCoords = false;
121 m_findReplaceData = std::make_unique<EDA_SEARCH_DATA>();
122 m_hotkeyPopup = nullptr;
123 m_propertiesPanel = nullptr;
124 m_netInspectorPanel = nullptr;
125
127
128 m_auimgr.SetFlags( wxAUI_MGR_DEFAULT );
129
130 if( ( aStyle & wxFRAME_NO_TASKBAR ) == 0 )
131 {
132 CreateStatusBar( 8 )->SetDoubleBuffered( true );
133
134 GetStatusBar()->SetFont( KIUI::GetStatusFont( this ) );
135
136 // set the size of the status bar subwindows:
138 }
139
140 m_messagePanel = new EDA_MSG_PANEL( this, -1, wxPoint( 0, m_frameSize.y ), wxDefaultSize );
141 m_messagePanel->SetBackgroundColour( COLOR4D( LIGHTGRAY ).ToColour() );
142 m_msgFrameHeight = m_messagePanel->GetBestSize().y;
143
144 // Create child subwindows.
145 GetClientSize( &m_frameSize.x, &m_frameSize.y );
146 m_framePos.x = m_framePos.y = 0;
148
150
151 Bind( wxEVT_DPI_CHANGED,
152 [&]( wxDPIChangedEvent& )
153 {
154 if( ( GetWindowStyle() & wxFRAME_NO_TASKBAR ) == 0 )
156
157 wxMoveEvent dummy;
158 OnMove( dummy );
159
160 // we need to kludge the msg panel to the correct size again
161 // especially important even for first launches as the constructor of the window
162 // here usually doesn't have the correct dpi awareness yet
164 m_msgFrameHeight = m_messagePanel->GetBestSize().y;
166
167 m_messagePanel->SetPosition( wxPoint( 0, m_frameSize.y ) );
169
170 // Don't skip, otherwise the frame gets too big
171 } );
172}
173
174
176{
179
180 delete m_actions;
181 delete m_toolManager;
182 delete m_toolDispatcher;
183 delete m_canvas;
184
185 delete m_currentScreen;
186 m_currentScreen = nullptr;
187
188 m_auimgr.UnInit();
189
190 ReleaseFile();
191}
192
193
195{
197
198 // Grid selection
199 auto gridSelectorFactory =
200 [this]( ACTION_TOOLBAR* aToolbar )
201 {
202 if( !m_gridSelectBox )
203 m_gridSelectBox = new wxChoice( aToolbar, ID_ON_GRID_SELECT );
204
206
207 aToolbar->Add( m_gridSelectBox );
208 };
209
211
212 // Zoom selection
213 auto zoomSelectorFactory =
214 [this]( ACTION_TOOLBAR* aToolbar )
215 {
216 if( !m_zoomSelectBox )
217 m_zoomSelectBox = new wxChoice( aToolbar, ID_ON_ZOOM_SELECT );
218
220 aToolbar->Add( m_zoomSelectBox );
221 };
222
224
225 auto overrideLocksFactory =
226 [this]( ACTION_TOOLBAR* aToolbar )
227 {
228 if( !m_overrideLocksCb )
229 m_overrideLocksCb = new wxCheckBox( aToolbar, wxID_ANY, _( "Override locks" ) );
230
231 aToolbar->Add( m_overrideLocksCb );
232 };
233
235}
236
237
239{
240 if( m_file_checker )
241 m_file_checker->UnlockFile();
242}
243
244
245bool EDA_DRAW_FRAME::LockFile( const wxString& aFileName )
246{
247 // We need to explicitly reset here to get the deletion before we create a new unique_ptr that
248 // may be for the same file.
249 m_file_checker.reset();
250
251 m_file_checker = std::make_unique<LOCKFILE>( aFileName );
252
253 if( !m_file_checker->Valid() && m_file_checker->IsLockedByMe() )
254 {
255 // If we cannot acquire the lock but we appear to be the one who locked it, check to see if
256 // there is another KiCad instance running. If there is not, then we can override the lock.
257 // This could happen if KiCad crashed or was interrupted.
258 if( !Pgm().SingleInstance()->IsAnotherRunning() )
259 m_file_checker->OverrideLock();
260 }
261
262 // If the file is valid, return true. This could mean that the file is locked or it could mean
263 // that the file is read-only.
264 return m_file_checker->Valid();
265}
266
267
269{
270 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PYTHON, false );
271
272 wxRect rect = GetScreenRect();
273 wxPoint center = rect.GetPosition() + rect.GetSize() / 2;
274
275 if( !frame )
276 {
277 frame = Kiway().Player( FRAME_PYTHON, true, Kiway().GetTop() );
278
279 // If we received an error in the CTOR due to Python-ness, don't crash
280 if( !frame )
281 return;
282
283 if( !frame->IsVisible() )
284 frame->Show( true );
285
286 // On Windows, Raise() does not bring the window on screen, when iconized
287 if( frame->IsIconized() )
288 frame->Iconize( false );
289
290 frame->Raise();
291 frame->SetPosition( center - frame->GetSize() / 2 );
292
293 return;
294 }
295
296 frame->Show( !frame->IsVisible() );
297 frame->SetPosition( center - frame->GetSize() / 2 );
298}
299
300
302{
303 KIWAY_PLAYER* frame = Kiway().Player( FRAME_PYTHON, false );
304 return frame && frame->IsVisible();
305}
306
307
309{
310 // Notify all tools the units have changed
311 if( m_toolManager )
313
317}
318
319
321{
322 if( m_toolManager->GetTool<COMMON_TOOLS>() )
323 {
325 m_toolManager->GetTool<COMMON_TOOLS>()->ToggleUnits( dummy );
326 }
327 else
328 {
331
332 wxCommandEvent e( EDA_EVT_UNITS_CHANGED );
333 ProcessEventLocally( e );
334 }
335}
336
337
339{
341
342 COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
344
345 if( m_supportsAutoSave && m_autoSaveTimer->IsRunning() )
346 {
347 if( GetAutoSaveInterval() > 0 )
348 {
349 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
350 }
351 else
352 {
353 m_autoSaveTimer->Stop();
354 m_autoSavePending = false;
355 }
356 }
357
358 viewControls->LoadSettings();
359
360 m_galDisplayOptions.ReadCommonConfig( *settings, this );
361
362 GetToolManager()->RunAction( ACTIONS::gridPreset, config()->m_Window.grid.last_size_idx );
364
365 if( m_lastToolbarIconSize == 0
367 {
370 }
371
372#ifndef __WXMAC__
374
375 if( m_canvasType != GetCanvas()->GetBackend() )
376 {
377 // Try to switch (will automatically fallback if necessary)
380 bool success = newGAL == m_canvasType;
381
382 if( !success )
383 {
384 m_canvasType = newGAL;
385 m_openGLFailureOccured = true; // Store failure for other EDA_DRAW_FRAMEs
386 }
387 }
388#endif
389
390 // Notify all tools the preferences have changed
391 if( m_toolManager )
393}
394
395
397{
398 if( m_messagePanel )
399 m_messagePanel->EraseMsgBox();
400}
401
402
404{
407
408 if( m_gridSelectBox == nullptr )
409 return;
410
411 // Update grid values with the current units setting.
412 m_gridSelectBox->Clear();
413 wxArrayString gridsList;
414
415 wxCHECK( config(), /* void */ );
416
417 GRID_MENU::BuildChoiceList( &gridsList, config(), this );
418
419 for( const wxString& grid : gridsList )
420 m_gridSelectBox->Append( grid );
421
422 m_gridSelectBox->Append( wxT( "---" ) );
423 m_gridSelectBox->Append( _( "Edit Grids..." ) );
424
425 m_gridSelectBox->SetSelection( config()->m_Window.grid.last_size_idx );
426}
427
428
429void EDA_DRAW_FRAME::OnUpdateSelectGrid( wxUpdateUIEvent& aEvent )
430{
431 // No need to update the grid select box if it doesn't exist or the grid setting change
432 // was made using the select box.
433 if( m_gridSelectBox == nullptr )
434 return;
435
436 wxCHECK( config(), /* void */ );
437
438 int idx = config()->m_Window.grid.last_size_idx;
439 idx = std::clamp( idx, 0, (int) m_gridSelectBox->GetCount() - 1 );
440
441 if( idx != m_gridSelectBox->GetSelection() )
442 m_gridSelectBox->SetSelection( idx );
443}
444
445
446
447void EDA_DRAW_FRAME::OnUpdateSelectZoom( wxUpdateUIEvent& aEvent )
448{
449 // No need to update the grid select box if it doesn't exist or the grid setting change
450 // was made using the select box.
451 if( m_zoomSelectBox == nullptr )
452 return;
453
454 double zoom = GetCanvas()->GetGAL()->GetZoomFactor();
455
456 wxCHECK( config(), /* void */ );
457
458 const std::vector<double>& zoomList = config()->m_Window.zoom_factors;
459 int curr_selection = m_zoomSelectBox->GetSelection();
460 int new_selection = 0; // select zoom auto
461 double last_approx = 1e9; // large value to start calculation
462
463 // Search for the nearest available value to the current zoom setting, and select it
464 for( size_t jj = 0; jj < zoomList.size(); ++jj )
465 {
466 double rel_error = std::fabs( zoomList[jj] - zoom ) / zoom;
467
468 if( rel_error < last_approx )
469 {
470 last_approx = rel_error;
471
472 // zoom IDs in m_zoomSelectBox start with 1 (leaving 0 for auto-zoom choice)
473 new_selection = (int) jj + 1;
474 }
475 }
476
477 if( curr_selection != new_selection )
478 m_zoomSelectBox->SetSelection( new_selection );
479}
480
481
482void EDA_DRAW_FRAME::OnSelectGrid( wxCommandEvent& event )
483{
484 wxCHECK_RET( m_gridSelectBox, wxS( "m_gridSelectBox uninitialized" ) );
485
486 int idx = m_gridSelectBox->GetCurrentSelection();
487
488 if( idx == int( m_gridSelectBox->GetCount() ) - 2 )
489 {
490 // wxWidgets will check the separator, which we don't want.
491 // Re-check the current grid.
492 wxUpdateUIEvent dummy;
494 }
495 else if( idx == int( m_gridSelectBox->GetCount() ) - 1 )
496 {
497 // wxWidgets will check the Grid Settings... entry, which we don't want.
498 // Re-check the current grid.
499 wxUpdateUIEvent dummy;
501
502 // Give a time-slice to close the menu before opening the dialog.
503 // (Only matters on some versions of GTK.)
504 wxSafeYield();
505
507 }
508 else
509 {
510 m_toolManager->RunAction( ACTIONS::gridPreset, idx );
511 }
512
514 m_canvas->Refresh();
515
516 // Needed on Windows because clicking on m_gridSelectBox remove the focus from m_canvas
517 // (Windows specific
518 m_canvas->SetFocus();
519}
520
521
523{
525 return m_overrideLocksCb->GetValue();
526
527 return false;
528}
529
530
532{
533 wxCHECK( config(), true );
534
535 return config()->m_Window.grid.show;
536}
537
538
540{
541 wxCHECK( config(), /* void */ );
542
543 config()->m_Window.grid.show = aVisible;
544
545 // Update the display with the new grid
546 if( GetCanvas() )
547 {
548 // Check to ensure these exist, since this function could be called before
549 // the GAL and View have been created
550 if( GetCanvas()->GetGAL() )
551 GetCanvas()->GetGAL()->SetGridVisibility( aVisible );
552
553 if( GetCanvas()->GetView() )
555
556 GetCanvas()->Refresh();
557 }
558}
559
560
562{
563 wxCHECK( config(), false );
564
566}
567
568
570{
571 wxCHECK( config(), /* void */ );
572
573 config()->m_Window.grid.overrides_enabled = aOverride;
574}
575
576
577std::unique_ptr<GRID_HELPER> EDA_DRAW_FRAME::MakeGridHelper()
578{
579 return nullptr;
580}
581
582
584{
585 if( m_zoomSelectBox == nullptr )
586 return;
587
588 double zoom = m_canvas->GetGAL()->GetZoomFactor();
589
590 m_zoomSelectBox->Clear();
591 m_zoomSelectBox->Append( _( "Zoom Auto" ) );
592 m_zoomSelectBox->SetSelection( 0 );
593
594 wxCHECK( config(), /* void */ );
595
596 for( unsigned ii = 0; ii < config()->m_Window.zoom_factors.size(); ++ii )
597 {
598 double current = config()->m_Window.zoom_factors[ii];
599
600 m_zoomSelectBox->Append( wxString::Format( _( "Zoom %.2f" ), current ) );
601
602 if( zoom == current )
603 m_zoomSelectBox->SetSelection( (int) ii + 1 );
604 }
605}
606
607
608void EDA_DRAW_FRAME::OnSelectZoom( wxCommandEvent& event )
609{
610 wxCHECK_RET( m_zoomSelectBox, wxS( "m_zoomSelectBox uninitialized" ) );
611
612 int id = m_zoomSelectBox->GetCurrentSelection();
613
614 if( id < 0 || !( id < (int)m_zoomSelectBox->GetCount() ) )
615 return;
616
617 m_toolManager->RunAction( ACTIONS::zoomPreset, id );
619 m_canvas->Refresh();
620
621 // Needed on Windows (only) because clicking on m_zoomSelectBox removes the focus from m_canvas
622 m_canvas->SetFocus();
623}
624
625
626void EDA_DRAW_FRAME::OnMove( wxMoveEvent& aEvent )
627{
628 // If the window is moved to a different display, the scaling factor may change
629 double oldFactor = m_galDisplayOptions.m_scaleFactor;
630 m_galDisplayOptions.UpdateScaleFactor();
631
632 if( oldFactor != m_galDisplayOptions.m_scaleFactor && m_canvas )
633 {
634 wxSize clientSize = GetClientSize();
635 GetCanvas()->GetGAL()->ResizeScreen( clientSize.x, clientSize.y );
637 }
638
639 aEvent.Skip();
640}
641
642
644{
645 COMMON_TOOLS* commonTools = m_toolManager->GetTool<COMMON_TOOLS>();
646 CONDITIONAL_MENU& aMenu = aToolMenu.GetMenu();
647
648 aMenu.AddSeparator( 1000 );
649
650 std::shared_ptr<ZOOM_MENU> zoomMenu = std::make_shared<ZOOM_MENU>( this );
651 zoomMenu->SetTool( commonTools );
652 aToolMenu.RegisterSubMenu( zoomMenu );
653
654 std::shared_ptr<GRID_MENU> gridMenu = std::make_shared<GRID_MENU>( this );
655 gridMenu->SetTool( commonTools );
656 aToolMenu.RegisterSubMenu( gridMenu );
657
658 aMenu.AddMenu( zoomMenu.get(), SELECTION_CONDITIONS::ShowAlways, 1000 );
659 aMenu.AddMenu( gridMenu.get(), SELECTION_CONDITIONS::ShowAlways, 1000 );
660}
661
662
663void EDA_DRAW_FRAME::DisplayToolMsg( const wxString& msg )
664{
665 if( m_isClosing )
666 return;
667
668 SetStatusText( msg, 6 );
669}
670
671
672void EDA_DRAW_FRAME::DisplayConstraintsMsg( const wxString& msg )
673{
674 if( m_isClosing )
675 return;
676
677 SetStatusText( msg, 7 );
678}
679
680
682{
683 if( m_isClosing )
684 return;
685
686 wxString msg;
687
688 GRID_SETTINGS& gridSettings = m_toolManager->GetSettings()->m_Window.grid;
689 int currentIdx = m_toolManager->GetSettings()->m_Window.grid.last_size_idx;
690
691 msg.Printf( _( "grid %s" ), gridSettings.grids[currentIdx].UserUnitsMessageText( this, false ) );
692
693 SetStatusText( msg, 4 );
694}
695
696
698{
699 if( m_isClosing )
700 return;
701
702 wxString msg;
703
704 switch( GetUserUnits() )
705 {
706 case EDA_UNITS::INCH: msg = _( "inches" ); break;
707 case EDA_UNITS::MILS: msg = _( "mils" ); break;
708 case EDA_UNITS::MM: msg = _( "mm" ); break;
709 default: msg = _( "Units" ); break;
710 }
711
712 SetStatusText( msg, 5 );
713}
714
715
716void EDA_DRAW_FRAME::OnSize( wxSizeEvent& SizeEv )
717{
718 EDA_BASE_FRAME::OnSize( SizeEv );
719
720 m_frameSize = GetClientSize( );
721
722 SizeEv.Skip();
723}
724
725
727{
728 constexpr int numLocalFields = 8;
729
730 wxStatusBar* stsbar = GetStatusBar();
731 int spacer = KIUI::GetTextSize( wxT( "M" ), stsbar ).x * 2;
732
733 // Note this is a KISTATUSBAR and there are fields to the right of the ones we know about
734 int totalFields = stsbar->GetFieldsCount();
735
736 std::vector<int> dims = {
737 // remainder of status bar on far left is set to a default or whatever is left over.
738 -1,
739
740 // When using GetTextSize() remember the width of character '1' is not the same
741 // as the width of '0' unless the font is fixed width, and it usually won't be.
742
743 // zoom:
744 KIUI::GetTextSize( wxT( "Z 762000" ), stsbar ).x,
745
746 // cursor coords
747 KIUI::GetTextSize( wxT( "X 1234.1234 Y 1234.1234" ), stsbar ).x,
748
749 // delta distances
750 KIUI::GetTextSize( wxT( "dx 1234.1234 dy 1234.1234 dist 1234.1234" ), stsbar ).x,
751
752 // grid size
753 KIUI::GetTextSize( wxT( "grid X 1234.1234 Y 1234.1234" ), stsbar ).x,
754
755 // units display, Inches is bigger than mm
756 KIUI::GetTextSize( _( "Inches" ), stsbar ).x,
757
758 // Size for the "Current Tool" panel; longest string from SetTool()
759 KIUI::GetTextSize( wxT( "Add layer alignment target" ), stsbar ).x,
760
761 // constraint mode
762 KIUI::GetTextSize( _( "Constrain to H, V, 45" ), stsbar ).x
763 };
764
765 for( int& dim : dims )
766 dim += spacer;
767
768 for( int idx = numLocalFields; idx < totalFields; ++idx )
769 dims.emplace_back( stsbar->GetStatusWidth( idx ) );
770
771 SetStatusWidths( dims.size(), dims.data() );
772}
773
774
775wxStatusBar* EDA_DRAW_FRAME::OnCreateStatusBar( int number, long style, wxWindowID id,
776 const wxString& name )
777{
778 return new KISTATUSBAR( number, this, id, KISTATUSBAR::STYLE_FLAGS::NONE_STYLE );
779}
780
781
783{
784 if( m_isClosing )
785 return;
786
787 SetStatusText( GetZoomLevelIndicator(), 1 );
788
789 // Absolute and relative cursor positions are handled by overloading this function and
790 // handling the internal to user units conversion at the appropriate level.
791
792 // refresh units display
794}
795
796
798{
799 // returns a human readable value which can be displayed as zoom
800 // level indicator in dialogs.
801 double zoom = m_canvas->GetGAL()->GetZoomFactor();
802 return wxString::Format( wxT( "Z %.2f" ), zoom );
803}
804
805
807{
809
811 WINDOW_SETTINGS* window = GetWindowSettings( aCfg );
812
813 // Read units used in dialogs and toolbars
814 SetUserUnits( static_cast<EDA_UNITS>( aCfg->m_System.units ) );
815
817
818 m_galDisplayOptions.ReadConfig( *cmnCfg, *window, this );
819
820 m_findReplaceData->findString = aCfg->m_FindReplace.find_string;
821 m_findReplaceData->replaceString = aCfg->m_FindReplace.replace_string;
822 m_findReplaceData->matchMode = static_cast<EDA_SEARCH_MATCH_MODE>( aCfg->m_FindReplace.match_mode );
823 m_findReplaceData->matchCase = aCfg->m_FindReplace.match_case;
824 m_findReplaceData->searchAndReplace = aCfg->m_FindReplace.search_and_replace;
825
826 for( const wxString& s : aCfg->m_FindReplace.find_history )
828
829 for( const wxString& s : aCfg->m_FindReplace.replace_history )
831
833}
834
835
837{
839
840 WINDOW_SETTINGS* window = GetWindowSettings( aCfg );
841
842 aCfg->m_System.units = static_cast<int>( GetUserUnits() );
844
845 m_galDisplayOptions.WriteConfig( *window );
846
847 aCfg->m_FindReplace.search_and_replace = m_findReplaceData->searchAndReplace;
848
849 aCfg->m_FindReplace.find_string = m_findReplaceData->findString;
850 aCfg->m_FindReplace.replace_string = m_findReplaceData->replaceString;
851
852 aCfg->m_FindReplace.find_history.clear();
853 aCfg->m_FindReplace.replace_history.clear();
854
855 for( size_t i = 0; i < m_findStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
856 aCfg->m_FindReplace.find_history.push_back( m_findStringHistoryList[ i ].ToStdString() );
857
858 for( size_t i = 0; i < m_replaceStringHistoryList.GetCount() && i < FR_HISTORY_LIST_CNT; i++ )
859 aCfg->m_FindReplace.replace_history.push_back( m_replaceStringHistoryList[ i ].ToStdString() );
860
861 // Save the units used in this frame
862 if( m_toolManager )
863 {
864 if( COMMON_TOOLS* cmnTool = m_toolManager->GetTool<COMMON_TOOLS>() )
865 {
866 aCfg->m_System.last_imperial_units = static_cast<int>( cmnTool->GetLastImperialUnits() );
867 aCfg->m_System.last_metric_units = static_cast<int>( cmnTool->GetLastMetricUnits() );
868 }
869 }
870}
871
872
873void EDA_DRAW_FRAME::AppendMsgPanel( const wxString& aTextUpper, const wxString& aTextLower,
874 int aPadding )
875{
877 m_messagePanel->AppendMessage( aTextUpper, aTextLower, aPadding );
878}
879
880
882{
884 m_messagePanel->EraseMsgBox();
885}
886
887
888void EDA_DRAW_FRAME::SetMsgPanel( const std::vector<MSG_PANEL_ITEM>& aList )
889{
891 {
892 m_messagePanel->EraseMsgBox();
893
894 for( const MSG_PANEL_ITEM& item : aList )
895 m_messagePanel->AppendMessage( item );
896 }
897}
898
899
900void EDA_DRAW_FRAME::SetMsgPanel( const wxString& aTextUpper, const wxString& aTextLower,
901 int aPadding )
902{
904 {
905 m_messagePanel->EraseMsgBox();
906 m_messagePanel->AppendMessage( aTextUpper, aTextLower, aPadding );
907 }
908}
909
910
912{
913 wxCHECK_RET( aItem, wxT( "Invalid EDA_ITEM pointer. Bad programmer." ) );
914
915 std::vector<MSG_PANEL_ITEM> items;
916 aItem->GetMsgPanelInfo( this, items );
917 SetMsgPanel( items );
918}
919
920
924
925
927{
928 GetCanvas()->SetEvtHandlerEnabled( true );
930}
931
932
940
941
943{
944#ifdef __WXMAC__
945 // Cairo renderer doesn't handle Retina displays so there's really only one game
946 // in town for Mac
948#endif
949
952
953 if( cfg )
954 canvasType = static_cast<EDA_DRAW_PANEL_GAL::GAL_TYPE>( cfg->m_Graphics.canvas_type );
955
956 if( canvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE
957 || canvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST )
958 {
959 wxASSERT( false );
961 }
962
963 // Legacy canvas no longer supported. Switch to OpenGL, falls back to Cairo on failure
964 if( canvasType == EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE )
966
967 wxString envCanvasType;
968
969 if( wxGetEnv( "KICAD_SOFTWARE_RENDERING", &envCanvasType ) )
970 {
971 if( envCanvasType.CmpNoCase( "1" ) == 0
972 || envCanvasType.CmpNoCase( "true" ) == 0
973 || envCanvasType.CmpNoCase( "yes" ) == 0 )
974 {
975 // Force software rendering if the environment variable is set
977 }
978 }
979
980 return canvasType;
981}
982
983
985{
986 // Not all classes derived from EDA_DRAW_FRAME can save the canvas type, because some
987 // have a fixed type, or do not have a option to set the canvas type (they inherit from
988 // a parent frame)
989 static std::vector<FRAME_T> s_allowedFrames = { FRAME_SCH,
995
996 if( !alg::contains( s_allowedFrames, m_ident ) )
997 return false;
998
999 if( wxGetEnv( "KICAD_SOFTWARE_RENDERING", nullptr ) )
1000 {
1001 // If the environment variable is set, don't save the canvas type.
1002 return false;
1003 }
1004
1005 if( aCanvasType < EDA_DRAW_PANEL_GAL::GAL_TYPE_NONE || aCanvasType >= EDA_DRAW_PANEL_GAL::GAL_TYPE_LAST )
1006 {
1007 wxASSERT( false );
1008 return false;
1009 }
1010
1011 if( COMMON_SETTINGS* cfg = Pgm().GetCommonSettings() )
1012 cfg->m_Graphics.canvas_type = static_cast<int>( aCanvasType );
1013
1014 return false;
1015}
1016
1017
1019{
1020 const VECTOR2I& gridOrigin = GetGridOrigin();
1021 VECTOR2D gridSize = GetCanvas()->GetGAL()->GetGridSize();
1022
1023 double xOffset = fmod( gridOrigin.x, gridSize.x );
1024 int x = KiROUND( (aPosition.x - xOffset) / gridSize.x );
1025 double yOffset = fmod( gridOrigin.y, gridSize.y );
1026 int y = KiROUND( (aPosition.y - yOffset) / gridSize.y );
1027
1028 return VECTOR2I( KiROUND( x * gridSize.x + xOffset ), KiROUND( y * gridSize.y + yOffset ) );
1029}
1030
1031
1033{
1034 const VECTOR2I& gridOrigin = GetGridOrigin();
1035 VECTOR2D gridSize = GetCanvas()->GetGAL()->GetGridSize() / 2.0;
1036
1037 double xOffset = fmod( gridOrigin.x, gridSize.x );
1038 int x = KiROUND( (aPosition.x - xOffset) / gridSize.x );
1039 double yOffset = fmod( gridOrigin.y, gridSize.y );
1040 int y = KiROUND( (aPosition.y - yOffset) / gridSize.y );
1041
1042 return VECTOR2I( KiROUND( x * gridSize.x + xOffset ), KiROUND( y * gridSize.y + yOffset ) );
1043}
1044
1045
1046const BOX2I EDA_DRAW_FRAME::GetDocumentExtents( bool aIncludeAllVisible ) const
1047{
1048 return BOX2I();
1049}
1050
1051
1053{
1054 // To be implemented by subclasses.
1055}
1056
1057
1058void EDA_DRAW_FRAME::Zoom_Automatique( bool aWarpPointer )
1059{
1061}
1062
1063
1064std::vector<wxWindow*> EDA_DRAW_FRAME::findDialogs()
1065{
1066 std::vector<wxWindow*> dialogs;
1067
1068 for( wxWindow* window : GetChildren() )
1069 {
1070 if( dynamic_cast<DIALOG_SHIM*>( window ) )
1071 dialogs.push_back( window );
1072 }
1073
1074 return dialogs;
1075}
1076
1077
1078void EDA_DRAW_FRAME::FocusOnLocation( const VECTOR2I& aPos, bool aAllowScroll )
1079{
1080 bool centerView = false;
1081 std::vector<BOX2D> dialogScreenRects;
1082
1083 if( aAllowScroll )
1084 {
1085 BOX2D r = GetCanvas()->GetView()->GetViewport();
1086
1087 // Center if we're off the current view, or within 10% of its edge
1088 r.Inflate( - r.GetWidth() / 10.0 );
1089
1090 if( !r.Contains( aPos ) )
1091 centerView = true;
1092
1093 for( wxWindow* dialog : findDialogs() )
1094 {
1095 dialogScreenRects.emplace_back( ToVECTOR2D( GetCanvas()->ScreenToClient( dialog->GetScreenPosition() ) ),
1096 ToVECTOR2D( dialog->GetSize() ) );
1097 }
1098
1099 // Center if we're behind an obscuring dialog, or within 10% of its edge
1100 for( BOX2D rect : dialogScreenRects )
1101 {
1102 rect.Inflate( rect.GetWidth() / 10 );
1103
1104 if( rect.Contains( GetCanvas()->GetView()->ToScreen( aPos ) ) )
1105 centerView = true;
1106 }
1107 }
1108
1109 if( centerView )
1110 {
1111 try
1112 {
1113 GetCanvas()->GetView()->SetCenter( aPos, dialogScreenRects );
1114 }
1115 catch( const Clipper2Lib::Clipper2Exception& e )
1116 {
1117 wxFAIL_MSG( wxString::Format( wxT( "Clipper2 exception occurred centering object: %s" ), e.what() ) );
1118 }
1119 }
1120
1122}
1123
1124
1125void PrintDrawingSheet( const RENDER_SETTINGS* aSettings, const PAGE_INFO& aPageInfo,
1126 const wxString& aSheetName, const wxString& aSheetPath,
1127 const wxString& aFileName, const TITLE_BLOCK& aTitleBlock,
1128 const std::map<wxString, wxString>* aProperties, int aSheetCount,
1129 const wxString& aPageNumber, double aMils2Iu, const PROJECT* aProject,
1130 const wxString& aSheetLayer, bool aIsFirstPage )
1131{
1132 DS_DRAW_ITEM_LIST drawList( unityScale );
1133
1134 drawList.SetDefaultPenSize( aSettings->GetDefaultPenWidth() );
1135 drawList.SetPlotterMilsToIUfactor( aMils2Iu );
1136 drawList.SetPageNumber( aPageNumber );
1137 drawList.SetSheetCount( aSheetCount );
1138 drawList.SetFileName( aFileName );
1139 drawList.SetSheetName( aSheetName );
1140 drawList.SetSheetPath( aSheetPath );
1141 drawList.SetSheetLayer( aSheetLayer );
1142 drawList.SetProject( aProject );
1143 drawList.SetIsFirstPage( aIsFirstPage );
1144 drawList.SetProperties( aProperties );
1145
1146 drawList.BuildDrawItemsList( aPageInfo, aTitleBlock );
1147
1148 // Draw item list
1149 drawList.Print( aSettings );
1150}
1151
1152
1154 const std::map<wxString, wxString>* aProperties,
1155 double aMils2Iu, const wxString &aFilename,
1156 const wxString &aSheetLayer )
1157{
1159 return;
1160
1161 wxDC* DC = aSettings->GetPrintDC();
1162 wxPoint origin = DC->GetDeviceOrigin();
1163
1164 if( origin.y > 0 )
1165 {
1166 DC->SetDeviceOrigin( 0, 0 );
1167 DC->SetAxisOrientation( true, false );
1168 }
1169
1171 aFilename, GetTitleBlock(), aProperties, aScreen->GetPageCount(),
1172 aScreen->GetPageNumber(), aMils2Iu, &Prj(), aSheetLayer,
1173 aScreen->GetVirtualPageNumber() == 1 );
1174
1175 if( origin.y > 0 )
1176 {
1177 DC->SetDeviceOrigin( origin.x, origin.y );
1178 DC->SetAxisOrientation( true, true );
1179 }
1180}
1181
1182
1184{
1185 // Virtual function. Base class implementation returns an empty string.
1186 return wxEmptyString;
1187}
1188
1189
1191{
1192 // Virtual function. Base class implementation returns an empty string.
1193 return wxEmptyString;
1194}
1195
1196
1197bool EDA_DRAW_FRAME::LibraryFileBrowser( const wxString& aTitle, bool doOpen, wxFileName& aFilename,
1198 const wxString& wildcard, const wxString& ext,
1199 bool isDirectory, FILEDLG_HOOK_NEW_LIBRARY* aFileDlgHook )
1200{
1201 aFilename.SetExt( ext );
1202
1203 wxString defaultDir = aFilename.GetPath();
1204
1205 if( defaultDir.IsEmpty() )
1206 defaultDir = GetMruPath();
1207
1208 if( isDirectory && doOpen )
1209 {
1210 wxDirDialog dlg( this, aTitle, defaultDir, wxDD_DEFAULT_STYLE | wxDD_DIR_MUST_EXIST );
1211
1212 if( dlg.ShowModal() == wxID_CANCEL )
1213 return false;
1214
1215 aFilename = dlg.GetPath();
1216 aFilename.SetExt( ext );
1217 }
1218 else
1219 {
1220 // Ensure the file has a dummy name, otherwise GTK will display the regex from the filter
1221 if( aFilename.GetName().empty() )
1222 aFilename.SetName( wxS( "Library" ) );
1223
1224 wxFileDialog dlg( this, aTitle, defaultDir, aFilename.GetFullName(), wildcard,
1225 doOpen ? wxFD_OPEN | wxFD_FILE_MUST_EXIST
1226 : wxFD_SAVE | wxFD_CHANGE_DIR | wxFD_OVERWRITE_PROMPT );
1227
1228 if( aFileDlgHook )
1229 dlg.SetCustomizeHook( *aFileDlgHook );
1230
1231 if( dlg.ShowModal() == wxID_CANCEL )
1232 return false;
1233
1234 aFilename = dlg.GetPath();
1235 aFilename.SetExt( ext );
1236 }
1237
1238 SetMruPath( aFilename.GetPath() );
1239
1240 return true;
1241}
1242
1243
1245{
1247
1248 if( m_searchPane )
1249 {
1250 wxAuiPaneInfo& search_pane_info = m_auimgr.GetPane( m_searchPane );
1251 search_pane_info.Caption( _( "Search" ) );
1252 }
1253
1254 if( m_propertiesPanel )
1255 {
1256 wxAuiPaneInfo& properties_pane_info = m_auimgr.GetPane( m_propertiesPanel );
1257 properties_pane_info.Caption( _( "Properties" ) );
1258 }
1259
1261 {
1262 wxAuiPaneInfo& net_inspector_panel_info = m_auimgr.GetPane( m_netInspectorPanel );
1263 net_inspector_panel_info.Caption( _( "Net Inspector" ) );
1264 }
1265}
1266
1267
1269{
1270 if( m_isClosing || !m_propertiesPanel || !m_propertiesPanel->IsShownOnScreen() )
1271 return;
1272
1273 m_propertiesPanel->UpdateData();
1274}
1275
1276
1281
1282
1284{
1285 if( !m_colorSettings || aForceRefresh )
1286 {
1288 const_cast<EDA_DRAW_FRAME*>( this )->m_colorSettings = colorSettings;
1289 }
1290
1291 return m_colorSettings;
1292}
1293
1294
1296{
1297 COMMON_TOOLS* cmnTool = m_toolManager->GetTool<COMMON_TOOLS>();
1298
1299 if( cmnTool )
1300 {
1301 // Tell the tool what the units used last session
1302 cmnTool->SetLastUnits( static_cast<EDA_UNITS>( aCfg->m_System.last_imperial_units ) );
1303 cmnTool->SetLastUnits( static_cast<EDA_UNITS>( aCfg->m_System.last_metric_units ) );
1304 }
1305
1306 // Tell the tool what units the frame is currently using
1307 switch( static_cast<EDA_UNITS>( aCfg->m_System.units ) )
1308 {
1309 default:
1310 case EDA_UNITS::MM: m_toolManager->RunAction( ACTIONS::millimetersUnits ); break;
1311 case EDA_UNITS::INCH: m_toolManager->RunAction( ACTIONS::inchesUnits ); break;
1312 case EDA_UNITS::MILS: m_toolManager->RunAction( ACTIONS::milsUnits ); break;
1313 }
1314}
1315
1316
1317void EDA_DRAW_FRAME::GetUnitPair( EDA_UNITS& aPrimaryUnit, EDA_UNITS& aSecondaryUnits )
1318{
1319 COMMON_TOOLS* cmnTool = m_toolManager->GetTool<COMMON_TOOLS>();
1320
1321 aPrimaryUnit = GetUserUnits();
1322 aSecondaryUnits = EDA_UNITS::MILS;
1323
1324 if( EDA_UNIT_UTILS::IsImperialUnit( aPrimaryUnit ) )
1325 {
1326 if( cmnTool )
1327 aSecondaryUnits = cmnTool->GetLastMetricUnits();
1328 else
1329 aSecondaryUnits = EDA_UNITS::MM;
1330 }
1331 else
1332 {
1333 if( cmnTool )
1334 aSecondaryUnits = cmnTool->GetLastImperialUnits();
1335 else
1336 aSecondaryUnits = EDA_UNITS::MILS;
1337 }
1338}
1339
1340
1342{
1344
1345 // If we had an OpenGL failure this session, use the fallback GAL but don't update the
1346 // user preference silently:
1347
1350}
1351
1352
1353void EDA_DRAW_FRAME::handleActivateEvent( wxActivateEvent& aEvent )
1354{
1355 // Force a refresh of the message panel to ensure that the text is the right color
1356 // when the window activates
1357 if( !IsIconized() )
1358 m_messagePanel->Refresh();
1359}
1360
1361
1362void EDA_DRAW_FRAME::onActivate( wxActivateEvent& aEvent )
1363{
1364 handleActivateEvent( aEvent );
1365
1366 aEvent.Skip();
1367}
1368
1369
1370bool EDA_DRAW_FRAME::SaveCanvasImageToFile( const wxString& aFileName,
1371 BITMAP_TYPE aBitmapType )
1372{
1373 bool retv = true;
1374
1375 // Make a screen copy of the canvas:
1376 wxSize image_size = GetCanvas()->GetClientSize();
1377
1378 wxClientDC dc( GetCanvas() );
1379 wxBitmap bitmap( image_size.x, image_size.y );
1380 wxMemoryDC memdc;
1381
1382 memdc.SelectObject( bitmap );
1383 memdc.Blit( 0, 0, image_size.x, image_size.y, &dc, 0, 0 );
1384 memdc.SelectObject( wxNullBitmap );
1385
1386 wxImage image = bitmap.ConvertToImage();
1387
1388 wxBitmapType type = wxBITMAP_TYPE_PNG;
1389 switch( aBitmapType )
1390 {
1391 case BITMAP_TYPE::PNG: type = wxBITMAP_TYPE_PNG; break;
1392 case BITMAP_TYPE::BMP: type = wxBITMAP_TYPE_BMP; break;
1393 case BITMAP_TYPE::JPG: type = wxBITMAP_TYPE_JPEG; break;
1394 }
1395
1396 if( !image.SaveFile( aFileName, type ) )
1397 retv = false;
1398
1399 image.Destroy();
1400 return retv;
1401}
1402
1403
1405 APP_SETTINGS_BASE* aCfg )
1406{
1407 wxCHECK( aCfg, aAction.show_button );
1408
1409 for( const auto& [identifier, visible] : aCfg->m_Plugins.actions )
1410 {
1411 if( identifier == aAction.identifier )
1412 return visible;
1413 }
1414
1415 return aAction.show_button;
1416}
1417
1418
1419std::vector<const PLUGIN_ACTION*> EDA_DRAW_FRAME::GetOrderedPluginActions(
1421{
1422 std::vector<const PLUGIN_ACTION*> actions;
1423 wxCHECK( aCfg, actions );
1424
1425#ifdef KICAD_IPC_API
1426
1427 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1428 std::vector<const PLUGIN_ACTION*> unsorted = mgr.GetActionsForScope( aScope );
1429 std::map<wxString, const PLUGIN_ACTION*> actionMap;
1430 std::set<const PLUGIN_ACTION*> handled;
1431
1432 for( const PLUGIN_ACTION* action : unsorted )
1433 actionMap[action->identifier] = action;
1434
1435 for( const auto& identifier : aCfg->m_Plugins.actions | std::views::keys )
1436 {
1437 if( actionMap.contains( identifier ) )
1438 {
1439 const PLUGIN_ACTION* action = actionMap[ identifier ];
1440 actions.emplace_back( action );
1441 handled.insert( action );
1442 }
1443 }
1444
1445 for( const auto& action : actionMap | std::views::values )
1446 {
1447 if( !handled.contains( action ) )
1448 actions.emplace_back( action );
1449 }
1450
1451#endif
1452
1453 return actions;
1454}
1455
1456
1458{
1459#ifdef KICAD_IPC_API
1460 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1461
1462 mgr.ButtonBindings().clear();
1463
1464 std::vector<const PLUGIN_ACTION*> actions =
1466
1467 for( const PLUGIN_ACTION* action : actions )
1468 {
1469 if( !IsPluginActionButtonVisible( *action, config() ) )
1470 continue;
1471
1472 const wxBitmapBundle& icon = KIPLATFORM::UI::IsDarkTheme() && action->icon_dark.IsOk()
1473 ? action->icon_dark
1474 : action->icon_light;
1475
1476 wxAuiToolBarItem* button = aToolbar->AddTool( wxID_ANY, wxEmptyString, icon,
1477 action->name );
1478
1479 Connect( button->GetId(), wxEVT_COMMAND_MENU_SELECTED,
1480 wxCommandEventHandler( EDA_DRAW_FRAME::OnApiPluginInvoke ) );
1481
1482 mgr.ButtonBindings().insert( { button->GetId(), action->identifier } );
1483 }
1484#endif
1485}
1486
1487
1488void EDA_DRAW_FRAME::OnApiPluginInvoke( wxCommandEvent& aEvent )
1489{
1490#ifdef KICAD_IPC_API
1491 API_PLUGIN_MANAGER& mgr = Pgm().GetPluginManager();
1492
1493 if( mgr.ButtonBindings().count( aEvent.GetId() ) )
1494 mgr.InvokeAction( mgr.ButtonBindings().at( aEvent.GetId() ) );
1495#endif
1496}
const char * name
PLUGIN_ACTION_SCOPE
Definition api_plugin.h:56
BASE_SCREEN class implementation.
constexpr EDA_IU_SCALE unityScale
Definition base_units.h:115
BITMAP_TYPE
BOX2< VECTOR2I > BOX2I
Definition box2.h:922
constexpr BOX2I KiROUND(const BOX2D &aBoxD)
Definition box2.h:990
BOX2< VECTOR2D > BOX2D
Definition box2.h:923
static TOOL_ACTION gridProperties
Definition actions.h:199
static TOOL_ACTION millimetersUnits
Definition actions.h:205
static TOOL_ACTION updatePreferences
Definition actions.h:277
static TOOL_ACTION gridPreset
Definition actions.h:196
static TOOL_ACTION updateUnits
Definition actions.h:206
static TOOL_ACTION milsUnits
Definition actions.h:204
static TOOL_ACTION inchesUnits
Definition actions.h:203
static TOOL_ACTION zoomFitScreen
Definition actions.h:141
static TOOL_ACTION zoomPreset
Definition actions.h:144
static ACTION_TOOLBAR_CONTROL gridSelect
static ACTION_TOOLBAR_CONTROL overrideLocks
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.
WINDOW_SETTINGS m_Window
FIND_REPLACE m_FindReplace
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
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.
void SetLastUnits(EDA_UNITS aUnit)
EDA_UNITS GetLastImperialUnits()
EDA_UNITS GetLastMetricUnits()
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:68
Store the list of graphic items: rect, lines, polygons and texts to draw/plot the title block and fra...
void SetPlotterMilsToIUfactor(double aMils2Iu)
Set the scalar to convert pages units (mils) to plot units.
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.
void SetFileName(const wxString &aFileName)
Set the filename to draw/plot.
void SetDefaultPenSize(int aPenSize)
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.
void SetIsFirstPage(bool aIsFirstPage)
Set if the page is the first page.
void SetProperties(const std::map< wxString, wxString > *aProps)
Set properties used for text variable resolution.
void SetSheetLayer(const wxString &aSheetLayer)
Set the sheet layer to draw/plot.
void SetSheetCount(int aSheetCount)
Set the value of the count of sheets, for basic inscriptions.
void SetPageNumber(const wxString &aPageNumber)
Set the value of the sheet number.
void SetProject(const PROJECT *aProject)
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.
wxCheckBox * m_overrideLocksCb
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 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.
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.
bool saveCanvasTypeSetting(EDA_DRAW_PANEL_GAL::GAL_TYPE aCanvasType)
Store the canvas type in the application settings.
EDA_DRAW_FRAME(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
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
bool LibraryFileBrowser(const wxString &aTitle, bool doOpen, wxFileName &aFilename, const wxString &wildcard, const wxString &ext, bool isDirectory, FILEDLG_HOOK_NEW_LIBRARY *aFileDlgHook=nullptr)
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.
wxStatusBar * OnCreateStatusBar(int number, long style, wxWindowID id, const wxString &name) override
Create the status line (like a wxStatusBar).
virtual COLOR_SETTINGS * GetColorSettings(bool aForceRefresh=false) const
Returns a pointer to the active color theme settings.
void ToggleUserUnits() override
void FocusOnLocation(const VECTOR2I &aPos, bool aAllowScroll=true)
Useful to focus on a particular location, in find functions.
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)
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.
wxSocketServer * m_socketServer
Prevents opening same file multiple times.
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.
EDA_DRAW_PANEL_GAL::GAL_TYPE loadCanvasTypeSetting()
Return the canvas type stored in the application settings.
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.
bool GetOverrideLocks() const
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_CAIRO
Cairo 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.
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:98
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:220
A panel to display various information messages.
Definition msgpanel.h:101
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...
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.
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:530
void MarkDirty()
Force redraw of view on the next rendering.
Definition view.h:659
void SetCenter(const VECTOR2D &aCenter)
Set the center point of the VIEW (i.e.
Definition view.cpp:596
void MarkTargetDirty(int aTarget)
Set or clear target 'dirty' flag.
Definition view.h:639
KISTATUSBAR is a wxStatusBar suitable for Kicad manager.
Definition kistatusbar.h:46
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.
A wxFrame capable of the OpenProjectFiles function, meaning it can load a portion of a KiCad project.
KIWAY_PLAYER(KIWAY *aKiway, wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, const EDA_IU_SCALE &aIuScale)
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:292
virtual KIWAY_PLAYER * Player(FRAME_T aFrameType, bool doCreate=true, wxTopLevelWindow *aParent=nullptr)
Return the KIWAY_PLAYER* given a FRAME_T.
Definition kiway.cpp:403
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:79
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:537
Container for project specific data.
Definition project.h:66
static bool ShowAlways(const SELECTION &aSelection)
The default condition function (always returns true).
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
TOOL_DISPATCHER * m_toolDispatcher
TOOL_MANAGER * GetToolManager() const
Return the MVC controller.
ACTIONS * m_actions
Generic, UI-independent tool event.
Definition tool_event.h:171
bool RunAction(const std::string &aActionName, T aParam)
Run the specified action immediately, pausing the current action to run the new one.
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.
EDA_SEARCH_MATCH_MODE
EDA_UNITS
Definition eda_units.h:48
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:114
@ ID_ON_ZOOM_SELECT
Definition id.h:112
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)
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:946
see class PGM_BASE
#define DEFAULT_THEME
std::vector< FAB_LAYER_COLOR > dummy
std::vector< wxString > replace_history
std::vector< wxString > find_history
std::vector< std::pair< wxString, bool > > actions
Ordered list of plugin actions mapped to whether or not they are shown in the toolbar.
int canvas_type
EDA_DRAW_PANEL_GAL::GAL_TYPE_* value, see gal_options_panel.cpp.
std::vector< GRID > grids
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
Store the common settings that are saved and loaded for each window / frame.
GRID_SETTINGS grid
std::vector< double > zoom_factors
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
VECTOR2< double > VECTOR2D
Definition vector2d.h:694
VECTOR2D ToVECTOR2D(const wxPoint &aPoint)
Definition vector2wx.h:40