From 6849c1472d415ecc3612b80c5301458441acee5b Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Mon, 17 Aug 2009 05:45:46 -0400 Subject: [PATCH] Eliminate as many signal emissions as we can from footreestore.c --- footreestore.c | 59 +++++++++++++++++++++++++++++++++++++-------------------- footreestore.h | 6 ++++++ treeviewutils.c | 30 +++++++++++++++++------------ 3 files changed, 62 insertions(+), 33 deletions(-) diff --git a/footreestore.c b/footreestore.c index 1629e6c..e2ab611 100644 --- a/footreestore.c +++ b/footreestore.c @@ -233,6 +233,11 @@ foo_tree_store_init (FooTreeStore *tree_store) tree_store->sort_list = NULL; tree_store->sort_column_id = GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID; tree_store->columns_dirty = FALSE; + + tree_store->row_changed_id = g_signal_lookup ("row_changed", GTK_TYPE_TREE_MODEL); + tree_store->row_inserted_id = g_signal_lookup ("row_inserted", GTK_TYPE_TREE_MODEL); + tree_store->row_has_child_toggled_id = g_signal_lookup ("row_has_child_toggled", GTK_TYPE_TREE_MODEL); + tree_store->rows_reordered_id = g_signal_lookup ("rows_reordered", GTK_TYPE_TREE_MODEL); } /** @@ -1059,11 +1064,13 @@ foo_tree_store_set_valist (FooTreeStore *tree_store, if (emit_signal) { - GtkTreePath *path; - - path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter); - gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter); - gtk_tree_path_free (path); + if (g_signal_has_handler_pending (tree_store, tree_store->row_changed_id, 0, FALSE)) + { + GtkTreePath *path; + path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter); + gtk_tree_model_row_changed (GTK_TREE_MODEL (tree_store), path, iter); + gtk_tree_path_free (path); + } } } @@ -1182,7 +1189,6 @@ foo_tree_store_insert (FooTreeStore *tree_store, GtkTreeIter *parent, gint position) { - GtkTreePath *path; GNode *parent_node; GNode *new_node; @@ -1204,20 +1210,26 @@ foo_tree_store_insert (FooTreeStore *tree_store, iter->user_data = new_node; g_node_insert (parent_node, position, new_node); - path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter); - gtk_tree_model_row_inserted (GTK_TREE_MODEL (tree_store), path, iter); - - if (parent_node != tree_store->root) + if (g_signal_has_handler_pending (tree_store, tree_store->row_inserted_id, 0, FALSE) || + g_signal_has_handler_pending (tree_store, tree_store->row_has_child_toggled_id, 0, FALSE)) { - if (new_node->prev == NULL && new_node->next == NULL) - { - gtk_tree_path_up (path); - gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (tree_store), path, parent); - } + GtkTreePath *path; + + path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), iter); + gtk_tree_model_row_inserted (GTK_TREE_MODEL (tree_store), path, iter); + + if (parent_node != tree_store->root) + { + if (new_node->prev == NULL && new_node->next == NULL) + { + gtk_tree_path_up (path); + gtk_tree_model_row_has_child_toggled (GTK_TREE_MODEL (tree_store), path, parent); + } + } + + gtk_tree_path_free (path); } - gtk_tree_path_free (path); - validate_tree ((FooTreeStore*)tree_store); } @@ -2850,10 +2862,15 @@ foo_tree_store_sort_helper (FooTreeStore *tree_store, iter.stamp = tree_store->stamp; iter.user_data = parent; - path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), &iter); - gtk_tree_model_rows_reordered (GTK_TREE_MODEL (tree_store), - path, &iter, new_order); - gtk_tree_path_free (path); + + if (g_signal_has_handler_pending (tree_store, tree_store->row_inserted_id, 0, FALSE)) + { + path = foo_tree_store_get_path (GTK_TREE_MODEL (tree_store), &iter); + gtk_tree_model_rows_reordered (GTK_TREE_MODEL (tree_store), + path, &iter, new_order); + gtk_tree_path_free (path); + } + g_free (new_order); g_array_free (sort_array, TRUE); diff --git a/footreestore.h b/footreestore.h index a79e5da..bac0312 100644 --- a/footreestore.h +++ b/footreestore.h @@ -56,6 +56,12 @@ struct _FooTreeStore GtkTreeIterCompareFunc GSEAL (default_sort_func); gpointer GSEAL (default_sort_data); GDestroyNotify GSEAL (default_sort_destroy); + + guint row_changed_id; + guint row_inserted_id; + guint row_has_child_toggled_id; + guint rows_reordered_id; + guint GSEAL (columns_dirty) : 1; }; diff --git a/treeviewutils.c b/treeviewutils.c index 99b8807..7511daf 100644 --- a/treeviewutils.c +++ b/treeviewutils.c @@ -256,26 +256,32 @@ tree_view_set_model_with_default_sort (GtkTreeView *view, int model_column, GtkSortType default_sort) { - gboolean was_sorted = FALSE; - int old_column; - GtkSortType old_type; + int column; + GtkSortType type; GtkTreeSortable *old_model; GtkAdjustment *adjustment; old_model = GTK_TREE_SORTABLE (gtk_tree_view_get_model (view)); - if (old_model) + if (!(old_model && gtk_tree_sortable_get_sort_column_id ( + GTK_TREE_SORTABLE (old_model), &column, &type))) { - was_sorted = gtk_tree_sortable_get_sort_column_id ( - GTK_TREE_SORTABLE (old_model), &old_column, &old_type); + column = model_column; + type = default_sort; } - + + /* Setting the sort column here prevents the "rows_reordered" + * signal from being emitted when the model is attached to + * a treeview. This is desirable because at that point there + * is a handler attached, which means the signal will actually + * be emitted. + */ + gtk_tree_sortable_set_sort_column_id ( + GTK_TREE_SORTABLE (model), column, type); + gtk_tree_view_set_model (view, model); - - if (was_sorted) - tree_view_set_sort_column (view, old_column, old_type); - else - tree_view_set_sort_column (view, model_column, default_sort); + + tree_view_set_sort_column (view, column, type); /* Workaround for GTK+ crack, see bug 405625 */ adjustment = gtk_tree_view_get_vadjustment (view); -- 2.7.4