From cd072866af05d7a5beadb6534b562a296cd85511 Mon Sep 17 00:00:00 2001 From: Carlos Garcia Campos Date: Thu, 21 May 2009 18:10:24 +0000 Subject: [shell] Remember and reuse "Save a Copy..." path Fixes bgo#485195. --- (limited to 'shell') diff --git a/shell/ev-application.c b/shell/ev-application.c index 9c7770a..6a3367f 100644 --- a/shell/ev-application.c +++ b/shell/ev-application.c @@ -68,7 +68,8 @@ struct _EvApplication { EggSMClient *smclient; - gchar *last_chooser_uri; + gchar *filechooser_open_uri; + gchar *filechooser_save_uri; #ifdef ENABLE_DBUS EvMediaPlayerKeys *keys; @@ -786,8 +787,10 @@ ev_application_shutdown (EvApplication *application) g_free (application->dot_dir); application->dot_dir = NULL; - g_free (application->last_chooser_uri); - application->last_chooser_uri = NULL; + g_free (application->filechooser_open_uri); + application->filechooser_open_uri = NULL; + g_free (application->filechooser_save_uri); + application->filechooser_save_uri = NULL; g_object_unref (application); instance = NULL; @@ -924,16 +927,32 @@ ev_application_save_toolbars_model (EvApplication *application) } void -ev_application_set_chooser_uri (EvApplication *application, const gchar *uri) +ev_application_set_filechooser_uri (EvApplication *application, + GtkFileChooserAction action, + const gchar *uri) { - g_free (application->last_chooser_uri); - application->last_chooser_uri = g_strdup (uri); + if (action == GTK_FILE_CHOOSER_ACTION_OPEN) { + g_free (application->filechooser_open_uri); + application->filechooser_open_uri = g_strdup (uri); + } else if (action == GTK_FILE_CHOOSER_ACTION_SAVE) { + g_free (application->filechooser_save_uri); + application->filechooser_save_uri = g_strdup (uri); + } } const gchar * -ev_application_get_chooser_uri (EvApplication *application) +ev_application_get_filechooser_uri (EvApplication *application, + GtkFileChooserAction action) { - return application->last_chooser_uri; + if (action == GTK_FILE_CHOOSER_ACTION_OPEN) { + if (application->filechooser_open_uri) + return application->filechooser_open_uri; + } else if (action == GTK_FILE_CHOOSER_ACTION_SAVE) { + if (application->filechooser_save_uri) + return application->filechooser_save_uri; + } + + return NULL; } void diff --git a/shell/ev-application.h b/shell/ev-application.h index ee38aea..184927b 100644 --- a/shell/ev-application.h +++ b/shell/ev-application.h @@ -79,9 +79,11 @@ GObject *ev_application_get_media_keys (EvApplication *application); EggToolbarsModel *ev_application_get_toolbars_model (EvApplication *application); void ev_application_save_toolbars_model (EvApplication *application); -void ev_application_set_chooser_uri (EvApplication *application, +void ev_application_set_filechooser_uri (EvApplication *application, + GtkFileChooserAction action, const gchar *uri); -const gchar *ev_application_get_chooser_uri (EvApplication *application); +const gchar *ev_application_get_filechooser_uri (EvApplication *application, + GtkFileChooserAction action); void ev_application_screensaver_enable (EvApplication *application); void ev_application_screensaver_disable (EvApplication *application); GtkPrintSettings *ev_application_get_print_settings (EvApplication *application); diff --git a/shell/ev-window.c b/shell/ev-window.c index 1f368ec..2926828 100644 --- a/shell/ev-window.c +++ b/shell/ev-window.c @@ -2021,24 +2021,25 @@ file_open_dialog_response_cb (GtkWidget *chooser, gint response_id, EvWindow *ev_window) { - gchar *uri; - if (response_id == GTK_RESPONSE_OK) { GSList *uris; + gchar *uri; uris = gtk_file_chooser_get_uris (GTK_FILE_CHOOSER (chooser)); ev_application_open_uri_list (EV_APP, uris, gtk_window_get_screen (GTK_WINDOW (ev_window)), GDK_CURRENT_TIME); - - g_slist_foreach (uris, (GFunc)g_free, NULL); + + g_slist_foreach (uris, (GFunc)g_free, NULL); g_slist_free (uris); - } - uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (chooser)); - ev_application_set_chooser_uri (EV_APP, uri); - g_free (uri); + uri = gtk_file_chooser_get_current_folder_uri (GTK_FILE_CHOOSER (chooser)); + ev_application_set_filechooser_uri (EV_APP, + GTK_FILE_CHOOSER_ACTION_OPEN, + uri); + g_free (uri); + } gtk_widget_destroy (chooser); } @@ -2046,7 +2047,9 @@ file_open_dialog_response_cb (GtkWidget *chooser, static void ev_window_cmd_file_open (GtkAction *action, EvWindow *window) { - GtkWidget *chooser; + GtkWidget *chooser; + const gchar *default_uri; + gchar *parent_uri = NULL; chooser = gtk_file_chooser_dialog_new (_("Open Document"), GTK_WINDOW (window), @@ -2059,12 +2062,23 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) ev_document_factory_add_filters (chooser, NULL); gtk_file_chooser_set_select_multiple (GTK_FILE_CHOOSER (chooser), TRUE); gtk_file_chooser_set_local_only (GTK_FILE_CHOOSER (chooser), FALSE); - if (ev_application_get_chooser_uri (EV_APP) != NULL) { - gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser), - ev_application_get_chooser_uri (EV_APP)); - } else if (window->priv->uri != NULL) { - gtk_file_chooser_set_uri (GTK_FILE_CHOOSER (chooser), - window->priv->uri); + + default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_OPEN); + if (!default_uri && window->priv->uri) { + GFile *file, *parent; + + file = g_file_new_for_uri (window->priv->uri); + parent = g_file_get_parent (file); + if (parent) { + parent_uri = g_file_get_uri (parent); + default_uri = parent_uri; + g_object_unref (parent); + } + g_object_unref (file); + } + + if (default_uri) { + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (chooser), default_uri); } else { const gchar *folder; @@ -2072,7 +2086,8 @@ ev_window_cmd_file_open (GtkAction *action, EvWindow *window) gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (chooser), folder ? folder : g_get_home_dir ()); } - + g_free (parent_uri); + g_signal_connect (chooser, "response", G_CALLBACK (file_open_dialog_response_cb), window); @@ -2538,17 +2553,32 @@ file_save_dialog_response_cb (GtkWidget *fc, EvWindow *ev_window) { gchar *uri; - + GFile *file, *parent; + if (response_id != GTK_RESPONSE_OK) { gtk_widget_destroy (fc); return; } - + uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (fc)); + file = g_file_new_for_uri (uri); + parent = g_file_get_parent (file); + g_object_unref (file); + if (parent) { + gchar *folder_uri; + + folder_uri = g_file_get_uri (parent); + ev_application_set_filechooser_uri (EV_APP, + GTK_FILE_CHOOSER_ACTION_SAVE, + folder_uri); + g_free (folder_uri); + g_object_unref (parent); + } + /* FIXME: remote copy should be done here rather than in the save job, * so that we can track progress and cancel the operation */ - + ev_window_clear_save_job (ev_window); ev_window->priv->save_job = ev_job_save_new (ev_window->priv->document, uri, ev_window->priv->uri); @@ -2568,7 +2598,7 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) GtkWidget *fc; gchar *base_name; GFile *file; - const gchar *folder; + const gchar *default_uri; fc = gtk_file_chooser_dialog_new ( _("Save a Copy"), @@ -2589,14 +2619,21 @@ ev_window_cmd_save_as (GtkAction *action, EvWindow *ev_window) file = g_file_new_for_uri (ev_window->priv->uri); base_name = g_file_get_basename (file); gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fc), base_name); - - folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); - gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc), - folder ? folder : g_get_home_dir ()); - + + default_uri = ev_application_get_filechooser_uri (EV_APP, GTK_FILE_CHOOSER_ACTION_SAVE); + if (default_uri) { + gtk_file_chooser_set_current_folder_uri (GTK_FILE_CHOOSER (fc), default_uri); + } else { + const gchar *folder; + + folder = g_get_user_special_dir (G_USER_DIRECTORY_DOCUMENTS); + gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (fc), + folder ? folder : g_get_home_dir ()); + } + g_object_unref (file); g_free (base_name); - + g_signal_connect (fc, "response", G_CALLBACK (file_save_dialog_response_cb), ev_window); -- cgit v0.9.1