[gimp] app: add gimp_tool_gui_set_alternative_button_order() and use it



commit 9a811d276eb901833e2a4274a4fa0e46fbc2992a
Author: Michael Natterer <mitch gimp org>
Date:   Fri Jun 7 15:18:24 2013 +0200

    app: add gimp_tool_gui_set_alternative_button_order() and use it
    
    Also make some of GimpToolGui's memory management proper, there was
    no leak but it needs to be proper in order to add runtime switching
    between dialog and overlay.

 app/display/gimptoolgui.c     |   80 +++++++++++++++++++++++++++++++++++++----
 app/display/gimptoolgui.h     |    2 +
 app/tools/gimpimagemaptool.c  |   15 ++++----
 app/tools/gimptransformtool.c |   13 +++----
 4 files changed, 87 insertions(+), 23 deletions(-)
---
diff --git a/app/display/gimptoolgui.c b/app/display/gimptoolgui.c
index 81c0866..7005ec2 100644
--- a/app/display/gimptoolgui.c
+++ b/app/display/gimptoolgui.c
@@ -43,10 +43,11 @@ typedef struct _GimpToolGuiPrivate GimpToolGuiPrivate;
 
 struct _GimpToolGuiPrivate
 {
-  gboolean          overlay;
+  GimpToolInfo     *tool_info;
   gchar            *desc;
 
-  GimpToolInfo     *tool_info;
+  gboolean          overlay;
+
   GimpDisplayShell *shell;
 
   GtkWidget        *dialog;
@@ -79,6 +80,10 @@ gimp_tool_gui_class_init (GimpToolGuiClass *klass)
 static void
 gimp_tool_gui_init (GimpToolGui *gui)
 {
+  GimpToolGuiPrivate *private = GET_PRIVATE (gui);
+
+  private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+  g_object_ref_sink (private->vbox);
 }
 
 static void
@@ -86,9 +91,21 @@ gimp_tool_gui_dispose (GObject *object)
 {
   GimpToolGuiPrivate *private = GET_PRIVATE (object);
 
+  if (private->tool_info)
+    {
+      g_object_unref (private->tool_info);
+      private->tool_info = NULL;
+    }
+
   if (private->shell)
     gimp_tool_gui_set_shell (GIMP_TOOL_GUI (object), NULL);
 
+  if (private->vbox)
+    {
+      g_object_unref (private->vbox);
+      private->vbox = NULL;
+    }
+
   if (private->dialog)
     {
       if (private->overlay)
@@ -97,7 +114,6 @@ gimp_tool_gui_dispose (GObject *object)
         gtk_widget_destroy (private->dialog);
 
       private->dialog = NULL;
-      private->vbox   = NULL;
     }
 
   G_OBJECT_CLASS (gimp_tool_gui_parent_class)->dispose (object);
@@ -147,10 +163,10 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
 
   private = GET_PRIVATE (gui);
 
-  private->overlay   = overlay;
+  private->tool_info = g_object_ref (tool_info);
   private->desc      = g_strdup (desc);
 
-  private->tool_info = tool_info;
+  private->overlay   = overlay;
 
   if (overlay)
     {
@@ -164,7 +180,7 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
 
       gtk_container_set_border_width (GTK_CONTAINER (private->dialog), 6);
 
-      private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+      gtk_container_set_border_width (GTK_CONTAINER (private->vbox), 0);
       gtk_container_add (GTK_CONTAINER (private->dialog), private->vbox);
       gtk_widget_show (private->vbox);
     }
@@ -176,7 +192,6 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
       gimp_dialog_add_buttons_valist (GIMP_DIALOG (private->dialog), args);
       va_end (args);
 
-      private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
       gtk_container_set_border_width (GTK_CONTAINER (private->vbox), 6);
       gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (private->dialog))),
                           private->vbox, TRUE, TRUE, 0);
@@ -345,3 +360,54 @@ gimp_tool_gui_set_response_sensitive (GimpToolGui *gui,
                                          response_id, sensitive);
     }
 }
+
+void
+gimp_tool_gui_set_alternative_button_order (GimpToolGui *gui,
+                                            ...)
+{
+  GimpToolGuiPrivate *private;
+  va_list             args;
+  gint                response_id;
+  GList              *id_list = NULL;
+  GList              *list;
+  gint               *ids;
+  gint                n_ids;
+  gint                i;
+
+  g_return_if_fail (GIMP_IS_TOOL_GUI (gui));
+
+  private = GET_PRIVATE (gui);
+
+  va_start (args, gui);
+
+  for (response_id = va_arg (args, gint);
+       response_id != -1;
+       response_id = va_arg (args, gint))
+    {
+      id_list = g_list_append (id_list, GINT_TO_POINTER (response_id));
+    }
+
+  va_end (args);
+
+  n_ids = g_list_length (id_list);
+  ids   = g_new0 (gint, n_ids);
+
+  for (list = id_list, i = 0; list; list = g_list_next (list), i++)
+    {
+      ids[i] = GPOINTER_TO_INT (list->data);
+    }
+
+  g_list_free (id_list);
+
+  if (private->overlay)
+    {
+      /* TODO */
+    }
+  else
+    {
+      gtk_dialog_set_alternative_button_order_from_array (GTK_DIALOG (private->dialog),
+                                                          n_ids, ids);
+    }
+
+  g_free (ids);
+}
diff --git a/app/display/gimptoolgui.h b/app/display/gimptoolgui.h
index 1e2e1d8..58b3d2e 100644
--- a/app/display/gimptoolgui.h
+++ b/app/display/gimptoolgui.h
@@ -69,6 +69,8 @@ void          gimp_tool_gui_set_default_response   (GimpToolGui      *gui,
 void          gimp_tool_gui_set_response_sensitive (GimpToolGui      *gui,
                                                     gint              response_id,
                                                     gboolean          sensitive);
+void    gimp_tool_gui_set_alternative_button_order (GimpToolGui      *gui,
+                                                    ...);
 
 
 #endif /* __GIMP_TOOL_GUI_H__ */
diff --git a/app/tools/gimpimagemaptool.c b/app/tools/gimpimagemaptool.c
index 9811cfe..3608fee 100644
--- a/app/tools/gimpimagemaptool.c
+++ b/app/tools/gimpimagemaptool.c
@@ -336,14 +336,13 @@ gimp_image_map_tool_initialize (GimpTool     *tool,
 
                            NULL);
 
-      /* FIXME */
-#if 0
-      gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog),
-                                               RESPONSE_RESET,
-                                               GTK_RESPONSE_OK,
-                                               GTK_RESPONSE_CANCEL,
-                                               -1);
-#endif
+      gimp_tool_gui_set_default_response (image_map_tool->gui, GTK_RESPONSE_OK);
+
+      gimp_tool_gui_set_alternative_button_order (image_map_tool->gui,
+                                                  RESPONSE_RESET,
+                                                  GTK_RESPONSE_OK,
+                                                  GTK_RESPONSE_CANCEL,
+                                                  -1);
 
       dialog = gimp_tool_gui_get_dialog (image_map_tool->gui);
       vbox   = gimp_tool_gui_get_vbox   (image_map_tool->gui);
diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c
index fca6d45..ebb5fa3 100644
--- a/app/tools/gimptransformtool.c
+++ b/app/tools/gimptransformtool.c
@@ -1703,14 +1703,11 @@ gimp_transform_tool_dialog (GimpTransformTool *tr_tool)
 
   gimp_tool_gui_set_default_response (tr_tool->gui, GTK_RESPONSE_OK);
 
-  /* FIXME */
-#if 0
-  gtk_dialog_set_alternative_button_order (GTK_DIALOG (tr_tool->dialog),
-                                           RESPONSE_RESET,
-                                           GTK_RESPONSE_OK,
-                                           GTK_RESPONSE_CANCEL,
-                                           -1);
-#endif
+  gimp_tool_gui_set_alternative_button_order (tr_tool->gui,
+                                              RESPONSE_RESET,
+                                              GTK_RESPONSE_OK,
+                                              GTK_RESPONSE_CANCEL,
+                                              -1);
 
   g_signal_connect (gimp_tool_gui_get_dialog (tr_tool->gui), "response",
                     G_CALLBACK (gimp_transform_tool_response),


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