Browse Source

More protection for stale wxDataView items.

pull/18/head
Jeff Young 3 months ago
parent
commit
f0972a8667
  1. 8
      common/rc_item.cpp
  2. 3
      eeschema/dialogs/dialog_erc.cpp
  3. 2
      include/rc_item.h
  4. 3
      pcbnew/dialogs/dialog_footprint_checker.cpp

8
common/rc_item.cpp

@ -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 )

3
eeschema/dialogs/dialog_erc.cpp

@ -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 );

2
include/rc_item.h

@ -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 );

3
pcbnew/dialogs/dialog_footprint_checker.cpp

@ -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 );

Loading…
Cancel
Save