[evolution] Bug 776584 - Remember last selected file chooser folder



commit 9f0df5c135adc5725ff90a57203133e6aee8e32d
Author: Milan Crha <mcrha redhat com>
Date:   Tue Jan 3 15:51:31 2017 +0100

    Bug 776584 - Remember last selected file chooser folder

 src/composer/e-composer-actions.c         |    3 +
 src/e-util/e-attachment-store.c           |    7 +++
 src/e-util/e-html-editor-actions.c        |    6 +++
 src/e-util/e-misc-utils.c                 |   62 +++++++++++++++++++++++++++++
 src/e-util/e-misc-utils.h                 |    2 +
 src/e-util/e-web-view.c                   |    7 +++-
 src/plugins/save-calendar/save-calendar.c |    4 ++
 src/shell/e-shell-utils.c                 |   14 ++++++-
 8 files changed, 102 insertions(+), 3 deletions(-)
---
diff --git a/src/composer/e-composer-actions.c b/src/composer/e-composer-actions.c
index 5d88b76..0620237 100644
--- a/src/composer/e-composer-actions.c
+++ b/src/composer/e-composer-actions.c
@@ -235,11 +235,14 @@ action_save_as_cb (GtkAction *action,
        gtk_window_set_icon_name (
                GTK_WINDOW (dialog), "mail-message-new");
 
+       e_util_load_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
        if (response != GTK_RESPONSE_OK)
                goto exit;
 
+       e_util_save_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
+
        editor = e_msg_composer_get_editor (composer);
        filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
        e_html_editor_set_filename (editor, filename);
diff --git a/src/e-util/e-attachment-store.c b/src/e-util/e-attachment-store.c
index e1191fc..fb3c4d8 100644
--- a/src/e-util/e-attachment-store.c
+++ b/src/e-util/e-attachment-store.c
@@ -723,6 +723,8 @@ e_attachment_store_run_load_dialog (EAttachmentStore *store,
        gtk_file_chooser_set_extra_widget (file_chooser, extra_box_widget);
        gtk_widget_show_all (extra_box_widget);
 
+       e_util_load_file_chooser_folder (file_chooser);
+
        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
 #ifdef HAVE_AUTOAR
@@ -732,6 +734,8 @@ e_attachment_store_run_load_dialog (EAttachmentStore *store,
 #endif
                goto exit;
 
+       e_util_save_file_chooser_folder (file_chooser);
+
        files = gtk_file_chooser_get_files (file_chooser);
        active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (option_display));
        disposition = active ? "inline" : "attachment";
@@ -895,6 +899,8 @@ e_attachment_store_run_save_dialog (EAttachmentStore *store,
                g_clear_object (&file_info);
        }
 
+       e_util_load_file_chooser_folder (file_chooser);
+
        response = gtk_dialog_run (GTK_DIALOG (dialog));
 
        if (response == GTK_RESPONSE_OK) {
@@ -902,6 +908,7 @@ e_attachment_store_run_save_dialog (EAttachmentStore *store,
                gboolean save_self, save_extracted;
 #endif
 
+               e_util_save_file_chooser_folder (file_chooser);
                destination = gtk_file_chooser_get_file (file_chooser);
 
 #ifdef HAVE_AUTOAR
diff --git a/src/e-util/e-html-editor-actions.c b/src/e-util/e-html-editor-actions.c
index 79ac0c8..4849d5f 100644
--- a/src/e-util/e-html-editor-actions.c
+++ b/src/e-util/e-html-editor-actions.c
@@ -326,9 +326,12 @@ action_insert_html_file_cb (GtkToggleAction *action,
        gtk_file_filter_add_mime_type (filter, "text/html");
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
+       e_util_load_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
+
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
                GFile *file;
 
+               e_util_save_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
                file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
 
                /* XXX Need a way to cancel this. */
@@ -417,9 +420,12 @@ action_insert_text_file_cb (GtkAction *action,
        gtk_file_filter_add_mime_type (filter, "text/plain");
        gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (dialog), filter);
 
+       e_util_load_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
+
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
                GFile *file;
 
+               e_util_save_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
                file = gtk_file_chooser_get_file (GTK_FILE_CHOOSER (dialog));
 
                /* XXX Need a way to cancel this. */
diff --git a/src/e-util/e-misc-utils.c b/src/e-util/e-misc-utils.c
index 11edab6..e97c2f8 100644
--- a/src/e-util/e-misc-utils.c
+++ b/src/e-util/e-misc-utils.c
@@ -3821,3 +3821,65 @@ e_util_invoke_g_dbus_proxy_call_sync_wrapper_full (GDBusProxy *dbus_proxy,
 
        return var_result;
 }
+
+/**
+ * e_util_save_file_chooser_folder:
+ * @file_chooser: a #GtkFileChooser
+ *
+ * Saves the current folder of the @file_chooser, thus it could be used
+ * by e_util_load_file_chooser_folder() to open it in the last chosen folder.
+ *
+ * Since: 3.24
+ **/
+void
+e_util_save_file_chooser_folder (GtkFileChooser *file_chooser)
+{
+       GSettings *settings;
+       gchar *uri;
+
+       g_return_if_fail (GTK_IS_FILE_CHOOSER (file_chooser));
+
+       uri = gtk_file_chooser_get_current_folder_uri (file_chooser);
+       if (uri && g_str_has_prefix (uri, "file://")) {
+               settings = e_util_ref_settings ("org.gnome.evolution.shell");
+               g_settings_set_string (settings, "file-chooser-folder", uri);
+               g_object_unref (settings);
+       }
+
+       g_free (uri);
+}
+
+/**
+ * e_util_load_file_chooser_folder:
+ * @file_chooser: a #GtkFileChooser
+ *
+ * Sets the current folder to the @file_chooser to the one previously saved
+ * by e_util_save_file_chooser_folder(). The function does nothing if none
+ * or invalid is saved.
+ *
+ * Since: 3.24
+ **/
+void
+e_util_load_file_chooser_folder (GtkFileChooser *file_chooser)
+{
+       GSettings *settings;
+       gchar *uri;
+
+       g_return_if_fail (GTK_IS_FILE_CHOOSER (file_chooser));
+
+       settings = e_util_ref_settings ("org.gnome.evolution.shell");
+       uri = g_settings_get_string (settings, "file-chooser-folder");
+       g_object_unref (settings);
+
+       if (uri && g_str_has_prefix (uri, "file://")) {
+               gchar *filename;
+
+               filename = g_filename_from_uri (uri, NULL, NULL);
+               if (filename && g_file_test (filename, G_FILE_TEST_IS_DIR))
+                       gtk_file_chooser_set_current_folder_uri (file_chooser, uri);
+
+               g_free (filename);
+       }
+
+       g_free (uri);
+}
diff --git a/src/e-util/e-misc-utils.h b/src/e-util/e-misc-utils.h
index f7848ac..abe7678 100644
--- a/src/e-util/e-misc-utils.h
+++ b/src/e-util/e-misc-utils.h
@@ -328,6 +328,8 @@ GVariant *  e_util_invoke_g_dbus_proxy_call_sync_wrapper_full
                                                 gint timeout_msec,
                                                 GCancellable *cancellable,
                                                 GError **error);
+void           e_util_save_file_chooser_folder (GtkFileChooser *file_chooser);
+void           e_util_load_file_chooser_folder (GtkFileChooser *file_chooser);
 
 G_END_DECLS
 
diff --git a/src/e-util/e-web-view.c b/src/e-util/e-web-view.c
index b40c499..a6ef841 100644
--- a/src/e-util/e-web-view.c
+++ b/src/e-util/e-web-view.c
@@ -4069,8 +4069,13 @@ e_web_view_cursor_image_save (EWebView *web_view)
                g_free (suggestion);
        }
 
-       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+       e_util_load_file_chooser_folder (file_chooser);
+
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+               e_util_save_file_chooser_folder (file_chooser);
+
                destination = gtk_file_chooser_get_file (file_chooser);
+       }
 
        gtk_widget_destroy (dialog);
 
diff --git a/src/plugins/save-calendar/save-calendar.c b/src/plugins/save-calendar/save-calendar.c
index 3ee0f2e..9f29152 100644
--- a/src/plugins/save-calendar/save-calendar.c
+++ b/src/plugins/save-calendar/save-calendar.c
@@ -194,9 +194,13 @@ ask_destination_and_save (ESourceSelector *selector,
        gtk_widget_show (GTK_WIDGET (combo));
        gtk_widget_show (extra_widget);
 
+       e_util_load_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
+
        if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK) {
                gchar *tmp = NULL;
 
+               e_util_save_file_chooser_folder (GTK_FILE_CHOOSER (dialog));
+
                if (gtk_combo_box_get_active_iter (combo, &iter))
                        gtk_tree_model_get (
                                model, &iter,
diff --git a/src/shell/e-shell-utils.c b/src/shell/e-shell-utils.c
index 01724c1..d825cb9 100644
--- a/src/shell/e-shell-utils.c
+++ b/src/shell/e-shell-utils.c
@@ -77,12 +77,17 @@ e_shell_run_open_dialog (EShell *shell,
 
        gtk_file_chooser_set_local_only (file_chooser, FALSE);
 
+       e_util_load_file_chooser_folder (file_chooser);
+
        /* Allow further customizations before running the dialog. */
        if (customize_func != NULL)
                customize_func (dialog, customize_data);
 
-       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+               e_util_save_file_chooser_folder (file_chooser);
+
                chosen_file = gtk_file_chooser_get_file (file_chooser);
+       }
 
        gtk_widget_destroy (dialog);
 
@@ -204,12 +209,17 @@ e_shell_run_save_dialog (EShell *shell,
                g_strfreev (flts);
        }
 
+       e_util_load_file_chooser_folder (file_chooser);
+
        /* Allow further customizations before running the dialog. */
        if (customize_func != NULL)
                customize_func (dialog, customize_data);
 
-       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT)
+       if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_ACCEPT) {
+               e_util_save_file_chooser_folder (file_chooser);
+
                chosen_file = gtk_file_chooser_get_file (file_chooser);
+       }
 
        gtk_widget_destroy (dialog);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]