diff options
-rw-r--r-- | mail/em-folder-tree-model.c | 122 | ||||
-rw-r--r-- | mail/em-folder-tree-model.h | 5 | ||||
-rw-r--r-- | mail/mail-folder-cache.c | 23 |
3 files changed, 88 insertions, 62 deletions
diff --git a/mail/em-folder-tree-model.c b/mail/em-folder-tree-model.c index 4833277a71..19697a4f6a 100644 --- a/mail/em-folder-tree-model.c +++ b/mail/em-folder-tree-model.c @@ -372,6 +372,69 @@ folder_tree_model_class_init (EMFolderTreeModelClass *class) } static void +em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, + CamelStore *store, + const gchar *full, + gint unread) +{ + EMFolderTreeModelStoreInfo *si; + GtkTreeRowReference *reference; + GtkTreeModel *tree_model; + GtkTreePath *path; + GtkTreeIter parent; + GtkTreeIter iter; + guint old_unread = 0; + + g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model)); + g_return_if_fail (CAMEL_IS_STORE (store)); + g_return_if_fail (full != NULL); + + if (unread < 0) + return; + + si = em_folder_tree_model_lookup_store_info (model, store); + if (si == NULL) + return; + + reference = g_hash_table_lookup (si->full_hash, full); + if (!gtk_tree_row_reference_valid (reference)) + return; + + tree_model = GTK_TREE_MODEL (model); + + path = gtk_tree_row_reference_get_path (reference); + gtk_tree_model_get_iter (tree_model, &iter, path); + gtk_tree_path_free (path); + + gtk_tree_model_get ( + tree_model, &iter, + COL_UINT_UNREAD_LAST_SEL, &old_unread, -1); + + gtk_tree_store_set ( + GTK_TREE_STORE (model), &iter, + COL_UINT_UNREAD, unread, + COL_UINT_UNREAD_LAST_SEL, MIN (old_unread, unread), -1); + + /* 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 (tree_model, &parent, &iter)) { + path = gtk_tree_model_get_path (tree_model, &parent); + gtk_tree_model_row_changed (tree_model, path, &parent); + gtk_tree_path_free (path); + iter = parent; + } +} + +static void +folder_unread_updated_cb (MailFolderCache *cache, CamelStore *store, + const gchar *full_name, int unread, gpointer user_data) +{ + EMFolderTreeModel *model = (EMFolderTreeModel*) user_data; + em_folder_tree_model_set_unread_count (model, store, full_name, unread); +} + +static void folder_tree_model_init (EMFolderTreeModel *model) { GHashTable *store_index; @@ -425,6 +488,10 @@ folder_tree_model_init (EMFolderTreeModel *model) model->priv->account_removed_id = g_signal_connect ( model->priv->accounts, "account-removed", G_CALLBACK (account_removed_cb), model); + + g_signal_connect (mail_folder_cache_get_default (), + "folder-unread-updated", + G_CALLBACK (folder_unread_updated_cb), model); } GType @@ -1173,61 +1240,6 @@ em_folder_tree_model_get_folder_name (EMFolderTreeModel *model, return name; } -void -em_folder_tree_model_set_unread_count (EMFolderTreeModel *model, - CamelStore *store, - const gchar *full, - gint unread) -{ - EMFolderTreeModelStoreInfo *si; - GtkTreeRowReference *reference; - GtkTreeModel *tree_model; - GtkTreePath *path; - GtkTreeIter parent; - GtkTreeIter iter; - guint old_unread = 0; - - g_return_if_fail (EM_IS_FOLDER_TREE_MODEL (model)); - g_return_if_fail (CAMEL_IS_STORE (store)); - g_return_if_fail (full != NULL); - - if (unread < 0) - return; - - si = em_folder_tree_model_lookup_store_info (model, store); - if (si == NULL) - return; - - reference = g_hash_table_lookup (si->full_hash, full); - if (!gtk_tree_row_reference_valid (reference)) - return; - - tree_model = GTK_TREE_MODEL (model); - - path = gtk_tree_row_reference_get_path (reference); - gtk_tree_model_get_iter (tree_model, &iter, path); - gtk_tree_path_free (path); - - gtk_tree_model_get ( - tree_model, &iter, - COL_UINT_UNREAD_LAST_SEL, &old_unread, -1); - - gtk_tree_store_set ( - GTK_TREE_STORE (model), &iter, - COL_UINT_UNREAD, unread, - COL_UINT_UNREAD_LAST_SEL, MIN (old_unread, unread), -1); - - /* 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 (tree_model, &parent, &iter)) { - path = gtk_tree_model_get_path (tree_model, &parent); - gtk_tree_model_row_changed (tree_model, path, &parent); - gtk_tree_path_free (path); - iter = parent; - } -} - EMFolderTreeModelStoreInfo * em_folder_tree_model_lookup_store_info (EMFolderTreeModel *model, CamelStore *store) diff --git a/mail/em-folder-tree-model.h b/mail/em-folder-tree-model.h index 00e2d39282..e0a73e03b8 100644 --- a/mail/em-folder-tree-model.h +++ b/mail/em-folder-tree-model.h @@ -137,11 +137,6 @@ void em_folder_tree_model_remove_folders (EMFolderTreeModel *model, EMFolderTreeModelStoreInfo *si, GtkTreeIter *toplevel); -void em_folder_tree_model_set_unread_count - (EMFolderTreeModel *model, - CamelStore *store, - const gchar *path, - gint unread); gboolean em_folder_tree_model_is_type_inbox (EMFolderTreeModel *model, CamelStore *store, diff --git a/mail/mail-folder-cache.c b/mail/mail-folder-cache.c index 769fa1df10..6b1be44753 100644 --- a/mail/mail-folder-cache.c +++ b/mail/mail-folder-cache.c @@ -98,6 +98,7 @@ enum FOLDER_UNAVAILABLE, FOLDER_DELETED, FOLDER_RENAMED, + FOLDER_UNREAD_UPDATED, LAST_SIGNAL }; @@ -198,8 +199,8 @@ real_flush_updates (gpointer o, gpointer event_data, gpointer data) } /* update unread counts */ - em_folder_tree_model_set_unread_count ( - default_model, up->store, up->full_name, up->unread); + g_signal_emit (self, signals[FOLDER_UNREAD_UPDATED], 0, + up->store, up->full_name, up->unread); if (up->uri) { EMEvent *e = em_event_peek(); @@ -1268,6 +1269,24 @@ mail_folder_cache_class_init (MailFolderCacheClass *klass) e_marshal_VOID__POINTER_STRING_STRING, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_STRING); + + /** + * MailFolderCache::folder-unread-updated + * @store: the #CamelStore containing the folder + * @name: the name of the folder + * @unread: the number of unread mails in the folder + * + * Emitted when a we receive an update to the unread count for a folder + **/ + signals[FOLDER_UNREAD_UPDATED] = + g_signal_new ("folder-unread-updated", + G_OBJECT_CLASS_TYPE (object_class), + G_SIGNAL_RUN_FIRST, + 0, /* struct offset */ + NULL, NULL, /* accumulator */ + e_marshal_VOID__POINTER_STRING_INT, + G_TYPE_NONE, 3, + G_TYPE_POINTER, G_TYPE_STRING, G_TYPE_INT); } static void |