[gimp: 10/27] app: Add an 'export' mode to the file save dialog



commit 0971d61fc4be3e846e3d218595465e0ad64e9061
Author: Martin Nordholts <martinn src gnome org>
Date:   Sat Apr 25 10:51:07 2009 +0200

    app: Add an 'export' mode to the file save dialog
---
 app/actions/file-commands.c        |    2 +-
 app/dialogs/dialogs-constructors.c |    2 +-
 app/dialogs/file-save-dialog.c     |   75 ++++++++++++++++++++++++++++--------
 app/dialogs/file-save-dialog.h     |    3 +-
 app/file/gimp-file.h               |    1 +
 app/widgets/gimpfiledialog.c       |    7 +++-
 app/widgets/gimpfiledialog.h       |    2 +
 7 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/app/actions/file-commands.c b/app/actions/file-commands.c
index 9132553..88ad264 100644
--- a/app/actions/file-commands.c
+++ b/app/actions/file-commands.c
@@ -513,7 +513,7 @@ file_save_dialog_show (Gimp        *gimp,
       gtk_window_set_title (GTK_WINDOW (dialog), title);
 
       gimp_file_dialog_set_save_image (GIMP_FILE_DIALOG (dialog),
-                                       gimp, image, save_a_copy,
+                                       gimp, image, save_a_copy, FALSE,
                                        close_after_saving);
 
       gtk_window_present (GTK_WINDOW (dialog));
diff --git a/app/dialogs/dialogs-constructors.c b/app/dialogs/dialogs-constructors.c
index fbdcd5c..329d3cb 100644
--- a/app/dialogs/dialogs-constructors.c
+++ b/app/dialogs/dialogs-constructors.c
@@ -125,7 +125,7 @@ dialogs_file_save_new (GimpDialogFactory *factory,
                        GimpContext       *context,
                        gint               view_size)
 {
-  return file_save_dialog_new (context->gimp);
+  return file_save_dialog_new (context->gimp, FALSE);
 }
 
 GtkWidget *
diff --git a/app/dialogs/file-save-dialog.c b/app/dialogs/file-save-dialog.c
index 60c3890..8557428 100644
--- a/app/dialogs/file-save-dialog.c
+++ b/app/dialogs/file-save-dialog.c
@@ -70,6 +70,8 @@ static gboolean  file_save_dialog_check_uri         (GtkWidget            *save_
 static gboolean  file_save_dialog_uri_will_change   (GimpFileDialog       *dialog,
                                                      Gimp                 *gimp);
 static gchar *   file_save_dialog_get_uri           (GimpFileDialog       *dialog);
+static GSList *  file_save_dialog_get_procs         (GimpFileDialog       *dialog,
+                                                     Gimp                 *gimp);
 static void      file_save_dialog_unknown_ext_msg   (GimpFileDialog       *dialog,
                                                      Gimp                 *gimp);
 static gboolean  file_save_dialog_use_extension     (GtkWidget            *save_dialog,
@@ -79,20 +81,34 @@ static gboolean  file_save_dialog_use_extension     (GtkWidget            *save_
 /*  public functions  */
 
 GtkWidget *
-file_save_dialog_new (Gimp *gimp)
+file_save_dialog_new (Gimp     *gimp,
+                      gboolean  export)
 {
   GtkWidget           *dialog;
   GimpFileDialogState *state;
 
-  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
+  if (! export)
+    {
+      dialog = gimp_file_dialog_new (gimp,
+                                     GIMP_FILE_CHOOSER_ACTION_SAVE,
+                                     _("Save Image"), "gimp-file-save",
+                                     GTK_STOCK_SAVE,
+                                     GIMP_HELP_FILE_SAVE);
+
+      state = g_object_get_data (G_OBJECT (gimp), "gimp-file-save-dialog-state");
+    }
+  else
+    {
+      dialog = gimp_file_dialog_new (gimp,
+                                     GIMP_FILE_CHOOSER_ACTION_EXPORT,
+                                     _("Export Image"), "gimp-file-export",
+                                     GTK_STOCK_SAVE,
+                                     GIMP_HELP_FILE_EXPORT);
 
-  dialog = gimp_file_dialog_new (gimp,
-                                 GIMP_FILE_CHOOSER_ACTION_SAVE,
-                                 _("Save Image"), "gimp-file-save",
-                                 GTK_STOCK_SAVE,
-                                 GIMP_HELP_FILE_SAVE);
+      state = g_object_get_data (G_OBJECT (gimp), "gimp-file-export-dialog-state");
+    }
 
-  state = g_object_get_data (G_OBJECT (gimp), "gimp-file-save-dialog-state");
+  g_return_val_if_fail (GIMP_IS_GIMP (gimp), NULL);
 
   if (state)
     gimp_file_dialog_set_state (GIMP_FILE_DIALOG (dialog), state);
@@ -137,9 +153,18 @@ file_save_dialog_response (GtkWidget *save_dialog,
   GimpPlugInProcedure *save_proc;
   gulong               handler_id;
 
-  g_object_set_data_full (G_OBJECT (gimp), "gimp-file-save-dialog-state",
-                          gimp_file_dialog_get_state (dialog),
-                          (GDestroyNotify) gimp_file_dialog_state_destroy);
+  if (! dialog->export)
+    {
+      g_object_set_data_full (G_OBJECT (gimp), "gimp-file-save-dialog-state",
+                              gimp_file_dialog_get_state (dialog),
+                              (GDestroyNotify) gimp_file_dialog_state_destroy);
+    }
+  else
+    {
+      g_object_set_data_full (G_OBJECT (gimp), "gimp-file-export-dialog-state",
+                              gimp_file_dialog_get_state (dialog),
+                              (GDestroyNotify) gimp_file_dialog_state_destroy);
+    }
 
   if (response_id != GTK_RESPONSE_OK)
     {
@@ -163,7 +188,7 @@ file_save_dialog_response (GtkWidget *save_dialog,
                                        uri,
                                        save_proc,
                                        GIMP_RUN_INTERACTIVE,
-                                       ! dialog->save_a_copy,
+                                       ! dialog->save_a_copy && ! dialog->export,
                                        FALSE))
         {
           /* Save was successful, now store the URI in a couple of
@@ -184,6 +209,15 @@ file_save_dialog_response (GtkWidget *save_dialog,
                                  NULL);
             }
 
+          if (! dialog->export)
+            g_object_set_data_full (G_OBJECT (dialog->image->gimp),
+                                    GIMP_FILE_SAVE_LAST_URI_KEY,
+                                    g_strdup (uri), (GDestroyNotify) g_free);
+          else
+            g_object_set_data_full (G_OBJECT (dialog->image->gimp),
+                                    GIMP_FILE_EXPORT_LAST_URI_KEY,
+                                    g_strdup (uri), (GDestroyNotify) g_free);
+
           g_object_set_data_full (G_OBJECT (dialog->image->gimp),
                                   GIMP_FILE_SAVE_LAST_URI_KEY,
                                   g_strdup (uri), (GDestroyNotify) g_free);
@@ -251,9 +285,9 @@ file_save_dialog_check_uri (GtkWidget            *save_dialog,
   basename      = file_utils_uri_display_basename (uri);
 
   save_proc     = dialog->file_proc;
-  uri_proc      = file_procedure_find (gimp->plug_in_manager->save_procs,
+  uri_proc      = file_procedure_find (file_save_dialog_get_procs (dialog, gimp),
                                        uri, NULL);
-  basename_proc = file_procedure_find (gimp->plug_in_manager->save_procs,
+  basename_proc = file_procedure_find (file_save_dialog_get_procs (dialog, gimp),
                                        basename, NULL);
 
   GIMP_LOG (SAVE_DIALOG, "URI = %s", uri);
@@ -301,9 +335,9 @@ file_save_dialog_check_uri (GtkWidget            *save_dialog,
               uri      = ext_uri;
               basename = ext_basename;
 
-              uri_proc      = file_procedure_find (gimp->plug_in_manager->save_procs,
+              uri_proc      = file_procedure_find (file_save_dialog_get_procs (dialog, gimp),
                                                     uri, NULL);
-              basename_proc = file_procedure_find (gimp->plug_in_manager->save_procs,
+              basename_proc = file_procedure_find (file_save_dialog_get_procs (dialog, gimp),
                                                    basename, NULL);
 
               utf8 = g_filename_to_utf8 (basename, -1, NULL, NULL, NULL);
@@ -503,6 +537,15 @@ file_save_dialog_get_uri (GimpFileDialog *dialog)
   return uri;
 }
 
+static GSList *
+file_save_dialog_get_procs (GimpFileDialog *dialog,
+                            Gimp           *gimp)
+{
+  return (! dialog->export ?
+          gimp->plug_in_manager->save_procs :
+          gimp->plug_in_manager->export_procs);
+}
+
 static void
 file_save_dialog_unknown_ext_msg (GimpFileDialog *dialog,
                                   Gimp           *gimp)
diff --git a/app/dialogs/file-save-dialog.h b/app/dialogs/file-save-dialog.h
index c4ac371..a2ec5ed 100644
--- a/app/dialogs/file-save-dialog.h
+++ b/app/dialogs/file-save-dialog.h
@@ -19,7 +19,8 @@
 #define __FILE_SAVE_DIALOG_H__
 
 
-GtkWidget * file_save_dialog_new        (Gimp *gimp);
+GtkWidget * file_save_dialog_new        (Gimp                *gimp,
+                                         gboolean             export);
 
 gboolean    file_save_dialog_save_image (GimpProgress        *progress_and_handler,
                                          Gimp                *gimp,
diff --git a/app/file/gimp-file.h b/app/file/gimp-file.h
index 4e826b9..5044107 100644
--- a/app/file/gimp-file.h
+++ b/app/file/gimp-file.h
@@ -24,6 +24,7 @@
 /* Data keys for Gimp */
 #define GIMP_FILE_OPEN_LAST_URI_KEY     "gimp-file-open-last-uri"
 #define GIMP_FILE_SAVE_LAST_URI_KEY     "gimp-file-save-last-uri"
+#define GIMP_FILE_EXPORT_LAST_URI_KEY   "gimp-file-export-last-uri"
 
 /* Data keys for GimpImage */
 #define GIMP_FILE_SAVE_A_COPY_URI_KEY   "gimp-file-save-a-copy-uri"
diff --git a/app/widgets/gimpfiledialog.c b/app/widgets/gimpfiledialog.c
index e7244e3..4301dc0 100644
--- a/app/widgets/gimpfiledialog.c
+++ b/app/widgets/gimpfiledialog.c
@@ -320,8 +320,11 @@ gimp_file_dialog_new (Gimp                  *gimp,
       break;
 
     case GIMP_FILE_CHOOSER_ACTION_SAVE:
+    case GIMP_FILE_CHOOSER_ACTION_EXPORT:
       gtk_action = GTK_FILE_CHOOSER_ACTION_SAVE;
-      file_procs = gimp->plug_in_manager->save_procs;
+      file_procs = (action == GIMP_FILE_CHOOSER_ACTION_SAVE ?
+                    gimp->plug_in_manager->save_procs :
+                    gimp->plug_in_manager->export_procs);
       automatic  = _("By Extension");
       automatic_help_id = GIMP_HELP_FILE_SAVE_BY_EXTENSION;
 
@@ -461,6 +464,7 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
                                  Gimp           *gimp,
                                  GimpImage      *image,
                                  gboolean        save_a_copy,
+                                 gboolean        export,
                                  gboolean        close_after_saving)
 {
   const gchar *uri = NULL;
@@ -472,6 +476,7 @@ gimp_file_dialog_set_save_image (GimpFileDialog *dialog,
 
   dialog->image              = image;
   dialog->save_a_copy        = save_a_copy;
+  dialog->export             = export;
   dialog->close_after_saving = close_after_saving;
 
   if (save_a_copy)
diff --git a/app/widgets/gimpfiledialog.h b/app/widgets/gimpfiledialog.h
index 34c6d1a..cf4b054 100644
--- a/app/widgets/gimpfiledialog.h
+++ b/app/widgets/gimpfiledialog.h
@@ -43,6 +43,7 @@ struct _GimpFileDialog
   GimpImage            *image;
   gboolean              open_as_layers;
   gboolean              save_a_copy;
+  gboolean              export;
   gboolean              close_after_saving;
 
   GtkWidget            *thumb_box;
@@ -85,6 +86,7 @@ void        gimp_file_dialog_set_save_image (GimpFileDialog       *dialog,
                                              Gimp                 *gimp,
                                              GimpImage            *image,
                                              gboolean              save_a_copy,
+                                             gboolean              export,
                                              gboolean              close_after_saving);
 
 GimpFileDialogState * gimp_file_dialog_get_state     (GimpFileDialog      *dialog);



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