From 1e2bc8d38c0a6a5b3f6a5390873570cb10da2425 Mon Sep 17 00:00:00 2001 From: Sankar P Date: Fri, 14 Dec 2007 12:37:56 +0000 Subject: Moving some code from tree to model where it belongs. Fixes some CPU usage 2007-12-14 Sankar P * em-folder-tree-model.c: (emft_model_unread_count_changed), (em_folder_tree_model_init), (em_folder_tree_model_set_unread_count): * em-folder-tree.c: (em_folder_tree_construct): Moving some code from tree to model where it belongs. Fixes some CPU usage issue whenever (un)read count is updated. Hopefully no regresssions. svn path=/trunk/; revision=34698 --- mail/em-folder-tree-model.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'mail/em-folder-tree-model.c') diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c index 5f4c67fc6e..69b9c55f3b 100644 --- a/mail/em-folder-tree-model.c +++ b/mail/em-folder-tree-model.c @@ -250,6 +250,30 @@ store_info_free (struct _EMFolderTreeModelStoreInfo *si) g_free (si); } +static void +emft_model_unread_count_changed (GtkTreeModel *model, GtkTreeIter *iter) +{ + GtkTreeIter parent_iter; + GtkTreeIter child_iter = *iter; + + g_signal_handler_block (model, emft_model_unread_count_changed); + + /* Folders are displayed with a bold weight to indicate that + they contain unread messages. We signal that parent rows + have changed here to update them. */ + + while (gtk_tree_model_iter_parent (model, &parent_iter, &child_iter)) { + GtkTreePath *parent_path; + + parent_path = gtk_tree_model_get_path (model, &parent_iter); + gtk_tree_model_row_changed (model, parent_path, &parent_iter); + gtk_tree_path_free (parent_path); + child_iter = parent_iter; + } + + g_signal_handler_unblock (model, emft_model_unread_count_changed); +} + static void em_folder_tree_model_init (EMFolderTreeModel *model) { @@ -269,6 +293,7 @@ em_folder_tree_model_init (EMFolderTreeModel *model) model->account_hash = g_hash_table_new (g_direct_hash, g_direct_equal); model->account_changed_id = g_signal_connect (model->accounts, "account-changed", G_CALLBACK (account_changed), model); model->account_removed_id = g_signal_connect (model->accounts, "account-removed", G_CALLBACK (account_removed), model); + //g_signal_connect (model, "row-changed", G_CALLBACK (emft_model_unread_count_changed), NULL); } static void @@ -1255,6 +1280,9 @@ em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, CamelStore *sto gtk_tree_path_free (tree_path); gtk_tree_store_set ((GtkTreeStore *) model, &iter, COL_UINT_UNREAD, unread, -1); + + /* May be this is from where we should probagate unread count to parents etc. */ + emft_model_unread_count_changed (model, &iter); } -- cgit v1.2.3