Modified the compact folder view rendering to show a messages column
authorJose Dapena Paz <jdapena@igalia.com>
Thu, 27 Nov 2008 11:01:37 +0000 (11:01 +0000)
committerJose Dapena Paz <jdapena@igalia.com>
Thu, 27 Nov 2008 11:01:37 +0000 (11:01 +0000)
pmo-drop-split-view-r6438

src/widgets/modest-folder-view.c

index ab051e1..ed499ee 100644 (file)
@@ -186,6 +186,8 @@ static void         on_row_inserted_maybe_select_folder (GtkTreeModel     *tree_
 static void         on_display_name_changed (ModestAccountMgr *self,
                                             const gchar *account,
                                             gpointer user_data);
+static void         update_style (ModestFolderView *self);
+static void         on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata);
 
 enum {
        FOLDER_SELECTION_CHANGED_SIGNAL,
@@ -226,6 +228,8 @@ struct _ModestFolderViewPrivate {
        gboolean  reselect; /* we use this to force a reselection of the INBOX */
        gboolean  show_non_move;
        gboolean  reexpand; /* next time we expose, we'll expand all root folders */
+
+       GtkCellRenderer *messages_renderer;
 };
 #define MODEST_FOLDER_VIEW_GET_PRIVATE(o)                      \
        (G_TYPE_INSTANCE_GET_PRIVATE((o),                       \
@@ -473,27 +477,18 @@ text_cell_data  (GtkTreeViewColumn *column,
                if ((type == TNY_FOLDER_TYPE_DRAFTS) ||
                    (type == TNY_FOLDER_TYPE_OUTBOX) ||
                    (type == TNY_FOLDER_TYPE_MERGE)) { /* _OUTBOX actually returns _MERGE... */
-                       number = tny_folder_get_all_count (TNY_FOLDER(instance));
                        drafts = TRUE;
                } else {
-                       number = tny_folder_get_unread_count (TNY_FOLDER(instance));
                        drafts = FALSE;
                }
 
                if (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT) {
-                       gchar * substring;
+                       item_name = g_strdup (fname);
                        if (number > 0) {
-                               substring = g_strdup_printf (drafts?"TODO:%d messages":"TODO:%d new messages", number);
-                               item_name = g_strdup_printf ("<span weight='800'>%s</span>\n<span weight='800' size='x-small' color='grey'>%s</span>", 
-                                                            fname, substring);
                                item_weight = 800;
                        } else {
-                               substring = g_strdup ("");
-                               item_name = g_strdup_printf ("%s\n<span size='x-small' color='grey'>%s</span>", 
-                                                            fname, substring);
                                item_weight = 400;
                        }
-                       g_free (substring);
                } else {
                        /* Use bold font style if there are unread or unset messages */
                        if (number > 0) {
@@ -528,7 +523,7 @@ text_cell_data  (GtkTreeViewColumn *column,
 
        if (item_name && item_weight) {
                /* Set the name in the treeview cell: */
-               g_object_set (rendobj,"markup", item_name, "weight", item_weight, NULL);
+               g_object_set (rendobj, "text", item_name, "weight", item_weight, NULL);
 
                /* Notify display name observers */
                /* TODO: What listens for this signal, and how can it use only the new name? */
@@ -565,6 +560,86 @@ text_cell_data  (GtkTreeViewColumn *column,
                g_free (fname);
 }
 
+static void
+messages_cell_data  (GtkTreeViewColumn *column,
+                GtkCellRenderer *renderer,
+                GtkTreeModel *tree_model,
+                GtkTreeIter *iter,
+                gpointer data)
+{
+       ModestFolderView *self; 
+       ModestFolderViewPrivate *priv;
+       GObject *rendobj = (GObject *) renderer;
+       TnyFolderType type = TNY_FOLDER_TYPE_UNKNOWN;
+       GObject *instance = NULL;
+       gchar *item_name = NULL;
+
+       gtk_tree_model_get (tree_model, iter,
+                           TYPE_COLUMN, &type,
+                           INSTANCE_COLUMN, &instance,
+                           -1);
+       if (!instance)
+               goto end;
+
+       self = MODEST_FOLDER_VIEW (data);
+       priv =  MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+
+       if (type != TNY_FOLDER_TYPE_ROOT) {
+               gint number = 0;
+               gboolean drafts;
+
+               if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) ||
+                   modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance))) {
+                       type = modest_tny_folder_get_local_or_mmc_folder_type (TNY_FOLDER (instance));
+               } else {
+                       /* Sometimes an special folder is reported by the server as
+                          NORMAL, like some versions of Dovecot */
+                       if (type == TNY_FOLDER_TYPE_NORMAL ||
+                           type == TNY_FOLDER_TYPE_UNKNOWN) {
+                               type = modest_tny_folder_guess_folder_type (TNY_FOLDER (instance));
+                       }
+               }
+
+               /* note: we cannot reliably get the counts from the tree model, we need
+                * to use explicit calls on tny_folder for some reason.
+                */
+               /* Select the number to show: the unread or unsent messages. in case of outbox/drafts, show all */
+               if ((type == TNY_FOLDER_TYPE_DRAFTS) ||
+                   (type == TNY_FOLDER_TYPE_OUTBOX) ||
+                   (type == TNY_FOLDER_TYPE_MERGE)) { /* _OUTBOX actually returns _MERGE... */
+                       number = tny_folder_get_all_count (TNY_FOLDER(instance));
+                       drafts = TRUE;
+               } else {
+                       number = tny_folder_get_unread_count (TNY_FOLDER(instance));
+                       drafts = FALSE;
+               }
+
+               if (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT) {
+                       if (number > 0) {
+                               item_name = g_strdup_printf (drafts?_("mcen_ti_messages"):_("mcen_ti_new_messages"), 
+                                                            number);
+                       } 
+               } 
+
+       } 
+
+       if (!item_name)
+               item_name = g_strdup ("");
+
+       if (item_name) {
+               /* Set the name in the treeview cell: */
+               g_object_set (rendobj,"text", item_name, NULL);
+
+               g_free (item_name);
+
+       }
+
+ end:
+       if (instance)
+               g_object_unref (G_OBJECT (instance));
+}
+
 
 typedef struct {
        GdkPixbuf *pixbuf;
@@ -789,6 +864,9 @@ add_columns (GtkWidget *treeview)
        GtkTreeViewColumn *column;
        GtkCellRenderer *renderer;
        GtkTreeSelection *sel;
+       ModestFolderViewPrivate *priv;
+
+       priv =  MODEST_FOLDER_VIEW_GET_PRIVATE(treeview);
 
        /* Create column */
        column = gtk_tree_view_column_new ();
@@ -800,12 +878,26 @@ add_columns (GtkWidget *treeview)
                                                icon_cell_data, treeview, NULL);
 
        renderer = gtk_cell_renderer_text_new();
-       g_object_set (renderer, "ellipsize", PANGO_ELLIPSIZE_END,
-                       "ellipsize-set", TRUE, NULL);
+       g_object_set (renderer, 
+#ifdef MODEST_TOOLKIT_HILDON2
+                     "ellipsize", PANGO_ELLIPSIZE_MIDDLE,
+#else
+                     "ellipsize", PANGO_ELLIPSIZE_END,
+#endif
+                     "ellipsize-set", TRUE, NULL);
        gtk_tree_view_column_pack_start (column, renderer, TRUE);
        gtk_tree_view_column_set_cell_data_func(column, renderer,
                                                text_cell_data, treeview, NULL);
 
+       priv->messages_renderer = gtk_cell_renderer_text_new ();
+       g_object_set (priv->messages_renderer, 
+                     "scale", PANGO_SCALE_X_SMALL,
+                     "scale-set", TRUE,
+                     NULL);
+       gtk_tree_view_column_pack_start (column, priv->messages_renderer, FALSE);
+       gtk_tree_view_column_set_cell_data_func(column, priv->messages_renderer,
+                                               messages_cell_data, treeview, NULL);
+
        /* Set selection mode */
        sel = gtk_tree_view_get_selection (GTK_TREE_VIEW(treeview));
        gtk_tree_selection_set_mode (sel, GTK_SELECTION_SINGLE);
@@ -875,6 +967,11 @@ modest_folder_view_init (ModestFolderView *obj)
                                                  "key_changed",
                                                  G_CALLBACK(on_configuration_key_changed),
                                                  obj);
+
+       update_style (obj);
+       g_signal_connect (G_OBJECT (obj), "notify::style", G_CALLBACK (on_notify_style), (gpointer) obj);
+
+
 }
 
 static void
@@ -3054,6 +3151,39 @@ modest_folder_view_set_cell_style (ModestFolderView *self,
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
 
        priv->cell_style = cell_style;
+
+       g_object_set (G_OBJECT (priv->messages_renderer),
+                     "visible", (cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT),
+                     NULL);
        
        gtk_widget_queue_draw (GTK_WIDGET (self));
 }
+
+static void
+update_style (ModestFolderView *self)
+{
+       ModestFolderViewPrivate *priv;
+       GdkColor style_color;
+
+       g_return_if_fail (MODEST_IS_FOLDER_VIEW (self));
+       priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+
+       if (!gtk_style_lookup_color (GTK_WIDGET (self)->style, "SecondaryTextColor", &style_color)) {
+               gdk_color_parse ("grey", &style_color);
+       }
+
+       g_object_set (G_OBJECT (priv->messages_renderer),
+                     "foreground-gdk", &style_color,
+                     "foreground-set", TRUE,
+                     NULL);
+}
+
+static void 
+on_notify_style (GObject *obj, GParamSpec *spec, gpointer userdata)
+{
+       if (strcmp ("style", spec->name) == 0) {
+               update_style (MODEST_FOLDER_VIEW (obj));
+               gtk_widget_queue_draw (GTK_WIDGET (obj));
+       } 
+}
+