From c225708fd49b38d834e3d00ffb96c2936c7f6297 Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Fri, 20 Aug 2010 20:51:17 +0000 Subject: [PATCH] Properly implement Cleared() by calling row_deleted on every child of root, fixes #12327: wxDataViewListCtrl Crash git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@65370 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/gtk/dataview.cpp | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/gtk/dataview.cpp b/src/gtk/dataview.cpp index e3ae840c43..a11f615b6a 100644 --- a/src/gtk/dataview.cpp +++ b/src/gtk/dataview.cpp @@ -1619,6 +1619,20 @@ bool wxGtkDataViewModelNotifier::ValueChanged( const wxDataViewItem &item, unsig bool wxGtkDataViewModelNotifier::Cleared() { + // There is no call to tell the model that everything + // has been deleted so call row_deleted() for every + // child of root... + + int count = m_owner->GtkGetInternal()->iter_n_children( NULL ); // number of children of root + + GtkTreePath *path = gtk_tree_path_new_first(); // points to root + + int i; + for (i = 0; i < count; i++) + gtk_tree_model_row_deleted( GTK_TREE_MODEL(m_wxgtk_model), path ); + + gtk_tree_path_free( path ); + m_owner->GtkGetInternal()->Cleared(); return true; @@ -3370,6 +3384,7 @@ void wxDataViewCtrlInternal::BuildBranch( wxGtkTreeModelNode *node ) { wxDataViewItemArray children; unsigned int count = m_wx_model->GetChildren( node->GetItem(), children ); + unsigned int pos; for (pos = 0; pos < count; pos++) { @@ -3534,16 +3549,14 @@ wxDataViewCtrlInternal::row_drop_possible(GtkTreeDragDest *WXUNUSED(drag_dest), bool wxDataViewCtrlInternal::Cleared() { - GtkWidget* tree_widget = GetOwner()->GtkGetTreeView(); - gtk_tree_view_set_model( GTK_TREE_VIEW(tree_widget), NULL ); - gtk_tree_view_set_model( GTK_TREE_VIEW(tree_widget), GTK_TREE_MODEL(m_gtk_model) ); - if (m_root) { delete m_root; - InitTree(); + m_root = NULL; } - + + InitTree(); + return true; } @@ -3707,7 +3720,7 @@ GtkTreePath *wxDataViewCtrlInternal::get_path( GtkTreeIter *iter ) while (node) { int pos = node->GetChildren().Index( id ); - + gtk_tree_path_prepend_index( retval, pos ); id = node->GetItem().GetID(); -- 2.47.2