Use folder view activity feedback in folder window
[modest] / src / widgets / modest-folder-view.c
index 1fc6cf2..d23911c 100644 (file)
@@ -62,6 +62,7 @@
 #include "modest-dnd.h"
 #include "modest-ui-constants.h"
 #include "widgets/modest-window.h"
+#include <modest-account-protocol.h>
 
 /* Folder view drag types */
 const GtkTargetEntry folder_view_drag_types[] =
@@ -196,12 +197,19 @@ static gboolean     get_inner_models        (ModestFolderView *self,
                                             GtkTreeModel **filter_model,
                                             GtkTreeModel **sort_model,
                                             GtkTreeModel **tny_model);
+#ifdef MODEST_TOOLKIT_HILDON2
+static void
+on_activity_changed (TnyGtkFolderListStore *store,
+                    gboolean activity,
+                    ModestFolderView *folder_view);
+#endif
 
 enum {
        FOLDER_SELECTION_CHANGED_SIGNAL,
        FOLDER_DISPLAY_NAME_CHANGED_SIGNAL,
        FOLDER_ACTIVATED_SIGNAL,
        VISIBLE_ACCOUNT_CHANGED_SIGNAL,
+       ACTIVITY_CHANGED_SIGNAL,
        LAST_SIGNAL
 };
 
@@ -245,6 +253,9 @@ struct _ModestFolderViewPrivate {
        GtkCellRenderer *messages_renderer;
 
        gulong                outbox_deleted_handler;
+
+       guint    activity_changed_handler;
+       gboolean activity;
 };
 #define MODEST_FOLDER_VIEW_GET_PRIVATE(o)                      \
        (G_TYPE_INSTANCE_GET_PRIVATE((o),                       \
@@ -355,6 +366,19 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
                              g_cclosure_marshal_VOID__STRING,
                              G_TYPE_NONE, 1, G_TYPE_STRING);
 
+       /*
+        * Emitted when the underlying GtkListStore is updating data
+        */
+       signals[ACTIVITY_CHANGED_SIGNAL] =
+               g_signal_new ("activity-changed",
+                             G_TYPE_FROM_CLASS (gobject_class),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET (ModestFolderViewClass,
+                                              activity_changed),
+                             NULL, NULL,
+                             g_cclosure_marshal_VOID__BOOLEAN,
+                             G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
+
        treeview_class->select_cursor_parent = NULL;
 
 #ifdef MODEST_TOOLKIT_HILDON2
@@ -894,9 +918,44 @@ get_composite_icons (const gchar *icon_code,
        return retval;
 }
 
+static inline ThreePixbufs *
+get_account_protocol_pixbufs (ModestFolderView *folder_view,
+                             ModestProtocolType protocol_type,
+                             GObject *object)
+{
+       ModestProtocol *protocol;
+       const GdkPixbuf *pixbuf = NULL;
+       ModestFolderViewPrivate *priv;
+
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (folder_view);
+
+       protocol = modest_protocol_registry_get_protocol_by_type (modest_runtime_get_protocol_registry (),
+                                                                 protocol_type);
+
+       if (MODEST_IS_ACCOUNT_PROTOCOL (protocol)) {
+               pixbuf = modest_account_protocol_get_icon (MODEST_ACCOUNT_PROTOCOL (protocol), 
+                                                          priv->filter & MODEST_FOLDER_VIEW_FILTER_SHOW_ONLY_MAILBOXES?
+                                                          MODEST_ACCOUNT_PROTOCOL_ICON_MAILBOX:
+                                                          MODEST_ACCOUNT_PROTOCOL_ICON_FOLDER,
+                                                          object, FOLDER_ICON_SIZE);
+       }
+
+       if (pixbuf) {
+               ThreePixbufs *retval;
+               retval = g_slice_new0 (ThreePixbufs);
+               retval->pixbuf = g_object_ref ((GObject *) pixbuf);
+               retval->pixbuf_open = g_object_ref ((GObject *) pixbuf);
+               retval->pixbuf_close = g_object_ref ((GObject *) pixbuf);
+               return retval;
+       } else {
+               return NULL;
+       }
+}
+
 static inline ThreePixbufs*
-get_folder_icons (TnyFolderType type, GObject *instance)
+get_folder_icons (ModestFolderView *folder_view, TnyFolderType type, GObject *instance)
 {
+       TnyAccount *account = NULL;
        static GdkPixbuf *inbox_pixbuf = NULL, *outbox_pixbuf = NULL,
                *junk_pixbuf = NULL, *sent_pixbuf = NULL,
                *trash_pixbuf = NULL, *draft_pixbuf = NULL,
@@ -917,6 +976,23 @@ get_folder_icons (TnyFolderType type, GObject *instance)
 
        ThreePixbufs *retval = NULL;
 
+       if (TNY_IS_ACCOUNT (instance)) {
+               account = g_object_ref (instance);
+       } else if (TNY_IS_FOLDER (instance) && !TNY_IS_MERGE_FOLDER (instance)) {
+               account = tny_folder_get_account (TNY_FOLDER (instance));
+       }
+
+       if (account) {
+               ModestProtocolType account_store_protocol;
+
+               account_store_protocol = modest_tny_account_get_protocol_type (account);
+               retval = get_account_protocol_pixbufs (folder_view, account_store_protocol, instance);
+               g_object_unref (account);
+       }
+
+       if (retval)
+               return retval;
+
        /* Sometimes an special folder is reported by the server as
           NORMAL, like some versions of Dovecot */
        if (type == TNY_FOLDER_TYPE_NORMAL ||
@@ -1065,6 +1141,7 @@ icon_cell_data  (GtkTreeViewColumn *column,
        TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
        gboolean has_children;
        ThreePixbufs *pixbufs;
+       ModestFolderView *folder_view = (ModestFolderView *) data;
 
        rendobj = (GObject *) renderer;
 
@@ -1077,7 +1154,7 @@ icon_cell_data  (GtkTreeViewColumn *column,
                return;
 
        has_children = gtk_tree_model_iter_has_child (tree_model, iter);
-       pixbufs = get_folder_icons (type, instance);
+       pixbufs = get_folder_icons (folder_view, type, instance);
        g_object_unref (instance);
 
        /* Set pixbuf */
@@ -1181,6 +1258,8 @@ modest_folder_view_init (ModestFolderView *obj)
        priv->folder_to_select = NULL;
        priv->outbox_deleted_handler = 0;
        priv->reexpand = TRUE;
+       priv->activity = FALSE;
+       priv->activity_changed_handler = 0;
 
        /* Initialize the local account name */
        conf = modest_runtime_get_conf();
@@ -2139,7 +2218,7 @@ modest_folder_view_update_model (ModestFolderView *self,
                                 TnyAccountStore *account_store)
 {
        ModestFolderViewPrivate *priv;
-       GtkTreeModel *model /* , *old_model */;
+       GtkTreeModel *model;
        GtkTreeModel *filter_model = NULL, *sortable = NULL;
 
        g_return_val_if_fail (self && MODEST_IS_FOLDER_VIEW (self), FALSE);
@@ -2213,6 +2292,15 @@ modest_folder_view_update_model (ModestFolderView *self,
                                                self,
                                                NULL);
 
+       if (priv->activity_changed_handler > 0) {
+               GtkTreeModel *old_tny_model;
+
+               if (get_inner_models (self, NULL, NULL, &old_tny_model)) {
+                       g_signal_handler_disconnect (G_OBJECT (old_tny_model), priv->activity_changed_handler);
+               }
+               priv->activity_changed_handler = 0;
+       }
+
        /* Set new model */
        gtk_tree_view_set_model (GTK_TREE_VIEW(self), filter_model);
 #ifndef MODEST_TOOLKIT_HILDON2
@@ -2220,6 +2308,12 @@ modest_folder_view_update_model (ModestFolderView *self,
                          (GCallback) on_row_inserted_maybe_select_folder, self);
 #endif
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       priv->activity_changed_handler = 
+               g_signal_connect (G_OBJECT (model), "activity-changed", G_CALLBACK (on_activity_changed), self);
+#endif
+       priv->activity = FALSE;
+
        g_object_unref (model);
        g_object_unref (filter_model);
        g_object_unref (sortable);
@@ -3682,11 +3776,22 @@ modest_folder_view_copy_model (ModestFolderView *folder_view_src,
        GtkTreeModel *filter_model = NULL;
        GtkTreeModel *model = NULL;
        GtkTreeModel *new_filter_model = NULL;
+       GtkTreeModel *old_tny_model = NULL;
+       GtkTreeModel *new_tny_model = NULL;
+       ModestFolderViewPrivate *dst_priv;
 
        g_return_if_fail (folder_view_src && MODEST_IS_FOLDER_VIEW (folder_view_src));
        g_return_if_fail (folder_view_dst && MODEST_IS_FOLDER_VIEW (folder_view_dst));
 
+       dst_priv = MODEST_FOLDER_VIEW_GET_PRIVATE (folder_view_dst);
+       if (!get_inner_models (folder_view_src, NULL, NULL, &new_tny_model))
+               new_tny_model = NULL;
+
        /* Get src model*/
+       if (get_inner_models (folder_view_dst, NULL, NULL, &old_tny_model)) {
+               g_signal_handler_disconnect (G_OBJECT (old_tny_model), dst_priv->activity_changed_handler);
+               dst_priv->activity_changed_handler = 0;
+       }
        filter_model = gtk_tree_view_get_model (GTK_TREE_VIEW (folder_view_src));
        model = gtk_tree_model_filter_get_model (GTK_TREE_MODEL_FILTER(filter_model));
 
@@ -3696,12 +3801,21 @@ modest_folder_view_copy_model (ModestFolderView *folder_view_src,
                                                filter_row,
                                                folder_view_dst,
                                                NULL);
+
+
+
        /* Set copied model */
        gtk_tree_view_set_model (GTK_TREE_VIEW (folder_view_dst), new_filter_model);
 #ifndef MODEST_TOOLKIT_HILDON2
        g_signal_connect (G_OBJECT(new_filter_model), "row-inserted",
                          (GCallback) on_row_inserted_maybe_select_folder, folder_view_dst);
 #endif
+#ifdef MODEST_TOOLKIT_HILDON2
+       if (new_tny_model)
+               dst_priv->activity_changed_handler = g_signal_connect (G_OBJECT (new_tny_model), "activity-changed",
+                                                                      G_CALLBACK (on_activity_changed), folder_view_dst);
+#endif
+       dst_priv->activity = FALSE;
 
        /* Free */
        g_object_unref (new_filter_model);
@@ -3993,3 +4107,33 @@ modest_folder_view_get_mailbox (ModestFolderView *self)
 
        return (const gchar *) priv->mailbox;
 }
+
+gboolean 
+modest_folder_view_get_activity (ModestFolderView *self)
+{
+       ModestFolderViewPrivate *priv;
+
+       g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+       return priv->activity;
+}
+
+#ifdef MODEST_TOOLKIT_HILDON2
+static void
+on_activity_changed (TnyGtkFolderListStore *store,
+                    gboolean activity,
+                    ModestFolderView *folder_view)
+{
+       ModestFolderViewPrivate *priv;
+
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW (folder_view));
+       g_return_if_fail (TNY_IS_GTK_FOLDER_LIST_STORE (store));
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (folder_view);
+
+       priv->activity = activity;
+
+       g_signal_emit (G_OBJECT (folder_view), signals[ACTIVITY_CHANGED_SIGNAL], 0,
+                      activity);
+}
+#endif