diff --git a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp index a3ebccbb9f..acee2d70d2 100644 --- a/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp +++ b/3d-viewer/3d_viewer/eda_3d_viewer_frame.cpp @@ -202,6 +202,10 @@ EDA_3D_VIEWER_FRAME::EDA_3D_VIEWER_FRAME( KIWAY* aKiway, PCB_BASE_FRAME* aParent EDA_3D_VIEWER_FRAME::~EDA_3D_VIEWER_FRAME() { + // Shutdown all running tools + if( m_toolManager ) + m_toolManager->ShutdownAllTools(); + Prj().GetProjectFile().m_Viewports3D = m_appearancePanel->GetUserViewports(); m_canvas->SetEventDispatcher( nullptr ); diff --git a/3d-viewer/dialogs/panel_preview_3d_model.cpp b/3d-viewer/dialogs/panel_preview_3d_model.cpp index d6ec1eb408..fb99b6d88c 100644 --- a/3d-viewer/dialogs/panel_preview_3d_model.cpp +++ b/3d-viewer/dialogs/panel_preview_3d_model.cpp @@ -185,6 +185,10 @@ PANEL_PREVIEW_3D_MODEL::PANEL_PREVIEW_3D_MODEL( wxWindow* aParent, PCB_BASE_FRAM PANEL_PREVIEW_3D_MODEL::~PANEL_PREVIEW_3D_MODEL() { + // Shutdown all running tools + if( m_toolManager ) + m_toolManager->ShutdownAllTools(); + // Restore the 3D viewer Render settings, that can be modified by the panel tools if( m_boardAdapter.m_Cfg ) m_boardAdapter.m_Cfg->m_Render = m_initialRender; diff --git a/bitmap2component/bitmap2cmp_frame.cpp b/bitmap2component/bitmap2cmp_frame.cpp index 9ca5b6279b..2b8dd54889 100644 --- a/bitmap2component/bitmap2cmp_frame.cpp +++ b/bitmap2component/bitmap2cmp_frame.cpp @@ -205,7 +205,12 @@ BITMAP2CMP_FRAME::BITMAP2CMP_FRAME( KIWAY* aKiway, wxWindow* aParent ) : BITMAP2CMP_FRAME::~BITMAP2CMP_FRAME() { + // Shutdown all running tools + if( m_toolManager ) + m_toolManager->ShutdownAllTools(); + SaveSettings( config() ); + /* * This needed for OSX: avoids further OnDraw processing after this * destructor and before the native window is destroyed diff --git a/pcbnew/board.cpp b/pcbnew/board.cpp index ab96a4d864..8886a892f9 100644 --- a/pcbnew/board.cpp +++ b/pcbnew/board.cpp @@ -1683,25 +1683,25 @@ void BOARD::DeleteMARKERs( bool aWarningsAndErrors, bool aExclusions ) void BOARD::DeleteAllFootprints() { - for( FOOTPRINT* footprint : m_footprints ) - { - delete footprint; - } + std::vector footprints; + std::copy( m_footprints.begin(), m_footprints.end(), std::back_inserter( footprints ) ); - m_footprints.clear(); - IncrementTimeStamp(); + RemoveAll( { PCB_FOOTPRINT_T } ); + + for( FOOTPRINT* footprint : footprints ) + delete footprint; } void BOARD::DetachAllFootprints() { - for( FOOTPRINT* footprint : m_footprints ) - { - footprint->SetParent( nullptr ); - } + std::vector footprints; + std::copy( m_footprints.begin(), m_footprints.end(), std::back_inserter( footprints ) ); - m_footprints.clear(); - IncrementTimeStamp(); + RemoveAll( { PCB_FOOTPRINT_T } ); + + for( FOOTPRINT* footprint : footprints ) + footprint->SetParent( nullptr ); } diff --git a/pcbnew/board.h b/pcbnew/board.h index e3af2c8df9..9db8843ed3 100644 --- a/pcbnew/board.h +++ b/pcbnew/board.h @@ -266,12 +266,12 @@ class BOARD_LISTENER public: virtual ~BOARD_LISTENER() { } virtual void OnBoardItemAdded( BOARD& aBoard, BOARD_ITEM* aBoardItem ) { } - virtual void OnBoardItemsAdded( BOARD& aBoard, std::vector& aBoardItem ) { } + virtual void OnBoardItemsAdded( BOARD& aBoard, std::vector& aBoardItems ) { } virtual void OnBoardItemRemoved( BOARD& aBoard, BOARD_ITEM* aBoardItem ) { } - virtual void OnBoardItemsRemoved( BOARD& aBoard, std::vector& aBoardItem ) { } + virtual void OnBoardItemsRemoved( BOARD& aBoard, std::vector& aBoardItems ) { } virtual void OnBoardNetSettingsChanged( BOARD& aBoard ) { } virtual void OnBoardItemChanged( BOARD& aBoard, BOARD_ITEM* aBoardItem ) { } - virtual void OnBoardItemsChanged( BOARD& aBoard, std::vector& aBoardItem ) { } + virtual void OnBoardItemsChanged( BOARD& aBoard, std::vector& aBoardItems ) { } virtual void OnBoardHighlightNetChanged( BOARD& aBoard ) { } virtual void OnBoardRatsnestChanged( BOARD& aBoard ) { } virtual void OnBoardCompositeUpdate( BOARD& aBoard, std::vector& aAddedItems, diff --git a/pcbnew/footprint_chooser_frame.cpp b/pcbnew/footprint_chooser_frame.cpp index 92dc79cb5a..54aaf377bb 100644 --- a/pcbnew/footprint_chooser_frame.cpp +++ b/pcbnew/footprint_chooser_frame.cpp @@ -234,6 +234,10 @@ FOOTPRINT_CHOOSER_FRAME::FOOTPRINT_CHOOSER_FRAME( KIWAY* aKiway, wxWindow* aPare FOOTPRINT_CHOOSER_FRAME::~FOOTPRINT_CHOOSER_FRAME() { + // Shutdown all running tools + if( m_toolManager ) + m_toolManager->ShutdownAllTools(); + // Work around assertion firing when we try to LockCtx on a hidden 3D canvas during dtor wxCloseEvent dummy; m_preview3DCanvas->Show(); diff --git a/pcbnew/tools/pcb_grid_helper.cpp b/pcbnew/tools/pcb_grid_helper.cpp index 9b418189e7..baf60687ef 100644 --- a/pcbnew/tools/pcb_grid_helper.cpp +++ b/pcbnew/tools/pcb_grid_helper.cpp @@ -174,6 +174,9 @@ PCB_GRID_HELPER::PCB_GRID_HELPER( TOOL_MANAGER* aToolMgr, MAGNETIC_SETTINGS* aMa m_viewSnapPoint.SetDrawAtZero( true ); view->Add( &m_viewSnapPoint ); view->SetVisible( &m_viewSnapPoint, false ); + + if( m_toolMgr->GetModel() ) + static_cast( aToolMgr->GetModel() )->AddListener( this ); } @@ -186,6 +189,9 @@ PCB_GRID_HELPER::~PCB_GRID_HELPER() view->Remove( &m_viewAxis ); view->Remove( &m_viewSnapPoint ); + + if( m_toolMgr->GetModel() ) + static_cast( m_toolMgr->GetModel() )->RemoveListener( this ); } diff --git a/pcbnew/tools/pcb_grid_helper.h b/pcbnew/tools/pcb_grid_helper.h index 437caffb07..5e49384c18 100644 --- a/pcbnew/tools/pcb_grid_helper.h +++ b/pcbnew/tools/pcb_grid_helper.h @@ -94,6 +94,12 @@ public: } } + virtual void OnBoardItemsRemoved( BOARD& aBoard, std::vector& aBoardItems ) override + { + // This is a bulk-remove. Simply clearing the snap item will be the most performant. + m_snapItem = std::nullopt; + } + /** * Chooses the "best" snap anchor around the given point, optionally taking layers from * the reference item. The reference item will not be snapped to (it is being dragged or