X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;f=src%2Fwidgets%2Fmodest-folder-view.c;h=1fc6cf2d3fe248bf2564ed2922375f94c323b6ae;hb=eb46b1a39b2c65cfeaa37e5100ab4164098d8728;hp=ab6e1b6086b8f1daeba2c2b54ed2e0e202805069;hpb=cf0c05e9174312cd577b7f73c5af992d54a259e2;p=modest diff --git a/src/widgets/modest-folder-view.c b/src/widgets/modest-folder-view.c index ab6e1b6..1fc6cf2 100644 --- a/src/widgets/modest-folder-view.c +++ b/src/widgets/modest-folder-view.c @@ -232,8 +232,10 @@ struct _ModestFolderViewPrivate { 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; @@ -374,7 +376,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 +520,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 +537,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; @@ -645,7 +668,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,7 +706,7 @@ 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); } @@ -1094,6 +1121,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 @@ -1149,6 +1177,7 @@ modest_folder_view_init (ModestFolderView *obj) 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; @@ -1165,6 +1194,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)); @@ -1266,6 +1296,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 +1608,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), @@ -1743,6 +1775,9 @@ foreach_folder_with_id (GtkTreeModel *model, } } + if (instance) + g_object_unref (instance); + return info->found; } @@ -1839,11 +1874,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 +1889,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 +1932,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 +1995,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 */ @@ -1961,9 +2019,37 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) } if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_LOCAL_FOLDERS)) { - if (!modest_tny_folder_store_is_remote (TNY_FOLDER_STORE (instance))) { + 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)) { @@ -2042,6 +2128,7 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) /* Free */ g_object_unref (instance); + g_free (fname); return retval; } @@ -3350,6 +3437,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; @@ -3381,6 +3469,7 @@ modest_folder_view_select_first_inbox_or_local (ModestFolderView *self) /* set focus */ gtk_widget_grab_focus (GTK_WIDGET(self)); +#endif } @@ -3639,6 +3728,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, @@ -3717,7 +3822,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)); @@ -3858,3 +3963,33 @@ 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; +}