X-Git-Url: http://git.maemo.org/git/?p=modest;a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-folder-view.c;h=47a5f4ee85dba788941feb94823cb45644f9e4c4;hp=1cb1465c297354c115d786a24afdad83d546365c;hb=6d2997c529d0f0eef75ee56242963c29164c1ae7;hpb=5c9abd002cf666909782f21285a3b3411b277710 diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index 1cb1465..47a5f4e 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -62,6 +62,7 @@ #include "modest-dnd.h" #include "modest-ui-constants.h" #include "widgets/modest-window.h" +#include /* 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 }; @@ -228,12 +236,15 @@ struct _ModestFolderViewPrivate { ModestFolderViewFilter filter; TnyFolderStoreQuery *query; + gboolean do_refresh; guint timer_expander; gchar *local_account_name; gchar *visible_account_id; + gchar *mailbox; ModestFolderViewStyle style; ModestFolderViewCellStyle cell_style; + gboolean show_message_count; gboolean reselect; /* we use this to force a reselection of the INBOX */ gboolean show_non_move; @@ -243,6 +254,9 @@ struct _ModestFolderViewPrivate { GtkCellRenderer *messages_renderer; gulong outbox_deleted_handler; + + guint activity_changed_handler; + GdkColor *active_color; }; #define MODEST_FOLDER_VIEW_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), \ @@ -353,6 +367,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 @@ -374,7 +401,7 @@ get_inner_models (ModestFolderView *self, f_model = gtk_tree_view_get_model (GTK_TREE_VIEW (self)); if (!GTK_IS_TREE_MODEL_FILTER(f_model)) { - g_warning ("BUG: %s: not a valid filter model", __FUNCTION__); + g_debug ("%s: emtpy model or not filter model", __FUNCTION__); return FALSE; } @@ -518,6 +545,7 @@ convert_parent_folders_to_dots (gchar **item_name) static void format_compact_style (gchar **item_name, GObject *instance, + const gchar *mailbox, gboolean bold, gboolean multiaccount, gboolean *use_markup) @@ -534,6 +562,26 @@ format_compact_style (gchar **item_name, folder_type = tny_folder_get_folder_type (folder); is_special = (get_cmp_pos (folder_type, folder)!= 4); + if (mailbox) { + /* Remove mailbox prefix if any */ + gchar *prefix = g_strconcat (mailbox, MODEST_FOLDER_PATH_SEPARATOR, NULL); + if (g_str_has_prefix (*item_name, prefix)) { + gchar *new_item_name; + + new_item_name = g_strdup (*item_name + strlen (prefix)); + if (!g_ascii_strcasecmp (new_item_name, "Inbox")) { + g_free (new_item_name); + new_item_name = g_strdup (_("mcen_me_folder_inbox")); + } + g_free (*item_name); + *item_name = new_item_name; + } + } else if (!g_ascii_strcasecmp (*item_name, "Inbox")) { + + g_free (*item_name); + *item_name = g_strdup (_("mcen_me_folder_inbox")); + } + if (!is_special || multiaccount) { TnyAccount *account = tny_folder_get_account (folder); const gchar *folder_name; @@ -558,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, ""); buffer = g_string_append (buffer, folder_name); - if (bold) buffer = g_string_append (buffer, ""); } 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; } @@ -603,9 +649,12 @@ text_cell_data (GtkTreeViewColumn *column, if (type != TNY_FOLDER_TYPE_ROOT) { gint number = 0; gboolean drafts; + gboolean is_local; - if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance)) || - modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance))) { + is_local = 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); @@ -625,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 { @@ -645,7 +694,11 @@ text_cell_data (GtkTreeViewColumn *column, } else { /* Use bold font style if there are unread or unset messages */ if (number > 0) { - item_name = g_strdup_printf ("%s (%d)", fname, number); + if (priv->show_message_count) { + item_name = g_strdup_printf ("%s (%d)", fname, number); + } else { + item_name = g_strdup (fname); + } item_weight = 800; } else { item_name = g_strdup (fname); @@ -679,17 +732,28 @@ text_cell_data (GtkTreeViewColumn *column, multiaccount = (priv->style == MODEST_FOLDER_VIEW_STYLE_SHOW_ALL); /* Convert item_name to markup */ - format_compact_style (&item_name, instance, + format_compact_style (&item_name, instance, priv->mailbox, item_weight == 800, multiaccount, &use_markup); } 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? */ @@ -754,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 @@ -771,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 { @@ -782,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); + } } } @@ -867,9 +937,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, @@ -890,6 +995,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 || @@ -1038,6 +1160,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; @@ -1050,7 +1173,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 */ @@ -1094,6 +1217,7 @@ add_columns (GtkWidget *treeview) #ifdef MODEST_TOOLKIT_HILDON2 "ellipsize", PANGO_ELLIPSIZE_MIDDLE, "ypad", MODEST_MARGIN_DEFAULT, + "xpad", MODEST_MARGIN_DEFAULT, #else "ellipsize", PANGO_ELLIPSIZE_END, #endif @@ -1146,12 +1270,15 @@ 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; + priv->mailbox = NULL; priv->folder_to_select = NULL; priv->outbox_deleted_handler = 0; priv->reexpand = TRUE; + priv->activity_changed_handler = 0; /* Initialize the local account name */ conf = modest_runtime_get_conf(); @@ -1165,6 +1292,7 @@ modest_folder_view_init (ModestFolderView *obj) priv->reselect = FALSE; priv->show_non_move = TRUE; priv->list_to_move = NULL; + priv->show_message_count = TRUE; /* Build treeview */ add_columns (GTK_WIDGET (obj)); @@ -1192,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); @@ -1217,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; @@ -1250,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; @@ -1266,6 +1414,7 @@ modest_folder_view_finalize (GObject *obj) g_free (priv->local_account_name); g_free (priv->visible_account_id); + g_free (priv->mailbox); if (priv->conf_key_signal) { g_signal_handler_disconnect (modest_runtime_get_conf (), @@ -1577,6 +1726,7 @@ on_account_removed (TnyAccountStore *account_store, /* Clear the current visible account_id */ modest_folder_view_set_account_id_of_visible_server_account (self, NULL); + modest_folder_view_set_mailbox (self, NULL); /* Call the restore method, this will set the new visible account */ modest_widget_memory_restore (modest_runtime_get_conf(), G_OBJECT(self), @@ -1648,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; @@ -1662,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); @@ -1743,6 +1901,9 @@ foreach_folder_with_id (GtkTreeModel *model, } } + if (instance) + g_object_unref (instance); + return info->found; } @@ -1839,11 +2000,13 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) gboolean found = FALSE; gboolean cleared = FALSE; ModestTnyFolderRules rules = 0; + gchar *fname; g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (data), FALSE); priv = MODEST_FOLDER_VIEW_GET_PRIVATE (data); gtk_tree_model_get (model, iter, + NAME_COLUMN, &fname, TYPE_COLUMN, &type, INSTANCE_COLUMN, &instance, -1); @@ -1852,8 +2015,10 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) happen when the model is being modified while it's being drawn. This could occur for example when moving folders using drag&drop */ - if (!instance) + if (!instance) { + g_free (fname); return FALSE; + } if (TNY_IS_ACCOUNT (instance)) { TnyAccount *acc = TNY_ACCOUNT (instance); @@ -1893,8 +2058,17 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) strcmp (account_id, MODEST_MMC_ACCOUNT_ID)) { /* Show only the visible account id */ if (priv->visible_account_id) { - if (strcmp (account_id, priv->visible_account_id)) - retval = FALSE; + if (strcmp (account_id, priv->visible_account_id)) { + retval = FALSE; + } else if (priv->mailbox) { + /* Filter mailboxes */ + if (!g_str_has_prefix (fname, priv->mailbox)) { + retval = FALSE; + } else if (!strcmp (fname, priv->mailbox)) { + /* Hide mailbox parent */ + retval = FALSE; + } + } } } g_object_unref (account); @@ -1947,6 +2121,16 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) break; } } + if (retval && TNY_IS_ACCOUNT (instance) && + modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (instance))) { + ModestProtocolType protocol_type; + + protocol_type = modest_tny_account_get_protocol_type (TNY_ACCOUNT (instance)); + retval = !modest_protocol_registry_protocol_type_has_tag + (modest_runtime_get_protocol_registry (), + protocol_type, + MODEST_PROTOCOL_REGISTRY_STORE_FORBID_MESSAGE_ADD); + } } /* apply special filters */ @@ -1960,6 +2144,40 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) return FALSE; } + if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_LOCAL_FOLDERS)) { + if (TNY_IS_ACCOUNT (instance)) { + if (modest_tny_account_is_virtual_local_folders (TNY_ACCOUNT (instance))) + return FALSE; + } else if (TNY_IS_FOLDER (instance)) { + if (modest_tny_folder_is_local_folder (TNY_FOLDER (instance))) + return FALSE; + } + } + + if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_MCC_FOLDERS)) { + if (TNY_IS_ACCOUNT (instance)) { + if (modest_tny_account_is_memory_card_account (TNY_ACCOUNT (instance))) + return FALSE; + } else if (TNY_IS_FOLDER (instance)) { + if (modest_tny_folder_is_memory_card_folder (TNY_FOLDER (instance))) + return FALSE; + } + } + + if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_SHOW_ONLY_MAILBOXES)) { + /* A mailbox is a fake folder with an @ in the middle of the name */ + if (!TNY_IS_FOLDER (instance) || + !(tny_folder_get_caps (TNY_FOLDER (instance)) & TNY_FOLDER_CAPS_NOSELECT)) { + return FALSE; + } else { + const gchar *folder_name; + folder_name = tny_folder_get_name (TNY_FOLDER (instance)); + if (!folder_name || strchr (folder_name, '@') == NULL) + return FALSE; + } + + } + if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_CAN_HAVE_FOLDERS)) { if (TNY_IS_FOLDER (instance)) { /* Check folder rules */ @@ -2036,6 +2254,7 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) /* Free */ g_object_unref (instance); + g_free (fname); return retval; } @@ -2046,7 +2265,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); @@ -2067,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 @@ -2120,6 +2343,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 @@ -2127,6 +2359,11 @@ 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 + g_object_unref (model); g_object_unref (filter_model); g_object_unref (sortable); @@ -3344,6 +3581,7 @@ find_inbox_iter (GtkTreeModel *model, GtkTreeIter *iter, GtkTreeIter *inbox_iter void modest_folder_view_select_first_inbox_or_local (ModestFolderView *self) { +#ifndef MODEST_TOOLKIT_HILDON2 GtkTreeModel *model; GtkTreeIter iter, inbox_iter; GtkTreeSelection *sel; @@ -3375,6 +3613,7 @@ modest_folder_view_select_first_inbox_or_local (ModestFolderView *self) /* set focus */ gtk_widget_grab_focus (GTK_WIDGET(self)); +#endif } @@ -3587,11 +3826,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)); @@ -3601,12 +3851,20 @@ 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 /* Free */ g_object_unref (new_filter_model); @@ -3633,6 +3891,22 @@ modest_folder_view_show_non_move_folders (ModestFolderView *folder_view, } } +void +modest_folder_view_show_message_count (ModestFolderView *folder_view, + gboolean show) +{ + ModestFolderViewPrivate* priv; + + g_return_if_fail (folder_view && MODEST_IS_FOLDER_VIEW (folder_view)); + + priv = MODEST_FOLDER_VIEW_GET_PRIVATE(folder_view); + priv->show_message_count = show; + + g_object_set (G_OBJECT (priv->messages_renderer), + "visible", (priv->cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT && priv->show_message_count), + NULL); +} + /* Returns FALSE if it did not selected anything */ static gboolean _clipboard_set_selected_data (ModestFolderView *folder_view, @@ -3711,7 +3985,7 @@ modest_folder_view_set_cell_style (ModestFolderView *self, priv->cell_style = cell_style; g_object_set (G_OBJECT (priv->messages_renderer), - "visible", (cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT), + "visible", (cell_style == MODEST_FOLDER_VIEW_CELL_STYLE_COMPACT && priv->show_message_count), NULL); gtk_widget_queue_draw (GTK_WIDGET (self)); @@ -3721,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; @@ -3755,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 @@ -3852,3 +4132,67 @@ modest_folder_view_set_list_to_move (ModestFolderView *self, priv->list_to_move = list; } + +void +modest_folder_view_set_mailbox (ModestFolderView *self, const gchar *mailbox) +{ + ModestFolderViewPrivate *priv; + + g_return_if_fail (MODEST_IS_FOLDER_VIEW (self)); + priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); + + if (priv->mailbox) + g_free (priv->mailbox); + + priv->mailbox = g_strdup (mailbox); + + /* Notify observers */ + g_signal_emit (G_OBJECT(self), + signals[VISIBLE_ACCOUNT_CHANGED_SIGNAL], 0, + priv->visible_account_id); +} + +const gchar * +modest_folder_view_get_mailbox (ModestFolderView *self) +{ + ModestFolderViewPrivate *priv; + + g_return_val_if_fail (MODEST_IS_FOLDER_VIEW (self), NULL); + priv = MODEST_FOLDER_VIEW_GET_PRIVATE (self); + + return (const gchar *) priv->mailbox; +} + +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); + + 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 +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); + + g_signal_emit (G_OBJECT (folder_view), signals[ACTIVITY_CHANGED_SIGNAL], 0, + activity); +} +#endif