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