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
28#include "kicad_manager_frame.h"
29#include <eda_base_frame.h>
30
31#include <advanced_config.h>
32#include <bitmaps.h>
33#include <bitmap_store.h>
34#include <dialog_shim.h>
41#include <eda_dde.h>
42#include <file_history.h>
43#include <id.h>
44#include <kiface_base.h>
45#include <hotkeys_basic.h>
47#include <paths.h>
48#include <local_history.h>
49#include <confirm.h>
51#include <pgm_base.h>
56#include <tool/action_manager.h>
57#include <tool/action_menu.h>
58#include <tool/action_toolbar.h>
59#include <tool/actions.h>
60#include <tool/common_control.h>
61#include <tool/tool_manager.h>
64#include <trace_helpers.h>
67#include <widgets/wx_infobar.h>
70#include <widgets/wx_grid.h>
71#include <widgets/wx_treebook.h>
72#include <wx/app.h>
73#include <wx/config.h>
74#include <wx/display.h>
75#include <wx/stdpaths.h>
76#include <wx/string.h>
77#include <wx/msgdlg.h>
78#include <wx/wupdlock.h>
79#include <kiplatform/app.h>
80#include <kiplatform/io.h>
81#include <kiplatform/ui.h>
82
83#include <nlohmann/json.hpp>
84
85#include <functional>
86#include <kiface_ids.h>
87
88#ifdef KICAD_IPC_API
89#include <api/api_server.h>
90#endif
91
92
93// Minimum window size
94static const wxSize minSizeLookup( FRAME_T aFrameType, wxWindow* aWindow )
95{
96 switch( aFrameType )
97 {
99 return wxWindow::FromDIP( wxSize( 406, 354 ), aWindow );
100
101 default:
102 return wxWindow::FromDIP( wxSize( 500, 400 ), aWindow );
103 }
104}
105
106
107static const wxSize defaultSize( FRAME_T aFrameType, wxWindow* aWindow )
108{
109 switch( aFrameType )
110 {
112 return wxWindow::FromDIP( wxSize( 850, 540 ), aWindow );
113
114 default:
115 return wxWindow::FromDIP( wxSize( 1280, 720 ), aWindow );
116 }
117}
118
119
120BEGIN_EVENT_TABLE( EDA_BASE_FRAME, wxFrame )
121 // These event table entries are needed to handle events from the mac application menu
122 EVT_MENU( wxID_ABOUT, EDA_BASE_FRAME::OnKicadAbout )
123 EVT_MENU( wxID_PREFERENCES, EDA_BASE_FRAME::OnPreferences )
124
125 EVT_CHAR_HOOK( EDA_BASE_FRAME::OnCharHook )
126 EVT_MENU_OPEN( EDA_BASE_FRAME::OnMenuEvent )
127 EVT_MENU_CLOSE( EDA_BASE_FRAME::OnMenuEvent )
128 EVT_MENU_HIGHLIGHT_ALL( EDA_BASE_FRAME::OnMenuEvent )
129 EVT_MOVE( EDA_BASE_FRAME::OnMove )
130 EVT_SIZE( EDA_BASE_FRAME::OnSize )
131 EVT_MAXIMIZE( EDA_BASE_FRAME::OnMaximize )
132
133 EVT_SYS_COLOUR_CHANGED( EDA_BASE_FRAME::onSystemColorChange )
134 EVT_ICONIZE( EDA_BASE_FRAME::onIconize )
135END_EVENT_TABLE()
136
137
139{
140 m_ident = aFrameType;
141 m_maximizeByDefault = false;
142 m_infoBar = nullptr;
143 m_settingsManager = nullptr;
144 m_fileHistory = nullptr;
145 m_supportsAutoSave = false;
146 m_autoSavePending = false;
148 m_isClosing = false;
149 m_isNonUserClose = false;
150 m_autoSaveTimer = new wxTimer( this, ID_AUTO_SAVE_TIMER );
151 m_autoSaveRequired = false;
154 m_frameSize = defaultSize( aFrameType, this );
155 m_displayIndex = -1;
156
157 m_auimgr.SetArtProvider( new WX_AUI_DOCK_ART() );
158
160
161 // Set a reasonable minimal size for the frame
162 wxSize minSize = minSizeLookup( aFrameType, this );
163 SetSizeHints( minSize.x, minSize.y, -1, -1, -1, -1 );
164
165 // Store dimensions of the user area of the main window.
166 GetClientSize( &m_frameSize.x, &m_frameSize.y );
167
168 Connect( ID_AUTO_SAVE_TIMER, wxEVT_TIMER,
169 wxTimerEventHandler( EDA_BASE_FRAME::onAutoSaveTimer ) );
170
171 // hook wxEVT_CLOSE_WINDOW so we can call SaveSettings(). This function seems
172 // to be called before any other hook for wxCloseEvent, which is necessary.
173 Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( EDA_BASE_FRAME::windowClosing ) );
174
175 initExitKey();
176}
177
178
179EDA_BASE_FRAME::EDA_BASE_FRAME( wxWindow* aParent, FRAME_T aFrameType, const wxString& aTitle,
180 const wxPoint& aPos, const wxSize& aSize, long aStyle,
181 const wxString& aFrameName, KIWAY* aKiway,
182 const EDA_IU_SCALE& aIuScale ) :
183 wxFrame( aParent, wxID_ANY, aTitle, aPos, aSize, aStyle, aFrameName ),
184 TOOLS_HOLDER(),
185 KIWAY_HOLDER( aKiway, KIWAY_HOLDER::FRAME ),
186 UNITS_PROVIDER( aIuScale, EDA_UNITS::MM )
187{
188 m_tbTopMain = nullptr;
189 m_tbTopAux = nullptr;
190 m_tbRight = nullptr;
191 m_tbLeft = nullptr;
192
193 commonInit( aFrameType );
194
195}
196
197
198wxWindow* findQuasiModalDialog( wxWindow* aParent )
199{
200 for( wxWindow* child : aParent->GetChildren() )
201 {
202 if( DIALOG_SHIM* dlg = dynamic_cast<DIALOG_SHIM*>( child ) )
203 {
204 if( dlg->IsQuasiModal() )
205 return dlg;
206
207 if( wxWindow* nestedDlg = findQuasiModalDialog( child ) )
208 return nestedDlg;
209 }
210 }
211
212 return nullptr;
213}
214
215
217{
218 if( wxWindow* dlg = ::findQuasiModalDialog( this ) )
219 return dlg;
220
221 // FIXME: CvPcb is currently implemented on top of KIWAY_PLAYER rather than DIALOG_SHIM,
222 // so we have to look for it separately.
223 if( m_ident == FRAME_SCH )
224 {
225 wxWindow* cvpcb = wxWindow::FindWindowByName( wxS( "CvpcbFrame" ) );
226
227 if( cvpcb )
228 return cvpcb;
229 }
230
231 return nullptr;
232}
233
234
235void EDA_BASE_FRAME::windowClosing( wxCloseEvent& event )
236{
237 // Don't allow closing when a quasi-modal is open.
238 wxWindow* quasiModal = findQuasiModalDialog();
239
240 if( quasiModal )
241 {
242 // Raise and notify; don't give the user a warning regarding "quasi-modal dialogs"
243 // when they have no idea what those are.
244 quasiModal->Raise();
245 wxBell();
246
247 if( event.CanVeto() )
248 event.Veto();
249
250 return;
251 }
252
253
254 if( event.GetId() == wxEVT_QUERY_END_SESSION
255 || event.GetId() == wxEVT_END_SESSION )
256 {
257 // End session means the OS is going to terminate us
258 m_isNonUserClose = true;
259 }
260
261 if( canCloseWindow( event ) )
262 {
263 m_isClosing = true;
264
265 if( m_infoBar )
266 m_infoBar->Dismiss();
267
268 APP_SETTINGS_BASE* cfg = config();
269
270 if( cfg )
271 SaveSettings( cfg ); // virtual, wxFrame specific
272
274
275 // Destroy (safe delete frame) this frame only in non modal mode.
276 // In modal mode, the caller will call Destroy().
277 if( !IsModal() )
278 Destroy();
279 }
280 else
281 {
282 if( event.CanVeto() )
283 event.Veto();
284 }
285}
286
287
289{
290 Disconnect( ID_AUTO_SAVE_TIMER, wxEVT_TIMER,
291 wxTimerEventHandler( EDA_BASE_FRAME::onAutoSaveTimer ) );
292 Disconnect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler( EDA_BASE_FRAME::windowClosing ) );
293
294 delete m_autoSaveTimer;
295 delete m_fileHistory;
296
298
300
302}
303
304
305bool EDA_BASE_FRAME::ProcessEvent( wxEvent& aEvent )
306{
307#ifdef __WXMAC__
308 // Apple in its infinite wisdom will raise a disabled window before even passing
309 // us the event, so we have no way to stop it. Instead, we have to catch an
310 // improperly ordered disabled window and quasi-modal dialog here and reorder
311 // them.
312 if( !IsEnabled() && IsActive() )
313 {
314 wxWindow* dlg = findQuasiModalDialog();
315
316 if( dlg )
317 dlg->Raise();
318 }
319#endif
320
321 if( !wxFrame::ProcessEvent( aEvent ) )
322 return false;
323
324 if( Pgm().m_Quitting )
325 return true;
326
327 if( !m_isClosing && m_supportsAutoSave && IsShownOnScreen() && IsActive()
329 && GetAutoSaveInterval() > 0 )
330 {
331 if( !m_autoSavePending )
332 {
333 wxLogTrace( traceAutoSave, wxT( "Starting auto save timer." ) );
334 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
335 m_autoSavePending = true;
336 }
337 else if( m_autoSaveTimer->IsRunning() )
338 {
339 wxLogTrace( traceAutoSave, wxT( "Stopping auto save timer." ) );
340 m_autoSaveTimer->Stop();
341 m_autoSavePending = false;
342 }
343 }
344
345 return true;
346}
347
348
353
354
355void EDA_BASE_FRAME::onAutoSaveTimer( wxTimerEvent& aEvent )
356{
357 // Don't stomp on someone else's timer event.
358 if( aEvent.GetId() != ID_AUTO_SAVE_TIMER )
359 {
360 aEvent.Skip();
361 return;
362 }
363
364 if( !doAutoSave() )
365 m_autoSaveTimer->Start( GetAutoSaveInterval() * 1000, wxTIMER_ONE_SHOT );
366}
367
368
370{
371 m_autoSaveRequired = false;
372 m_autoSavePending = false;
373
374 // Use registered saver callbacks to snapshot editor state into .history and only commit
375 // if there are material changes.
376 if( !Prj().IsReadOnly() )
377 Kiway().LocalHistory().RunRegisteredSaversAndCommit( Prj().GetProjectPath(), wxS( "Autosave" ) );
378
379 return true;
380}
381
382
383void EDA_BASE_FRAME::OnCharHook( wxKeyEvent& aKeyEvent )
384{
385 wxLogTrace( kicadTraceKeyEvent, wxS( "EDA_BASE_FRAME::OnCharHook %s" ), dump( aKeyEvent ) );
386
387 // Key events can be filtered here.
388 // Currently no filtering is made.
389 aKeyEvent.Skip();
390}
391
392
393void EDA_BASE_FRAME::OnMenuEvent( wxMenuEvent& aEvent )
394{
395 if( !m_toolDispatcher )
396 aEvent.Skip();
397 else
398 m_toolDispatcher->DispatchWxEvent( aEvent );
399}
400
401
403{
405 std::placeholders::_1,
406 this,
407 aConditions );
408
409 m_uiUpdateMap[aID] = evtFunc;
410
411 Bind( wxEVT_UPDATE_UI, evtFunc, aID );
412}
413
414
416{
417 const auto it = m_uiUpdateMap.find( aID );
418
419 if( it == m_uiUpdateMap.end() )
420 return;
421
422 Unbind( wxEVT_UPDATE_UI, it->second, aID );
423}
424
425
426void EDA_BASE_FRAME::HandleUpdateUIEvent( wxUpdateUIEvent& aEvent, EDA_BASE_FRAME* aFrame,
427 ACTION_CONDITIONS aCond )
428{
429 bool checkRes = false;
430 bool enableRes = true;
431 bool showRes = true;
432 bool isCut = aEvent.GetId() == ACTIONS::cut.GetUIId();
433 bool isCopy = aEvent.GetId() == ACTIONS::copy.GetUIId();
434 bool isPaste = aEvent.GetId() == ACTIONS::paste.GetUIId();
435 SELECTION& selection = aFrame->GetCurrentSelection();
436
437 try
438 {
439 checkRes = aCond.checkCondition( selection );
440 enableRes = aCond.enableCondition( selection );
441 showRes = aCond.showCondition( selection );
442 }
443 catch( std::exception& )
444 {
445 // Something broke with the conditions, just skip the event.
446 aEvent.Skip();
447 return;
448 }
449
450 if( showRes && aEvent.GetId() == ACTIONS::undo.GetUIId() )
451 {
452 wxString msg = _( "Undo" );
453
454 if( enableRes )
455 msg += wxS( " " ) + aFrame->GetUndoActionDescription();
456
457 aEvent.SetText( msg );
458 }
459 else if( showRes && aEvent.GetId() == ACTIONS::redo.GetUIId() )
460 {
461 wxString msg = _( "Redo" );
462
463 if( enableRes )
464 msg += wxS( " " ) + aFrame->GetRedoActionDescription();
465
466 aEvent.SetText( msg );
467 }
468
469 if( isCut || isCopy || isPaste )
470 {
471 wxWindow* focus = wxWindow::FindFocus();
472 wxTextEntry* textEntry = dynamic_cast<wxTextEntry*>( focus );
473
474 if( textEntry && isCut && textEntry->CanCut() )
475 enableRes = true;
476 else if( textEntry && isCopy && textEntry->CanCopy() )
477 enableRes = true;
478 else if( textEntry && isPaste && textEntry->CanPaste() )
479 enableRes = true;
480 else if( dynamic_cast<WX_GRID*>( focus ) )
481 enableRes = false; // Must disable menu in order to get command as CharHook event
482 }
483
484 aEvent.Enable( enableRes );
485 aEvent.Show( showRes );
486
487 if( aEvent.IsCheckable() )
488 aEvent.Check( checkRes );
489}
490
491
493{
494 // Setup the conditions to check a language menu item
495 auto isCurrentLang =
496 [] ( const SELECTION& aSel, int aLangIdentifier )
497 {
498 return Pgm().GetSelectedLanguageIdentifier() == aLangIdentifier;
499 };
500
501 for( unsigned ii = 0; LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
502 {
504 cond.Check( std::bind( isCurrentLang, std::placeholders::_1,
505 LanguagesList[ii].m_WX_Lang_Identifier ) );
506 RegisterUIUpdateHandler( LanguagesList[ii].m_KI_Lang_Identifier, cond );
507 }
508}
509
510
512 const ACTION_TOOLBAR_CONTROL_FACTORY& aControlFactory )
513{
514 m_toolbarControlFactories.emplace( aControlDesc.GetName(), aControlFactory );
515}
516
517
519{
520 for( auto& control : m_toolbarControlFactories )
521 {
522 if( control.first == aName )
523 return &control.second;
524 }
525
526 return nullptr;
527}
528
529
533
534
536{
537 wxWindowUpdateLocker dummy( this );
538
539 wxASSERT( m_toolbarSettings );
540
541 std::optional<TOOLBAR_CONFIGURATION> tbConfig;
542
543 // Drawing tools (typically on right edge of window)
544 tbConfig = m_toolbarSettings->GetToolbarConfig( TOOLBAR_LOC::RIGHT, config()->m_CustomToolbars );
545
546 if( tbConfig.has_value() )
547 {
548 if( !m_tbRight )
549 {
550 m_tbRight = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
551 KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL );
552 m_tbRight->SetAuiManager( &m_auimgr );
553 }
554
555 m_tbRight->ApplyConfiguration( tbConfig.value() );
556 }
557
558 // Options (typically on left edge of window)
559 tbConfig = m_toolbarSettings->GetToolbarConfig( TOOLBAR_LOC::LEFT, config()->m_CustomToolbars );
560
561 if( tbConfig.has_value() )
562 {
563 if( !m_tbLeft )
564 {
565 m_tbLeft = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
566 KICAD_AUI_TB_STYLE | wxAUI_TB_VERTICAL );
567 m_tbLeft->SetAuiManager( &m_auimgr );
568 }
569
570 m_tbLeft->ApplyConfiguration( tbConfig.value() );
571 }
572
573 // Top main toolbar (the top one)
574 tbConfig = m_toolbarSettings->GetToolbarConfig( TOOLBAR_LOC::TOP_MAIN, config()->m_CustomToolbars );
575
576 if( tbConfig.has_value() )
577 {
578 if( !m_tbTopMain )
579 {
580 m_tbTopMain = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
581 KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_HORIZONTAL );
582 m_tbTopMain->SetAuiManager( &m_auimgr );
583 }
584
585 m_tbTopMain->ApplyConfiguration( tbConfig.value() );
586 }
587
588 // Top aux toolbar (the bottom one)
589 tbConfig = m_toolbarSettings->GetToolbarConfig( TOOLBAR_LOC::TOP_AUX, config()->m_CustomToolbars );
590
591 if( tbConfig.has_value() )
592 {
593 if( !m_tbTopAux )
594 {
595 m_tbTopAux = new ACTION_TOOLBAR( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,
596 KICAD_AUI_TB_STYLE | wxAUI_TB_HORZ_LAYOUT | wxAUI_TB_HORIZONTAL );
597 m_tbTopAux->SetAuiManager( &m_auimgr );
598 }
599
600 m_tbTopAux->ApplyConfiguration( tbConfig.value() );
601 }
602}
603
604
606{
607 if( m_tbTopMain )
608 m_tbTopMain->UpdateControlWidths();
609
610 if( m_tbRight )
611 m_tbRight->UpdateControlWidths();
612
613 if( m_tbLeft )
614 m_tbLeft->UpdateControlWidths();
615
616 if( m_tbTopAux )
617 m_tbTopAux->UpdateControlWidths();
618
619}
620
621
623{
624 if( m_tbTopMain )
625 m_auimgr.GetPane( m_tbTopMain ).MaxSize( m_tbTopMain->GetSize() );
626
627 if( m_tbRight )
628 m_auimgr.GetPane( m_tbRight ).MaxSize( m_tbRight->GetSize() );
629
630 if( m_tbLeft )
631 m_auimgr.GetPane( m_tbLeft ).MaxSize( m_tbLeft->GetSize() );
632
633 if( m_tbTopAux )
634 m_auimgr.GetPane( m_tbTopAux ).MaxSize( m_tbTopAux->GetSize() );
635
636 m_auimgr.Update();
637}
638
639
641{
648
649 CallAfter( [this]()
650 {
651 if( !m_isClosing )
653 } );
654}
655
656
657void EDA_BASE_FRAME::AddStandardHelpMenu( wxMenuBar* aMenuBar )
658{
659 COMMON_CONTROL* commonControl = m_toolManager->GetTool<COMMON_CONTROL>();
660 ACTION_MENU* helpMenu = new ACTION_MENU( false, commonControl );
661
662 helpMenu->Add( ACTIONS::help );
663 helpMenu->Add( ACTIONS::gettingStarted );
664 helpMenu->Add( ACTIONS::listHotKeys );
665 helpMenu->Add( ACTIONS::getInvolved );
666 helpMenu->Add( ACTIONS::donate );
667 helpMenu->Add( ACTIONS::reportBug );
668
669 helpMenu->AppendSeparator();
670 helpMenu->Add( ACTIONS::about );
671
672 aMenuBar->Append( helpMenu, _( "&Help" ) );
673}
674
675
676
678{
679 wxString menuItemLabel = aAction.GetMenuLabel();
680 wxMenuBar* menuBar = GetMenuBar();
681
682 for( size_t ii = 0; ii < menuBar->GetMenuCount(); ++ii )
683 {
684 for( wxMenuItem* menuItem : menuBar->GetMenu( ii )->GetMenuItems() )
685 {
686 if( menuItem->GetItemLabelText() == menuItemLabel )
687 {
688 wxString menuTitleLabel = menuBar->GetMenuLabelText( ii );
689
690 menuTitleLabel.Replace( wxS( "&" ), wxS( "&&" ) );
691 menuItemLabel.Replace( wxS( "&" ), wxS( "&&" ) );
692
693 return wxString::Format( _( "Run: %s > %s" ),
694 menuTitleLabel,
695 menuItemLabel );
696 }
697 }
698 }
699
700 return wxString::Format( _( "Run: %s" ), aAction.GetFriendlyName() );
701};
702
703
705{
707
708 if( GetMenuBar() )
709 {
711 GetMenuBar()->Refresh();
712 }
713}
714
715
717{
719
720 COMMON_SETTINGS* settings = Pgm().GetCommonSettings();
721
722#ifdef KICAD_IPC_API
723 bool running = Pgm().GetApiServer().Running();
724
725 if( running && !settings->m_Api.enable_server )
726 Pgm().GetApiServer().Stop();
727 else if( !running && settings->m_Api.enable_server )
728 Pgm().GetApiServer().Start();
729#endif
730
731 if( m_fileHistory )
732 {
733 int historySize = settings->m_System.file_history_size;
734 m_fileHistory->SetMaxFiles( (unsigned) std::max( 0, historySize ) );
735 }
736
737 if( Pgm().GetCommonSettings()->m_Backup.enabled )
738 Kiway().LocalHistory().Init( Prj().GetProjectPath() );
739
741 ThemeChanged();
742
743 if( GetMenuBar() )
744 {
745 // For icons in menus, icon scaling & hotkeys
747 GetMenuBar()->Refresh();
748 }
749
750 // Update the toolbars
752}
753
754
756{
758
759 // Update all the toolbars to have new icons
760 wxAuiPaneInfoArray panes = m_auimgr.GetAllPanes();
761
762 for( size_t i = 0; i < panes.GetCount(); ++i )
763 {
764 if( ACTION_TOOLBAR* toolbar = dynamic_cast<ACTION_TOOLBAR*>( panes[i].window ) )
765 toolbar->RefreshBitmaps();
766 }
767}
768
769
770void EDA_BASE_FRAME::OnSize( wxSizeEvent& aEvent )
771{
772#ifdef __WXMAC__
773 int currentDisplay = wxDisplay::GetFromWindow( this );
774
775 if( m_displayIndex >= 0 && currentDisplay >= 0 && currentDisplay != m_displayIndex )
776 {
777 wxLogTrace( traceDisplayLocation, wxS( "OnSize: current display changed %d to %d" ),
778 m_displayIndex, currentDisplay );
779 m_displayIndex = currentDisplay;
781 }
782#endif
783
784 aEvent.Skip();
785}
786
787
788void EDA_BASE_FRAME::LoadWindowState( const wxString& aFileName )
789{
790 if( !Pgm().GetCommonSettings()->m_Session.remember_open_files )
791 return;
792
793 const PROJECT_FILE_STATE* state = Prj().GetLocalSettings().GetFileState( aFileName );
794
795 if( state != nullptr )
796 {
797 LoadWindowState( state->window );
798 }
799}
800
801
803{
804 bool wasDefault = false;
805
806 m_framePos.x = aState.pos_x;
807 m_framePos.y = aState.pos_y;
808 m_frameSize.x = aState.size_x;
809 m_frameSize.y = aState.size_y;
810
811 wxLogTrace( traceDisplayLocation, wxS( "Config position (%d, %d) with size (%d, %d)" ),
813
814 // Ensure minimum size is set if the stored config was zero-initialized
815 wxSize minSize = minSizeLookup( m_ident, this );
816
817 if( m_frameSize.x < minSize.x || m_frameSize.y < minSize.y )
818 {
820 wasDefault = true;
821
822 wxLogTrace( traceDisplayLocation, wxS( "Using minimum size (%d, %d)" ),
824 }
825
826 wxLogTrace( traceDisplayLocation, wxS( "Number of displays: %d" ), wxDisplay::GetCount() );
827
828 if( aState.display >= wxDisplay::GetCount() )
829 {
830 wxLogTrace( traceDisplayLocation, wxS( "Previous display not found" ) );
831
832 // If it isn't attached, use the first display
833 // Warning wxDisplay has 2 ctor variants. the parameter needs a type:
834 const unsigned int index = 0;
835 wxDisplay display( index );
836 wxRect clientSize = display.GetGeometry();
837
838 m_framePos = wxDefaultPosition;
839
840 // Ensure the window fits on the display, since the other one could have been larger
841 if( m_frameSize.x > clientSize.width )
842 m_frameSize.x = clientSize.width;
843
844 if( m_frameSize.y > clientSize.height )
845 m_frameSize.y = clientSize.height;
846 }
847 else
848 {
849 wxPoint upperRight( m_framePos.x + m_frameSize.x, m_framePos.y );
850 wxPoint upperLeft( m_framePos.x, m_framePos.y );
851
852 wxDisplay display( aState.display );
853 wxRect clientSize = display.GetClientArea();
854
855 int yLimTop = clientSize.y;
856 int yLimBottom = clientSize.y + clientSize.height;
857 int xLimLeft = clientSize.x;
858 int xLimRight = clientSize.x + clientSize.width;
859
860 if( upperLeft.x > xLimRight || // Upper left corner too close to right edge of screen
861 upperRight.x < xLimLeft || // Upper right corner too close to left edge of screen
862 upperLeft.y < yLimTop || // Upper corner too close to the bottom of the screen
863 upperLeft.y > yLimBottom )
864 {
865 m_framePos = wxDefaultPosition;
866 wxLogTrace( traceDisplayLocation, wxS( "Resetting to default position" ) );
867 }
868 }
869
870 wxLogTrace( traceDisplayLocation, wxS( "Final window position (%d, %d) with size (%d, %d)" ),
872
873 SetSize( m_framePos.x, m_framePos.y, m_frameSize.x, m_frameSize.y );
874
875 // Center the window if we reset to default
876 if( m_framePos.x == -1 )
877 {
878 wxLogTrace( traceDisplayLocation, wxS( "Centering window" ) );
879 Center();
880 m_framePos = GetPosition();
881 }
882
883 // Record the frame sizes in an un-maximized state
886
887 // Maximize if we were maximized before
888 if( aState.maximized || ( wasDefault && m_maximizeByDefault ) )
889 {
890 wxLogTrace( traceDisplayLocation, wxS( "Maximizing window" ) );
891 Maximize();
892 }
893
894 m_displayIndex = wxDisplay::GetFromWindow( this );
895}
896
897
899{
900 wxDisplay display( wxDisplay::GetFromWindow( this ) );
901 wxRect clientSize = display.GetClientArea();
902 wxPoint pos = GetPosition();
903 wxSize size = GetWindowSize();
904
905 wxLogTrace( traceDisplayLocation,
906 wxS( "ensureWindowIsOnScreen: clientArea (%d, %d) w %d h %d" ),
907 clientSize.x, clientSize.y,
908 clientSize.width, clientSize.height );
909
910 if( pos.y < clientSize.y )
911 {
912 wxLogTrace( traceDisplayLocation,
913 wxS( "ensureWindowIsOnScreen: y pos %d below minimum, setting to %d" ), pos.y,
914 clientSize.y );
915 pos.y = clientSize.y;
916 }
917
918 if( pos.x < clientSize.x )
919 {
920 wxLogTrace( traceDisplayLocation,
921 wxS( "ensureWindowIsOnScreen: x pos %d is off the client rect, setting to %d" ),
922 pos.x, clientSize.x );
923 pos.x = clientSize.x;
924 }
925
926 if( pos.x + size.x - clientSize.x > clientSize.width )
927 {
928 int newWidth = clientSize.width - ( pos.x - clientSize.x );
929 wxLogTrace( traceDisplayLocation,
930 wxS( "ensureWindowIsOnScreen: effective width %d above available %d, setting "
931 "to %d" ), pos.x + size.x, clientSize.width, newWidth );
932 size.x = newWidth;
933 }
934
935 if( pos.y + size.y - clientSize.y > clientSize.height )
936 {
937 int newHeight = clientSize.height - ( pos.y - clientSize.y );
938 wxLogTrace( traceDisplayLocation,
939 wxS( "ensureWindowIsOnScreen: effective height %d above available %d, setting "
940 "to %d" ), pos.y + size.y, clientSize.height, newHeight );
941 size.y = newHeight;
942 }
943
944 wxLogTrace( traceDisplayLocation, wxS( "Updating window position (%d, %d) with size (%d, %d)" ),
945 pos.x, pos.y, size.x, size.y );
946
947 SetSize( pos.x, pos.y, size.x, size.y );
948}
949
950
961
962
964{
965 if( IsIconized() )
966 return;
967
968 // If the window is maximized, we use the saved window size from before it was maximized
969 if( IsMaximized() )
970 {
973 }
974 else
975 {
977 m_framePos = GetPosition();
978 }
979
980 aCfg->state.pos_x = m_framePos.x;
981 aCfg->state.pos_y = m_framePos.y;
982 aCfg->state.size_x = m_frameSize.x;
983 aCfg->state.size_y = m_frameSize.y;
984 aCfg->state.maximized = IsMaximized();
985 aCfg->state.display = wxDisplay::GetFromWindow( this );
986
987 wxLogTrace( traceDisplayLocation, wxS( "Saving window maximized: %s" ),
988 IsMaximized() ? wxS( "true" ) : wxS( "false" ) );
989 wxLogTrace( traceDisplayLocation, wxS( "Saving config position (%d, %d) with size (%d, %d)" ),
991
992 // Once this is fully implemented, wxAuiManager will be used to maintain
993 // the persistence of the main frame and all it's managed windows and
994 // all of the legacy frame persistence position code can be removed.
995#if wxCHECK_VERSION( 3, 3, 0 )
996 {
997 WX_AUI_JSON_SERIALIZER serializer( m_auimgr );
998 nlohmann::json state = serializer.Serialize();
999
1000 if( state.is_null() || state.empty() )
1001 aCfg->aui_state = nlohmann::json();
1002 else
1003 aCfg->aui_state = state;
1004
1005 aCfg->perspective.clear();
1006 }
1007#else
1008 aCfg->perspective = m_auimgr.SavePerspective().ToStdString();
1009 aCfg->aui_state = nlohmann::json();
1010#endif
1011
1012 aCfg->mru_path = m_mruPath;
1013}
1014
1015
1017{
1019
1020 // Get file history size from common settings
1021 int fileHistorySize = Pgm().GetCommonSettings()->m_System.file_history_size;
1022
1023 // Load the recently used files into the history menu
1024 m_fileHistory = new FILE_HISTORY( (unsigned) std::max( 1, fileHistorySize ),
1026 m_fileHistory->Load( *aCfg );
1027}
1028
1029
1031{
1032 wxCHECK( config(), /* void */ );
1033
1035
1036 bool fileOpen = m_isClosing && m_isNonUserClose;
1037
1038 wxString currentlyOpenedFile = GetCurrentFileName();
1039
1040 if( Pgm().GetCommonSettings()->m_Session.remember_open_files && !currentlyOpenedFile.IsEmpty() )
1041 {
1042 wxFileName rfn( currentlyOpenedFile );
1043 rfn.MakeRelativeTo( Prj().GetProjectPath() );
1044 Prj().GetLocalSettings().SaveFileState( rfn.GetFullPath(), &aCfg->m_Window, fileOpen );
1045 }
1046
1047 // Save the recently used files list
1048 if( m_fileHistory )
1049 {
1050 // Save the currently opened file in the file history
1051 if( !currentlyOpenedFile.IsEmpty() )
1052 UpdateFileHistory( currentlyOpenedFile );
1053
1054 m_fileHistory->Save( *aCfg );
1055 }
1056}
1057
1058
1063
1064
1066{
1067 // KICAD_MANAGER_FRAME overrides this
1068 return Kiface().KifaceSettings();
1069}
1070
1071
1073{
1074 return Kiface().KifaceSearch();
1075}
1076
1077
1079{
1080 return Kiface().GetHelpFileName();
1081}
1082
1083
1084void EDA_BASE_FRAME::PrintMsg( const wxString& text )
1085{
1086 SetStatusText( text );
1087}
1088
1089
1091{
1092#if defined( __WXOSX_MAC__ )
1094#else
1095 m_infoBar = new WX_INFOBAR( this, &m_auimgr );
1096
1097 m_auimgr.AddPane( m_infoBar, EDA_PANE().InfoBar().Name( wxS( "InfoBar" ) ).Top().Layer(1) );
1098#endif
1099}
1100
1101
1103{
1104#if defined( __WXOSX_MAC__ )
1105 m_auimgr.Update();
1106#else
1107 // Call Update() to fix all pane default sizes, especially the "InfoBar" pane before
1108 // hiding it.
1109 m_auimgr.Update();
1110
1111 // We don't want the infobar displayed right away
1112 m_auimgr.GetPane( wxS( "InfoBar" ) ).Hide();
1113 m_auimgr.Update();
1114#endif
1115}
1116
1117
1119{
1120 if( !ADVANCED_CFG::GetCfg().m_EnableUseAuiPerspective )
1121 return;
1122
1123#if wxCHECK_VERSION( 3, 3, 0 )
1124 bool restored = false;
1125
1126 if( !m_auiLayoutState.is_null() && !m_auiLayoutState.empty() )
1127 {
1128 WX_AUI_JSON_SERIALIZER serializer( m_auimgr );
1129
1130 if( serializer.Deserialize( m_auiLayoutState ) )
1131 restored = true;
1132 }
1133
1134 if( !restored && !m_perspective.IsEmpty() )
1135 m_auimgr.LoadPerspective( m_perspective );
1136#else
1137 // Do nothing: Save/LoadPerspective() is broken on wx before 3.3
1138#endif
1139}
1140
1141
1142void EDA_BASE_FRAME::ShowInfoBarError( const wxString& aErrorMsg, bool aShowCloseButton,
1144{
1145 m_infoBar->RemoveAllButtons();
1146
1147 if( aShowCloseButton )
1148 m_infoBar->AddCloseButton();
1149
1150 GetInfoBar()->ShowMessageFor( aErrorMsg, 8000, wxICON_ERROR, aType );
1151}
1152
1153
1154void EDA_BASE_FRAME::ShowInfoBarError( const wxString& aErrorMsg, bool aShowCloseButton,
1155 std::function<void(void)> aCallback )
1156{
1157 m_infoBar->RemoveAllButtons();
1158
1159 if( aShowCloseButton )
1160 m_infoBar->AddCloseButton();
1161
1162 if( aCallback )
1163 m_infoBar->SetCallback( aCallback );
1164
1165 GetInfoBar()->ShowMessageFor( aErrorMsg, 6000, wxICON_ERROR );
1166}
1167
1168
1169void EDA_BASE_FRAME::ShowInfoBarWarning( const wxString& aWarningMsg, bool aShowCloseButton )
1170{
1171 m_infoBar->RemoveAllButtons();
1172
1173 if( aShowCloseButton )
1174 m_infoBar->AddCloseButton();
1175
1176 GetInfoBar()->ShowMessageFor( aWarningMsg, 6000, wxICON_WARNING );
1177}
1178
1179
1180void EDA_BASE_FRAME::ShowInfoBarMsg( const wxString& aMsg, bool aShowCloseButton )
1181{
1182 m_infoBar->RemoveAllButtons();
1183
1184 if( aShowCloseButton )
1185 m_infoBar->AddCloseButton();
1186
1187 GetInfoBar()->ShowMessageFor( aMsg, 8000, wxICON_INFORMATION );
1188}
1189
1190
1191void EDA_BASE_FRAME::UpdateFileHistory( const wxString& FullFileName, FILE_HISTORY* aFileHistory )
1192{
1193 if( !aFileHistory )
1194 aFileHistory = m_fileHistory;
1195
1196 wxASSERT( aFileHistory );
1197
1198 aFileHistory->AddFileToHistory( FullFileName );
1199
1200 // Update the menubar to update the file history menu
1201 if( !m_isClosing && GetMenuBar() )
1202 {
1204 GetMenuBar()->Refresh();
1205 }
1206}
1207
1208
1209wxString EDA_BASE_FRAME::GetFileFromHistory( int cmdId, const wxString& type,
1210 FILE_HISTORY* aFileHistory )
1211{
1212 if( !aFileHistory )
1213 aFileHistory = m_fileHistory;
1214
1215 wxASSERT( aFileHistory );
1216
1217 int baseId = aFileHistory->GetBaseId();
1218
1219 wxASSERT( cmdId >= baseId && cmdId < baseId + (int) aFileHistory->GetCount() );
1220
1221 unsigned i = cmdId - baseId;
1222
1223 if( i < aFileHistory->GetCount() )
1224 {
1225 wxString fn = aFileHistory->GetHistoryFile( i );
1226
1227 if( wxFileName::FileExists( fn ) )
1228 {
1229 return fn;
1230 }
1231 else
1232 {
1233 DisplayErrorMessage( this, wxString::Format( _( "File '%s' was not found." ), fn ) );
1234 aFileHistory->RemoveFileFromHistory( i );
1235 }
1236 }
1237
1238 // Update the menubar to update the file history menu
1239 if( GetMenuBar() )
1240 {
1242 GetMenuBar()->Refresh();
1243 }
1244
1245 return wxEmptyString;
1246}
1247
1248
1250{
1251 wxASSERT( m_fileHistory );
1252
1253 m_fileHistory->ClearFileHistory();
1254
1255 // Update the menubar to update the file history menu
1256 if( GetMenuBar() )
1257 {
1259 GetMenuBar()->Refresh();
1260 }
1261}
1262
1263
1264void EDA_BASE_FRAME::OnKicadAbout( wxCommandEvent& event )
1265{
1266 void ShowAboutDialog( EDA_BASE_FRAME * aParent ); // See AboutDialog_main.cpp
1267 ShowAboutDialog( this );
1268}
1269
1270
1271void EDA_BASE_FRAME::OnPreferences( wxCommandEvent& event )
1272{
1273 ShowPreferences( wxEmptyString, wxEmptyString );
1274}
1275
1276
1277void EDA_BASE_FRAME::ShowPreferences( wxString aStartPage, wxString aStartParentPage )
1278{
1279 PAGED_DIALOG dlg( this, _( "Preferences" ), true, true, wxEmptyString,
1280 wxWindow::FromDIP( wxSize( 980, 560 ), nullptr ) );
1281
1282 dlg.SetEvtHandlerEnabled( false );
1283
1284 {
1285 WX_BUSY_INDICATOR busy_cursor;
1286
1287 WX_TREEBOOK* book = dlg.GetTreebook();
1288 PANEL_HOTKEYS_EDITOR* hotkeysPanel = new PANEL_HOTKEYS_EDITOR( this, book );
1289 std::vector<int> expand;
1290
1291 wxWindow* kicadMgr_window = wxWindow::FindWindowByName( KICAD_MANAGER_FRAME_NAME );
1292
1293 if( KICAD_MANAGER_FRAME* kicadMgr = static_cast<KICAD_MANAGER_FRAME*>( kicadMgr_window ) )
1294 {
1295 ACTION_MANAGER* actionMgr = kicadMgr->GetToolManager()->GetActionManager();
1296
1297 for( const auto& [name, action] : actionMgr->GetActions() )
1298 hotkeysPanel->ActionsList().push_back( action );
1299 }
1300
1301 book->AddLazyPage(
1302 []( wxWindow* aParent ) -> wxWindow*
1303 {
1304 return new PANEL_COMMON_SETTINGS( aParent );
1305 },
1306 _( "Common" ) );
1307
1308 book->AddLazyPage(
1309 []( wxWindow* aParent ) -> wxWindow*
1310 {
1311 return new PANEL_MOUSE_SETTINGS( aParent );
1312 }, _( "Mouse and Touchpad" ) );
1313
1314 book->AddLazyPage(
1315 [] ( wxWindow* aParent ) -> wxWindow*
1316 {
1317 return new PANEL_SPACEMOUSE( aParent );
1318 }, _( "SpaceMouse" ) );
1319
1320 book->AddPage( hotkeysPanel, _( "Hotkeys" ) );
1321
1322 book->AddLazyPage(
1323 []( wxWindow* aParent ) -> wxWindow*
1324 {
1325 return new PANEL_GIT_REPOS( aParent );
1326 }, _( "Version Control" ) );
1327
1328#ifdef KICAD_USE_SENTRY
1329 book->AddLazyPage(
1330 []( wxWindow* aParent ) -> wxWindow*
1331 {
1332 return new PANEL_DATA_COLLECTION( aParent );
1333 }, _( "Data Collection" ) );
1334#endif
1335
1336#define LAZY_CTOR( key ) \
1337 [this, kiface]( wxWindow* aParent ) \
1338 { \
1339 return kiface->CreateKiWindow( aParent, key, &Kiway() ); \
1340 }
1341
1342 // If a dll is not loaded, the loader will show an error message.
1343
1344 try
1345 {
1346 if( KIFACE* kiface = Kiway().KiFACE( KIWAY::FACE_SCH ) )
1347 {
1348 kiface->GetActions( hotkeysPanel->ActionsList() );
1349
1351 expand.push_back( (int) book->GetPageCount() );
1352
1353 book->AddPage( new wxPanel( book ), _( "Symbol Editor" ) );
1354 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_DISP_OPTIONS ), _( "Display Options" ) );
1355 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_GRIDS ), _( "Grids" ) );
1356 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_OPTIONS ), _( "Editing Options" ) );
1357 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_COLORS ), _( "Colors" ) );
1358
1359 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1360 book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_TOOLBARS ), _( "Toolbars" ) );
1361
1362 if( GetFrameType() == FRAME_SCH )
1363 expand.push_back( (int) book->GetPageCount() );
1364
1365 book->AddPage( new wxPanel( book ), _( "Schematic Editor" ) );
1366 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_DISP_OPTIONS ), _( "Display Options" ) );
1367 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_GRIDS ), _( "Grids" ) );
1368 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_EDIT_OPTIONS ), _( "Editing Options" ) );
1369 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_COLORS ), _( "Colors" ) );
1370
1371 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1372 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_TOOLBARS ), _( "Toolbars" ) );
1373
1374 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_FIELD_NAME_TEMPLATES ), _( "Field Name Templates" ) );
1375 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_DATA_SOURCES ), _( "Data Sources" ) );
1376 book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_SIMULATOR ), _( "Simulator" ) );
1377 }
1378 }
1379 catch( ... )
1380 {
1381 }
1382
1383 try
1384 {
1385 if( KIFACE* kiface = Kiway().KiFACE( KIWAY::FACE_PCB ) )
1386 {
1387 kiface->GetActions( hotkeysPanel->ActionsList() );
1388
1390 expand.push_back( (int) book->GetPageCount() );
1391
1392 book->AddPage( new wxPanel( book ), _( "Footprint Editor" ) );
1393 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DISPLAY_OPTIONS ), _( "Display Options" ) );
1394 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_GRIDS ), _( "Grids" ) );
1395 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_ORIGINS_AXES ), _( "Origins & Axes" ) );
1396 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_EDIT_OPTIONS ), _( "Editing Options" ) );
1397 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_COLORS ), _( "Colors" ) );
1398
1399 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1400 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_TOOLBARS ), _( "Toolbars" ) );
1401
1402 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DEFAULT_FIELDS ), _( "Footprint Defaults" ) );
1403 book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DEFAULT_GRAPHICS_VALUES ), _( "Graphics Defaults" ) );
1404
1406 expand.push_back( (int) book->GetPageCount() );
1407
1408 book->AddPage( new wxPanel( book ), _( "PCB Editor" ) );
1409 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_DISPLAY_OPTS ), _( "Display Options" ) );
1410 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_GRIDS ), _( "Grids" ) );
1411 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ORIGINS_AXES ), _( "Origins & Axes" ) );
1412 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_EDIT_OPTIONS ), _( "Editing Options" ) );
1413 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_COLORS ), _( "Colors" ) );
1414
1415 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1416 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_TOOLBARS ), _( "Toolbars" ) );
1417
1418 book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ACTION_PLUGINS ), _( "Plugins" ) );
1419
1421 expand.push_back( (int) book->GetPageCount() );
1422
1423 book->AddPage( new wxPanel( book ), _( "3D Viewer" ) );
1424 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_DISPLAY_OPTIONS ), _( "General" ) );
1425
1426 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1427 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_TOOLBARS ), _( "Toolbars" ) );
1428
1429 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_OPENGL ), _( "Realtime Renderer" ) );
1430 book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_RAYTRACING ), _( "Raytracing Renderer" ) );
1431 }
1432 }
1433 catch( ... )
1434 {
1435 }
1436
1437 try
1438 {
1439 if( KIFACE* kiface = Kiway().KiFACE( KIWAY::FACE_GERBVIEW ) )
1440 {
1441 kiface->GetActions( hotkeysPanel->ActionsList() );
1442
1443 if( GetFrameType() == FRAME_GERBER )
1444 expand.push_back( (int) book->GetPageCount() );
1445
1446 book->AddPage( new wxPanel( book ), _( "Gerber Viewer" ) );
1447 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_DISPLAY_OPTIONS ), _( "Display Options" ) );
1448 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_COLORS ), _( "Colors" ) );
1449
1450 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1451 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_TOOLBARS ), _( "Toolbars" ) );
1452
1453 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_GRIDS ), _( "Grids" ) );
1454 book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_EXCELLON_OPTIONS ), _( "Excellon Options" ) );
1455 }
1456 }
1457 catch( ... )
1458 {
1459 }
1460
1461 try
1462 {
1463 if( KIFACE* kiface = Kiway().KiFACE( KIWAY::FACE_PL_EDITOR ) )
1464 {
1465 kiface->GetActions( hotkeysPanel->ActionsList() );
1466
1467 if( GetFrameType() == FRAME_PL_EDITOR )
1468 expand.push_back( (int) book->GetPageCount() );
1469
1470 book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) );
1471 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_DISPLAY_OPTIONS ), _( "Display Options" ) );
1472 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_GRIDS ), _( "Grids" ) );
1473 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_COLORS ), _( "Colors" ) );
1474
1475 if( ADVANCED_CFG::GetCfg().m_ConfigurableToolbars )
1476 book->AddLazySubPage( LAZY_CTOR( PANEL_DS_TOOLBARS ), _( "Toolbars" ) );
1477
1478 book->AddLazyPage(
1479 []( wxWindow* aParent ) -> wxWindow*
1480 {
1481 return new PANEL_PACKAGES_AND_UPDATES( aParent );
1482 }, _( "Packages and Updates" ) );
1483 }
1484 }
1485 catch( ... )
1486 {
1487 }
1488
1489#ifdef KICAD_IPC_API
1490 book->AddPage( new PANEL_PLUGIN_SETTINGS( book ), _( "Plugins" ) );
1491#endif
1492
1493 book->AddPage( new PANEL_MAINTENANCE( book, this ), _( "Maintenance" ) );
1494
1495 // Update all of the action hotkeys. The process of loading the actions through
1496 // the KiFACE will only get us the default hotkeys
1497 ReadHotKeyConfigIntoActions( wxEmptyString, hotkeysPanel->ActionsList() );
1498
1499 for( size_t i = 0; i < book->GetPageCount(); ++i )
1500 book->GetPage( i )->Layout();
1501
1502 for( int page : expand )
1503 book->ExpandNode( page );
1504
1505 if( !aStartPage.IsEmpty() )
1506 dlg.SetInitialPage( aStartPage, aStartParentPage );
1507
1508 dlg.SetEvtHandlerEnabled( true );
1509#undef LAZY_CTOR
1510 }
1511
1512 if( dlg.ShowModal() == wxID_OK )
1513 {
1514 // Update our grids that are cached in the tool
1515 m_toolManager->ResetTools( TOOL_BASE::REDRAW );
1518 }
1519
1520}
1521
1522
1523void EDA_BASE_FRAME::OnDropFiles( wxDropFilesEvent& aEvent )
1524{
1525 Raise();
1526
1527 wxString* files = aEvent.GetFiles();
1528
1529 for( int nb = 0; nb < aEvent.GetNumberOfFiles(); nb++ )
1530 {
1531 const wxFileName fn = wxFileName( files[nb] );
1532 wxString ext = fn.GetExt();
1533
1534 // Alias all gerber files as GerberFileExtension
1537
1538 if( m_acceptedExts.find( ext.ToStdString() ) != m_acceptedExts.end() )
1539 m_AcceptedFiles.emplace_back( fn );
1540 }
1541
1543 m_AcceptedFiles.clear();
1544}
1545
1546
1548{
1549 for( const wxFileName& file : m_AcceptedFiles )
1550 {
1551 wxString fn = file.GetFullPath();
1552 m_toolManager->RunAction<wxString*>( *m_acceptedExts.at( file.GetExt() ), &fn );
1553 }
1554}
1555
1556
1557bool EDA_BASE_FRAME::IsWritable( const wxFileName& aFileName, bool aVerbose )
1558{
1559 wxString msg;
1560 wxFileName fn = aFileName;
1561
1562 // Check for absence of a file path with a file name. Unfortunately KiCad
1563 // uses paths relative to the current project path without the ./ part which
1564 // confuses wxFileName. Making the file name path absolute may be less than
1565 // elegant but it solves the problem.
1566 if( fn.GetPath().IsEmpty() && fn.HasName() )
1567 fn.MakeAbsolute();
1568
1569 wxCHECK_MSG( fn.IsOk(), false,
1570 wxT( "File name object is invalid. Bad programmer!" ) );
1571 wxCHECK_MSG( !fn.GetPath().IsEmpty(), false,
1572 wxT( "File name object path <" ) + fn.GetFullPath() +
1573 wxT( "> is not set. Bad programmer!" ) );
1574
1575 if( fn.IsDir() && !fn.IsDirWritable() )
1576 {
1577 msg.Printf( _( "Insufficient permissions to folder '%s'." ), fn.GetPath() );
1578 }
1579 else if( !fn.FileExists() && !fn.IsDirWritable() )
1580 {
1581 msg.Printf( _( "Insufficient permissions to save file '%s'." ), fn.GetFullPath() );
1582 }
1583 else if( fn.FileExists() && !fn.IsFileWritable() )
1584 {
1585 msg.Printf( _( "Insufficient permissions to save file '%s'." ), fn.GetFullPath() );
1586 }
1587
1588 if( !msg.IsEmpty() )
1589 {
1590 if( aVerbose )
1591 DisplayErrorMessage( this, msg );
1592
1593 return false;
1594 }
1595
1596 return true;
1597}
1598
1599
1601{
1602 // This function should be overridden in child classes
1603 return false;
1604}
1605
1606
1608{
1609 wxAcceleratorEntry entries[1];
1610 entries[0].Set( wxACCEL_CTRL, int( 'Q' ), wxID_EXIT );
1611 wxAcceleratorTable accel( 1, entries );
1612 SetAcceleratorTable( accel );
1613}
1614
1615
1621
1622
1624{
1625 m_undoList.PushCommand( aNewitem );
1626
1627 // Delete the extra items, if count max reached
1628 if( m_undoRedoCountMax > 0 )
1629 {
1630 int extraitems = GetUndoCommandCount() - m_undoRedoCountMax;
1631
1632 if( extraitems > 0 )
1633 ClearUndoORRedoList( UNDO_LIST, extraitems );
1634 }
1635}
1636
1637
1639{
1640 m_redoList.PushCommand( aNewitem );
1641
1642 // Delete the extra items, if count max reached
1643 if( m_undoRedoCountMax > 0 )
1644 {
1645 int extraitems = GetRedoCommandCount() - m_undoRedoCountMax;
1646
1647 if( extraitems > 0 )
1648 ClearUndoORRedoList( REDO_LIST, extraitems );
1649 }
1650}
1651
1652
1657
1658
1663
1664
1666{
1667 if( GetUndoCommandCount() > 0 )
1668 return m_undoList.m_CommandsList.back()->GetDescription();
1669
1670 return wxEmptyString;
1671}
1672
1673
1675{
1676 if( GetRedoCommandCount() > 0 )
1677 return m_redoList.m_CommandsList.back()->GetDescription();
1678
1679 return wxEmptyString;
1680}
1681
1682
1684{
1685 m_autoSaveRequired = true;
1686}
1687
1688
1690{
1691 SetUserUnits( aUnits );
1693
1694 wxCommandEvent e( EDA_EVT_UNITS_CHANGED );
1695 e.SetInt( static_cast<int>( aUnits ) );
1696 e.SetClientData( this );
1697 ProcessEventLocally( e );
1698}
1699
1700
1701void EDA_BASE_FRAME::OnMaximize( wxMaximizeEvent& aEvent )
1702{
1703 // When we maximize the window, we want to save the old information
1704 // so that we can add it to the settings on next window load.
1705 // Contrary to the documentation, this event seems to be generated
1706 // when the window is also being unmaximized on OSX, so we only
1707 // capture the size information when we maximize the window when on OSX.
1708#ifdef __WXOSX__
1709 if( !IsMaximized() )
1710#endif
1711 {
1713 m_normalFramePos = GetPosition();
1714 wxLogTrace( traceDisplayLocation,
1715 "Maximizing window - Saving position (%d, %d) with size (%d, %d)",
1718 }
1719
1720 // Skip event to actually maximize the window
1721 aEvent.Skip();
1722}
1723
1724
1726{
1727#ifdef __WXGTK__
1728 wxSize winSize = GetSize();
1729
1730 // GTK includes the window decorations in the normal GetSize call,
1731 // so we have to use a GTK-specific sizing call that returns the
1732 // non-decorated window size.
1734 {
1735 int width = 0;
1736 int height = 0;
1737 GTKDoGetSize( &width, &height );
1738
1739 winSize.Set( width, height );
1740 }
1741#else
1742 wxSize winSize = GetSize();
1743#endif
1744
1745 return winSize;
1746}
1747
1748
1750{
1751 // Update the icon theme when the system theme changes and update the toolbars
1753 ThemeChanged();
1754
1755 // This isn't handled by ThemeChanged()
1756 if( GetMenuBar() )
1757 {
1758 // For icons in menus, icon scaling & hotkeys
1760 GetMenuBar()->Refresh();
1761 }
1762}
1763
1764
1765void EDA_BASE_FRAME::onSystemColorChange( wxSysColourChangedEvent& aEvent )
1766{
1767 // Call the handler to update the colors used in the frame
1769
1770 // Skip the change event to ensure the rest of the window controls get it
1771 aEvent.Skip();
1772}
1773
1774
1775void EDA_BASE_FRAME::onIconize( wxIconizeEvent& aEvent )
1776{
1777 // Call the handler
1778 handleIconizeEvent( aEvent );
1779
1780 // Skip the event.
1781 aEvent.Skip();
1782}
1783
1784
1785#ifdef __WXMSW__
1786WXLRESULT EDA_BASE_FRAME::MSWWindowProc( WXUINT message, WXWPARAM wParam, WXLPARAM lParam )
1787{
1788 // This will help avoid the menu keeping focus when the alt key is released
1789 // You can still trigger accelerators as long as you hold down alt
1790 if( message == WM_SYSCOMMAND )
1791 {
1792 if( wParam == SC_KEYMENU && ( lParam >> 16 ) <= 0 )
1793 return 0;
1794 }
1795
1796 return wxFrame::MSWWindowProc( message, wParam, lParam );
1797}
1798#endif
1799
1800
1802{
1803 ACTION_MENU* langsMenu = new ACTION_MENU( false, aControlTool );
1804 langsMenu->SetTitle( _( "Set Language" ) );
1805 langsMenu->SetIcon( BITMAPS::language );
1806
1807 wxString tooltip;
1808
1809 for( unsigned ii = 0; LanguagesList[ii].m_KI_Lang_Identifier != 0; ii++ )
1810 {
1811 wxString label;
1812
1813 if( LanguagesList[ii].m_DoNotTranslate )
1814 label = LanguagesList[ii].m_Lang_Label;
1815 else
1816 label = wxGetTranslation( LanguagesList[ii].m_Lang_Label );
1817
1818 wxMenuItem* item =
1819 new wxMenuItem( langsMenu,
1820 LanguagesList[ii].m_KI_Lang_Identifier, // wxMenuItem wxID
1821 label, tooltip, wxITEM_CHECK );
1822
1823 langsMenu->Append( item );
1824 }
1825
1826 // This must be done after the items are added
1827 aMasterMenu->Add( langsMenu );
1828}
void ShowAboutDialog(EDA_BASE_FRAME *aParent)
int index
const char * name
std::function< void(ACTION_TOOLBAR *)> ACTION_TOOLBAR_CONTROL_FACTORY
Type for the function signature that is used to add custom controls to the toolbar.
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:80
static TOOL_ACTION about
Definition actions.h:287
static TOOL_ACTION reportBug
Definition actions.h:291
static TOOL_ACTION copy
Definition actions.h:78
static TOOL_ACTION donate
Definition actions.h:289
static TOOL_ACTION listHotKeys
Definition actions.h:288
static TOOL_ACTION getInvolved
Definition actions.h:290
static TOOL_ACTION undo
Definition actions.h:75
static TOOL_ACTION redo
Definition actions.h:76
static TOOL_ACTION cut
Definition actions.h:77
static TOOL_ACTION gettingStarted
Definition actions.h:285
static TOOL_ACTION help
Definition actions.h:286
Manage TOOL_ACTION objects.
const std::map< std::string, TOOL_ACTION * > & GetActions() const
Get a list of currently-registered actions mapped by their name.
Define the structure of a menu based on ACTIONs.
Definition action_menu.h:47
void SetTitle(const wxString &aTitle) override
Set title for the menu.
void SetIcon(BITMAPS aIcon)
Assign an icon for the entry.
wxMenuItem * Add(const wxString &aLabel, int aId, BITMAPS aIcon)
Add a wxWidgets-style entry to the menu.
Class to hold basic information about controls that can be added to the toolbars.
const std::string & GetName() const
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.
WINDOW_SETTINGS m_Window
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:68
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
void CommonSettingsChanged(int aFlags) override
Notification event that some of the common (suite-wide) settings have changed.
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 OnToolbarSizeChanged()
Update toolbars if desired toolbar icon changed.
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
bool m_autoSavePermissionError
void OnKicadAbout(wxCommandEvent &event)
virtual void UpdateToolbarControlSizes()
Update the sizes of any controls in the toolbars of the frame.
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.
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)
static constexpr int KICAD_AUI_TB_STYLE
Default style flags used for wxAUI toolbars.
ACTION_TOOLBAR * m_tbRight
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
TOOLBAR_SETTINGS * m_toolbarSettings
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 RegisterCustomToolbarControlFactory(const ACTION_TOOLBAR_CONTROL &aControlDesc, const ACTION_TOOLBAR_CONTROL_FACTORY &aControlFactory)
Register a creation factory for toolbar controls that are present in this frame.
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...
virtual void configureToolbars()
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.
virtual void RecreateToolbars()
std::map< int, UIUpdateHandler > m_uiUpdateMap
Map containing the UI update handlers registered with wx for each action.
std::map< std::string, ACTION_TOOLBAR_CONTROL_FACTORY > m_toolbarControlFactories
ACTION_TOOLBAR_CONTROL_FACTORY * GetCustomToolbarControlFactory(const std::string &aName)
UNDO_REDO_CONTAINER m_redoList
virtual void LoadSettings(APP_SETTINGS_BASE *aCfg)
Load common frame parameters from a configuration file.
FILE_HISTORY * m_fileHistory
ACTION_TOOLBAR * m_tbLeft
SETTINGS_MANAGER * m_settingsManager
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.
wxString GetRunMenuCommandDescription(const TOOL_ACTION &aAction)
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 ClearFileHistory()
Remove all files from the file history.
ACTION_TOOLBAR * m_tbTopAux
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.
ACTION_TOOLBAR * m_tbTopMain
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.
nlohmann::json m_auiLayoutState
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...
void AddFileToHistory(const wxString &aFile) override
Adds a file to the history.
The main KiCad project manager frame.
SEARCH_STACK & KifaceSearch()
Only for DSO specific 'non-library' files.
APP_SETTINGS_BASE * KifaceSettings() const
Definition kiface_base.h:95
const wxString & GetHelpFileName() const
Return just the basename portion of the current help file.
PROJECT & Prj() const
Return a reference to the PROJECT associated with this KIWAY.
KIWAY_HOLDER(KIWAY *aKiway, HOLDER_TYPE aType)
KIWAY & Kiway() const
Return a reference to the KIWAY that this object has an opportunity to participate in.
A minimalistic software bus for communications between various DLLs/DSOs (DSOs) within the same KiCad...
Definition kiway.h:292
@ FACE_SCH
eeschema DSO
Definition kiway.h:299
@ FACE_PL_EDITOR
Definition kiway.h:303
@ FACE_PCB
pcbnew DSO
Definition kiway.h:300
@ FACE_GERBVIEW
Definition kiway.h:302
LOCAL_HISTORY & LocalHistory()
Return the LOCAL_HISTORY associated with this KIWAY.
Definition kiway.h:404
virtual void CommonSettingsChanged(int aFlags=0)
Call CommonSettingsChanged() on all KIWAY_PLAYERs.
Definition kiway.cpp:600
bool Init(const wxString &aProjectPath)
Initialize the local history repository for the given project path.
bool RunRegisteredSaversAndCommit(const wxString &aProjectPath, const wxString &aTitle)
Run all registered savers and, if any staged changes differ from HEAD, create a commit.
WX_TREEBOOK * GetTreebook()
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:137
virtual COMMON_SETTINGS * GetCommonSettings() const
Definition pgm_base.cpp:537
virtual int GetSelectedLanguageIdentifier() const
Definition pgm_base.h:235
virtual SETTINGS_MANAGER & GetSettingsManager() const
Definition pgm_base.h:129
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:205
Look for files in a number of paths.
virtual wxWindow * GetToolCanvas() const =0
Canvas access.
virtual void CommonSettingsChanged(int aFlags=0)
Notification event that some of the common (suite-wide) settings have changed.
TOOL_MANAGER * m_toolManager
virtual void ShowChangedLanguage()
TOOL_DISPATCHER * m_toolDispatcher
virtual SELECTION & GetCurrentSelection()
Get the current selection from the canvas area.
Represent a single user action.
wxString GetMenuLabel() const
Return the translated label for the action.
wxString GetFriendlyName() const
Return the translated user-friendly name of the action.
@ REDRAW
Full drawing refresh.
Definition tool_base.h:83
UNITS_PROVIDER(const EDA_IU_SCALE &aIuScale, EDA_UNITS aUnits)
void SetUserUnits(EDA_UNITS aUnits)
bool Deserialize(const nlohmann::json &aState) const
nlohmann::json Serialize() const
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 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.
MESSAGE_TYPE
Sets the type of message for special handling if needed.
Definition wx_infobar.h:94
bool AddLazyPage(std::function< wxWindow *(wxWindow *aParent)> aLazyCtor, const wxString &text, bool bSelect=false, int imageId=NO_IMAGE)
bool AddLazySubPage(std::function< wxWindow *(wxWindow *aParent)> aLazyCtor, const wxString &text, bool bSelect=false, int imageId=NO_IMAGE)
void DisplayErrorMessage(wxWindow *aParent, const wxString &aText, const wxString &aExtraInfo)
Display an error message with aMessage.
Definition confirm.cpp:202
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 KICAD_MANAGER_FRAME_NAME
#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:48
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:97
@ 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_3DV_TOOLBARS
Definition frame_type.h:107
@ PANEL_SCH_FIELD_NAME_TEMPLATES
Definition frame_type.h:83
@ PANEL_DS_TOOLBARS
Definition frame_type.h:119
@ PANEL_SCH_TOOLBARS
Definition frame_type.h:82
@ PANEL_GBR_DISPLAY_OPTIONS
Definition frame_type.h:109
@ PANEL_3DV_OPENGL
Definition frame_type.h:105
@ PANEL_FP_DEFAULT_GRAPHICS_VALUES
Definition frame_type.h:93
@ PANEL_PCB_TOOLBARS
Definition frame_type.h:100
@ PANEL_PCB_ORIGINS_AXES
Definition frame_type.h:102
@ PANEL_PCB_EDIT_OPTIONS
Definition frame_type.h:98
@ PANEL_SCH_DISP_OPTIONS
Definition frame_type.h:78
@ PANEL_FP_DISPLAY_OPTIONS
Definition frame_type.h:87
@ PANEL_SCH_SIMULATOR
Definition frame_type.h:84
@ FRAME_SCH
Definition frame_type.h:34
@ PANEL_DS_COLORS
Definition frame_type.h:118
@ PANEL_PCB_COLORS
Definition frame_type.h:99
@ PANEL_SYM_TOOLBARS
Definition frame_type.h:76
@ PANEL_3DV_RAYTRACING
Definition frame_type.h:106
@ PANEL_SYM_EDIT_OPTIONS
Definition frame_type.h:74
@ PANEL_FP_GRIDS
Definition frame_type.h:88
@ PANEL_SCH_EDIT_OPTIONS
Definition frame_type.h:80
@ PANEL_FP_ORIGINS_AXES
Definition frame_type.h:94
@ PANEL_SYM_DISP_OPTIONS
Definition frame_type.h:72
@ PANEL_PCB_DISPLAY_OPTS
Definition frame_type.h:96
@ PANEL_FP_COLORS
Definition frame_type.h:90
@ PANEL_FP_DEFAULT_FIELDS
Definition frame_type.h:92
@ PANEL_SYM_COLORS
Definition frame_type.h:75
@ FRAME_PL_EDITOR
Definition frame_type.h:59
@ PANEL_GBR_GRIDS
Definition frame_type.h:112
@ FRAME_FOOTPRINT_EDITOR
Definition frame_type.h:43
@ FRAME_GERBER
Definition frame_type.h:57
@ PANEL_DS_GRIDS
Definition frame_type.h:117
@ FRAME_PCB_DISPLAY3D
Definition frame_type.h:47
@ PANEL_GBR_TOOLBARS
Definition frame_type.h:114
@ PANEL_FP_EDIT_OPTIONS
Definition frame_type.h:89
@ PANEL_SCH_GRIDS
Definition frame_type.h:79
@ PANEL_FP_TOOLBARS
Definition frame_type.h:91
@ PANEL_PCB_ACTION_PLUGINS
Definition frame_type.h:101
@ PANEL_3DV_DISPLAY_OPTIONS
Definition frame_type.h:104
@ PANEL_DS_DISPLAY_OPTIONS
Definition frame_type.h:116
@ PANEL_SCH_COLORS
Definition frame_type.h:81
@ PANEL_GBR_COLORS
Definition frame_type.h:113
@ PANEL_GBR_EXCELLON_OPTIONS
Definition frame_type.h:111
@ KICAD_MAIN_FRAME_T
Definition frame_type.h:68
static const std::string GerberFileExtension
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.
@ ID_FILE_LIST_CLEAR
Definition id.h:62
@ ID_FILE1
Definition id.h:59
@ ID_AUTO_SAVE_TIMER
Definition id.h:54
void RemoveShutdownBlockReason(wxWindow *aWindow)
Removes any shutdown block reason set.
Definition unix/app.cpp:85
PGM_BASE & Pgm()
The global program "get" accessor.
Definition pgm_base.cpp:946
LANGUAGE_DESCR LanguagesList[]
An array containing all the languages that KiCad supports.
Definition pgm_base.cpp:94
see class PGM_BASE
std::vector< FAB_LAYER_COLOR > dummy
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:155
struct WINDOW_STATE window
Store the common settings that are saved and loaded for each window / frame.
WINDOW_STATE state
wxString mru_path
nlohmann::json aui_state
wxString perspective
Store the window positioning/state.
unsigned int display
IFACE KIFACE_BASE kiface("pcb_test_frame", KIWAY::FACE_PCB)
@ RIGHT
Toolbar on the right side of the canvas.
@ LEFT
Toolbar on the left side of the canvas.
@ TOP_AUX
Toolbar on the top of the canvas.
@ TOP_MAIN
Toolbar on the top of the canvas.
#define HOTKEYS_CHANGED
wxString dump(const wxArrayString &aArray)
Debug helper for printing wxArrayString contents.
wxLogTrace helper definitions.