Don't short-cicuit Remove() or RemoveAll().

Also, make sure PCB_GRID_HELPER installs itself
as a board listener.  (Otherwise its
OnBoardItemRemoved() handler will never get
called.)

(cherry picked from commit 88e87bab3e)
This commit is contained in:
Jeff Young
2025-12-09 18:00:37 +00:00
parent 6296360047
commit 3071bbd201
8 changed files with 44 additions and 15 deletions
@@ -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 );
@@ -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;
+5
View File
@@ -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
+12 -12
View File
@@ -1683,25 +1683,25 @@ void BOARD::DeleteMARKERs( bool aWarningsAndErrors, bool aExclusions )
void BOARD::DeleteAllFootprints()
{
for( FOOTPRINT* footprint : m_footprints )
{
delete footprint;
}
std::vector<FOOTPRINT*> 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<FOOTPRINT*> 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 );
}
+3 -3
View File
@@ -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<BOARD_ITEM*>& aBoardItem ) { }
virtual void OnBoardItemsAdded( BOARD& aBoard, std::vector<BOARD_ITEM*>& aBoardItems ) { }
virtual void OnBoardItemRemoved( BOARD& aBoard, BOARD_ITEM* aBoardItem ) { }
virtual void OnBoardItemsRemoved( BOARD& aBoard, std::vector<BOARD_ITEM*>& aBoardItem ) { }
virtual void OnBoardItemsRemoved( BOARD& aBoard, std::vector<BOARD_ITEM*>& aBoardItems ) { }
virtual void OnBoardNetSettingsChanged( BOARD& aBoard ) { }
virtual void OnBoardItemChanged( BOARD& aBoard, BOARD_ITEM* aBoardItem ) { }
virtual void OnBoardItemsChanged( BOARD& aBoard, std::vector<BOARD_ITEM*>& aBoardItem ) { }
virtual void OnBoardItemsChanged( BOARD& aBoard, std::vector<BOARD_ITEM*>& aBoardItems ) { }
virtual void OnBoardHighlightNetChanged( BOARD& aBoard ) { }
virtual void OnBoardRatsnestChanged( BOARD& aBoard ) { }
virtual void OnBoardCompositeUpdate( BOARD& aBoard, std::vector<BOARD_ITEM*>& aAddedItems,
+4
View File
@@ -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();
+6
View File
@@ -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<BOARD*>( 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<BOARD*>( m_toolMgr->GetModel() )->RemoveListener( this );
}
+6
View File
@@ -94,6 +94,12 @@ public:
}
}
virtual void OnBoardItemsRemoved( BOARD& aBoard, std::vector<BOARD_ITEM*>& 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