[gimp] libgimp: make gimp_proc_view_new() show both new- and old-style args



commit acbe22942706b4433660d880f26495e600f028ce
Author: Michael Natterer <mitch gimp org>
Date:   Mon Aug 5 14:17:18 2019 +0200

    libgimp: make gimp_proc_view_new() show both new- and old-style args
    
    And reduce its API to just (proc-name, menu-path), it can look up all
    the shit from the PDB itself.

 libgimp/gimpprocbrowserdialog.c  |  59 +---------
 libgimp/gimpproceduraldb.c       |  22 ----
 libgimp/gimpprocview.c           | 242 +++++++++++++++++++++++++++++++--------
 libgimp/gimpprocview.h           |  14 +--
 plug-ins/common/plugin-browser.c |  60 +---------
 5 files changed, 206 insertions(+), 191 deletions(-)
---
diff --git a/libgimp/gimpprocbrowserdialog.c b/libgimp/gimpprocbrowserdialog.c
index d804cb0871..10757ba877 100644
--- a/libgimp/gimpprocbrowserdialog.c
+++ b/libgimp/gimpprocbrowserdialog.c
@@ -93,8 +93,6 @@ static void       browser_row_activated     (GtkTreeView           *treeview,
                                              GtkTreePath           *path,
                                              GtkTreeViewColumn     *column,
                                              GimpProcBrowserDialog *dialog);
-static void       browser_show_procedure    (GimpProcBrowserDialog *dialog,
-                                             const gchar           *proc_name);
 static void       browser_search            (GimpBrowser           *browser,
                                              const gchar           *query_text,
                                              gint                   search_type,
@@ -329,7 +327,10 @@ browser_selection_changed (GtkTreeSelection      *sel,
       gtk_tree_model_get (GTK_TREE_MODEL (dialog->priv->store), &iter,
                           COLUMN_PROC_NAME, &proc_name,
                           -1);
-      browser_show_procedure (dialog, proc_name);
+
+      gimp_browser_set_widget (GIMP_BROWSER (dialog->priv->browser),
+                               gimp_proc_view_new (proc_name, NULL));
+
       g_free (proc_name);
     }
 
@@ -345,58 +346,6 @@ browser_row_activated (GtkTreeView           *treeview,
   g_signal_emit (dialog, dialog_signals[ROW_ACTIVATED], 0);
 }
 
-static void
-browser_show_procedure (GimpProcBrowserDialog *dialog,
-                        const gchar           *proc_name)
-{
-  GimpProcBrowserDialogPrivate *priv = GET_PRIVATE (dialog);
-  gchar                        *proc_blurb;
-  gchar                        *proc_help;
-  gchar                        *proc_author;
-  gchar                        *proc_copyright;
-  gchar                        *proc_date;
-  GimpPDBProcType               proc_type;
-  gint                          n_params;
-  gint                          n_return_vals;
-  GimpParamDef                 *params;
-  GimpParamDef                 *return_vals;
-
-  gimp_procedural_db_proc_info (proc_name,
-                                &proc_blurb,
-                                &proc_help,
-                                &proc_author,
-                                &proc_copyright,
-                                &proc_date,
-                                &proc_type,
-                                &n_params,
-                                &n_return_vals,
-                                &params,
-                                &return_vals);
-
-  gimp_browser_set_widget (GIMP_BROWSER (priv->browser),
-                           gimp_proc_view_new (proc_name,
-                                               NULL,
-                                               proc_blurb,
-                                               proc_help,
-                                               proc_author,
-                                               proc_copyright,
-                                               proc_date,
-                                               proc_type,
-                                               n_params,
-                                               n_return_vals,
-                                               params,
-                                               return_vals));
-
-  g_free (proc_blurb);
-  g_free (proc_help);
-  g_free (proc_author);
-  g_free (proc_copyright);
-  g_free (proc_date);
-
-  gimp_destroy_paramdefs (params,      n_params);
-  gimp_destroy_paramdefs (return_vals, n_return_vals);
-}
-
 static void
 browser_search (GimpBrowser           *browser,
                 const gchar           *query_text,
diff --git a/libgimp/gimpproceduraldb.c b/libgimp/gimpproceduraldb.c
index ae5caaef6c..4605af18cd 100644
--- a/libgimp/gimpproceduraldb.c
+++ b/libgimp/gimpproceduraldb.c
@@ -82,8 +82,6 @@ gimp_procedural_db_proc_info (const gchar      *procedure,
 
       for (i = 0; i < *num_args; i++)
         {
-          GParamSpec *pspec;
-
           if (! gimp_procedural_db_proc_arg (procedure,
                                              i,
                                              &(*args)[i].type,
@@ -95,21 +93,10 @@ gimp_procedural_db_proc_info (const gchar      *procedure,
 
               return FALSE;
             }
-
-          pspec = gimp_procedural_db_proc_argument (procedure, i);
-
-          if (pspec)
-            {
-              g_printerr ("Arg %i of %s: %s\n", i, procedure,
-                          G_PARAM_SPEC_TYPE_NAME (pspec));
-              g_param_spec_unref (pspec);
-            }
         }
 
       for (i = 0; i < *num_values; i++)
         {
-          GParamSpec *pspec;
-
           if (! gimp_procedural_db_proc_val (procedure,
                                              i,
                                              &(*return_vals)[i].type,
@@ -121,15 +108,6 @@ gimp_procedural_db_proc_info (const gchar      *procedure,
 
               return FALSE;
             }
-
-          pspec = gimp_procedural_db_proc_return_value (procedure, i);
-
-          if (pspec)
-            {
-              g_printerr ("Value %i of %s: %s\n", i, procedure,
-                          G_PARAM_SPEC_TYPE_NAME (pspec));
-              g_param_spec_unref (pspec);
-            }
         }
      }
 
diff --git a/libgimp/gimpprocview.c b/libgimp/gimpprocview.c
index 9bbeb50063..4a18bcd86d 100644
--- a/libgimp/gimpprocview.c
+++ b/libgimp/gimpprocview.c
@@ -59,6 +59,12 @@ static GtkWidget * gimp_proc_view_create_params (const GimpParamDef *params,
                                                  GtkSizeGroup       *name_group,
                                                  GtkSizeGroup       *type_group,
                                                  GtkSizeGroup       *desc_group);
+static GtkWidget * gimp_proc_view_create_args   (const gchar        *procedure_name,
+                                                 gint                n_args,
+                                                 gboolean            return_values,
+                                                 GtkSizeGroup       *name_group,
+                                                 GtkSizeGroup       *type_group,
+                                                 GtkSizeGroup       *desc_group);
 
 
 /*  public functions  */
@@ -66,63 +72,68 @@ static GtkWidget * gimp_proc_view_create_params (const GimpParamDef *params,
 
 /**
  * gimp_proc_view_new:
- * @name:
- * @menu_path:
- * @blurb:
- * @help:
- * @author:
- * @copyright:
- * @date:
- * @type:
- * @n_params:
- * @n_return_vals:
- * @params:
- * @return_vals:
+ * @procedure_name: The name of a procedure.
+ * @menu_path:      (nullable):  The procedure's menu path, or %NULL.
  *
  * Returns: (transfer full): a new widget providing a view on a
- *               GIMP procedure
+ *          GIMP procedure
  *
  * Since: 2.4
  **/
 GtkWidget *
-gimp_proc_view_new (const gchar        *name,
-                    const gchar        *menu_path,
-                    const gchar        *blurb,
-                    const gchar        *help,
-                    const gchar        *author,
-                    const gchar        *copyright,
-                    const gchar        *date,
-                    GimpPDBProcType     type,
-                    gint                n_params,
-                    gint                n_return_vals,
-                    const GimpParamDef *params,
-                    const GimpParamDef *return_vals)
+gimp_proc_view_new (const gchar *procedure_name,
+                    const gchar *menu_path)
 {
-  GtkWidget    *main_vbox;
-  GtkWidget    *frame;
-  GtkWidget    *vbox;
-  GtkWidget    *grid;
-  GtkWidget    *label;
-  GtkSizeGroup *name_group;
-  GtkSizeGroup *type_group;
-  GtkSizeGroup *desc_group;
-  const gchar  *type_str;
-  gint          row;
-
-  if (blurb     && strlen (blurb) < 2)     blurb     = NULL;
-  if (help      && strlen (help) < 2)      help      = NULL;
-  if (author    && strlen (author) < 2)    author    = NULL;
-  if (date      && strlen (date) < 2)      date      = NULL;
-  if (copyright && strlen (copyright) < 2) copyright = NULL;
+  GtkWidget       *main_vbox;
+  GtkWidget       *frame;
+  GtkWidget       *vbox;
+  GtkWidget       *grid;
+  GtkWidget       *label;
+  GtkWidget       *notebook;
+  GtkSizeGroup    *name_group;
+  GtkSizeGroup    *type_group;
+  GtkSizeGroup    *desc_group;
+  gchar           *blurb;
+  gchar           *help;
+  gchar           *author;
+  gchar           *copyright;
+  gchar           *date;
+  GimpPDBProcType  type;
+  gint             n_params;
+  gint             n_return_vals;
+  GimpParamDef    *params;
+  GimpParamDef    *return_vals;
+  const gchar     *type_str;
+  gint             row;
+
+  g_return_val_if_fail (procedure_name != NULL, NULL);
+
+  gimp_procedural_db_proc_info (procedure_name,
+                                &blurb,
+                                &help,
+                                &author,
+                                &copyright,
+                                &date,
+                                &type,
+                                &n_params,
+                                &n_return_vals,
+                                &params,
+                                &return_vals);
+
+  if (blurb     && strlen (blurb) < 2)     g_clear_pointer (&blurb,     g_free);
+  if (help      && strlen (help) < 2)      g_clear_pointer (&help,      g_free);
+  if (author    && strlen (author) < 2)    g_clear_pointer (&author,    g_free);
+  if (date      && strlen (date) < 2)      g_clear_pointer (&date,      g_free);
+  if (copyright && strlen (copyright) < 2) g_clear_pointer (&copyright, g_free);
 
   if (blurb && help && ! strcmp (blurb, help))
-    help = NULL;
+    g_clear_pointer (&help, g_free);
 
   main_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
 
   /* show the name */
 
-  frame = gimp_frame_new (name);
+  frame = gimp_frame_new (procedure_name);
   label = gtk_frame_get_label_widget (GTK_FRAME (frame));
   gtk_label_set_selectable (GTK_LABEL (label), TRUE);
   gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
@@ -164,6 +175,56 @@ gimp_proc_view_new (const gchar        *name,
       gtk_widget_show (label);
     }
 
+  notebook = gtk_notebook_new ();
+  gtk_box_pack_start (GTK_BOX (main_vbox), notebook, FALSE, FALSE, 0);
+  gtk_widget_show (notebook);
+
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox,
+                            gtk_label_new (_("GValue-based API")));
+  gtk_widget_show (vbox);
+
+  name_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+  type_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+  desc_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+
+  /* in parameters */
+  if (n_params)
+    {
+      frame = gimp_frame_new (_("Parameters"));
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+      gtk_widget_show (frame);
+
+      grid = gimp_proc_view_create_args (procedure_name, n_params, FALSE,
+                                         name_group, type_group, desc_group);
+      gtk_container_add (GTK_CONTAINER (frame), grid);
+      gtk_widget_show (grid);
+    }
+
+  /* out parameters */
+  if (n_return_vals)
+    {
+      frame = gimp_frame_new (_("Return Values"));
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+      gtk_widget_show (frame);
+
+      grid = gimp_proc_view_create_args (procedure_name, n_return_vals, TRUE,
+                                         name_group, type_group, desc_group);
+      gtk_container_add (GTK_CONTAINER (frame), grid);
+      gtk_widget_show (grid);
+    }
+
+  g_object_unref (name_group);
+  g_object_unref (type_group);
+  g_object_unref (desc_group);
+
+  vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 8);
+  gtk_container_set_border_width (GTK_CONTAINER (vbox), 8);
+  gtk_notebook_append_page (GTK_NOTEBOOK (notebook), vbox,
+                            gtk_label_new (_("Legacy API")));
+  gtk_widget_show (vbox);
+
   name_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
   type_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
   desc_group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
@@ -172,7 +233,7 @@ gimp_proc_view_new (const gchar        *name,
   if (n_params)
     {
       frame = gimp_frame_new (_("Parameters"));
-      gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
       gtk_widget_show (frame);
 
       grid = gimp_proc_view_create_params (params, n_params,
@@ -185,7 +246,7 @@ gimp_proc_view_new (const gchar        *name,
   if (n_return_vals)
     {
       frame = gimp_frame_new (_("Return Values"));
-      gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
+      gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
       gtk_widget_show (frame);
 
       grid = gimp_proc_view_create_params (return_vals, n_return_vals,
@@ -194,6 +255,10 @@ gimp_proc_view_new (const gchar        *name,
       gtk_widget_show (grid);
     }
 
+  g_object_unref (name_group);
+  g_object_unref (type_group);
+  g_object_unref (desc_group);
+
   if (! help && ! author && ! date && ! copyright)
     return main_vbox;
 
@@ -219,7 +284,7 @@ gimp_proc_view_new (const gchar        *name,
   /* show the author & the copyright */
 
   if (! author && ! date && ! copyright)
-    return main_vbox;
+    goto out;
 
   grid = gtk_grid_new ();
   gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
@@ -268,6 +333,30 @@ gimp_proc_view_new (const gchar        *name,
                                 label, 3);
     }
 
+ out:
+
+  g_free (blurb);
+  g_free (help);
+  g_free (author);
+  g_free (copyright);
+  g_free (date);
+
+  while (n_params--)
+    {
+      g_free (params[n_params].name);
+      g_free (params[n_params].description);
+    }
+
+  g_free (params);
+
+  while (n_return_vals--)
+    {
+      g_free (return_vals[n_return_vals].name);
+      g_free (return_vals[n_return_vals].description);
+    }
+
+  g_free (return_vals);
+
   return main_vbox;
 }
 
@@ -335,3 +424,64 @@ gimp_proc_view_create_params (const GimpParamDef *params,
 
   return grid;
 }
+
+static GtkWidget *
+gimp_proc_view_create_args (const gchar  *procedure_name,
+                            gint          n_args,
+                            gboolean      return_values,
+                            GtkSizeGroup *name_group,
+                            GtkSizeGroup *type_group,
+                            GtkSizeGroup *desc_group)
+{
+  GtkWidget *grid;
+  gint       i;
+
+  grid = gtk_grid_new ();
+  gtk_grid_set_column_spacing (GTK_GRID (grid), 6);
+  gtk_grid_set_row_spacing (GTK_GRID (grid), 4);
+
+  for (i = 0; i < n_args; i++)
+    {
+      GParamSpec *pspec;
+      GtkWidget  *label;
+
+      if (return_values)
+        pspec = gimp_procedural_db_proc_return_value (procedure_name, i);
+      else
+        pspec = gimp_procedural_db_proc_argument (procedure_name, i);
+
+      /* name */
+      label = gtk_label_new (g_param_spec_get_name (pspec));
+      gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+      gtk_label_set_yalign (GTK_LABEL (label), 0.0);
+      gtk_size_group_add_widget (name_group, label);
+      gtk_grid_attach (GTK_GRID (grid), label, 0, i, 1, 1);
+      gtk_widget_show (label);
+
+      /* type */
+      label = gtk_label_new (g_type_name (G_PARAM_SPEC_VALUE_TYPE (pspec)));
+      gimp_label_set_attributes (GTK_LABEL (label),
+                                 PANGO_ATTR_FAMILY, "monospace",
+                                 PANGO_ATTR_STYLE,  PANGO_STYLE_ITALIC,
+                                 -1);
+      gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+      gtk_label_set_yalign (GTK_LABEL (label), 0.0);
+      gtk_size_group_add_widget (type_group, label);
+      gtk_grid_attach (GTK_GRID (grid), label, 1, i, 1, 1);
+      gtk_widget_show (label);
+
+      /* description */
+      label = gtk_label_new (g_param_spec_get_blurb (pspec));
+      gtk_label_set_selectable (GTK_LABEL (label), TRUE);
+      gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+      gtk_label_set_yalign (GTK_LABEL (label), 0.0);
+      gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
+      gtk_size_group_add_widget (desc_group, label);
+      gtk_grid_attach (GTK_GRID (grid), label, 2, i, 1, 1);
+      gtk_widget_show (label);
+
+      g_param_spec_unref (pspec);
+    }
+
+  return grid;
+}
diff --git a/libgimp/gimpprocview.h b/libgimp/gimpprocview.h
index 749929771e..915a0aa562 100644
--- a/libgimp/gimpprocview.h
+++ b/libgimp/gimpprocview.h
@@ -31,18 +31,8 @@ G_BEGIN_DECLS
 /* For information look into the C source or the html documentation */
 
 
-GtkWidget * gimp_proc_view_new (const gchar        *name,
-                                const gchar        *menu_path,
-                                const gchar        *blurb,
-                                const gchar        *help,
-                                const gchar        *author,
-                                const gchar        *copyright,
-                                const gchar        *date,
-                                GimpPDBProcType     type,
-                                gint                n_params,
-                                gint                n_return_vals,
-                                const GimpParamDef *params,
-                                const GimpParamDef *return_vals);
+GtkWidget * gimp_proc_view_new (const gchar *procedure_name,
+                                const gchar *menu_path);
 
 
 G_END_DECLS
diff --git a/plug-ins/common/plugin-browser.c b/plug-ins/common/plugin-browser.c
index 8451744b51..801b12f5a2 100644
--- a/plug-ins/common/plugin-browser.c
+++ b/plug-ins/common/plugin-browser.c
@@ -102,8 +102,6 @@ static void        browser_list_selection_changed (GtkTreeSelection *selection,
                                                    PluginBrowser    *browser);
 static void        browser_tree_selection_changed (GtkTreeSelection *selection,
                                                    PluginBrowser    *browser);
-static void        browser_show_plugin            (PluginBrowser    *browser,
-                                                   PInfo            *pinfo);
 
 static gboolean    find_existing_mpath            (GtkTreeModel     *model,
                                                    const gchar      *mpath,
@@ -784,7 +782,9 @@ browser_list_selection_changed (GtkTreeSelection *selection,
 
   g_free (mpath);
 
-  browser_show_plugin (browser, pinfo);
+  gimp_browser_set_widget (GIMP_BROWSER (browser->browser),
+                           gimp_proc_view_new (pinfo->realname,
+                                               pinfo->menu));
 }
 
 static void
@@ -860,59 +860,7 @@ browser_tree_selection_changed (GtkTreeSelection *selection,
       g_warning ("Failed to find node in list");
     }
 
-  browser_show_plugin (browser, pinfo);
-}
-
-static void
-browser_show_plugin (PluginBrowser *browser,
-                     PInfo         *pinfo)
-{
-  gchar           *blurb         = NULL;
-  gchar           *help          = NULL;
-  gchar           *author        = NULL;
-  gchar           *copyright     = NULL;
-  gchar           *date          = NULL;
-  GimpPDBProcType  type          = 0;
-  gint             n_params      = 0;
-  gint             n_return_vals = 0;
-  GimpParamDef    *params        = NULL;
-  GimpParamDef    *return_vals   = NULL;
-
-  g_return_if_fail (browser != NULL);
-  g_return_if_fail (pinfo != NULL);
-
-  gimp_procedural_db_proc_info (pinfo->realname,
-                                &blurb,
-                                &help,
-                                &author,
-                                &copyright,
-                                &date,
-                                &type,
-                                &n_params,
-                                &n_return_vals,
-                                &params,
-                                &return_vals);
-
   gimp_browser_set_widget (GIMP_BROWSER (browser->browser),
                            gimp_proc_view_new (pinfo->realname,
-                                               pinfo->menu,
-                                               blurb,
-                                               help,
-                                               author,
-                                               copyright,
-                                               date,
-                                               type,
-                                               n_params,
-                                               n_return_vals,
-                                               params,
-                                               return_vals));
-
-  g_free (blurb);
-  g_free (help);
-  g_free (author);
-  g_free (copyright);
-  g_free (date);
-
-  gimp_destroy_paramdefs (params,      n_params);
-  gimp_destroy_paramdefs (return_vals, n_return_vals);
+                                               pinfo->menu));
 }


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