More protection for stale wxDataView items.

This commit is contained in:
Jeff Young 2025-07-08 10:23:00 +01:00
parent f589ed906f
commit f0972a8667
4 changed files with 14 additions and 2 deletions

View File

@ -402,7 +402,7 @@ unsigned int RC_TREE_MODEL::GetChildren( wxDataViewItem const& aItem,
void RC_TREE_MODEL::GetValue( wxVariant& aVariant, wxDataViewItem const& aItem,
unsigned int aCol ) const
{
if( !aItem.IsOk() )
if( !aItem.IsOk() || m_view->IsFrozen() )
return;
const RC_TREE_NODE* node = ToNode( aItem );
@ -477,7 +477,7 @@ bool RC_TREE_MODEL::GetAttr( wxDataViewItem const& aItem,
unsigned int aCol,
wxDataViewItemAttr& aAttr ) const
{
if( !aItem.IsOk() )
if( !aItem.IsOk() || m_view->IsFrozen() )
return false;
const RC_TREE_NODE* node = ToNode( aItem );
@ -738,6 +738,8 @@ void RC_TREE_MODEL::NextMarker()
void RC_TREE_MODEL::SelectMarker( const MARKER_BASE* aMarker )
{
wxCHECK( !m_view->IsFrozen(), /* void */ );
for( RC_TREE_NODE* candidate : m_tree )
{
if( candidate->m_RcItem->GetParent() == aMarker )
@ -751,6 +753,8 @@ void RC_TREE_MODEL::SelectMarker( const MARKER_BASE* aMarker )
void RC_TREE_MODEL::CenterMarker( const MARKER_BASE* aMarker )
{
wxCHECK( !m_view->IsFrozen(), /* void */ );
for( RC_TREE_NODE* candidate : m_tree )
{
if( candidate->m_RcItem->GetParent() == aMarker )

View File

@ -934,6 +934,9 @@ void DIALOG_ERC::SelectMarker( const SCH_MARKER* aMarker )
void DIALOG_ERC::centerMarkerIdleHandler( wxIdleEvent& aEvent )
{
if( m_markerTreeModel->GetView()->IsFrozen() )
return;
m_markerTreeModel->CenterMarker( m_centerMarkerOnIdle );
m_centerMarkerOnIdle = nullptr;
Unbind( wxEVT_IDLE, &DIALOG_ERC::centerMarkerIdleHandler, this );

View File

@ -240,6 +240,8 @@ public:
return static_cast<RC_TREE_NODE*>( aItem.GetID() );
}
const wxDataViewCtrl* GetView() const { return m_view; }
static KIID ToUUID( wxDataViewItem aItem );
RC_TREE_MODEL( EDA_DRAW_FRAME* aParentFrame, wxDataViewCtrl* aView );

View File

@ -216,6 +216,9 @@ void DIALOG_FOOTPRINT_CHECKER::SelectMarker( const PCB_MARKER* aMarker )
void DIALOG_FOOTPRINT_CHECKER::centerMarkerIdleHandler( wxIdleEvent& aEvent )
{
if( m_markersTreeModel->GetView()->IsFrozen() )
return;
m_markersTreeModel->CenterMarker( m_centerMarkerOnIdle );
m_centerMarkerOnIdle = nullptr;
Unbind( wxEVT_IDLE, &DIALOG_FOOTPRINT_CHECKER::centerMarkerIdleHandler, this );