KiCad PCB EDA Suite
Loading...
Searching...
No Matches
eda_base_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) 2017 Jean-Pierre Charras, jp.charras at wanadoo.fr
5 * Copyright (C) 2013 Wayne Stambaugh <[email protected]>
6 * Copyright (C) 2023 CERN (www.cern.ch)
7 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
8 *
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, you may find one here:
21 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
22 * or you may search the http://www.gnu.org website for the version 2 license,
23 * or you may write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
25 */
26
27#include <eda_base_frame.h>
28
29#include <advanced_config.h>
30#include <bitmaps.h>
31#include <bitmap_store.h>
32#include <dialog_shim.h>
38#include <eda_dde.h>
39#include <file_history.h>
40#include <id.h>
41#include <kiface_base.h>
42#include <hotkeys_basic.h>
44#include <paths.h>
45#include <confirm.h>
47#include <pgm_base.h>
52#include <tool/action_manager.h>
53#include <tool/action_menu.h>
54#include <tool/action_toolbar.h>
55#include <tool/actions.h>
56#include <tool/common_control.h>
57#include <tool/tool_manager.h>
59#include <trace_helpers.h>
62#include <widgets/wx_infobar.h>
64#include <widgets/wx_grid.h>
65#include <widgets/wx_treebook.h>
66#include <wx/app.h>
67#include <wx/config.h>
68#include <wx/display.h>
69#include <wx/stdpaths.h>
70#include <wx/string.h>
71#include <wx/msgdlg.h>
72#include <kiplatform/app.h>
73#include <kiplatform/io.h>
74#include <kiplatform/ui.h>
75
76#include <functional>
77#include <kiface_ids.h>
78
79#ifdef KICAD_IPC_API
80#include <api/api_server.h>
81#endif
82
83
84// Minimum window size
85static const wxSize minSizeLookup( FRAME_T aFrameType, wxWindow* aWindow )
86{
87 switch( aFrameType )
88 {
90 return wxWindow::FromDIP( wxSize( 406, 354 ), aWindow );
91
92 default:
93 return wxWindow::FromDIP( wxSize( 500, 400 ), aWindow );
94 }
95}
96
97
98static const wxSize defaultSize( FRAME_T aFrameType, wxWindow* aWindow )
99{
100 switch( aFrameType )
101 {
103 return wxWindow::FromDIP( wxSize( 850, 540 ), aWindow );
104
105 default:
106 return wxWindow::FromDIP( wxSize( 1280, 720 ), aWindow );
107 }
108}
109
110
111BEGIN_EVENT_TABLE( EDA_BASE_FRAME, wxFrame )
112 // These event table entries are needed to handle events from the mac application menu
113 EVT_MENU( wxID_ABOUT, EDA_BASE_FRAME::OnKicadAbout )
114 EVT_MENU( wxID_PREFERENCES, EDA_BASE_FRAME::OnPreferences )
115
116 EVT_CHAR_HOOK( EDA_BASE_FRAME::OnCharHook )
117 EVT_MENU_OPEN( EDA_BASE_FRAME::OnMenuEvent )
118 EVT_MENU_CLOSE( EDA_BASE_FRAME::OnMenuEvent )
119 EVT_MENU_HIGHLIGHT_ALL( EDA_BASE_FRAME::OnMenuEvent )
120 EVT_MOVE( EDA_BASE_FRAME::OnMove )
121 EVT_SIZE( EDA_BASE_FRAME::OnSize )
122 EVT_MAXIMIZE( EDA_BASE_FRAME::OnMaximize )
123
124 EVT_SYS_COLOUR_CHANGED( EDA_BASE_FRAME::onSystemColorChange )
125 EVT_ICONIZE( EDA_BASE_FRAME::onIconize )
126END_EVENT_TABLE()
127
128
129void EDA_BASE_FRAME::commonInit( FRAME_T aFrameType )
130{
131 m_ident = aFrameType;
132 m_maximizeByDefault = false;
133 m_infoBar = nullptr;
134 m_settingsManager = nullptr;
135 m_fileHistory = nullptr;
136 m_supportsAutoSave = false;
137 m_autoSavePending = false;
138 m_undoRedoCountMax = DEFAULT_MAX_UNDO_ITEMS;
139 m_isClosing = false;
140 m_isNonUserClose = false;
141 m_autoSaveTimer = new wxTimer( this, ID_AUTO_SAVE_TIMER );
142 m_autoSaveRequired = false;
144 m_frameSize = defaultSize( aFrameType, this );
145 m_displayIndex = -1;
146
147 m_auimgr.SetArtProvider( new WX_AUI_DOCK_ART() );
148
149 m_settingsManager = &Pgm().GetSettingsManager();
150
151 // Set a reasonable minimal size for the frame
152 wxSize minSize = minSizeLookup( aFrameType, this );
153 SetSizeHints( minSize.x, minSize.y, -1, -1, -1, -1 );
154
155 // Store dimensions of the user area of the main window.
156 GetClientSize( &m_frameSize.x, &m_frameSize.y );
157
158 Connect( ID_AUTO_SAVE_TIMER, wxEVT_TIMER,
159 wxTimerEventHandler( EDA_BASE_FRAME::onAutoSaveTimer ) );
160
161 // hook wxEVT_CLOSE_WINDOW so we can call SaveSettings(). This function seems
162 // to be called before any other hook for wxCloseEvent, which is necessary.
163 Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( EDA_BASE_FRAME::windowClosing ) );
164
165 initExitKey();
166}
167
168
169EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType, const wxString& aTitle,
170 const wxPoint& aPos, const wxSize& aSize, long aStyle,
171 const wxString& aFrameName, KIWAY* aKiway,
172 const EDA_IU_SCALE& aIuScale ) :
173 wxFrame( aParent, wxID_ANY, aTitle, aPos, aSize, aStyle, aFrameName ),
174 TOOLS_HOLDER(),
175 KIWAY_HOLDER( aKiway, KIWAY_HOLDER::FRAME ),
177{
178 commonInit( aFrameType );
179}
180
181
182wxWindow* findQuasiModalDialog( wxWindow* aParent )
183{
184 for( wxWindow* child : aParent->GetChildren() )
185 {
186 if( DIALOG_SHIM* dlg = dynamic_cast<DIALOG_SHIM*>( child ) )
187 {
188 if( dlg->IsQuasiModal() )
189 return dlg;
190
191 if( wxWindow* nestedDlg = findQuasiModalDialog( child ) )
192 return nestedDlg;
193 }
194 }
195
196 return nullptr;
197}
198
199
201{
202 if( wxWindow* dlg = ::findQuasiModalDialog( this ) )
203 return dlg;
204
205 // FIXME: CvPcb is currently implemented on top of KIWAY_PLAYER rather than DIALOG_SHIM,
206 // so we have to look for it separately.
207 if( m_ident == FRAME_SCH )
208 {
209 wxWindow* cvpcb = wxWindow::FindWindowByName( wxS( "CvpcbFrame" ) );
210
211 if( cvpcb )
212 return cvpcb;
213 }
214
215 return nullptr;
216}
217
218
219void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
220{
221 // Don't allow closing when a quasi-modal is open.
222 wxWindow* quasiModal = findQuasiModalDialog();
223
224 if( quasiModal )
225 {
226 // Raise and notify; don't give the user a warning regarding "quasi-modal dialogs"
227 // when they have no idea what those are.
228 quasiModal->Raise();
229 wxBell();
230
231 if( event.CanVeto() )
232 event.Veto();
233
234 return;
235 }
236
237
238 if( event.GetId() == wxEVT_QUERY_END_SESSION
239 || event.GetId() == wxEVT_END_SESSION )
240 {
241 // End session means the OS is going to terminate us
242 m_isNonUserClose = true;
243 }
244
245 if( canCloseWindow( event ) )
246 {
247 m_isClosing = true;
248
249 if( m_infoBar )
251
252 APP_SETTINGS_BASE* cfg = config();
253
254 if( cfg )
255 SaveSettings( cfg ); // virtual, wxFrame specific
256
258
259 // Destroy (safe delete frame) this frame only in non modal mode.
260 // In modal mode, the caller will call Destroy().
261 if( !IsModal() )
262 Destroy();
263 }
264 else
265 {
266 if( event.CanVeto() )
267 event.Veto();
268 }
269}
270
271
273{
274 Disconnect( ID_AUTO_SAVE_TIMER, wxEVT_TIMER,
275 wxTimerEventHandler( EDA_BASE_FRAME::onAutoSaveTimer ) );
276 Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( EDA_BASE_FRAME::windowClosing ) );
277
278 delete m_autoSaveTimer;
279 delete m_fileHistory;
280
282
284
286}
287
288
289bool EDA_BASE_FRAME::ProcessEvent( wxEvent& aEvent )
290{
291#ifdef __WXMAC__
292 // Apple in its infinite wisdom will raise a disabled window before even passing
293 // us the event, so we have no way to stop it. Instead, we have to catch an
294 // improperly ordered disabled window and quasi-modal dialog here and reorder
295 // them.
296 if( !IsEnabled() && IsActive() )
297 {
298 wxWindow* dlg = findQuasiModalDialog();
299
300 if( dlg )
301 dlg->Raise();
302 }
303#endif
304
305 if( !wxFrame::ProcessEvent( aEvent ) )
306 return false;
307
308 if( Pgm().m_Quitting )
309 return true;
310
311 if( !m_isClosing && m_supportsAutoSave && IsShownOnScreen() && IsActive()
313 && GetAutoSaveInterval() > 0 )
314 {
315 if( !m_autoSavePending )
316 {
317 wxLogTrace( traceAutoSave, wxT( "Starting auto save timer." ) );
318 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
319 m_autoSavePending = true;
320 }
321 else if( m_autoSaveTimer->IsRunning() )
322 {
323 wxLogTrace( traceAutoSave, wxT( "Stopping auto save timer." ) );
324 m_autoSaveTimer->Stop();
325 m_autoSavePending = false;
326 }
327 }
328
329 return true;
330}
331
332
334{
336}
337
338
339void EDA_BASE_FRAME::onAutoSaveTimer( wxTimerEvent& aEvent )
340{
341 // Don't stomp on someone else's timer event.
342 if( aEvent.GetId() != ID_AUTO_SAVE_TIMER )
343 {
344 aEvent.Skip();
345 return;
346 }
347
348 if( !doAutoSave() )
349 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
350}
351
352
354{
355 wxCHECK_MSG( false, true, wxT( "Auto save timer function not overridden. Bad programmer!" ) );
356}
357
358
359void EDA_BASE_FRAME::OnCharHook( wxKeyEvent& aKeyEvent )
360{
361 wxLogTrace( kicadTraceKeyEvent, wxS( "EDA_BASE_FRAME::OnCharHook %s" ), dump( aKeyEvent ) );
362
363 // Key events can be filtered here.
364 // Currently no filtering is made.
365 aKeyEvent.Skip();
366}
367
368
369void EDA_BASE_FRAME::OnMenuEvent( wxMenuEvent& aEvent )
370{
371 if( !m_toolDispatcher )
372 aEvent.Skip();
373 else
375}
376
377
379{
381 std::placeholders::_1,
382 this,
383 aConditions );
384
385 m_uiUpdateMap[aID] = evtFunc;
386
387 Bind( wxEVT_UPDATE_UI, evtFunc, aID );
388}
389
390
392{
393 const auto it = m_uiUpdateMap.find( aID );
394
395 if( it == m_uiUpdateMap.end() )
396 return;
397
398 Unbind( wxEVT_UPDATE_UI, it->second, aID );
399}
400
401
402void EDA_BASE_FRAME::HandleUpdateUIEvent( wxUpdateUIEvent& aEvent, EDA_BASE_FRAME* aFrame,
403 ACTION_CONDITIONS aCond )
404{
405 bool checkRes = false;
406 bool enableRes = true;
407 bool showRes = true;
408 bool isCut = aEvent.GetId() == ACTIONS::cut.GetUIId();
409 bool isCopy = aEvent.GetId() == ACTIONS::copy.GetUIId();
410 bool isPaste = aEvent.GetId() == ACTIONS::paste.GetUIId();
411 SELECTION& selection = aFrame->GetCurrentSelection();
412
413 try
414 {
415 checkRes = aCond.checkCondition( selection );
416 enableRes = aCond.enableCondition( selection );
417 showRes = aCond.showCondition( selection );
418 }
419 catch( std::exception& )
420 {
421 // Something broke with the conditions, just skip the event.
422 aEvent.Skip();
423 return;
424 }
425
426 if( showRes && aEvent.GetId() == ACTIONS::undo.GetUIId() )
427 {
428 wxString msg = _( "Undo" );
429
430 if( enableRes )
431 msg += wxS( " " ) + aFrame->GetUndoActionDescription();
432
433 aEvent.SetText( msg );
434 }
435 else if( showRes && aEvent.GetId() == ACTIONS::redo.GetUIId() )
436 {
437 wxString msg = _( "Redo" );
438
439 if( enableRes )
440 msg += wxS( " " ) + aFrame->GetRedoActionDescription();
441
442 aEvent.SetText( msg );
443 }
444
445 if( isCut || isCopy || isPaste )
446 {
447 wxWindow* focus = wxWindow::FindFocus();
448 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( focus );
449
450 if( textEntry && isCut && textEntry->CanCut() )
451 enableRes = true;
452 else if( textEntry && isCopy && textEntry->CanCopy() )
453 enableRes = true;
454 else if( textEntry && isPaste && textEntry->CanPaste() )
455 enableRes = true;
456 else if( dynamic_cast<WX_GRID*>( focus ) )
457 enableRes = false; // Must disable menu in order to get command as CharHook event
458 }
459
460 aEvent.Enable( enableRes );
461 aEvent.Show( showRes );
462
463 if( aEvent.IsCheckable() )
464 aEvent.Check( checkRes );
465}
466
467
469{
470 // Setup the conditions to check a language menu item
471 auto isCurrentLang =
472 [] ( const SELECTION& aSel, int aLangIdentifier )
473 {
474 return Pgm().GetSelectedLanguageIdentifier() == aLangIdentifier;
475 };
476
477 for( unsigned ii = 0; LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
478 {
480 cond.Check( std::bind( isCurrentLang, std::placeholders::_1,
481 LanguagesList[ii].m_WX_Lang_Identifier ) );
482
483 RegisterUIUpdateHandler( LanguagesList[ii].m_KI_Lang_Identifier, cond );
484 }
485}
486
487
489{
497 CallAfter( [this]()
498 {
499 if( !m_isClosing )
501 } );
502}
503
504
505void EDA_BASE_FRAME::SetMenuBar( wxMenuBar* menu_bar )
506{
507 wxFrame::SetMenuBar( menu_bar );
508
509 // Move Help menu back to end of menubar
510
511 int pos = GetMenuBar()->FindMenu( _( "&Help" ) + wxS( " " ) );
512
513 if( pos != wxNOT_FOUND )
514 {
515 wxMenu* helpMenu = GetMenuBar()->Remove( pos );
516 GetMenuBar()->Append( helpMenu, _( "&Help" ) + wxS( " " ) );
517 }
518}
519
520
521void EDA_BASE_FRAME::AddStandardHelpMenu( wxMenuBar* aMenuBar )
522{
524 ACTION_MENU* helpMenu = new ACTION_MENU( false, commonControl );
525
526 helpMenu->Add( ACTIONS::help );
527 helpMenu->Add( ACTIONS::gettingStarted );
528 helpMenu->Add( ACTIONS::listHotKeys );
529 helpMenu->Add( ACTIONS::getInvolved );
530 helpMenu->Add( ACTIONS::donate );
531 helpMenu->Add( ACTIONS::reportBug );
532
533 helpMenu->AppendSeparator();
534 helpMenu->Add( ACTIONS::about );
535
536 // Trailing space keeps OSX from hijacking our menu (and disabling everything in it).
537 aMenuBar->Append( helpMenu, _( "&Help" ) + wxS( " " ) );
538
539 // This change is only needed on macOS, and creates a bug on Windows
540 #ifdef __WXMAC__
541 helpMenu->wxMenu::SetTitle( _( "&Help" ) + wxS( " " ) );
542 #endif
543}
544
545
547{
549
550 if( GetMenuBar() )
551 {
553 GetMenuBar()->Refresh();
554 }
555}
556
557
558void EDA_BASE_FRAME::CommonSettingsChanged( bool aEnvVarsChanged, bool aTextVarsChanged )
559{
560 TOOLS_HOLDER::CommonSettingsChanged( aEnvVarsChanged, aTextVarsChanged );
561
562 COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
563
564#ifdef KICAD_IPC_API
565 bool running = Pgm().GetApiServer().Running();
566
567 if( running && !settings->m_Api.enable_server )
568 Pgm().GetApiServer().Stop();
569 else if( !running && settings->m_Api.enable_server )
570 Pgm().GetApiServer().Start();
571#endif
572
573 if( m_fileHistory )
574 {
575 int historySize = settings->m_System.file_history_size;
576 m_fileHistory->SetMaxFiles( (unsigned) std::max( 0, historySize ) );
577 }
578
580 ThemeChanged();
581
582 if( GetMenuBar() )
583 {
584 // For icons in menus, icon scaling & hotkeys
586 GetMenuBar()->Refresh();
587 }
588}
589
590
592{
594
595 // Update all the toolbars to have new icons
596 wxAuiPaneInfoArray panes = m_auimgr.GetAllPanes();
597
598 for( size_t i = 0; i < panes.GetCount(); ++i )
599 {
600 if( ACTION_TOOLBAR* toolbar = dynamic_cast<ACTION_TOOLBAR*>( panes[i].window ) )
601 toolbar->RefreshBitmaps();
602 }
603}
604
605
606void EDA_BASE_FRAME::OnSize( wxSizeEvent& aEvent )
607{
608#ifdef __WXMAC__
609 int currentDisplay = wxDisplay::GetFromWindow( this );
610
611 if( m_displayIndex >= 0 && currentDisplay >= 0 && currentDisplay != m_displayIndex )
612 {
613 wxLogTrace( traceDisplayLocation, wxS( "OnSize: current display changed %d to %d" ),
614 m_displayIndex, currentDisplay );
615 m_displayIndex = currentDisplay;
617 }
618#endif
619
620 aEvent.Skip();
621}
622
623
624void EDA_BASE_FRAME::LoadWindowState( const wxString& aFileName )
625{
626 if( !Pgm().GetCommonSettings()->m_Session.remember_open_files )
627 return;
628
629 const PROJECT_FILE_STATE* state = Prj().GetLocalSettings().GetFileState( aFileName );
630
631 if( state != nullptr )
632 {
633 LoadWindowState( state->window );
634 }
635}
636
637
639{
640 bool wasDefault = false;
641
642 m_framePos.x = aState.pos_x;
643 m_framePos.y = aState.pos_y;
644 m_frameSize.x = aState.size_x;
645 m_frameSize.y = aState.size_y;
646
647 wxLogTrace( traceDisplayLocation, wxS( "Config position (%d, %d) with size (%d, %d)" ),
649
650 // Ensure minimum size is set if the stored config was zero-initialized
651 wxSize minSize = minSizeLookup( m_ident, this );
652
653 if( m_frameSize.x < minSize.x || m_frameSize.y < minSize.y )
654 {
656 wasDefault = true;
657
658 wxLogTrace( traceDisplayLocation, wxS( "Using minimum size (%d, %d)" ),
660 }
661
662 wxLogTrace( traceDisplayLocation, wxS( "Number of displays: %d" ), wxDisplay::GetCount() );
663
664 if( aState.display >= wxDisplay::GetCount() )
665 {
666 wxLogTrace( traceDisplayLocation, wxS( "Previous display not found" ) );
667
668 // If it isn't attached, use the first display
669 // Warning wxDisplay has 2 ctor variants. the parameter needs a type:
670 const unsigned int index = 0;
671 wxDisplay display( index );
672 wxRect clientSize = display.GetGeometry();
673
674 m_framePos = wxDefaultPosition;
675
676 // Ensure the window fits on the display, since the other one could have been larger
677 if( m_frameSize.x > clientSize.width )
678 m_frameSize.x = clientSize.width;
679
680 if( m_frameSize.y > clientSize.height )
681 m_frameSize.y = clientSize.height;
682 }
683 else
684 {
685 wxPoint upperRight( m_framePos.x + m_frameSize.x, m_framePos.y );
686 wxPoint upperLeft( m_framePos.x, m_framePos.y );
687
688 wxDisplay display( aState.display );
689 wxRect clientSize = display.GetClientArea();
690
691 int yLimTop = clientSize.y;
692 int yLimBottom = clientSize.y + clientSize.height;
693 int xLimLeft = clientSize.x;
694 int xLimRight = clientSize.x + clientSize.width;
695
696 if( upperLeft.x > xLimRight || // Upper left corner too close to right edge of screen
697 upperRight.x < xLimLeft || // Upper right corner too close to left edge of screen
698 upperLeft.y < yLimTop || // Upper corner too close to the bottom of the screen
699 upperLeft.y > yLimBottom )
700 {
701 m_framePos = wxDefaultPosition;
702 wxLogTrace( traceDisplayLocation, wxS( "Resetting to default position" ) );
703 }
704 }
705
706 wxLogTrace( traceDisplayLocation, wxS( "Final window position (%d, %d) with size (%d, %d)" ),
708
709 SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y );
710
711 // Center the window if we reset to default
712 if( m_framePos.x == -1 )
713 {
714 wxLogTrace( traceDisplayLocation, wxS( "Centering window" ) );
715 Center();
716 m_framePos = GetPosition();
717 }
718
719 // Record the frame sizes in an un-maximized state
722
723 // Maximize if we were maximized before
724 if( aState.maximized || ( wasDefault && m_maximizeByDefault ) )
725 {
726 wxLogTrace( traceDisplayLocation, wxS( "Maximizing window" ) );
727 Maximize();
728 }
729
730 m_displayIndex = wxDisplay::GetFromWindow( this );
731}
732
733
735{
736 wxDisplay display( wxDisplay::GetFromWindow( this ) );
737 wxRect clientSize = display.GetClientArea();
738 wxPoint pos = GetPosition();
739 wxSize size = GetWindowSize();
740
741 wxLogTrace( traceDisplayLocation,
742 wxS( "ensureWindowIsOnScreen: clientArea (%d, %d) w %d h %d" ),
743 clientSize.x, clientSize.y,
744 clientSize.width, clientSize.height );
745
746 if( pos.y < clientSize.y )
747 {
748 wxLogTrace( traceDisplayLocation,
749 wxS( "ensureWindowIsOnScreen: y pos %d below minimum, setting to %d" ), pos.y,
750 clientSize.y );
751 pos.y = clientSize.y;
752 }
753
754 if( pos.x < clientSize.x )
755 {
756 wxLogTrace( traceDisplayLocation,
757 wxS( "ensureWindowIsOnScreen: x pos %d is off the client rect, setting to %d" ),
758 pos.x, clientSize.x );
759 pos.x = clientSize.x;
760 }
761
762 if( pos.x + size.x - clientSize.x > clientSize.width )
763 {
764 int newWidth = clientSize.width - ( pos.x - clientSize.x );
765 wxLogTrace( traceDisplayLocation,
766 wxS( "ensureWindowIsOnScreen: effective width %d above available %d, setting "
767 "to %d" ), pos.x + size.x, clientSize.width, newWidth );
768 size.x = newWidth;
769 }
770
771 if( pos.y + size.y - clientSize.y > clientSize.height )
772 {
773 int newHeight = clientSize.height - ( pos.y - clientSize.y );
774 wxLogTrace( traceDisplayLocation,
775 wxS( "ensureWindowIsOnScreen: effective height %d above available %d, setting "
776 "to %d" ), pos.y + size.y, clientSize.height, newHeight );
777 size.y = newHeight;
778 }
779
780 wxLogTrace( traceDisplayLocation, wxS( "Updating window position (%d, %d) with size (%d, %d)" ),
781 pos.x, pos.y, size.x, size.y );
782
783 SetSize( pos.x, pos.y, size.x, size.y );
784}
785
786
788{
789 LoadWindowState( aCfg->state );
790
792 m_mruPath = aCfg->mru_path;
793
795}
796
797
799{
800 if( IsIconized() )
801 return;
802
803 // If the window is maximized, we use the saved window size from before it was maximized
804 if( IsMaximized() )
805 {
808 }
809 else
810 {
812 m_framePos = GetPosition();
813 }
814
815 aCfg->state.pos_x = m_framePos.x;
816 aCfg->state.pos_y = m_framePos.y;
817 aCfg->state.size_x = m_frameSize.x;
818 aCfg->state.size_y = m_frameSize.y;
819 aCfg->state.maximized = IsMaximized();
820 aCfg->state.display = wxDisplay::GetFromWindow( this );
821
822 wxLogTrace( traceDisplayLocation, wxS( "Saving window maximized: %s" ),
823 IsMaximized() ? wxS( "true" ) : wxS( "false" ) );
824 wxLogTrace( traceDisplayLocation, wxS( "Saving config position (%d, %d) with size (%d, %d)" ),
826
827 // Once this is fully implemented, wxAuiManager will be used to maintain
828 // the persistence of the main frame and all it's managed windows and
829 // all of the legacy frame persistence position code can be removed.
830 aCfg->perspective = m_auimgr.SavePerspective().ToStdString();
831
832 aCfg->mru_path = m_mruPath;
833}
834
835
837{
839
840 // Get file history size from common settings
841 int fileHistorySize = Pgm().GetCommonSettings()->m_System.file_history_size;
842
843 // Load the recently used files into the history menu
844 m_fileHistory = new FILE_HISTORY( (unsigned) std::max( 1, fileHistorySize ),
846 m_fileHistory->Load( *aCfg );
847}
848
849
851{
852 wxCHECK( config(), /* void */ );
853
855
856 bool fileOpen = m_isClosing && m_isNonUserClose;
857
858 wxString currentlyOpenedFile = GetCurrentFileName();
859
860 if( Pgm().GetCommonSettings()->m_Session.remember_open_files && !currentlyOpenedFile.IsEmpty() )
861 {
862 wxFileName rfn( currentlyOpenedFile );
863 rfn.MakeRelativeTo( Prj().GetProjectPath() );
864 Prj().GetLocalSettings().SaveFileState( rfn.GetFullPath(), &aCfg->m_Window, fileOpen );
865 }
866
867 // Save the recently used files list
868 if( m_fileHistory )
869 {
870 // Save the currently opened file in the file history
871 if( !currentlyOpenedFile.IsEmpty() )
872 UpdateFileHistory( currentlyOpenedFile );
873
874 m_fileHistory->Save( *aCfg );
875 }
876}
877
878
880{
881 return &aCfg->m_Window;
882}
883
884
886{
887 // KICAD_MANAGER_FRAME overrides this
888 return Kiface().KifaceSettings();
889}
890
891
893{
894 return Kiface().KifaceSearch();
895}
896
897
899{
900 return Kiface().GetHelpFileName();
901}
902
903
904void EDA_BASE_FRAME::PrintMsg( const wxString& text )
905{
906 SetStatusText( text );
907}
908
909
911{
912#if defined( __WXOSX_MAC__ )
914#else
915 m_infoBar = new WX_INFOBAR( this, &m_auimgr );
916
917 m_auimgr.AddPane( m_infoBar, EDA_PANE().InfoBar().Name( wxS( "InfoBar" ) ).Top().Layer(1) );
918#endif
919}
920
921
923{
924#if defined( __WXOSX_MAC__ )
925 m_auimgr.Update();
926#else
927 // Call Update() to fix all pane default sizes, especially the "InfoBar" pane before
928 // hiding it.
929 m_auimgr.Update();
930
931 // We don't want the infobar displayed right away
932 m_auimgr.GetPane( wxS( "InfoBar" ) ).Hide();
933 m_auimgr.Update();
934#endif
935}
936
937
938void EDA_BASE_FRAME::ShowInfoBarError( const wxString& aErrorMsg, bool aShowCloseButton,
940{
942
943 if( aShowCloseButton )
945
946 GetInfoBar()->ShowMessageFor( aErrorMsg, 8000, wxICON_ERROR, aType );
947}
948
949
950void EDA_BASE_FRAME::ShowInfoBarError( const wxString& aErrorMsg, bool aShowCloseButton,
951 std::function<void(void)> aCallback )
952{
954
955 if( aShowCloseButton )
957
958 if( aCallback )
959 m_infoBar->SetCallback( aCallback );
960
961 GetInfoBar()->ShowMessageFor( aErrorMsg, 6000, wxICON_ERROR );
962}
963
964
965void EDA_BASE_FRAME::ShowInfoBarWarning( const wxString& aWarningMsg, bool aShowCloseButton )
966{
968
969 if( aShowCloseButton )
971
972 GetInfoBar()->ShowMessageFor( aWarningMsg, 6000, wxICON_WARNING );
973}
974
975
976void EDA_BASE_FRAME::ShowInfoBarMsg( const wxString& aMsg, bool aShowCloseButton )
977{
979
980 if( aShowCloseButton )
982
983 GetInfoBar()->ShowMessageFor( aMsg, 8000, wxICON_INFORMATION );
984}
985
986
987void EDA_BASE_FRAME::UpdateFileHistory( const wxString& FullFileName, FILE_HISTORY* aFileHistory )
988{
989 if( !aFileHistory )
990 aFileHistory = m_fileHistory;
991
992 wxASSERT( aFileHistory );
993
994 aFileHistory->AddFileToHistory( FullFileName );
995
996 // Update the menubar to update the file history menu
997 if( !m_isClosing && GetMenuBar() )
998 {
1000 GetMenuBar()->Refresh();
1001 }
1002}
1003
1004
1005wxString EDA_BASE_FRAME::GetFileFromHistory( int cmdId, const wxString& type,
1006 FILE_HISTORY* aFileHistory )
1007{
1008 if( !aFileHistory )
1009 aFileHistory = m_fileHistory;
1010
1011 wxASSERT( aFileHistory );
1012
1013 int baseId = aFileHistory->GetBaseId();
1014
1015 wxASSERT( cmdId >= baseId && cmdId < baseId + (int) aFileHistory->GetCount() );
1016
1017 unsigned i = cmdId - baseId;
1018
1019 if( i < aFileHistory->GetCount() )
1020 {
1021 wxString fn = aFileHistory->GetHistoryFile( i );
1022
1023 if( wxFileName::FileExists( fn ) )
1024 {
1025 return fn;
1026 }
1027 else
1028 {
1029 DisplayErrorMessage( this, wxString::Format( _( "File '%s' was not found." ), fn ) );
1030 aFileHistory->RemoveFileFromHistory( i );
1031 }
1032 }
1033
1034 // Update the menubar to update the file history menu
1035 if( GetMenuBar() )
1036 {
1038 GetMenuBar()->Refresh();
1039 }
1040
1041 return wxEmptyString;
1042}
1043
1044
1046{
1047 if( !aFileHistory )
1048 aFileHistory = m_fileHistory;
1049
1050 wxASSERT( aFileHistory );
1051
1052 aFileHistory->ClearFileHistory();
1053
1054 // Update the menubar to update the file history menu
1055 if( GetMenuBar() )
1056 {
1058 GetMenuBar()->Refresh();
1059 }
1060}
1061
1062
1063void EDA_BASE_FRAME::OnKicadAbout( wxCommandEvent& event )
1064{
1065 void ShowAboutDialog( EDA_BASE_FRAME * aParent ); // See AboutDialog_main.cpp
1066 ShowAboutDialog( this );
1067}
1068
1069
1070void EDA_BASE_FRAME::OnPreferences( wxCommandEvent& event )
1071{
1072 ShowPreferences( wxEmptyString, wxEmptyString );
1073}
1074
1075
1076void EDA_BASE_FRAME::ShowPreferences( wxString aStartPage, wxString aStartParentPage )
1077{
1078 PAGED_DIALOG dlg( this, _( "Preferences" ), true, true, wxEmptyString,
1079 wxWindow::FromDIP( wxSize( 980, 560 ), NULL ) );
1080
1081 dlg.SetEvtHandlerEnabled( false );
1082
1083 {
1084 WX_BUSY_INDICATOR busy_cursor;
1085
1086 WX_TREEBOOK* book = dlg.GetTreebook();
1087 PANEL_HOTKEYS_EDITOR* hotkeysPanel = new PANEL_HOTKEYS_EDITOR( this, book, false );
1088 KIFACE* kiface = nullptr;
1089 std::vector<int> expand;
1090
1091 Kiway().GetActions( hotkeysPanel->ActionsList() );
1092
1093 book->AddLazyPage(
1094 []( wxWindow* aParent ) -> wxWindow*
1095 {
1096 return new PANEL_COMMON_SETTINGS( aParent );
1097 },
1098 _( "Common" ) );
1099
1100 book->AddLazyPage(
1101 []( wxWindow* aParent ) -> wxWindow*
1102 {
1103 return new PANEL_MOUSE_SETTINGS( aParent );
1104 }, _( "Mouse and Touchpad" ) );
1105
1106 book->AddPage( hotkeysPanel, _( "Hotkeys" ) );
1107
1108 // This currently allows pre-defined repositories that we
1109 // don't use, so keep it disabled at the moment
1110 if( ADVANCED_CFG::GetCfg().m_EnableGit && false )
1111 {
1112 book->AddLazyPage(
1113 []( wxWindow* aParent ) -> wxWindow*
1114 {
1115 return new PANEL_GIT_REPOS( aParent );
1116 }, _( "Version Control" ) );
1117 }
1118
1119#ifdef KICAD_USE_SENTRY
1120 book->AddLazyPage(
1121 []( wxWindow* aParent ) -> wxWindow*
1122 {
1123 return new PANEL_DATA_COLLECTION( aParent );
1124 }, _( "Data Collection" ) );
1125#endif
1126
1127#define LAZY_CTOR( key ) \
1128 [this, kiface]( wxWindow* aParent ) \
1129 { \
1130 return kiface->CreateKiWindow( aParent, key, &Kiway() ); \
1131 }
1132
1133 // If a dll is not loaded, the loader will show an error message.
1134
1135 try
1136 {
1138
1139 if( !kiface )
1140 return;
1141
1142 kiface->GetActions( hotkeysPanel->ActionsList() );
1143
1145 expand.push_back( (int) book->GetPageCount() );
1146
1147 book->AddPage( new wxPanel( book ), _( "Symbol Editor" ) );
1148 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_DISP_OPTIONS ), _( "Display Options" ) );
1149 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_GRIDS ), _( "Grids" ) );
1150 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_OPTIONS ), _( "Editing Options" ) );
1151 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_COLORS ), _( "Colors" ) );
1152
1153 if( GetFrameType() == FRAME_SCH )
1154 expand.push_back( (int) book->GetPageCount() );
1155
1156 book->AddPage( new wxPanel( book ), _( "Schematic Editor" ) );
1157 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_DISP_OPTIONS ), _( "Display Options" ) );
1158 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_GRIDS ), _( "Grids" ) );
1159 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_EDIT_OPTIONS ), _( "Editing Options" ) );
1160 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_ANNO_OPTIONS ), _( "Annotation Options" ) );
1161 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_COLORS ), _( "Colors" ) );
1163 _( "Field Name Templates" ) );
1164 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_SIMULATOR ), _( "Simulator" ) );
1165 }
1166 catch( ... )
1167 {
1168 }
1169
1170 try
1171 {
1173
1174 if( !kiface )
1175 return;
1176
1177 kiface->GetActions( hotkeysPanel->ActionsList() );
1178
1180 expand.push_back( (int) book->GetPageCount() );
1181
1182 book->AddPage( new wxPanel( book ), _( "Footprint Editor" ) );
1183 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DISPLAY_OPTIONS ), _( "Display Options" ) );
1184 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_GRIDS ), _( "Grids" ) );
1185 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_ORIGINS_AXES ), _( "Origins & Axes" ) );
1186 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_EDIT_OPTIONS ), _( "Editing Options" ) );
1187 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_COLORS ), _( "Colors" ) );
1188 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DEFAULT_FIELDS ), _( "Footprint Defaults" ) );
1190 _( "Graphics Defaults" ) );
1191
1193 expand.push_back( (int) book->GetPageCount() );
1194
1195 book->AddPage( new wxPanel( book ), _( "PCB Editor" ) );
1196 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_DISPLAY_OPTS ), _( "Display Options" ) );
1197 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_GRIDS ), _( "Grids" ) );
1198 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ORIGINS_AXES ), _( "Origins & Axes" ) );
1199 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_EDIT_OPTIONS ), _( "Editing Options" ) );
1200 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_COLORS ), _( "Colors" ) );
1201 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ACTION_PLUGINS ), _( "Plugins" ) );
1202
1204 expand.push_back( (int) book->GetPageCount() );
1205
1206 book->AddPage( new wxPanel( book ), _( "3D Viewer" ) );
1207 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_DISPLAY_OPTIONS ), _( "General" ) );
1208 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_OPENGL ), _( "Realtime Renderer" ) );
1209 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_RAYTRACING ), _( "Raytracing Renderer" ) );
1210 }
1211 catch( ... )
1212 {
1213 }
1214
1215 try
1216 {
1218
1219 if( !kiface )
1220 return;
1221
1222 kiface->GetActions( hotkeysPanel->ActionsList() );
1223
1224 if( GetFrameType() == FRAME_GERBER )
1225 expand.push_back( (int) book->GetPageCount() );
1226
1227 book->AddPage( new wxPanel( book ), _( "Gerber Viewer" ) );
1228 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_DISPLAY_OPTIONS ), _( "Display Options" ) );
1229 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_COLORS ), _( "Colors" ) );
1230 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_GRIDS ), _( "Grids" ) );
1232 _( "Excellon Options" ) );
1233 }
1234 catch( ... )
1235 {
1236 }
1237
1238 try
1239 {
1241
1242 if( !kiface )
1243 return;
1244
1245 kiface->GetActions( hotkeysPanel->ActionsList() );
1246
1247 if( GetFrameType() == FRAME_PL_EDITOR )
1248 expand.push_back( (int) book->GetPageCount() );
1249
1250 book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) );
1251 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_DISPLAY_OPTIONS ), _( "Display Options" ) );
1252 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_GRIDS ), _( "Grids" ) );
1253 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_COLORS ), _( "Colors" ) );
1254
1255 book->AddLazyPage(
1256 []( wxWindow* aParent ) -> wxWindow*
1257 {
1258 return new PANEL_PACKAGES_AND_UPDATES( aParent );
1259 }, _( "Packages and Updates" ) );
1260 }
1261 catch( ... )
1262 {
1263 }
1264
1265#ifdef KICAD_IPC_API
1266 book->AddPage( new PANEL_PLUGIN_SETTINGS( book ), _( "Plugins" ) );
1267#endif
1268
1269 // Update all of the action hotkeys. The process of loading the actions through
1270 // the KiFACE will only get us the default hotkeys
1271 ReadHotKeyConfigIntoActions( wxEmptyString, hotkeysPanel->ActionsList() );
1272
1273 for( size_t i = 0; i < book->GetPageCount(); ++i )
1274 book->GetPage( i )->Layout();
1275
1276 for( int page : expand )
1277 book->ExpandNode( page );
1278
1279 if( !aStartPage.IsEmpty() )
1280 dlg.SetInitialPage( aStartPage, aStartParentPage );
1281
1282 dlg.SetEvtHandlerEnabled( true );
1283#undef LAZY_CTOR
1284 }
1285
1286 if( dlg.ShowModal() == wxID_OK )
1287 {
1288 // Update our grids that are cached in the tool
1291 dlg.Kiway().CommonSettingsChanged( false, false );
1292 }
1293
1294}
1295
1296
1297void EDA_BASE_FRAME::OnDropFiles( wxDropFilesEvent& aEvent )
1298{
1299 wxString* files = aEvent.GetFiles();
1300
1301 for( int nb = 0; nb < aEvent.GetNumberOfFiles(); nb++ )
1302 {
1303 const wxFileName fn = wxFileName( files[nb] );
1304 wxString ext = fn.GetExt();
1305
1306 // Alias all gerber files as GerberFileExtension
1309
1310 if( m_acceptedExts.find( ext.ToStdString() ) != m_acceptedExts.end() )
1311 m_AcceptedFiles.emplace_back( fn );
1312 }
1313
1315 m_AcceptedFiles.clear();
1316}
1317
1318
1320{
1321 for( const wxFileName& file : m_AcceptedFiles )
1322 {
1323 wxString fn = file.GetFullPath();
1324 m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( file.GetExt() ), &fn );
1325 }
1326}
1327
1328
1329bool EDA_BASE_FRAME::IsWritable( const wxFileName& aFileName, bool aVerbose )
1330{
1331 wxString msg;
1332 wxFileName fn = aFileName;
1333
1334 // Check for absence of a file path with a file name. Unfortunately KiCad
1335 // uses paths relative to the current project path without the ./ part which
1336 // confuses wxFileName. Making the file name path absolute may be less than
1337 // elegant but it solves the problem.
1338 if( fn.GetPath().IsEmpty() && fn.HasName() )
1339 fn.MakeAbsolute();
1340
1341 wxCHECK_MSG( fn.IsOk(), false,
1342 wxT( "File name object is invalid. Bad programmer!" ) );
1343 wxCHECK_MSG( !fn.GetPath().IsEmpty(), false,
1344 wxT( "File name object path <" ) + fn.GetFullPath() +
1345 wxT( "> is not set. Bad programmer!" ) );
1346
1347 if( fn.IsDir() && !fn.IsDirWritable() )
1348 {
1349 msg.Printf( _( "Insufficient permissions to folder '%s'." ), fn.GetPath() );
1350 }
1351 else if( !fn.FileExists() && !fn.IsDirWritable() )
1352 {
1353 msg.Printf( _( "Insufficient permissions to save file '%s'." ), fn.GetFullPath() );
1354 }
1355 else if( fn.FileExists() && !fn.IsFileWritable() )
1356 {
1357 msg.Printf( _( "Insufficient permissions to save file '%s'." ), fn.GetFullPath() );
1358 }
1359
1360 if( !msg.IsEmpty() )
1361 {
1362 if( aVerbose )
1363 DisplayErrorMessage( this, msg );
1364
1365 return false;
1366 }
1367
1368 return true;
1369}
1370
1371
1372void EDA_BASE_FRAME::CheckForAutoSaveFile( const wxFileName& aFileName )
1373{
1374 if( !Pgm().IsGUI() )
1375 return;
1376
1377 wxCHECK_RET( aFileName.IsOk(), wxT( "Invalid file name!" ) );
1378
1379 wxFileName autoSaveFileName = aFileName;
1380
1381 // Check for auto save file.
1382 autoSaveFileName.SetName( FILEEXT::AutoSaveFilePrefix + aFileName.GetName() );
1383
1384 wxLogTrace( traceAutoSave,
1385 wxT( "Checking for auto save file " ) + autoSaveFileName.GetFullPath() );
1386
1387 if( !autoSaveFileName.FileExists() )
1388 return;
1389
1390 wxString msg = wxString::Format( _( "Well this is potentially embarrassing!\n"
1391 "It appears that the last time you were editing\n"
1392 "%s\n"
1393 "KiCad exited before saving.\n"
1394 "\n"
1395 "Do you wish to open the auto-saved file instead?" ),
1396 aFileName.GetFullName() );
1397
1398 int response = wxMessageBox( msg, Pgm().App().GetAppDisplayName(), wxYES_NO | wxICON_QUESTION,
1399 this );
1400
1401 // Make a backup of the current file, delete the file, and rename the auto save file to
1402 // the file name.
1403 if( response == wxYES )
1404 {
1405 // Preserve the permissions of the current file
1406 KIPLATFORM::IO::DuplicatePermissions( aFileName.GetFullPath(),
1407 autoSaveFileName.GetFullPath() );
1408
1409 if( !wxRenameFile( autoSaveFileName.GetFullPath(), aFileName.GetFullPath() ) )
1410 {
1411 wxMessageBox( _( "The auto save file could not be renamed to the board file name." ),
1412 Pgm().App().GetAppDisplayName(), wxOK | wxICON_EXCLAMATION, this );
1413 }
1414 }
1415 else
1416 {
1417 DeleteAutoSaveFile( aFileName );
1418 }
1419}
1420
1421
1422void EDA_BASE_FRAME::DeleteAutoSaveFile( const wxFileName& aFileName )
1423{
1424 if( !Pgm().IsGUI() )
1425 return;
1426
1427 wxCHECK_RET( aFileName.IsOk(), wxT( "Invalid file name!" ) );
1428
1429 wxFileName autoSaveFn = aFileName;
1430 autoSaveFn.SetName( FILEEXT::AutoSaveFilePrefix + aFileName.GetName() );
1431
1432 if( autoSaveFn.FileExists() )
1433 {
1434 wxLogTrace( traceAutoSave, wxT( "Removing auto save file " ) + autoSaveFn.GetFullPath() );
1435 wxRemoveFile( autoSaveFn.GetFullPath() );
1436 }
1437}
1438
1439
1441{
1442 // This function should be overridden in child classes
1443 return false;
1444}
1445
1446
1448{
1449 wxAcceleratorEntry entries[1];
1450 entries[0].Set( wxACCEL_CTRL, int( 'Q' ), wxID_EXIT );
1451 wxAcceleratorTable accel( 1, entries );
1452 SetAcceleratorTable( accel );
1453}
1454
1455
1457{
1460}
1461
1462
1464{
1465 m_undoList.PushCommand( aNewitem );
1466
1467 // Delete the extra items, if count max reached
1468 if( m_undoRedoCountMax > 0 )
1469 {
1470 int extraitems = GetUndoCommandCount() - m_undoRedoCountMax;
1471
1472 if( extraitems > 0 )
1473 ClearUndoORRedoList( UNDO_LIST, extraitems );
1474 }
1475}
1476
1477
1479{
1480 m_redoList.PushCommand( aNewitem );
1481
1482 // Delete the extra items, if count max reached
1483 if( m_undoRedoCountMax > 0 )
1484 {
1485 int extraitems = GetRedoCommandCount() - m_undoRedoCountMax;
1486
1487 if( extraitems > 0 )
1488 ClearUndoORRedoList( REDO_LIST, extraitems );
1489 }
1490}
1491
1492
1494{
1495 return m_undoList.PopCommand();
1496}
1497
1498
1500{
1501 return m_redoList.PopCommand();
1502}
1503
1504
1506{
1507 if( GetUndoCommandCount() > 0 )
1508 return m_undoList.m_CommandsList.back()->GetDescription();
1509
1510 return wxEmptyString;
1511}
1512
1513
1515{
1516 if( GetRedoCommandCount() > 0 )
1517 return m_redoList.m_CommandsList.back()->GetDescription();
1518
1519 return wxEmptyString;
1520}
1521
1522
1524{
1525 m_autoSaveRequired = true;
1526}
1527
1528
1530{
1531 SetUserUnits( aUnits );
1533
1534 wxCommandEvent e( EDA_EVT_UNITS_CHANGED );
1535 e.SetInt( static_cast<int>( aUnits ) );
1536 e.SetClientData( this );
1537 ProcessEventLocally( e );
1538}
1539
1540
1541void EDA_BASE_FRAME::OnMaximize( wxMaximizeEvent& aEvent )
1542{
1543 // When we maximize the window, we want to save the old information
1544 // so that we can add it to the settings on next window load.
1545 // Contrary to the documentation, this event seems to be generated
1546 // when the window is also being unmaximized on OSX, so we only
1547 // capture the size information when we maximize the window when on OSX.
1548#ifdef __WXOSX__
1549 if( !IsMaximized() )
1550#endif
1551 {
1553 m_normalFramePos = GetPosition();
1554 wxLogTrace( traceDisplayLocation,
1555 "Maximizing window - Saving position (%d, %d) with size (%d, %d)",
1558 }
1559
1560 // Skip event to actually maximize the window
1561 aEvent.Skip();
1562}
1563
1564
1566{
1567#ifdef __WXGTK__
1568 wxSize winSize = GetSize();
1569
1570 // GTK includes the window decorations in the normal GetSize call,
1571 // so we have to use a GTK-specific sizing call that returns the
1572 // non-decorated window size.
1574 {
1575 int width = 0;
1576 int height = 0;
1577 GTKDoGetSize( &width, &height );
1578
1579 winSize.Set( width, height );
1580 }
1581#else
1582 wxSize winSize = GetSize();
1583#endif
1584
1585 return winSize;
1586}
1587
1588
1590{
1591 // Update the icon theme when the system theme changes and update the toolbars
1593 ThemeChanged();
1594
1595 // This isn't handled by ThemeChanged()
1596 if( GetMenuBar() )
1597 {
1598 // For icons in menus, icon scaling & hotkeys
1600 GetMenuBar()->Refresh();
1601 }
1602}
1603
1604
1605void EDA_BASE_FRAME::onSystemColorChange( wxSysColourChangedEvent& aEvent )
1606{
1607 // Call the handler to update the colors used in the frame
1609
1610 // Skip the change event to ensure the rest of the window controls get it
1611 aEvent.Skip();
1612}
1613
1614
1615void EDA_BASE_FRAME::onIconize( wxIconizeEvent& aEvent )
1616{
1617 // Call the handler
1618 handleIconizeEvent( aEvent );
1619
1620 // Skip the event.
1621 aEvent.Skip();
1622}
1623
1624
1625#ifdef __WXMSW__
1626WXLRESULT EDA_BASE_FRAME::MSWWindowProc( WXUINT message, WXWPARAM wParam, WXLPARAM lParam )
1627{
1628 // This will help avoid the menu keeping focus when the alt key is released
1629 // You can still trigger accelerators as long as you hold down alt
1630 if( message == WM_SYSCOMMAND )
1631 {
1632 if( wParam == SC_KEYMENU && ( lParam >> 16 ) <= 0 )
1633 return 0;
1634 }
1635
1636 return wxFrame::MSWWindowProc( message, wParam, lParam );
1637}
1638#endif
1639
1640
1642{
1643 ACTION_MENU* langsMenu = new ACTION_MENU( false, aControlTool );
1644 langsMenu->SetTitle( _( "Set Language" ) );
1645 langsMenu->SetIcon( BITMAPS::language );
1646
1647 wxString tooltip;
1648
1649 for( unsigned ii = 0; LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
1650 {
1651 wxString label;
1652
1653 if( LanguagesList[ii].m_DoNotTranslate )
1654 label = LanguagesList[ii].m_Lang_Label;
1655 else
1656 label = wxGetTranslation( LanguagesList[ii].m_Lang_Label );
1657
1658 wxMenuItem* item =
1659 new wxMenuItem( langsMenu,
1660 LanguagesList[ii].m_KI_Lang_Identifier, // wxMenuItem wxID
1661 label, tooltip, wxITEM_CHECK );
1662
1663 langsMenu->Append( item );
1664 }
1665
1666 // This must be done after the items are added
1667 aMasterMenu->Add( langsMenu );
1668}
void ShowAboutDialog(EDA_BASE_FRAME *aParent)
KIFACE_BASE & Kiface()
Global KIFACE_BASE "get" accessor.
void ClearScaledBitmapCache()
Wipes out the scaled bitmap cache so that the icon theme can be changed.
Definition: bitmap.cpp:172
BITMAP_STORE * GetBitmapStore()
Definition: bitmap.cpp:92
static TOOL_ACTION paste
Definition: actions.h:73
static TOOL_ACTION about
Definition: actions.h:234
static TOOL_ACTION reportBug
Definition: actions.h:238
static TOOL_ACTION copy
Definition: actions.h:71
static TOOL_ACTION donate
Definition: actions.h:236
static TOOL_ACTION listHotKeys
Definition: actions.h:235
static TOOL_ACTION getInvolved
Definition: actions.h:237
static TOOL_ACTION undo
Definition: actions.h:68
static TOOL_ACTION redo
Definition: actions.h:69
static TOOL_ACTION cut
Definition: actions.h:70
static TOOL_ACTION gettingStarted
Definition: actions.h:232
static TOOL_ACTION help
Definition: actions.h:233
Define the structure of a menu based on ACTIONs.
Definition: action_menu.h:49
void SetTitle(const wxString &aTitle) override
Set title for the menu.
Definition: action_menu.cpp:92
void SetIcon(BITMAPS aIcon)
Assign an icon for the entry.
Definition: action_menu.cpp:78
wxMenuItem * Add(const wxString &aLabel, int aId, BITMAPS aIcon)
Add a wxWidgets-style entry to the menu.
Define the structure of a toolbar with buttons that invoke ACTIONs.
static const ADVANCED_CFG & GetCfg()
Get the singleton instance's config, which is shared by all consumers.
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:196
void ThemeChanged()
Notifies the store that the icon theme has been changed by the user, so caches must be invalidated.
Handle actions that are shared between different applications.
Dialog helper object to sit in the inheritance tree between wxDialog and any class written by wxFormB...
Definition: dialog_shim.h:88
int ShowModal() override
The base frame for deriving all KiCad main window classes.
virtual wxString help_name()
virtual bool doAutoSave()
This should be overridden by the derived class to handle the auto save feature.
void LoadWindowState(const wxString &aFileName)
FRAME_T GetFrameType() const
virtual void UnregisterUIUpdateHandler(int aID) override
Unregister a UI handler for a given ID that was registered using RegisterUIUpdateHandler.
virtual bool isAutoSaveRequired() const
Return the auto save status of the application.
virtual APP_SETTINGS_BASE * config() const
Return the settings object used in SaveSettings(), and is overloaded in KICAD_MANAGER_FRAME.
virtual void handleIconizeEvent(wxIconizeEvent &aEvent)
Handle a window iconize event.
virtual void PushCommandToUndoList(PICKED_ITEMS_LIST *aItem)
Add a command to undo in the undo list.
void windowClosing(wxCloseEvent &event)
(with its unexpected name so it does not collide with the real OnWindowClose() function provided in d...
virtual void OnCharHook(wxKeyEvent &aKeyEvent)
Capture the key event before it is sent to the GUI.
virtual int GetRedoCommandCount() const
UNDO_REDO_CONTAINER m_undoList
virtual void OnMove(wxMoveEvent &aEvent)
virtual WINDOW_SETTINGS * GetWindowSettings(APP_SETTINGS_BASE *aCfg)
Return a pointer to the window settings for this frame.
virtual void doCloseWindow()
void OnMenuEvent(wxMenuEvent &event)
The TOOL_DISPATCHER needs these to work around some issues in wxWidgets where the menu events aren't ...
virtual bool IsModal() const
Return true if the frame is shown in our modal mode and false if the frame is shown as an usual frame...
void ShowChangedLanguage() override
Redraw the menus and what not in current language.
virtual void HandleSystemColorChange()
Update the UI in response to a change in the system colors.
virtual void setupUIConditions()
Setup the UI conditions for the various actions and their controls in this frame.
void ensureWindowIsOnScreen()
bool m_isNonUserClose
Set by NonUserClose() to indicate that the user did not request the current close.
void LoadWindowSettings(const WINDOW_SETTINGS *aCfg)
Load window settings from the given settings object.
std::vector< wxFileName > m_AcceptedFiles
virtual void CheckForAutoSaveFile(const wxFileName &aFileName)
Check if an auto save file exists for aFileName and takes the appropriate action depending on the use...
void OnKicadAbout(wxCommandEvent &event)
virtual void ClearUndoRedoList()
Clear the undo and redo list using ClearUndoORRedoList()
virtual void DoWithAcceptedFiles()
Execute action on accepted dropped file.
virtual void OnModify()
Must be called after a model change in order to set the "modify" flag and do other frame-specific pro...
wxWindow * findQuasiModalDialog()
static void HandleUpdateUIEvent(wxUpdateUIEvent &aEvent, EDA_BASE_FRAME *aFrame, ACTION_CONDITIONS aCond)
Handle events generated when the UI is trying to figure out the current state of the UI controls rela...
wxString m_perspective
virtual void ClearUndoORRedoList(UNDO_REDO_LIST aList, int aItemCount=-1)
Remove the aItemCount of old commands from aList and delete commands, pickers and picked items if nee...
virtual void ThemeChanged()
Process light/dark theme change.
wxSize m_normalFrameSize
EDA_BASE_FRAME(wxWindow *aParent, FRAME_T aFrameType, const wxString &aTitle, const wxPoint &aPos, const wxSize &aSize, long aStyle, const wxString &aFrameName, KIWAY *aKiway, const EDA_IU_SCALE &aIuScale)
void ShowPreferences(wxString aStartPage, wxString aStartParentPage)
Display the preferences and settings of all opened editors paged dialog, starting with a particular p...
void initExitKey()
Set the common key-pair for exiting the application (Ctrl-Q) and ties it to the wxID_EXIT event id.
void OnPreferences(wxCommandEvent &event)
virtual const SEARCH_STACK & sys_search()
Return a SEARCH_STACK pertaining to entire program.
WX_INFOBAR * m_infoBar
void onAutoSaveTimer(wxTimerEvent &aEvent)
Handle the auto save timer event.
void SaveWindowSettings(WINDOW_SETTINGS *aCfg)
Save window settings to the given settings object.
virtual wxString GetRedoActionDescription() const
void FinishAUIInitialization()
virtual wxString GetCurrentFileName() const
Get the full filename + path of the currently opened file in the frame.
void ChangeUserUnits(EDA_UNITS aUnits)
void AddMenuLanguageList(ACTION_MENU *aMasterMenu, TOOL_INTERACTIVE *aControlTool)
Create a menu list for language choice, and add it as submenu to MasterMenu.
void SetMenuBar(wxMenuBar *menu_bar) override
void ShowInfoBarMsg(const wxString &aMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an info icon on the left of...
wxTimer * m_autoSaveTimer
void UpdateFileHistory(const wxString &FullFileName, FILE_HISTORY *aFileHistory=nullptr)
Update the list of recently opened files.
wxAuiManager m_auimgr
void PrintMsg(const wxString &text)
void commonInit(FRAME_T aFrameType)
Collect common initialization functions used in all CTORs.
virtual bool IsContentModified() const
Get if the contents of the frame have been modified since the last save.
void ShowInfoBarWarning(const wxString &aWarningMsg, bool aShowCloseButton=false)
Show the WX_INFOBAR displayed on the top of the canvas with a message and a warning icon on the left ...
virtual PICKED_ITEMS_LIST * PopCommandFromRedoList()
Return the last command to undo and remove it from list, nothing is deleted.
void ClearFileHistory(FILE_HISTORY *aFileHistory=nullptr)
Remove all files from the file history.
std::map< int, UIUpdateHandler > m_uiUpdateMap
Map containing the UI update handlers registered with wx for each action.
UNDO_REDO_CONTAINER m_redoList
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged) override
Notification event that some of the common (suite-wide) settings have changed.
FILE_HISTORY * m_fileHistory
virtual void DeleteAutoSaveFile(const wxFileName &aFileName)
virtual void OnSize(wxSizeEvent &aEvent)
virtual wxString GetUndoActionDescription() const
virtual PICKED_ITEMS_LIST * PopCommandFromUndoList()
Return the last command to undo and remove it from list, nothing is deleted.
virtual bool canCloseWindow(wxCloseEvent &aCloseEvent)
bool ProcessEvent(wxEvent &aEvent) override
Override the default process event handler to implement the auto save feature.
bool IsWritable(const wxFileName &aFileName, bool aVerbose=true)
Check if aFileName can be written.
wxPoint m_normalFramePos
void OnMaximize(wxMaximizeEvent &aEvent)
virtual void OnDropFiles(wxDropFilesEvent &aEvent)
Handle event fired when a file is dropped to the window.
std::map< const wxString, TOOL_ACTION * > m_acceptedExts
Associate file extensions with action to execute.
void onIconize(wxIconizeEvent &aEvent)
virtual void unitsChangeRefresh()
Called when when the units setting has changed to allow for any derived classes to handle refreshing ...
wxString GetFileFromHistory(int cmdId, const wxString &type, FILE_HISTORY *aFileHistory=nullptr)
Fetch the file name from the file history list.
wxSize GetWindowSize()
Get the undecorated window size that can be used for restoring the window size.
int GetAutoSaveInterval() const
virtual void SaveSettings(APP_SETTINGS_BASE *aCfg)
Save common frame parameters to a configuration data file.
void onSystemColorChange(wxSysColourChangedEvent &aEvent)
virtual int GetUndoCommandCount() const
virtual void RegisterUIUpdateHandler(int aID, const ACTION_CONDITIONS &aConditions) override
Register a UI update handler for the control with ID aID.
virtual void PushCommandToRedoList(PICKED_ITEMS_LIST *aItem)
Add a command to redo in the redo list.
void ShowInfoBarError(const wxString &aErrorMsg, bool aShowCloseButton=false, WX_INFOBAR::MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the WX_INFOBAR displayed on the top of the canvas with a message and an error icon on the left o...
bool m_isClosing
Set by the close window event handler after frames are asked if they can close.
void AddStandardHelpMenu(wxMenuBar *aMenuBar)
Add the standard KiCad help menu to the menubar.
wxString m_mruPath
void ReCreateMenuBar()
Recreate the menu bar.
virtual void doReCreateMenuBar()
WX_INFOBAR * GetInfoBar()
Specialization of the wxAuiPaneInfo class for KiCad panels.
This class implements a file history object to store a list of files, that can then be added to a men...
Definition: file_history.h:43
void AddFileToHistory(const wxString &aFile) override
Adds a file to the history.
void ClearFileHistory()
Clear all entries from the file history.
void Save(APP_SETTINGS_BASE &aSettings)
Saves history into a JSON settings object.
void SetMaxFiles(size_t aMaxFiles)
Update the number of files that will be contained inside the file history.
void Load(const APP_SETTINGS_BASE &aSettings)
Loads history from a JSON settings object.
SEARCH_STACK & KifaceSearch()
Only for DSO specific 'non-library' files.
Definition: kiface_base.h:116
APP_SETTINGS_BASE * KifaceSettings() const
Definition: kiface_base.h:95
void GetActions(std::vector< TOOL_ACTION * > &aActions) const override
Append this Kiface's registered actions to the given list.
Definition: kiface_base.h:118
const wxString & GetHelpFileName() const
Return just the basename portion of the current help file.
Definition: kiface_base.h:112
A mix in class which holds the location of a wxWindow's KIWAY.
Definition: kiway_holder.h:39
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 minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition: kiway.h:285
virtual void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition: kiway.cpp:617
virtual KIFACE * KiFACE(FACE_T aFaceId, bool doLoad=true)
Return the KIFACE* given a FACE_T.
Definition: kiway.cpp:201
@ FACE_SCH
eeschema DSO
Definition: kiway.h:292
@ FACE_PL_EDITOR
Definition: kiway.h:296
@ FACE_PCB
pcbnew DSO
Definition: kiway.h:293
@ FACE_GERBVIEW
Definition: kiway.h:295
virtual void GetActions(std::vector< TOOL_ACTION * > &aActions) const
Append all registered actions to the given list.
Definition: kiway.cpp:536
WX_TREEBOOK * GetTreebook()
Definition: paged_dialog.h:39
void SetInitialPage(const wxString &aPage, const wxString &aParentPage=wxEmptyString)
std::vector< TOOL_ACTION * > & ActionsList()
static wxString GetDefaultUserProjectsPath()
Gets the default path we point users to create projects.
Definition: paths.cpp:143
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition: pgm_base.cpp:689
virtual int GetSelectedLanguageIdentifier() const
Definition: pgm_base.h:229
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition: pgm_base.h:125
A holder to handle information on schematic or board items.
void SaveFileState(const wxString &aFileName, const WINDOW_SETTINGS *aWindowCfg, bool aOpen)
const PROJECT_FILE_STATE * GetFileState(const wxString &aFileName)
virtual PROJECT_LOCAL_SETTINGS & GetLocalSettings() const
Definition: project.h:206
Look for files in a number of paths.
Definition: search_stack.h:43
virtual wxWindow * GetToolCanvas() const =0
Canvas access.
TOOL_MANAGER * m_toolManager
Definition: tools_holder.h:167
virtual void ShowChangedLanguage()
TOOL_DISPATCHER * m_toolDispatcher
Definition: tools_holder.h:169
virtual SELECTION & GetCurrentSelection()
Get the current selection from the canvas area.
Definition: tools_holder.h:98
virtual void CommonSettingsChanged(bool aEnvVarsChanged, bool aTextVarsChanged)
Notification event that some of the common (suite-wide) settings have changed.
int GetUIId() const
Get the unique ID for this action in the user interface system.
Definition: tool_action.h:339
@ REDRAW
Full drawing refresh.
Definition: tool_base.h:83
virtual void DispatchWxEvent(wxEvent &aEvent)
Process wxEvents (mostly UI events), translate them to TOOL_EVENTs, and make tools handle those.
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
void ResetTools(TOOL_BASE::RESET_REASON aReason)
Reset all tools (i.e.
void PushCommand(PICKED_ITEMS_LIST *aCommand)
PICKED_ITEMS_LIST * PopCommand()
std::vector< PICKED_ITEMS_LIST * > m_CommandsList
void SetUserUnits(EDA_UNITS aUnits)
Simple wrapper around wxBusyCursor for used with the generic BUSY_INDICATOR interface.
A modified version of the wxInfoBar class that allows us to:
Definition: wx_infobar.h:76
void RemoveAllButtons()
Remove all the buttons that have been added by the user.
Definition: wx_infobar.cpp:320
void ShowMessageFor(const wxString &aMessage, int aTime, int aFlags=wxICON_INFORMATION, MESSAGE_TYPE aType=WX_INFOBAR::MESSAGE_TYPE::GENERIC)
Show the infobar with the provided message and icon for a specific period of time.
Definition: wx_infobar.cpp:139
MESSAGE_TYPE
Sets the type of message for special handling if needed.
Definition: wx_infobar.h:94
void Dismiss() override
Dismisses the infobar and updates the containing layout and AUI manager (if one is provided).
Definition: wx_infobar.cpp:189
void AddCloseButton(const wxString &aTooltip=_("Hide this message."))
Add the default close button to the infobar on the right side.
Definition: wx_infobar.cpp:310
void SetCallback(std::function< void(void)> aCallback)
Provide a callback to be called when the infobar is dismissed (either by user action or timer).
Definition: wx_infobar.h:160
bool AddLazyPage(std::function< wxWindow *(wxWindow *aParent)> aLazyCtor, const wxString &text, bool bSelect=false, int imageId=NO_IMAGE)
Definition: wx_treebook.cpp:89
bool AddLazySubPage(std::function< wxWindow *(wxWindow *aParent)> aLazyCtor, const wxString &text, bool bSelect=false, int imageId=NO_IMAGE)
Definition: wx_treebook.cpp:96
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.
const int minSize
Push and Shove router track width and via size dialog.
#define _(s)
static const wxSize minSizeLookup(FRAME_T aFrameType, wxWindow *aWindow)
#define LAZY_CTOR(key)
static const wxSize defaultSize(FRAME_T aFrameType, wxWindow *aWindow)
wxWindow * findQuasiModalDialog(wxWindow *aParent)
Base window classes and related definitions.
#define DEFAULT_MAX_UNDO_ITEMS
std::function< void(wxUpdateUIEvent &) > UIUpdateHandler
This is the handler functor for the update UI events.
void SocketCleanup()
Must be called to clean up the socket thread used by SendCommand.
Definition: eda_dde.cpp:319
DDE server & client.
EDA_UNITS
Definition: eda_units.h:46
FRAME_T
The set of EDA_BASE_FRAME derivatives, typically stored in EDA_BASE_FRAME::m_Ident.
Definition: frame_type.h:33
@ PANEL_PCB_GRIDS
Definition: frame_type.h:94
@ FRAME_PCB_EDITOR
Definition: frame_type.h:42
@ PANEL_SYM_EDIT_GRIDS
Definition: frame_type.h:73
@ FRAME_SCH_SYMBOL_EDITOR
Definition: frame_type.h:35
@ PANEL_SCH_FIELD_NAME_TEMPLATES
Definition: frame_type.h:82
@ PANEL_GBR_DISPLAY_OPTIONS
Definition: frame_type.h:104
@ PANEL_3DV_OPENGL
Definition: frame_type.h:101
@ PANEL_FP_DEFAULT_GRAPHICS_VALUES
Definition: frame_type.h:90
@ PANEL_PCB_ORIGINS_AXES
Definition: frame_type.h:98
@ PANEL_PCB_EDIT_OPTIONS
Definition: frame_type.h:95
@ PANEL_SCH_DISP_OPTIONS
Definition: frame_type.h:77
@ PANEL_FP_DISPLAY_OPTIONS
Definition: frame_type.h:85
@ PANEL_SCH_SIMULATOR
Definition: frame_type.h:83
@ FRAME_SCH
Definition: frame_type.h:34
@ PANEL_DS_COLORS
Definition: frame_type.h:112
@ PANEL_PCB_COLORS
Definition: frame_type.h:96
@ PANEL_3DV_RAYTRACING
Definition: frame_type.h:102
@ PANEL_SYM_EDIT_OPTIONS
Definition: frame_type.h:74
@ PANEL_FP_GRIDS
Definition: frame_type.h:86
@ PANEL_SCH_EDIT_OPTIONS
Definition: frame_type.h:79
@ PANEL_FP_ORIGINS_AXES
Definition: frame_type.h:91
@ PANEL_SYM_DISP_OPTIONS
Definition: frame_type.h:72
@ PANEL_PCB_DISPLAY_OPTS
Definition: frame_type.h:93
@ PANEL_FP_COLORS
Definition: frame_type.h:88
@ PANEL_FP_DEFAULT_FIELDS
Definition: frame_type.h:89
@ PANEL_SYM_COLORS
Definition: frame_type.h:75
@ FRAME_PL_EDITOR
Definition: frame_type.h:59
@ PANEL_GBR_GRIDS
Definition: frame_type.h:107
@ FRAME_FOOTPRINT_EDITOR
Definition: frame_type.h:43
@ FRAME_GERBER
Definition: frame_type.h:57
@ PANEL_DS_GRIDS
Definition: frame_type.h:111
@ FRAME_PCB_DISPLAY3D
Definition: frame_type.h:47
@ PANEL_FP_EDIT_OPTIONS
Definition: frame_type.h:87
@ PANEL_SCH_ANNO_OPTIONS
Definition: frame_type.h:80
@ PANEL_SCH_GRIDS
Definition: frame_type.h:78
@ PANEL_PCB_ACTION_PLUGINS
Definition: frame_type.h:97
@ PANEL_3DV_DISPLAY_OPTIONS
Definition: frame_type.h:100
@ PANEL_DS_DISPLAY_OPTIONS
Definition: frame_type.h:110
@ PANEL_SCH_COLORS
Definition: frame_type.h:81
@ PANEL_GBR_COLORS
Definition: frame_type.h:108
@ PANEL_GBR_EXCELLON_OPTIONS
Definition: frame_type.h:106
@ KICAD_MAIN_FRAME_T
Definition: frame_type.h:68
bool m_EnableGit
Enable git integration.
static const std::string GerberFileExtension
static const std::string AutoSaveFilePrefix
static bool IsGerberFileExtension(const wxString &ext)
const wxChar *const traceAutoSave
Flag to enable auto save feature debug tracing.
const wxChar *const kicadTraceKeyEvent
Flag to enable wxKeyEvent debug tracing.
const wxChar *const traceDisplayLocation
Flag to enable debug output of display positioning logic.
void ReadHotKeyConfigIntoActions(const wxString &aFileName, std::vector< TOOL_ACTION * > &aActions)
Read a hotkey config file into a list of actions.
Common command IDs shared by more than one of the KiCad applications.
@ ID_FILE_LIST_CLEAR
Definition: id.h:84
@ ID_FILE1
Definition: id.h:81
@ ID_AUTO_SAVE_TIMER
Definition: id.h:76
void RemoveShutdownBlockReason(wxWindow *aWindow)
Removes any shutdown block reason set.
Definition: unix/app.cpp:85
bool DuplicatePermissions(const wxString &aSrc, const wxString &aDest)
Duplicates the file security data from one file to another ensuring that they are the same between bo...
Definition: unix/io.cpp:47
PGM_BASE & Pgm()
The global program "get" accessor.
Definition: pgm_base.cpp:1073
LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
Definition: pgm_base.cpp:95
see class PGM_BASE
Functors that can be used to figure out how the action controls should be displayed in the UI and if ...
SELECTION_CONDITION enableCondition
Returns true if the UI control should be enabled.
SELECTION_CONDITION checkCondition
Returns true if the UI control should be checked.
SELECTION_CONDITION showCondition
Returns true if the UI control should be shown.
ACTION_CONDITIONS & Check(const SELECTION_CONDITION &aCondition)
Implement a participant in the KIWAY alchemy.
Definition: kiway.h:152
int m_KI_Lang_Identifier
KiCad identifier used in menu selection (See id.h)
Definition: pgm_base.h:74
wxString m_Lang_Label
Labels used in menus.
Definition: pgm_base.h:77
struct WINDOW_STATE window
Store the common settings that are saved and loaded for each window / frame.
Definition: app_settings.h:74
WINDOW_STATE state
Definition: app_settings.h:75
wxString mru_path
Definition: app_settings.h:76
wxString perspective
Definition: app_settings.h:77
Store the window positioning/state.
Definition: app_settings.h:61
unsigned int display
Definition: app_settings.h:67
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)
wxString dump(const wxArrayString &aArray)
Debug helper for printing wxArrayString contents.
wxLogTrace helper definitions.