From 7975ad495b7e6e12af3f374c219b00965116172c Mon Sep 17 00:00:00 2001 From: Jeff Young Date: Fri, 19 Jan 2024 17:12:55 +0000 Subject: [PATCH] Push busyCursor out of scope after building dialog. Fixes https://gitlab.com/kicad/code/kicad/-/issues/16653 --- common/eda_base_frame.cpp | 316 ++++++++++++++------------- common/widgets/wx_busy_indicator.cpp | 3 +- 2 files changed, 162 insertions(+), 157 deletions(-) diff --git a/common/eda_base_frame.cpp b/common/eda_base_frame.cpp index a0fe7ad866..3088743d4f 100644 --- a/common/eda_base_frame.cpp +++ b/common/eda_base_frame.cpp @@ -1053,198 +1053,203 @@ void EDA_BASE_FRAME::OnPreferences( wxCommandEvent& event ) void EDA_BASE_FRAME::ShowPreferences( wxString aStartPage, wxString aStartParentPage ) { - WX_BUSY_INDICATOR busy_cursor; - PAGED_DIALOG dlg( this, _( "Preferences" ), true, true, wxEmptyString, wxWindow::FromDIP( wxSize( 980, 560 ), NULL ) ); dlg.SetEvtHandlerEnabled( false ); - WX_TREEBOOK* book = dlg.GetTreebook(); - PANEL_HOTKEYS_EDITOR* hotkeysPanel = new PANEL_HOTKEYS_EDITOR( this, book, false ); - KIFACE* kiface = nullptr; - std::vector expand; - - Kiway().GetActions( hotkeysPanel->ActionsList() ); + { + WX_BUSY_INDICATOR busy_cursor; - book->AddLazyPage( - []( wxWindow* aParent ) -> wxWindow* - { - return new PANEL_COMMON_SETTINGS( aParent ); - }, - _( "Common" ) ); + WX_TREEBOOK* book = dlg.GetTreebook(); + PANEL_HOTKEYS_EDITOR* hotkeysPanel = new PANEL_HOTKEYS_EDITOR( this, book, false ); + KIFACE* kiface = nullptr; + std::vector expand; - book->AddLazyPage( - []( wxWindow* aParent ) -> wxWindow* - { - return new PANEL_MOUSE_SETTINGS( aParent ); - }, _( "Mouse and Touchpad" ) ); + Kiway().GetActions( hotkeysPanel->ActionsList() ); - book->AddPage( hotkeysPanel, _( "Hotkeys" ) ); + book->AddLazyPage( + []( wxWindow* aParent ) -> wxWindow* + { + return new PANEL_COMMON_SETTINGS( aParent ); + }, + _( "Common" ) ); -// This currently allows pre-defined repositories that we -// don't use, so keep it disabled at the moment -if( ADVANCED_CFG::GetCfg().m_EnableGit && false ) - book->AddLazyPage( - []( wxWindow* aParent ) -> wxWindow* - { - return new PANEL_GIT_REPOS( aParent ); - }, _( "Version Control" ) ); + book->AddLazyPage( + []( wxWindow* aParent ) -> wxWindow* + { + return new PANEL_MOUSE_SETTINGS( aParent ); + }, _( "Mouse and Touchpad" ) ); -#ifdef KICAD_USE_SENTRY - book->AddLazyPage( - []( wxWindow* aParent ) -> wxWindow* - { - return new PANEL_DATA_COLLECTION( aParent ); - }, _( "Data Collection" ) ); -#endif + book->AddPage( hotkeysPanel, _( "Hotkeys" ) ); -#define LAZY_CTOR( key ) \ - [=]( wxWindow* aParent ) \ - { \ - return kiface->CreateKiWindow( aParent, key, &Kiway() ); \ + // This currently allows pre-defined repositories that we + // don't use, so keep it disabled at the moment + if( ADVANCED_CFG::GetCfg().m_EnableGit && false ) + { + book->AddLazyPage( + []( wxWindow* aParent ) -> wxWindow* + { + return new PANEL_GIT_REPOS( aParent ); + }, _( "Version Control" ) ); } - // If a dll is not loaded, the loader will show an error message. + #ifdef KICAD_USE_SENTRY + book->AddLazyPage( + []( wxWindow* aParent ) -> wxWindow* + { + return new PANEL_DATA_COLLECTION( aParent ); + }, _( "Data Collection" ) ); + #endif - try - { - kiface = Kiway().KiFACE( KIWAY::FACE_SCH ); + #define LAZY_CTOR( key ) \ + [=]( wxWindow* aParent ) \ + { \ + return kiface->CreateKiWindow( aParent, key, &Kiway() ); \ + } - if( !kiface ) - return; + // If a dll is not loaded, the loader will show an error message. - kiface->GetActions( hotkeysPanel->ActionsList() ); + try + { + kiface = Kiway().KiFACE( KIWAY::FACE_SCH ); - if( GetFrameType() == FRAME_SCH_SYMBOL_EDITOR ) - expand.push_back( (int) book->GetPageCount() ); + if( !kiface ) + return; - book->AddPage( new wxPanel( book ), _( "Symbol Editor" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_DISP_OPTIONS ), _( "Display Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_GRIDS ), _( "Grids" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_OPTIONS ), _( "Editing Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_COLORS ), _( "Colors" ) ); + kiface->GetActions( hotkeysPanel->ActionsList() ); - if( GetFrameType() == FRAME_SCH ) - expand.push_back( (int) book->GetPageCount() ); + if( GetFrameType() == FRAME_SCH_SYMBOL_EDITOR ) + expand.push_back( (int) book->GetPageCount() ); - book->AddPage( new wxPanel( book ), _( "Schematic Editor" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_DISP_OPTIONS ), _( "Display Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_GRIDS ), _( "Grids" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_EDIT_OPTIONS ), _( "Editing Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_ANNO_OPTIONS ), _( "Annotation Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_COLORS ), _( "Colors" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_FIELD_NAME_TEMPLATES ), _( "Field Name Templates" ) ); - } - catch( ... ) - { - } + book->AddPage( new wxPanel( book ), _( "Symbol Editor" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_DISP_OPTIONS ), _( "Display Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_GRIDS ), _( "Grids" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_EDIT_OPTIONS ), _( "Editing Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SYM_COLORS ), _( "Colors" ) ); - try - { - kiface = Kiway().KiFACE( KIWAY::FACE_PCB ); - - if( !kiface ) - return; - - kiface->GetActions( hotkeysPanel->ActionsList() ); - - if( GetFrameType() == FRAME_FOOTPRINT_EDITOR ) - expand.push_back( (int) book->GetPageCount() ); - - book->AddPage( new wxPanel( book ), _( "Footprint Editor" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DISPLAY_OPTIONS ), _( "Display Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_FP_GRIDS ), _( "Grids" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_FP_ORIGINS_AXES ), _( "Origins & Axes" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_FP_EDIT_OPTIONS ), _( "Editing Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_FP_COLORS ), _( "Colors" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DEFAULT_VALUES ), _( "Default Values" ) ); - - if( GetFrameType() == FRAME_PCB_EDITOR ) - expand.push_back( (int) book->GetPageCount() ); - - book->AddPage( new wxPanel( book ), _( "PCB Editor" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_DISPLAY_OPTS ), _( "Display Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_GRIDS ), _( "Grids" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ORIGINS_AXES ), _( "Origins & Axes" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_EDIT_OPTIONS ), _( "Editing Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_COLORS ), _( "Colors" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ACTION_PLUGINS ), _( "Action Plugins" ) ); - - if( GetFrameType() == FRAME_PCB_DISPLAY3D ) - expand.push_back( (int) book->GetPageCount() ); - - book->AddPage( new wxPanel( book ), _( "3D Viewer" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_DISPLAY_OPTIONS ), _( "General" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_OPENGL ), _( "Realtime Renderer" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_RAYTRACING ), _( "Raytracing Renderer" ) ); - } - catch( ... ) - { - } + if( GetFrameType() == FRAME_SCH ) + expand.push_back( (int) book->GetPageCount() ); - try - { - kiface = Kiway().KiFACE( KIWAY::FACE_GERBVIEW ); + book->AddPage( new wxPanel( book ), _( "Schematic Editor" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_DISP_OPTIONS ), _( "Display Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_GRIDS ), _( "Grids" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_EDIT_OPTIONS ), _( "Editing Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_ANNO_OPTIONS ), _( "Annotation Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_COLORS ), _( "Colors" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_SCH_FIELD_NAME_TEMPLATES ), _( "Field Name Templates" ) ); + } + catch( ... ) + { + } - if( !kiface ) - return; + try + { + kiface = Kiway().KiFACE( KIWAY::FACE_PCB ); + + if( !kiface ) + return; + + kiface->GetActions( hotkeysPanel->ActionsList() ); + + if( GetFrameType() == FRAME_FOOTPRINT_EDITOR ) + expand.push_back( (int) book->GetPageCount() ); + + book->AddPage( new wxPanel( book ), _( "Footprint Editor" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DISPLAY_OPTIONS ), _( "Display Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_FP_GRIDS ), _( "Grids" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_FP_ORIGINS_AXES ), _( "Origins & Axes" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_FP_EDIT_OPTIONS ), _( "Editing Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_FP_COLORS ), _( "Colors" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_FP_DEFAULT_VALUES ), _( "Default Values" ) ); + + if( GetFrameType() == FRAME_PCB_EDITOR ) + expand.push_back( (int) book->GetPageCount() ); + + book->AddPage( new wxPanel( book ), _( "PCB Editor" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_DISPLAY_OPTS ), _( "Display Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_GRIDS ), _( "Grids" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ORIGINS_AXES ), _( "Origins & Axes" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_EDIT_OPTIONS ), _( "Editing Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_COLORS ), _( "Colors" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_PCB_ACTION_PLUGINS ), _( "Action Plugins" ) ); + + if( GetFrameType() == FRAME_PCB_DISPLAY3D ) + expand.push_back( (int) book->GetPageCount() ); + + book->AddPage( new wxPanel( book ), _( "3D Viewer" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_DISPLAY_OPTIONS ), _( "General" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_OPENGL ), _( "Realtime Renderer" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_3DV_RAYTRACING ), _( "Raytracing Renderer" ) ); + } + catch( ... ) + { + } - kiface->GetActions( hotkeysPanel->ActionsList() ); + try + { + kiface = Kiway().KiFACE( KIWAY::FACE_GERBVIEW ); - if( GetFrameType() == FRAME_GERBER ) - expand.push_back( (int) book->GetPageCount() ); + if( !kiface ) + return; - book->AddPage( new wxPanel( book ), _( "Gerber Viewer" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_DISPLAY_OPTIONS ), _( "Display Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_COLORS ), _( "Colors" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_EXCELLON_OPTIONS ), _( "Excellon Options" ) ); - } - catch( ... ) - { - } + kiface->GetActions( hotkeysPanel->ActionsList() ); - try - { - kiface = Kiway().KiFACE( KIWAY::FACE_PL_EDITOR ); + if( GetFrameType() == FRAME_GERBER ) + expand.push_back( (int) book->GetPageCount() ); - if( !kiface ) - return; + book->AddPage( new wxPanel( book ), _( "Gerber Viewer" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_DISPLAY_OPTIONS ), _( "Display Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_COLORS ), _( "Colors" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_GBR_EXCELLON_OPTIONS ), _( "Excellon Options" ) ); + } + catch( ... ) + { + } - kiface->GetActions( hotkeysPanel->ActionsList() ); + try + { + kiface = Kiway().KiFACE( KIWAY::FACE_PL_EDITOR ); - if( GetFrameType() == FRAME_PL_EDITOR ) - expand.push_back( (int) book->GetPageCount() ); + if( !kiface ) + return; - book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_DS_DISPLAY_OPTIONS ), _( "Display Options" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_DS_GRIDS ), _( "Grids" ) ); - book->AddLazySubPage( LAZY_CTOR( PANEL_DS_COLORS ), _( "Colors" ) ); + kiface->GetActions( hotkeysPanel->ActionsList() ); - book->AddLazyPage( - []( wxWindow* aParent ) -> wxWindow* - { - return new PANEL_PACKAGES_AND_UPDATES( aParent ); - }, _( "Packages and Updates" ) ); - } - catch( ... ) - { - } + if( GetFrameType() == FRAME_PL_EDITOR ) + expand.push_back( (int) book->GetPageCount() ); - // Update all of the action hotkeys. The process of loading the actions through - // the KiFACE will only get us the default hotkeys - ReadHotKeyConfigIntoActions( wxEmptyString, hotkeysPanel->ActionsList() ); + book->AddPage( new wxPanel( book ), _( "Drawing Sheet Editor" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_DS_DISPLAY_OPTIONS ), _( "Display Options" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_DS_GRIDS ), _( "Grids" ) ); + book->AddLazySubPage( LAZY_CTOR( PANEL_DS_COLORS ), _( "Colors" ) ); - for( size_t i = 0; i < book->GetPageCount(); ++i ) - book->GetPage( i )->Layout(); + book->AddLazyPage( + []( wxWindow* aParent ) -> wxWindow* + { + return new PANEL_PACKAGES_AND_UPDATES( aParent ); + }, _( "Packages and Updates" ) ); + } + catch( ... ) + { + } - for( int page : expand ) - book->ExpandNode( page ); + // Update all of the action hotkeys. The process of loading the actions through + // the KiFACE will only get us the default hotkeys + ReadHotKeyConfigIntoActions( wxEmptyString, hotkeysPanel->ActionsList() ); - if( !aStartPage.IsEmpty() ) - dlg.SetInitialPage( aStartPage, aStartParentPage ); + for( size_t i = 0; i < book->GetPageCount(); ++i ) + book->GetPage( i )->Layout(); - dlg.SetEvtHandlerEnabled( true ); + for( int page : expand ) + book->ExpandNode( page ); + + if( !aStartPage.IsEmpty() ) + dlg.SetInitialPage( aStartPage, aStartParentPage ); + + dlg.SetEvtHandlerEnabled( true ); +#undef LAZY_CTOR + } if( dlg.ShowModal() == wxID_OK ) { @@ -1254,7 +1259,6 @@ if( ADVANCED_CFG::GetCfg().m_EnableGit && false ) dlg.Kiway().CommonSettingsChanged( false, false ); } -#undef LAZY_CTOR } diff --git a/common/widgets/wx_busy_indicator.cpp b/common/widgets/wx_busy_indicator.cpp index fab5656828..174ba52ec9 100644 --- a/common/widgets/wx_busy_indicator.cpp +++ b/common/widgets/wx_busy_indicator.cpp @@ -26,6 +26,7 @@ #include -WX_BUSY_INDICATOR::WX_BUSY_INDICATOR() : m_cursor( std::make_unique() ) +WX_BUSY_INDICATOR::WX_BUSY_INDICATOR() : + m_cursor( std::make_unique() ) { }