* cleanup icon handling a bit
[modest] / src / widgets / modest-folder-view.c
index 5f68032..bfce187 100644 (file)
@@ -48,6 +48,7 @@
 #include <modest-runtime.h>
 #include "modest-folder-view.h"
 #include <modest-dnd.h>
+#include <modest-platform.h>
 
 /* 'private'/'protected' functions */
 static void modest_folder_view_class_init  (ModestFolderViewClass *klass);
@@ -243,35 +244,6 @@ text_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
 }
 
 
-static GdkPixbuf*
-get_cached_icon (const gchar *name)
-{
-       GError *err = NULL;
-       gpointer pixbuf;
-       gpointer orig_key;
-       static GHashTable *icon_cache = NULL;
-       
-       g_return_val_if_fail (name, NULL);
-
-       if (G_UNLIKELY(!icon_cache))
-               icon_cache = modest_cache_mgr_get_cache (modest_runtime_get_cache_mgr(),
-                                                        MODEST_CACHE_MGR_CACHE_TYPE_PIXBUF);
-       
-       if (!icon_cache || !g_hash_table_lookup_extended (icon_cache, name, &orig_key, &pixbuf)) {
-               pixbuf = (gpointer)gdk_pixbuf_new_from_file (name, &err);
-               if (!pixbuf) {
-                       g_printerr ("modest: error in icon factory while loading '%s': %s\n",
-                                   name, err->message);
-                       g_error_free (err);
-               }
-               /* if we cannot find it, we still insert (if we have a cache), so we get the error
-                * only once */
-               if (icon_cache)
-                       g_hash_table_insert (icon_cache, g_strdup(name),(gpointer)pixbuf);
-       }
-       return GDK_PIXBUF(pixbuf);
-}
-
 
 static void
 icon_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
@@ -298,38 +270,29 @@ icon_cell_data  (GtkTreeViewColumn *column,  GtkCellRenderer *renderer,
 
        switch (type) {
        case TNY_FOLDER_TYPE_ROOT:
-               pixbuf = get_cached_icon (MODEST_FOLDER_ICON_ACCOUNT);
+               pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_ACCOUNT);
                 break;
        case TNY_FOLDER_TYPE_INBOX:
-                pixbuf = get_cached_icon (MODEST_FOLDER_ICON_INBOX);
+                pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_INBOX);
                 break;
         case TNY_FOLDER_TYPE_OUTBOX:
-                pixbuf = get_cached_icon (MODEST_FOLDER_ICON_OUTBOX);
+                pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_OUTBOX);
                 break;
         case TNY_FOLDER_TYPE_JUNK:
-                pixbuf = get_cached_icon (MODEST_FOLDER_ICON_JUNK);
+                pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_JUNK);
                 break;
         case TNY_FOLDER_TYPE_SENT:
-                pixbuf = get_cached_icon (MODEST_FOLDER_ICON_SENT);
+                pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_SENT);
                 break;
        case TNY_FOLDER_TYPE_TRASH:
-               pixbuf = get_cached_icon (MODEST_FOLDER_ICON_TRASH);
+               pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_TRASH);
                 break;
        case TNY_FOLDER_TYPE_DRAFTS:
-               pixbuf = get_cached_icon (MODEST_FOLDER_ICON_DRAFTS);
-                break;
-       case TNY_FOLDER_TYPE_NOTES:
-               pixbuf = get_cached_icon (MODEST_FOLDER_ICON_NOTES);
-                break;
-       case TNY_FOLDER_TYPE_CALENDAR:
-               pixbuf = get_cached_icon (MODEST_FOLDER_ICON_CALENDAR);
-                break;
-       case TNY_FOLDER_TYPE_CONTACTS:
-                pixbuf = get_cached_icon (MODEST_FOLDER_ICON_CONTACTS);
+               pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_DRAFTS);
                 break;
        case TNY_FOLDER_TYPE_NORMAL:
         default:
-                pixbuf = get_cached_icon (MODEST_FOLDER_ICON_NORMAL);
+                pixbuf = modest_platform_get_icon (MODEST_FOLDER_ICON_NORMAL);
                break;
         }
        g_object_set (rendobj, "pixbuf", pixbuf, NULL);
@@ -758,32 +721,31 @@ typedef struct _DndHelper {
 
 /*
  * This function is the callback of the
- * modest_mail_operation_xfer_msg() call. We check here if the message
- * was correctly asynchronously transfered
+ * modest_mail_operation_xfer_msg() and
+ * modest_mail_operation_xfer_folder() calls. We check here if the
+ * message/folder was correctly asynchronously transferred. The reason
+ * to use the same callback is that the code is the same, it only has
+ * to check that the operation went fine and then finalize the drag
+ * and drop action
  */
 static void
 on_progress_changed (ModestMailOperation *mail_op, gpointer user_data)
 {
-       ModestMailOperationQueue *queue;
-       gboolean success = FALSE;
+       gboolean success;
        DndHelper *helper;
 
        helper = (DndHelper *) user_data;
 
+       if (!modest_mail_operation_is_finished (mail_op))
+               return;
+
        if (modest_mail_operation_get_status (mail_op) == 
            MODEST_MAIL_OPERATION_STATUS_SUCCESS) {
                success = TRUE;
        } else {
-               const GError *error;
-               error = modest_mail_operation_get_error (mail_op);
-               g_warning ("Error transferring messages: %s\n", error->message);
+               success = FALSE;
        }
 
-       /* Remove the mail operation */ 
-       queue = modest_runtime_get_mail_operation_queue ();
-       modest_mail_operation_queue_remove (queue, mail_op);
-       g_object_unref (G_OBJECT (mail_op));
-
        /* Notify the drag source. Never call delete, the monitor will
           do the job if needed */
        gtk_drag_finish (helper->context, success, FALSE, helper->time);
@@ -806,9 +768,7 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
 {
        TnyHeader *header;
        TnyFolder *folder;
-       ModestMailOperationQueue *queue;
        ModestMailOperation *mail_op;
-       gboolean started;
        GtkTreeIter source_iter, dest_iter;
 
        /* Get header */
@@ -824,23 +784,13 @@ drag_and_drop_from_header_view (GtkTreeModel *source_model,
                            &folder, -1);
 
        /* Transfer message */
-       queue = modest_runtime_get_mail_operation_queue ();
        mail_op = modest_mail_operation_new ();
-       started = modest_mail_operation_xfer_msg (mail_op, header,
-                                                 folder, helper->delete_source);
-       if (started) {
-               g_signal_connect (G_OBJECT (mail_op), "progress_changed",
-                                 G_CALLBACK (on_progress_changed), helper);
-               modest_mail_operation_queue_add (queue, mail_op);
-       } else {
-               const GError *error;
-               error = modest_mail_operation_get_error (mail_op);
-               if (error)
-                       g_warning ("Error trying to transfer messages: %s\n",
-                                  error->message);
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
+                                        mail_op);
+       g_signal_connect (G_OBJECT (mail_op), "progress-changed",
+                         G_CALLBACK (on_progress_changed), helper);
 
-               g_slice_free (DndHelper, helper);
-       }
+       modest_mail_operation_xfer_msg (mail_op, header, folder, helper->delete_source);
 
        /* Frees */
        g_object_unref (G_OBJECT (mail_op));
@@ -861,20 +811,21 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
                                DndHelper        *helper)
 {
        ModestMailOperation *mail_op;
-       const GError *error;
        GtkTreeIter parent_iter, iter;
-       TnyFolder *folder;
        TnyFolderStore *parent_folder;
-       gboolean success = FALSE;
+       TnyFolder *folder;
 
        /* Check if the drag is possible */
-       if (!gtk_tree_path_compare (helper->source_row, dest_row))
-               goto out;
-
-       if (!gtk_tree_drag_dest_row_drop_possible (GTK_TREE_DRAG_DEST (dest_model),
+       if (!gtk_tree_path_compare (helper->source_row, dest_row) ||
+           !gtk_tree_drag_dest_row_drop_possible (GTK_TREE_DRAG_DEST (dest_model),
                                                   dest_row,
-                                                  selection_data))
-               goto out;
+                                                  selection_data)) {
+
+               gtk_drag_finish (helper->context, FALSE, FALSE, helper->time);
+               gtk_tree_path_free (helper->source_row);        
+               g_slice_free (DndHelper, helper);
+               return;
+       }
 
        /* Get data */
        gtk_tree_model_get_iter (source_model, &parent_iter, dest_row);
@@ -888,26 +839,20 @@ drag_and_drop_from_folder_view (GtkTreeModel     *source_model,
 
        /* Do the mail operation */
        mail_op = modest_mail_operation_new ();
-       modest_mail_operation_xfer_folder (mail_op, folder, parent_folder, 
+       modest_mail_operation_queue_add (modest_runtime_get_mail_operation_queue (), 
+                                        mail_op);
+       g_signal_connect (G_OBJECT (mail_op), "progress-changed",
+                         G_CALLBACK (on_progress_changed), helper);
+
+       modest_mail_operation_xfer_folder (mail_op, 
+                                          folder, 
+                                          parent_folder,
                                           helper->delete_source);
 
+       /* Frees */
        g_object_unref (G_OBJECT (parent_folder));
        g_object_unref (G_OBJECT (folder));
-
-       error = modest_mail_operation_get_error (mail_op);
-       if (error) {
-               g_warning ("Error transferring folder: %s\n", error->message);
-               g_object_unref (G_OBJECT (mail_op));
-               goto out;
-       }
        g_object_unref (G_OBJECT (mail_op));
-       success = TRUE;
- out:
-       gtk_drag_finish (helper->context, success, FALSE, helper->time);
-
-       /* Free the helper */
-       gtk_tree_path_free (helper->source_row);        
-       g_slice_free (DndHelper, helper);
 }
 
 /*