* Fixes NB#100011, just created child folders are visible again
[modest] / src / widgets / modest-folder-view.c
index be66797..cd9ad27 100644 (file)
@@ -44,6 +44,7 @@
 #include <tny-camel-folder.h>
 #include <tny-simple-list.h>
 #include <tny-camel-account.h>
+#include <modest-defs.h>
 #include <modest-tny-account.h>
 #include <modest-tny-folder.h>
 #include <modest-tny-local-folders-account.h>
@@ -200,6 +201,7 @@ enum {
        FOLDER_SELECTION_CHANGED_SIGNAL,
        FOLDER_DISPLAY_NAME_CHANGED_SIGNAL,
        FOLDER_ACTIVATED_SIGNAL,
+       VISIBLE_ACCOUNT_CHANGED_SIGNAL,
        LAST_SIGNAL
 };
 
@@ -230,6 +232,7 @@ struct _ModestFolderViewPrivate {
 
        gchar                *local_account_name;
        gchar                *visible_account_id;
+       gchar                *mailbox;
        ModestFolderViewStyle style;
        ModestFolderViewCellStyle cell_style;
 
@@ -338,6 +341,19 @@ modest_folder_view_class_init (ModestFolderViewClass *klass)
                              g_cclosure_marshal_VOID__POINTER,
                              G_TYPE_NONE, 1, G_TYPE_POINTER);
 
+       /*
+        * Emitted whenever the visible account changes
+        */
+       signals[VISIBLE_ACCOUNT_CHANGED_SIGNAL] =
+               g_signal_new ("visible-account-changed",
+                             G_TYPE_FROM_CLASS (gobject_class),
+                             G_SIGNAL_RUN_FIRST,
+                             G_STRUCT_OFFSET (ModestFolderViewClass,
+                                              visible_account_changed),
+                             NULL, NULL,
+                             g_cclosure_marshal_VOID__STRING,
+                             G_TYPE_NONE, 1, G_TYPE_STRING);
+
        treeview_class->select_cursor_parent = NULL;
 
 #ifdef MODEST_TOOLKIT_HILDON2
@@ -503,6 +519,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)
@@ -519,6 +536,22 @@ 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;
+               }
+       }
+
        if (!is_special || multiaccount) {
                TnyAccount *account = tny_folder_get_account (folder);
                const gchar *folder_name;
@@ -664,7 +697,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);
        }
@@ -1134,6 +1167,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;
@@ -1251,6 +1285,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 (),
@@ -1562,6 +1597,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),
@@ -1728,6 +1764,9 @@ foreach_folder_with_id (GtkTreeModel *model,
                }
        }
 
+       if (instance)
+               g_object_unref (instance);
+
        return info->found;
        
 }
@@ -1824,11 +1863,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);
@@ -1837,8 +1878,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);
@@ -1878,8 +1921,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);
@@ -1903,7 +1955,7 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 
        /* If this is a move to dialog, hide Sent, Outbox and Drafts
        folder as no message can be move there according to UI specs */
-       if (!priv->show_non_move) {
+       if (retval && !priv->show_non_move) {
                if (priv->list_to_move && 
                    tny_list_get_length (priv->list_to_move) > 0 &&
                    TNY_IS_FOLDER (instance)) {
@@ -1940,6 +1992,45 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
                        return FALSE;
        }
 
+       if (retval && (priv->filter & MODEST_FOLDER_VIEW_FILTER_HIDE_FOLDERS)) {
+               if (TNY_IS_FOLDER (instance))
+                       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 */
@@ -2016,6 +2107,7 @@ filter_row (GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
 
        /* Free */
        g_object_unref (instance);
+        g_free (fname);
 
        return retval;
 }
@@ -3269,6 +3361,11 @@ modest_folder_view_set_account_id_of_visible_server_account (ModestFolderView *s
        /* Save settings to gconf */
        modest_widget_memory_save (modest_runtime_get_conf (), G_OBJECT(self),
                                   MODEST_CONF_FOLDER_VIEW_KEY);
+
+       /* Notify observers */
+       g_signal_emit (G_OBJECT(self),
+                      signals[VISIBLE_ACCOUNT_CHANGED_SIGNAL], 0,
+                      account_id);
 }
 
 const gchar *
@@ -3827,3 +3924,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;
+}