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:
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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,
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 );
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user