[gnome-screenshot] screenshot: implement an overwrite dialog for interactive mode



commit 0737d4ec4eec889a2b2e4dcff806954b26e700a3
Author: Cosimo Cecchi <cosimoc gnome org>
Date:   Thu Jan 26 16:34:46 2012 -0500

    screenshot: implement an overwrite dialog for interactive mode
    
    If we're in interactive mode, and we specify a name already in use,
    trigger an overwrite confirmation dialog.

 src/screenshot-application.c |   97 ++++++++++++++++++++++++++++++++++--------
 src/screenshot-utils.c       |   27 +++++++----
 src/screenshot-utils.h       |    8 ++-
 3 files changed, 101 insertions(+), 31 deletions(-)
---
diff --git a/src/screenshot-application.c b/src/screenshot-application.c
index 7e67898..157a7fc 100644
--- a/src/screenshot-application.c
+++ b/src/screenshot-application.c
@@ -47,6 +47,8 @@ G_DEFINE_TYPE (ScreenshotApplication, screenshot_application, GTK_TYPE_APPLICATI
 
 static ScreenshotApplication *_app_singleton = NULL;
 
+static void screenshot_save_to_file (ScreenshotApplication *self);
+
 struct _ScreenshotApplicationPriv {
   GDBusConnection *connection;
 
@@ -54,6 +56,7 @@ struct _ScreenshotApplicationPriv {
   GdkPixbuf *screenshot;
 
   gchar *save_uri;
+  gboolean should_overwrite;
 
   ScreenshotDialog *dialog;
 };
@@ -125,16 +128,54 @@ save_pixbuf_handle_success (ScreenshotApplication *self)
 }
 
 static void
-save_pixbuf_handle_error (ScreenshotApplication *self)
+save_pixbuf_handle_error (ScreenshotApplication *self,
+                          GError *error)
 {
   if (screenshot_config->interactive)
     {
       ScreenshotDialog *dialog = self->priv->dialog;
+      GtkWidget *toplevel = screenshot_dialog_get_toplevel (dialog);
 
       screenshot_dialog_set_busy (dialog, FALSE);
-      screenshot_show_error_dialog (GTK_WINDOW (screenshot_dialog_get_toplevel (dialog)),
-                                    _("Unable to capture a screenshot"),
-                                    _("Error creating file. Please choose another location and retry."));
+
+      if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_EXISTS) &&
+          !self->priv->should_overwrite)
+        {
+          gchar *folder = screenshot_dialog_get_folder (dialog);
+          gchar *folder_name = g_path_get_basename (folder);
+          gchar *file_name = screenshot_dialog_get_filename (dialog);
+          gchar *detail = g_strdup_printf (_("A file named \"%s\" already exists in \"%s\""),
+                                           file_name, folder_name);
+          gint response;
+                                             
+          response = screenshot_show_dialog (GTK_WINDOW (toplevel),
+                                             GTK_MESSAGE_WARNING,
+                                             GTK_BUTTONS_YES_NO,
+                                             _("Overwrite existing file?"),
+                                             detail);
+
+          g_free (folder);
+          g_free (folder_name);
+          g_free (file_name);
+          g_free (detail);
+
+          if (response == GTK_RESPONSE_YES)
+            {
+              self->priv->should_overwrite = TRUE;
+              screenshot_save_to_file (self);
+
+              return;
+            }
+        }
+      else
+        {
+          screenshot_show_dialog (GTK_WINDOW (toplevel),
+                                  GTK_MESSAGE_ERROR,
+                                  GTK_BUTTONS_OK,
+                                  _("Unable to capture a screenshot"),
+                                  _("Error creating file. Please choose another location and retry."));
+        }
+
       screenshot_dialog_focus_entry (dialog);
     }
   else
@@ -156,8 +197,8 @@ save_pixbuf_ready_cb (GObject *source,
 
   if (error != NULL)
     {
+      save_pixbuf_handle_error (self, error);
       g_error_free (error);
-      save_pixbuf_handle_error (self);
       return;
     }
 
@@ -173,12 +214,15 @@ save_file_create_ready_cb (GObject *source,
   GFileOutputStream *os;
   GError *error = NULL;
 
-  os = g_file_create_finish (G_FILE (source), res, &error);
+  if (self->priv->should_overwrite)
+    os = g_file_replace_finish (G_FILE (source), res, &error);
+  else
+    os = g_file_create_finish (G_FILE (source), res, &error);
 
   if (error != NULL)
     {
+      save_pixbuf_handle_error (self, error);
       g_error_free (error);
-      save_pixbuf_handle_error (self);
       return;
     }
 
@@ -210,11 +254,24 @@ screenshot_save_to_file (ScreenshotApplication *self)
     screenshot_dialog_set_busy (self->priv->dialog, TRUE);
 
   target_file = g_file_new_for_uri (self->priv->save_uri);
-  g_file_create_async (target_file,
-                       G_FILE_CREATE_NONE,
-                       G_PRIORITY_DEFAULT,
-                       NULL,
-                       save_file_create_ready_cb, self);
+
+  if (self->priv->should_overwrite)
+    {
+      g_file_replace_async (target_file,
+                            NULL, FALSE,
+                            G_FILE_CREATE_NONE,
+                            G_PRIORITY_DEFAULT,
+                            NULL, 
+                            save_file_create_ready_cb, self);
+    }
+  else
+    {
+      g_file_create_async (target_file,
+                           G_FILE_CREATE_NONE,
+                           G_PRIORITY_DEFAULT,
+                           NULL,
+                           save_file_create_ready_cb, self);
+    }
 
   g_object_unref (target_file);
 }
@@ -279,9 +336,11 @@ build_filename_ready_cb (GObject *source,
       g_error_free (error);
 
       if (screenshot_config->interactive)
-        screenshot_show_error_dialog (NULL,
-                                      _("Unable to capture a screenshot"),
-                                      _("Error creating file"));
+        screenshot_show_dialog (NULL,
+                                GTK_MESSAGE_ERROR,
+                                GTK_BUTTONS_OK,
+                                _("Unable to capture a screenshot"),
+                                _("Error creating file"));
       else
         screenshot_play_sound_effect ("dialog-error", _("Unable to capture a screenshot"));
 
@@ -323,9 +382,11 @@ finish_prepare_screenshot (ScreenshotApplication *self,
       g_critical ("Unable to capture a screenshot of any window");
 
       if (screenshot_config->interactive)
-        screenshot_show_error_dialog (NULL,
-                                      _("Unable to capture a screenshot"),
-                                      _("All possible methods failed"));
+        screenshot_show_dialog (NULL,
+                                GTK_MESSAGE_ERROR,
+                                GTK_BUTTONS_OK,
+                                _("Unable to capture a screenshot"),
+                                _("All possible methods failed"));
       else
         screenshot_play_sound_effect ("dialog-error", _("Unable to capture a screenshot"));
 
diff --git a/src/screenshot-utils.c b/src/screenshot-utils.c
index bfa3d08..e1d7be7 100644
--- a/src/screenshot-utils.c
+++ b/src/screenshot-utils.c
@@ -663,21 +663,24 @@ screenshot_get_pixbuf (GdkRectangle *rectangle)
   return screenshot;
 }
 
-void
-screenshot_show_error_dialog (GtkWindow   *parent,
-                              const gchar *message,
-                              const gchar *detail)
+gint
+screenshot_show_dialog (GtkWindow   *parent,
+                        GtkMessageType message_type,
+                        GtkButtonsType buttons_type,
+                        const gchar *message,
+                        const gchar *detail)
 {
   GtkWidget *dialog;
   GtkWindowGroup *group;
+  gint response;
 
   g_return_if_fail ((parent == NULL) || (GTK_IS_WINDOW (parent)));
   g_return_if_fail (message != NULL);
   
   dialog = gtk_message_dialog_new (parent,
   				   GTK_DIALOG_DESTROY_WITH_PARENT,
-  				   GTK_MESSAGE_ERROR,
-  				   GTK_BUTTONS_OK,
+  				   message_type,
+  				   buttons_type,
   				   "%s", message);
   gtk_window_set_title (GTK_WINDOW (dialog), "");
   
@@ -692,9 +695,11 @@ screenshot_show_error_dialog (GtkWindow   *parent,
         gtk_window_group_add_window (group, GTK_WINDOW (dialog));
     }
 
-  gtk_dialog_run (GTK_DIALOG (dialog));
+  response = gtk_dialog_run (GTK_DIALOG (dialog));
   
   gtk_widget_destroy (dialog);
+
+  return response;
 }
 
 void
@@ -708,9 +713,11 @@ screenshot_display_help (GtkWindow *parent)
 
   if (error)
     {
-      screenshot_show_error_dialog (parent, 
-                                    _("Error loading the help page"), 
-                                    error->message);
+      screenshot_show_dialog (parent, 
+                              GTK_MESSAGE_ERROR,
+                              GTK_BUTTONS_OK,
+                              _("Error loading the help page"), 
+                              error->message);
       g_error_free (error);
     }
 }
diff --git a/src/screenshot-utils.h b/src/screenshot-utils.h
index 54d6d33..6beea05 100644
--- a/src/screenshot-utils.h
+++ b/src/screenshot-utils.h
@@ -27,9 +27,11 @@ G_BEGIN_DECLS
 
 GdkPixbuf *screenshot_get_pixbuf          (GdkRectangle *rectangle);
 
-void       screenshot_show_error_dialog   (GtkWindow   *parent,
-                                           const gchar *message,
-                                           const gchar *detail);
+gint       screenshot_show_dialog   (GtkWindow   *parent,
+                                     GtkMessageType message_type,
+                                     GtkButtonsType buttons_type,
+                                     const gchar *message,
+                                     const gchar *detail);
 void       screenshot_play_sound_effect (const gchar *event_id,
                                          const gchar *event_desc);
 void       screenshot_display_help        (GtkWindow *parent);



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