[evince] [shell] Remember and reuse "Save a Copy..." path



commit cd072866af05d7a5beadb6534b562a296cd85511
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Thu May 21 20:10:24 2009 +0200

    [shell] Remember and reuse "Save a Copy..." path
    
    Fixes bgo#485195.
---
 shell/ev-application.c |   35 ++++++++++++++----
 shell/ev-application.h |    6 ++-
 shell/ev-window.c      |   89 ++++++++++++++++++++++++++++++++++--------------
 3 files changed, 94 insertions(+), 36 deletions(-)

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);



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