From 91c818f82929ee2164ac5cfc77eaecddcea937a0 Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Sat, 20 Dec 2008 15:47:05 +0000 Subject: [PATCH] Fixed various inconsistencies with deleting properties, added wxPGProperty::DeleteChildren() git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@57442 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- include/wx/propgrid/property.h | 11 +++++-- interface/wx/propgrid/property.h | 5 +++ src/propgrid/property.cpp | 11 +++++++ src/propgrid/propgridpagestate.cpp | 50 ++++++++++-------------------- 4 files changed, 41 insertions(+), 36 deletions(-) diff --git a/include/wx/propgrid/property.h b/include/wx/propgrid/property.h index 7c329b7d1c..38019dfe9b 100644 --- a/include/wx/propgrid/property.h +++ b/include/wx/propgrid/property.h @@ -1443,6 +1443,11 @@ public: return false; } + /** + Deletes children of the property. + */ + void DeleteChildren(); + /** Removes entry from property's wxPGChoices and editor control (if it is active). @@ -2073,9 +2078,6 @@ public: /** Returns index of given child property. */ int Index( const wxPGProperty* p ) const; - /** Deletes all sub-properties. */ - void Empty(); - // Puts correct indexes to children void FixIndicesOfChildren( unsigned int starthere = 0 ); @@ -2205,6 +2207,9 @@ protected: void DoSetName(const wxString& str) { m_name = str; } + /** Deletes all sub-properties. */ + void Empty(); + void InitAfterAdded( wxPropertyGridPageState* pageState, wxPropertyGrid* propgrid ); diff --git a/interface/wx/propgrid/property.h b/interface/wx/propgrid/property.h index 9369d8cb96..5cd1d564a1 100644 --- a/interface/wx/propgrid/property.h +++ b/interface/wx/propgrid/property.h @@ -907,6 +907,11 @@ public: */ bool AreChildrenComponents() const; + /** + Deletes children of the property. + */ + void DeleteChildren(); + /** Removes entry from property's wxPGChoices and editor control (if it is active). diff --git a/src/propgrid/property.cpp b/src/propgrid/property.cpp index 53a26de39f..addc80c0c2 100644 --- a/src/propgrid/property.cpp +++ b/src/propgrid/property.cpp @@ -2276,6 +2276,17 @@ void wxPGProperty::Empty() m_children.clear(); } +void wxPGProperty::DeleteChildren() +{ + wxPropertyGridPageState* state = m_parentState; + + while ( GetChildCount() ) + { + wxPGProperty* child = Item(GetChildCount()-1); + state->DoDelete(child, true); + } +} + void wxPGProperty::ChildChanged( wxVariant& WXUNUSED(thisValue), int WXUNUSED(childIndex), wxVariant& WXUNUSED(childValue) ) const diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index 705baa516a..6e4e78d65e 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -245,17 +245,17 @@ void wxPropertyGridPageState::InitNonCatMode() if ( m_properties->GetChildCount() ) { - // Copy items. - wxPropertyGridIterator it( this, wxPG_ITERATE_DEFAULT|wxPG_ITERATE_CATEGORIES ); + // + // Prepare m_abcArray + wxPropertyGridIterator it( this, wxPG_ITERATE_PROPERTIES ); for ( ; !it.AtEnd(); it.Next() ) { wxPGProperty* p = it.GetProperty(); wxPGProperty* parent = p->GetParent(); - if ( p->HasFlag(wxPG_PROP_MISC_PARENT) && - ( parent == m_properties || (parent->IsCategory() || parent->IsRoot()) ) ) + if ( parent->IsCategory() || parent->IsRoot() ) { - m_abcArray->AddChild2( p ); + m_abcArray->AddChild2(p); p->m_parent = &m_regularArray; } } @@ -1698,57 +1698,41 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) wxCHECK_RET( item != &m_regularArray && item != m_abcArray, wxT("wxPropertyGrid: Do not attempt to remove the root item.") ); - size_t i; unsigned int indinparent = item->GetIndexInParent(); wxPGProperty* pwc = (wxPGProperty*)item; + wxPGProperty* parent = item->GetParent(); - wxCHECK_RET( !item->GetParent()->HasFlag(wxPG_PROP_AGGREGATE), + wxCHECK_RET( !parent->HasFlag(wxPG_PROP_AGGREGATE), wxT("wxPropertyGrid: Do not attempt to remove sub-properties.") ); - if ( item->IsCategory() ) + // Delete children + if ( item->GetChildCount() && !item->HasFlag(wxPG_PROP_AGGREGATE) ) { // deleting a category - - // erase category entries from the hash table - for ( i=0; iGetChildCount(); i++ ) + if ( item->IsCategory() ) { - wxPGProperty* sp = pwc->Item( i ); - if ( sp->GetBaseName().Len() ) m_dictName.erase(sp->GetBaseName()); + if ( pwc == m_currentCategory ) + m_currentCategory = (wxPropertyCategory*) NULL; } - if ( pwc == m_currentCategory ) - m_currentCategory = (wxPropertyCategory*) NULL; - - if ( m_abcArray ) - { - // Remove children from non-categorized array. - for ( i=0; iGetChildCount(); i++ ) - { - wxPGProperty * p = pwc->Item( i ); - wxASSERT( p != NULL ); - if ( !p->IsCategory() ) - m_abcArray->RemoveChild(p); - } - - if ( IsInNonCatMode() ) - m_abcArray->FixIndicesOfChildren(); - } + item->DeleteChildren(); } if ( !IsInNonCatMode() ) { // categorized mode - non-categorized array - // Remove from non-cat array, but only if parent is in it - if ( !item->IsCategory() && item->GetParent()->IsCategory() ) + // Remove from non-cat array + if ( !item->IsCategory() && + (parent->IsCategory() || parent->IsRoot()) ) { if ( m_abcArray ) m_abcArray->RemoveChild(item); } // categorized mode - categorized array - wxArrayPGProperty& parentsChildren = item->m_parent->m_children; + wxArrayPGProperty& parentsChildren = parent->m_children; parentsChildren.erase( parentsChildren.begin() + indinparent ); item->m_parent->FixIndicesOfChildren(); } -- 2.45.2