Fixes NB#116438, replaced a logical id for "1 new message" by the correct one
[modest] / src / widgets / modest-folder-view.c
index d23911c..47a5f4e 100644 (file)
@@ -236,6 +236,7 @@ struct _ModestFolderViewPrivate {
        ModestFolderViewFilter filter;
 
        TnyFolderStoreQuery  *query;
+       gboolean              do_refresh;
        guint                 timer_expander;
 
        gchar                *local_account_name;
@@ -255,7 +256,7 @@ struct _ModestFolderViewPrivate {
        gulong                outbox_deleted_handler;
 
        guint    activity_changed_handler;
-       gboolean activity;
+       GdkColor *active_color;
 };
 #define MODEST_FOLDER_VIEW_GET_PRIVATE(o)                      \
        (G_TYPE_INSTANCE_GET_PRIVATE((o),                       \
@@ -605,15 +606,13 @@ format_compact_style (gchar **item_name,
 
                buffer = g_string_append (buffer, *item_name);
                if (concat_folder_name) {
-                       if (bold) buffer = g_string_append (buffer, "<span weight='bold'>");
                        buffer = g_string_append (buffer, folder_name);
-                       if (bold) buffer = g_string_append (buffer, "</span>");
                }
                g_free (*item_name);
                g_object_unref (account);
 
                *item_name = g_string_free (buffer, FALSE);
-               *use_markup = bold;
+               *use_markup = FALSE;
        } else {
                *use_markup = FALSE;
        }
@@ -650,9 +649,12 @@ text_cell_data  (GtkTreeViewColumn *column,
        if (type != TNY_FOLDER_TYPE_ROOT) {
                gint number = 0;
                gboolean drafts;
+               gboolean is_local;
+
+               is_local = modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) ||
+                       modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance));
 
-               if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) ||
-                   modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance))) {
+               if (is_local) {
                        type = modest_tny_folder_get_local_or_mmc_folder_type (TNY_FOLDER (instance));
                        if (type != TNY_FOLDER_TYPE_UNKNOWN) {
                                g_free (fname);
@@ -672,9 +674,9 @@ text_cell_data  (GtkTreeViewColumn *column,
                 * 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... */
+               if (is_local && ((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 {
@@ -737,10 +739,21 @@ text_cell_data  (GtkTreeViewColumn *column,
 
        if (item_name && item_weight) {
                /* Set the name in the treeview cell: */
-               if (use_markup)
-                       g_object_set (rendobj, "markup", item_name, NULL);
-               else
-                       g_object_set (rendobj, "text", item_name, "weight", item_weight, NULL);
+               if (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT && item_weight == 800 && priv->active_color) {
+                       g_object_set (rendobj, 
+                                     "text", item_name, 
+                                     "weight-set", FALSE,
+                                     "foreground-set", TRUE,
+                                     "foreground-gdk", priv->active_color,
+                                     NULL);
+               } else {
+                       g_object_set (rendobj, 
+                                     "text", item_name,
+                                     "foreground-set", FALSE,
+                                     "weight-set", TRUE, 
+                                     "weight", item_weight,
+                                     NULL);
+               }
 
                /* Notify display name observers */
                /* TODO: What listens for this signal, and how can it use only the new name? */
@@ -805,9 +818,12 @@ messages_cell_data  (GtkTreeViewColumn *column,
        if (type != TNY_FOLDER_TYPE_ROOT) {
                gint number = 0;
                gboolean drafts;
+               gboolean is_local;
+
+               is_local = modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) ||
+                       modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance));
 
-               if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) ||
-                   modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance))) {
+               if (is_local) {
                        type = modest_tny_folder_get_local_or_mmc_folder_type (TNY_FOLDER (instance));
                } else {
                        /* Sometimes an special folder is reported by the server as
@@ -822,9 +838,9 @@ messages_cell_data  (GtkTreeViewColumn *column,
                 * 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... */
+               if (is_local && ((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 {
@@ -833,10 +849,13 @@ messages_cell_data  (GtkTreeViewColumn *column,
                }
 
                if (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT) {
-                       if (number > 0) {
+                       if (number > 1) {
                                item_name = g_strdup_printf (drafts?_("mcen_ti_messages"):_("mcen_ti_new_messages"), 
                                                             number);
-                       } 
+                       } else if (number == 1) {
+                               item_name = g_strdup_printf (drafts?_("mcen_ti_message"):_("mcen_ti_new_messages_singular"), 
+                                                            number);
+                       }
                } 
 
        } 
@@ -1251,6 +1270,7 @@ modest_folder_view_init (ModestFolderView *obj)
        priv->timer_expander = 0;
        priv->account_store  = NULL;
        priv->query          = NULL;
+       priv->do_refresh     = TRUE;
        priv->style          = MODEST_FOLDER_VIEW_STYLE_SHOW_ALL;
        priv->cur_folder_store   = NULL;
        priv->visible_account_id = NULL;
@@ -1258,7 +1278,6 @@ 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 */
@@ -1301,6 +1320,8 @@ modest_folder_view_init (ModestFolderView *obj)
                                                  G_CALLBACK(on_configuration_key_changed),
                                                  obj);
 
+       priv->active_color = NULL;
+
        update_style (obj);
        g_signal_connect (G_OBJECT (obj), "notify::style", G_CALLBACK (on_notify_style), (gpointer) obj);
 
@@ -1326,6 +1347,11 @@ modest_folder_view_finalize (GObject *obj)
 
        priv =  MODEST_FOLDER_VIEW_GET_PRIVATE(obj);
 
+       if (priv->active_color) {
+               gdk_color_free (priv->active_color);
+               priv->active_color = NULL;
+       }
+
        if (priv->timer_expander != 0) {
                g_source_remove (priv->timer_expander);
                priv->timer_expander = 0;
@@ -1359,6 +1385,19 @@ modest_folder_view_finalize (GObject *obj)
                priv->display_name_changed_signal = 0;
        }
 
+#ifdef MODEST_TOOLKIT_HILDON2
+       GtkTreeModel *tny_model;
+
+       if (get_inner_models (MODEST_FOLDER_VIEW (obj), NULL, NULL, &tny_model)) {
+               if (g_signal_handler_is_connected (tny_model,
+                                                  priv->activity_changed_handler)) {
+                       g_signal_handler_disconnect (tny_model,
+                                                    priv->activity_changed_handler);
+                       priv->activity_changed_handler = 0;
+               }
+       }
+#endif
+
        if (priv->query) {
                g_object_unref (G_OBJECT (priv->query));
                priv->query = NULL;
@@ -1759,6 +1798,12 @@ modest_folder_view_on_map (ModestFolderView *self,
 GtkWidget*
 modest_folder_view_new (TnyFolderStoreQuery *query)
 {
+       return modest_folder_view_new_full (query, TRUE);
+}
+
+GtkWidget*
+modest_folder_view_new_full (TnyFolderStoreQuery *query, gboolean do_refresh)
+{
        GObject *self;
        ModestFolderViewPrivate *priv;
        GtkTreeSelection *sel;
@@ -1773,6 +1818,8 @@ modest_folder_view_new (TnyFolderStoreQuery *query)
        if (query)
                priv->query = g_object_ref (query);
 
+       priv->do_refresh = do_refresh;
+
        sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(self));
        priv->changed_signal = g_signal_connect (sel, "changed",
                                                 G_CALLBACK (on_selection_changed), self);
@@ -2239,8 +2286,12 @@ modest_folder_view_update_model (ModestFolderView *self,
        /* FIXME: the local accounts are not shown when the query
           selects only the subscribed folders */
 #ifdef MODEST_TOOLKIT_HILDON2
+       TnyGtkFolderListStoreFlags flags;
+       flags = TNY_GTK_FOLDER_LIST_STORE_FLAG_SHOW_PATH;
+       if (!priv->do_refresh)
+               flags &= TNY_GTK_FOLDER_LIST_STORE_FLAG_NO_REFRESH;
        model = tny_gtk_folder_list_store_new_with_flags (NULL, 
-                                                         TNY_GTK_FOLDER_LIST_STORE_FLAG_SHOW_PATH);
+                                                         flags);
        tny_gtk_folder_list_store_set_path_separator (TNY_GTK_FOLDER_LIST_STORE (model),
                                                      MODEST_FOLDER_PATH_SEPARATOR);
 #else
@@ -2312,7 +2363,6 @@ modest_folder_view_update_model (ModestFolderView *self,
        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);
@@ -3815,7 +3865,6 @@ modest_folder_view_copy_model (ModestFolderView *folder_view_src,
                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);
@@ -3946,7 +3995,7 @@ static void
 update_style (ModestFolderView *self)
 {
        ModestFolderViewPrivate *priv;
-       GdkColor style_color;
+       GdkColor style_color, style_active_color;
        PangoAttrList *attr_list;
        GtkStyle *style;
        PangoAttribute *attr;
@@ -3980,6 +4029,12 @@ update_style (ModestFolderView *self)
                              NULL);
                pango_attr_list_unref (attr_list);
        }
+       if (priv->active_color)
+               gdk_color_free (priv->active_color);
+
+       if (gtk_style_lookup_color (GTK_WIDGET (self)->style, "ActiveTextColor", &style_active_color)) {
+               priv->active_color = gdk_color_copy (&style_active_color);
+       }
 }
 
 static void 
@@ -4112,11 +4167,17 @@ gboolean
 modest_folder_view_get_activity (ModestFolderView *self)
 {
        ModestFolderViewPrivate *priv;
+       GtkTreeModel *inner_model;
 
        g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), FALSE);
        priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self);
+       g_return_val_if_fail (get_inner_models (self, NULL, NULL, &inner_model), FALSE);
 
-       return priv->activity;
+       if (TNY_IS_GTK_FOLDER_LIST_STORE (inner_model)) {
+               return tny_gtk_folder_list_store_get_activity (TNY_GTK_FOLDER_LIST_STORE (inner_model));
+       } else {
+               return FALSE;
+       }
 }
 
 #ifdef MODEST_TOOLKIT_HILDON2
@@ -4131,8 +4192,6 @@ on_activity_changed (TnyGtkFolderListStore *store,
        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);
 }