summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2005-11-29 19:32:40 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2005-11-29 19:32:40 +0000
commitafd5ed8095f509ce977677f6d5a4ae89fa7ee2b0 (patch)
tree6acce3f7325b8b12c0e74ffb506a9976016f02e0
parent13ed5fef8d451422b2ed314b453457f084cc44d5 (diff)
downloadgdk-pixbuf-afd5ed8095f509ce977677f6d5a4ae89fa7ee2b0.tar.gz
Properly handle model changes in GtkTreeSelection: (#322569, Milosz
2005-11-29 Matthias Clasen <mclasen@redhat.com> Properly handle model changes in GtkTreeSelection: (#322569, Milosz Derezynski) * gtk/gtktreeselection.c (gtk_tree_selection_selected_foreach): Get a reference to the model, and stop the iteration if the model of the treeview is changed on the way. * gtk/gtktreeprivate.h: * gtk/gtktreeselection.c (_gtk_tree_selection_emit_changed): New private function to emit the GtkTreeSelection::changed signal. * gtk/gtktreeview.c (gtk_tree_view_set_model): Call _gtk_tree_selection_emit_changed() when the model changes.
-rw-r--r--ChangeLog16
-rw-r--r--ChangeLog.pre-2-1016
-rw-r--r--gtk/gtktreeprivate.h1
-rw-r--r--gtk/gtktreeselection.c52
-rw-r--r--gtk/gtktreeview.c4
5 files changed, 66 insertions, 23 deletions
diff --git a/ChangeLog b/ChangeLog
index 5e7089a0a..d5fdff156 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+2005-11-29 Matthias Clasen <mclasen@redhat.com>
+
+ Properly handle model changes in GtkTreeSelection: (#322569,
+ Milosz Derezynski)
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_selected_foreach):
+ Get a reference to the model, and stop the iteration if the model
+ of the treeview is changed on the way.
+
+ * gtk/gtktreeprivate.h:
+ * gtk/gtktreeselection.c (_gtk_tree_selection_emit_changed): New
+ private function to emit the GtkTreeSelection::changed signal.
+
+ * gtk/gtktreeview.c (gtk_tree_view_set_model): Call
+ _gtk_tree_selection_emit_changed() when the model changes.
+
2005-11-28 Federico Mena Quintero <federico@ximian.com>
Merged from HEAD:
diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10
index 5e7089a0a..d5fdff156 100644
--- a/ChangeLog.pre-2-10
+++ b/ChangeLog.pre-2-10
@@ -1,3 +1,19 @@
+2005-11-29 Matthias Clasen <mclasen@redhat.com>
+
+ Properly handle model changes in GtkTreeSelection: (#322569,
+ Milosz Derezynski)
+
+ * gtk/gtktreeselection.c (gtk_tree_selection_selected_foreach):
+ Get a reference to the model, and stop the iteration if the model
+ of the treeview is changed on the way.
+
+ * gtk/gtktreeprivate.h:
+ * gtk/gtktreeselection.c (_gtk_tree_selection_emit_changed): New
+ private function to emit the GtkTreeSelection::changed signal.
+
+ * gtk/gtktreeview.c (gtk_tree_view_set_model): Call
+ _gtk_tree_selection_emit_changed() when the model changes.
+
2005-11-28 Federico Mena Quintero <federico@ximian.com>
Merged from HEAD:
diff --git a/gtk/gtktreeprivate.h b/gtk/gtktreeprivate.h
index f91679b26..e4a333724 100644
--- a/gtk/gtktreeprivate.h
+++ b/gtk/gtktreeprivate.h
@@ -312,6 +312,7 @@ void _gtk_tree_selection_internal_select_node (GtkTreeSelection *select
GtkTreePath *path,
GtkTreeSelectMode mode,
gboolean override_browse_mode);
+void _gtk_tree_selection_emit_changed (GtkTreeSelection *selection);
gboolean _gtk_tree_view_find_node (GtkTreeView *tree_view,
GtkTreePath *path,
GtkRBTree **tree,
diff --git a/gtk/gtktreeselection.c b/gtk/gtktreeselection.c
index 676a22177..3575fd078 100644
--- a/gtk/gtktreeselection.c
+++ b/gtk/gtktreeselection.c
@@ -618,8 +618,9 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection,
GtkRBTree *tree;
GtkRBNode *node;
GtkTreeIter iter;
+ GtkTreeModel *model;
- guint inserted_id, deleted_id, reordered_id;
+ gulong inserted_id, deleted_id, reordered_id, changed_id;
gboolean stop = FALSE;
g_return_if_fail (GTK_IS_TREE_SELECTION (selection));
@@ -649,19 +650,22 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection,
while (node->left != tree->nil)
node = node->left;
+ model = selection->tree_view->priv->model;
+ g_object_ref (model);
+
/* connect to signals to monitor changes in treemodel */
- inserted_id = g_signal_connect_swapped (selection->tree_view->priv->model,
- "row_inserted",
+ inserted_id = g_signal_connect_swapped (model, "row_inserted",
G_CALLBACK (model_changed),
&stop);
- deleted_id = g_signal_connect_swapped (selection->tree_view->priv->model,
- "row_deleted",
+ deleted_id = g_signal_connect_swapped (model, "row_deleted",
G_CALLBACK (model_changed),
&stop);
- reordered_id = g_signal_connect_swapped (selection->tree_view->priv->model,
- "rows_reordered",
+ reordered_id = g_signal_connect_swapped (model, "rows_reordered",
G_CALLBACK (model_changed),
&stop);
+ changed_id = g_signal_connect_swapped (selection->tree_view, "notify::model",
+ G_CALLBACK (model_changed),
+ &stop);
/* find the node internally */
path = gtk_tree_path_new_first ();
@@ -670,9 +674,8 @@ gtk_tree_selection_selected_foreach (GtkTreeSelection *selection,
{
if (GTK_RBNODE_FLAG_SET (node, GTK_RBNODE_IS_SELECTED))
{
- gtk_tree_model_get_iter (selection->tree_view->priv->model,
- &iter, path);
- (* func) (selection->tree_view->priv->model, path, &iter, data);
+ gtk_tree_model_get_iter (model, &iter, path);
+ (* func) (model, path, &iter, data);
}
if (stop)
@@ -725,20 +728,18 @@ out:
if (path)
gtk_tree_path_free (path);
- g_signal_handler_disconnect (selection->tree_view->priv->model,
- inserted_id);
- g_signal_handler_disconnect (selection->tree_view->priv->model,
- deleted_id);
- g_signal_handler_disconnect (selection->tree_view->priv->model,
- reordered_id);
+ g_signal_handler_disconnect (model, inserted_id);
+ g_signal_handler_disconnect (model, deleted_id);
+ g_signal_handler_disconnect (model, reordered_id);
+ g_signal_handler_disconnect (selection->tree_view, changed_id);
+ g_object_unref (model);
/* check if we have to spew a scary message */
if (stop)
- g_warning
- ("The model has been modified from within gtk_tree_selection_selected_foreach.\n"
- "This function is for observing the selections of the tree only. If\n"
- "you are trying to get all selected items from the tree, try using\n"
- "gtk_tree_selection_get_selected_rows instead.\n");
+ g_warning ("The model has been modified from within gtk_tree_selection_selected_foreach.\n"
+ "This function is for observing the selections of the tree only. If\n"
+ "you are trying to get all selected items from the tree, try using\n"
+ "gtk_tree_selection_get_selected_rows instead.\n");
}
/**
@@ -1486,7 +1487,14 @@ _gtk_tree_selection_internal_select_node (GtkTreeSelection *selection,
gtk_tree_path_free (anchor_path);
if (dirty)
- g_signal_emit (selection, tree_selection_signals[CHANGED], 0);
+ g_signal_emit (selection, tree_selection_signals[CHANGED], 0);
+}
+
+
+void
+_gtk_tree_selection_emit_changed (GtkTreeSelection *selection)
+{
+ g_signal_emit (selection, tree_selection_signals[CHANGED], 0);
}
/* NOTE: Any {un,}selection ever done _MUST_ be done through this function!
diff --git a/gtk/gtktreeview.c b/gtk/gtktreeview.c
index b6fea022b..bd12fd107 100644
--- a/gtk/gtktreeview.c
+++ b/gtk/gtktreeview.c
@@ -9526,7 +9526,6 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
tree_view->priv->model = model;
-
if (tree_view->priv->model)
{
gint i;
@@ -9590,6 +9589,9 @@ gtk_tree_view_set_model (GtkTreeView *tree_view,
g_object_notify (G_OBJECT (tree_view), "model");
+ if (tree_view->priv->selection)
+ _gtk_tree_selection_emit_changed (tree_view->priv->selection);
+
if (GTK_WIDGET_REALIZED (tree_view))
gtk_widget_queue_resize (GTK_WIDGET (tree_view));
}