[gimp] plug-ins, app: port file-gbr to GimpProcedureConfig



commit b8fb09d33002eecfc92b45bb15e44c8b563e5987
Author: Michael Natterer <mitch gimp org>
Date:   Mon Sep 23 19:49:36 2019 +0200

    plug-ins, app: port file-gbr to GimpProcedureConfig
    
    and use the new feature of saving the last config in an image
    parasite.
    
    In app/file-data/fie-data-gbr.c, manually construct the same parasite
    when loading a brush, so its spacing and description are stored in the
    image.
    
    This replaces the "gimp-brush-name" parasite which is now obsolete.

 app/file-data/file-data-gbr.c |  27 ++++++-
 plug-ins/common/file-gbr.c    | 179 +++++++++++++++---------------------------
 2 files changed, 85 insertions(+), 121 deletions(-)
---
diff --git a/app/file-data/file-data-gbr.c b/app/file-data/file-data-gbr.c
index 229fbac45b..5550f3228f 100644
--- a/app/file-data/file-data-gbr.c
+++ b/app/file-data/file-data-gbr.c
@@ -23,6 +23,7 @@
 
 #include "libgimpbase/gimpbase.h"
 #include "libgimpcolor/gimpcolor.h"
+#include "libgimpconfig/gimpconfig.h"
 
 #include "core/core-types.h"
 
@@ -362,12 +363,13 @@ file_gbr_brush_to_image (Gimp      *gimp,
 {
   GimpImage         *image;
   GimpLayer         *layer;
-  const gchar       *name;
   GimpImageBaseType  base_type;
   gint               width;
   gint               height;
   GimpTempBuf       *mask   = gimp_brush_get_mask   (brush);
   GimpTempBuf       *pixmap = gimp_brush_get_pixmap (brush);
+  GString           *string;
+  GimpConfigWriter  *writer;
   GimpParasite      *parasite;
 
   if (pixmap)
@@ -375,19 +377,36 @@ file_gbr_brush_to_image (Gimp      *gimp,
   else
     base_type = GIMP_GRAY;
 
-  name   = gimp_object_get_name (brush);
   width  = gimp_temp_buf_get_width  (mask);
   height = gimp_temp_buf_get_height (mask);
 
   image = gimp_image_new (gimp, width, height, base_type,
                           GIMP_PRECISION_U8_NON_LINEAR);
 
-  parasite = gimp_parasite_new ("gimp-brush-name",
+  string = g_string_new (NULL);
+  writer = gimp_config_writer_new_from_string (string);
+
+  gimp_config_writer_open (writer, "spacing");
+  gimp_config_writer_printf (writer, "%d", gimp_brush_get_spacing (brush));
+  gimp_config_writer_close (writer);
+
+  gimp_config_writer_linefeed (writer);
+
+  gimp_config_writer_open (writer, "description");
+  gimp_config_writer_string (writer, gimp_object_get_name (brush));
+  gimp_config_writer_close (writer);
+
+  gimp_config_writer_finish (writer, NULL, NULL);
+  g_object_unref (writer);
+
+  parasite = gimp_parasite_new ("GimpProcedureConfig-file-gbr-save-last",
                                 GIMP_PARASITE_PERSISTENT,
-                                strlen (name) + 1, name);
+                                string->len + 1, string->str);
   gimp_image_parasite_attach (image, parasite, FALSE);
   gimp_parasite_free (parasite);
 
+  g_string_free (string, TRUE);
+
   layer = file_gbr_brush_to_layer (image, brush);
   gimp_image_add_layer (image, layer, NULL, 0, FALSE);
 
diff --git a/plug-ins/common/file-gbr.c b/plug-ins/common/file-gbr.c
index 108fe7b762..2a7d1e0d84 100644
--- a/plug-ins/common/file-gbr.c
+++ b/plug-ins/common/file-gbr.c
@@ -45,13 +45,6 @@
 #define PLUG_IN_ROLE   "gimp-file-gbr"
 
 
-typedef struct
-{
-  gchar description[256];
-  gint  spacing;
-} BrushInfo;
-
-
 typedef struct _Gbr      Gbr;
 typedef struct _GbrClass GbrClass;
 
@@ -83,21 +76,14 @@ static GimpValueArray * gbr_save             (GimpProcedure        *procedure,
                                               const GimpValueArray *args,
                                               gpointer              run_data);
 
-static gboolean         save_dialog          (void);
-static void             entry_callback       (GtkWidget            *widget,
-                                              gpointer              data);
+static gboolean         save_dialog          (GimpProcedure        *procedure,
+                                              GObject              *config);
 
 
 G_DEFINE_TYPE (Gbr, gbr, GIMP_TYPE_PLUG_IN)
 
 GIMP_MAIN (GBR_TYPE)
 
-static BrushInfo info =
-{
-  "GIMP Brush",
-  10
-};
-
 
 static void
 gbr_class_init (GbrClass *klass)
@@ -181,11 +167,12 @@ gbr_save (GimpProcedure        *procedure,
           const GimpValueArray *args,
           gpointer              run_data)
 {
-  GimpPDBStatusType  status = GIMP_PDB_SUCCESS;
-  GimpExportReturn   export = GIMP_EXPORT_CANCEL;
-  GimpParasite      *parasite;
-  GimpImage         *orig_image;
-  GError            *error  = NULL;
+  GimpProcedureConfig *config;
+  GimpPDBStatusType    status = GIMP_PDB_SUCCESS;
+  GimpExportReturn     export = GIMP_EXPORT_CANCEL;
+  GimpImage           *orig_image;
+  gchar               *description;
+  GError              *error  = NULL;
 
   INIT_I18N ();
 
@@ -208,63 +195,52 @@ gbr_save (GimpProcedure        *procedure,
                                                  GIMP_PDB_CANCEL,
                                                  NULL);
 
-      /*  Possibly retrieve data  */
-      gimp_get_data (SAVE_PROC, &info);
+    default:
+      break;
+    }
 
-      parasite = gimp_image_get_parasite (orig_image,
-                                          "gimp-brush-name");
-      if (parasite)
-        {
-          g_strlcpy (info.description,
-                     gimp_parasite_data (parasite),
-                     MIN (sizeof (info.description),
-                          gimp_parasite_data_size (parasite)));
+  config = gimp_procedure_create_config (procedure);
+  gimp_procedure_config_begin_run (config, orig_image, run_mode, args);
 
-          gimp_parasite_free (parasite);
-        }
-      else
-        {
-          gchar *name = g_path_get_basename (gimp_file_get_utf8_name (file));
+  g_object_get (config,
+                "description", &description,
+                NULL);
 
-          if (g_str_has_suffix (name, ".gbr"))
-            name[strlen (name) - 4] = '\0';
+  if (! description || ! strlen (description))
+    {
+      gchar *name = g_path_get_basename (gimp_file_get_utf8_name (file));
 
-          if (strlen (name))
-            g_strlcpy (info.description, name, sizeof (info.description));
+      if (g_str_has_suffix (name, ".gbr"))
+        name[strlen (name) - 4] = '\0';
 
-          g_free (name);
-        }
-      break;
+      if (strlen (name))
+        g_object_set (config,
+                      "description", name,
+                      NULL);
 
-    default:
-      break;
+      g_free (name);
     }
 
-  switch (run_mode)
+  g_free (description);
+
+  if (run_mode == GIMP_RUN_INTERACTIVE)
     {
-    case GIMP_RUN_INTERACTIVE:
-      if (! save_dialog ())
+      if (! save_dialog (procedure, G_OBJECT (config)))
         {
           status = GIMP_PDB_CANCEL;
           goto out;
         }
-      break;
-
-    case GIMP_RUN_NONINTERACTIVE:
-      info.spacing = GIMP_VALUES_GET_INT (args, 0);
-      g_strlcpy (info.description,
-                 GIMP_VALUES_GET_STRING (args, 1),
-                 sizeof (info.description));
-      break;
-
-    default:
-      break;
     }
 
   if (status == GIMP_PDB_SUCCESS)
     {
       GimpValueArray *save_retvals;
-      gchar          *uri = g_file_get_uri (file);
+      gint            spacing;
+
+      g_object_get (config,
+                    "description", &description,
+                    "spacing",     &spacing,
+                    NULL);
 
       save_retvals =
         gimp_pdb_run_procedure (gimp_get_pdb (),
@@ -272,16 +248,16 @@ gbr_save (GimpProcedure        *procedure,
                                 GIMP_TYPE_RUN_MODE, GIMP_RUN_NONINTERACTIVE,
                                 GIMP_TYPE_IMAGE,    image,
                                 GIMP_TYPE_DRAWABLE, drawable,
-                                G_TYPE_STRING,      uri,
-                                G_TYPE_INT,         info.spacing,
-                                G_TYPE_STRING,      info.description,
+                                G_TYPE_FILE,        file,
+                                G_TYPE_INT,         spacing,
+                                G_TYPE_STRING,      description,
                                 G_TYPE_NONE);
 
-      g_free (uri);
+      g_free (description);
 
       if (GIMP_VALUES_GET_ENUM (save_retvals, 0) == GIMP_PDB_SUCCESS)
         {
-          gimp_set_data (SAVE_PROC, &info, sizeof (info));
+          gimp_procedure_config_end_run (config, orig_image, run_mode);
         }
       else
         {
@@ -296,23 +272,9 @@ gbr_save (GimpProcedure        *procedure,
       gimp_value_array_unref (save_retvals);
     }
 
-  if (strlen (info.description))
-    {
-      GimpParasite *parasite;
-
-      parasite = gimp_parasite_new ("gimp-brush-name",
-                                    GIMP_PARASITE_PERSISTENT,
-                                    strlen (info.description) + 1,
-                                    info.description);
-      gimp_image_attach_parasite (orig_image, parasite);
-      gimp_parasite_free (parasite);
-    }
-  else
-    {
-      gimp_image_detach_parasite (orig_image, "gimp-brush-name");
-    }
-
  out:
+  g_object_unref (config);
+
   if (export == GIMP_EXPORT_EXPORT)
     gimp_image_delete (image);
 
@@ -320,63 +282,46 @@ gbr_save (GimpProcedure        *procedure,
 }
 
 static gboolean
-save_dialog (void)
+save_dialog (GimpProcedure *procedure,
+             GObject       *config)
 {
-  GtkWidget     *dialog;
-  GtkWidget     *grid;
-  GtkWidget     *entry;
-  GtkWidget     *spinbutton;
-  GtkAdjustment *adj;
-  gboolean       run;
+  GtkWidget *dialog;
+  GtkWidget *grid;
+  GtkWidget *entry;
+  gboolean   run;
 
-  dialog = gimp_export_dialog_new (_("Brush"), PLUG_IN_BINARY, SAVE_PROC);
+  dialog = gimp_procedure_dialog_new (procedure,
+                                      GIMP_PROCEDURE_CONFIG (config),
+                                      _("Export Image as Brush"));
 
   /* The main grid */
   grid = gtk_grid_new ();
   gtk_container_set_border_width (GTK_CONTAINER (grid), 12);
   gtk_grid_set_row_spacing (GTK_GRID (grid), 6);
   gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
-  gtk_box_pack_start (GTK_BOX (gimp_export_dialog_get_content_area (dialog)),
+  gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (dialog))),
                       grid, TRUE, TRUE, 0);
   gtk_widget_show (grid);
 
-  entry = gtk_entry_new ();
+  entry = gimp_prop_entry_new (config, "description", 256);
   gtk_entry_set_width_chars (GTK_ENTRY (entry), 20);
   gtk_entry_set_activates_default (GTK_ENTRY (entry), TRUE);
-  gtk_entry_set_text (GTK_ENTRY (entry), info.description);
+
   gimp_grid_attach_aligned (GTK_GRID (grid), 0, 0,
                             _("_Description:"), 1.0, 0.5,
-                            entry, 1);
-
-  g_signal_connect (entry, "changed",
-                    G_CALLBACK (entry_callback),
-                    info.description);
+                            entry, 2);
 
-  adj = gtk_adjustment_new (info.spacing, 1, 1000, 1, 10, 0);
-  spinbutton = gimp_spin_button_new (adj, 1.0, 0);
-  gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
-  gtk_entry_set_activates_default (GTK_ENTRY (spinbutton), TRUE);
-  gimp_grid_attach_aligned (GTK_GRID (grid), 0, 1,
-                            _("_Spacing:"), 1.0, 0.5,
-                            spinbutton, 1);
-
-  g_signal_connect (adj, "value-changed",
-                    G_CALLBACK (gimp_int_adjustment_update),
-                    &info.spacing);
+  gimp_prop_scale_entry_new (config, "spacing",
+                             GTK_GRID (grid), 0, 1,
+                             _("_Spacing:"),
+                             1, 10, 0,
+                             FALSE, 0, 0);
 
   gtk_widget_show (dialog);
 
-  run = (gimp_dialog_run (GIMP_DIALOG (dialog)) == GTK_RESPONSE_OK);
+  run = gimp_procedure_dialog_run (GIMP_PROCEDURE_DIALOG (dialog));
 
   gtk_widget_destroy (dialog);
 
   return run;
 }
-
-static void
-entry_callback (GtkWidget *widget,
-                gpointer   data)
-{
-  g_strlcpy (info.description, gtk_entry_get_text (GTK_ENTRY (widget)),
-             sizeof (info.description));
-}


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