[gimp] app: keep around all settable stuff in GimpToolGui



commit e7bb2805c265ebe644239dc34aaddbf3b3dc27bd
Author: Michael Natterer <mitch gimp org>
Date:   Fri Jun 7 23:20:20 2013 +0200

    app: keep around all settable stuff in GimpToolGui
    
    so the gui can be recreated when switching from embedded to detached
    or vice versa.

 app/display/gimptoolgui.c |  293 +++++++++++++++++++++++++++++++++++++--------
 1 files changed, 244 insertions(+), 49 deletions(-)
---
diff --git a/app/display/gimptoolgui.c b/app/display/gimptoolgui.c
index 1638ba5..4f83875 100644
--- a/app/display/gimptoolgui.c
+++ b/app/display/gimptoolgui.c
@@ -39,16 +39,29 @@
 #include "gimptoolgui.h"
 
 
+typedef struct _ResponseEntry ResponseEntry;
+
+struct _ResponseEntry
+{
+  gint      response_id;
+  gchar    *stock_id;
+  gint      alternative_position;
+  gboolean  sensitive;
+};
+
 typedef struct _GimpToolGuiPrivate GimpToolGuiPrivate;
 
 struct _GimpToolGuiPrivate
 {
   GimpToolInfo     *tool_info;
   gchar            *description;
+  GList            *response_entries;
+  gint              default_response;
 
   gboolean          overlay;
 
   GimpDisplayShell *shell;
+  GimpViewable     *viewable;
 
   GtkWidget        *dialog;
   GtkWidget        *vbox;
@@ -59,8 +72,19 @@ struct _GimpToolGuiPrivate
                                                       GimpToolGuiPrivate)
 
 
-static void   gimp_tool_gui_dispose  (GObject *object);
-static void   gimp_tool_gui_finalize (GObject *object);
+static void   gimp_tool_gui_dispose         (GObject       *object);
+static void   gimp_tool_gui_finalize        (GObject       *object);
+
+static void   gimp_tool_gui_create_dialog   (GimpToolGui   *gui);
+static void   gimp_tool_gui_update_buttons  (GimpToolGui   *gui);
+static void   gimp_tool_gui_update_shell    (GimpToolGui   *gui);
+static void   gimp_tool_gui_update_viewable (GimpToolGui   *gui);
+
+static ResponseEntry * response_entry_new   (gint           response_id,
+                                             const gchar   *stock_id);
+static void            response_entry_free  (ResponseEntry *entry);
+static ResponseEntry * response_entry_find  (GList         *entries,
+                                             gint           response_id);
 
 
 G_DEFINE_TYPE (GimpToolGui, gimp_tool_gui, GIMP_TYPE_OBJECT)
@@ -82,6 +106,8 @@ gimp_tool_gui_init (GimpToolGui *gui)
 {
   GimpToolGuiPrivate *private = GET_PRIVATE (gui);
 
+  private->default_response = -1;
+
   private->vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
   g_object_ref_sink (private->vbox);
 }
@@ -130,6 +156,13 @@ gimp_tool_gui_finalize (GObject *object)
       private->description = NULL;
     }
 
+  if (private->response_entries)
+    {
+      g_list_free_full (private->response_entries,
+                        (GDestroyNotify) response_entry_free);
+      private->response_entries = NULL;
+    }
+
   G_OBJECT_CLASS (gimp_tool_gui_parent_class)->finalize (object);
 }
 
@@ -156,6 +189,7 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
   GimpToolGui        *gui;
   GimpToolGuiPrivate *private;
   va_list             args;
+  const gchar        *stock_id;
 
   g_return_val_if_fail (GIMP_IS_TOOL_INFO (tool_info), NULL);
 
@@ -167,35 +201,22 @@ gimp_tool_gui_new (GimpToolInfo *tool_info,
   private->description = g_strdup (description);
   private->overlay     = overlay;
 
-  if (overlay)
-    {
-      private->dialog = gimp_overlay_dialog_new (tool_info, description, NULL);
-      g_object_ref_sink (private->dialog);
+  va_start (args, overlay);
 
-      va_start (args, overlay);
-      gimp_overlay_dialog_add_buttons_valist (GIMP_OVERLAY_DIALOG (private->dialog),
-                                              args);
-      va_end (args);
-
-      gtk_container_set_border_width (GTK_CONTAINER (private->dialog), 6);
+  for (stock_id = va_arg (args, const gchar *);
+       stock_id;
+       stock_id = va_arg (args, const gchar *))
+    {
+      gint response_id = va_arg (args, gint);
 
-      gtk_container_set_border_width (GTK_CONTAINER (private->vbox), 0);
-      gtk_container_add (GTK_CONTAINER (private->dialog), private->vbox);
-      gtk_widget_show (private->vbox);
+      private->response_entries = g_list_append (private->response_entries,
+                                                 response_entry_new (response_id,
+                                                                     stock_id));
     }
-  else
-    {
-      private->dialog = gimp_tool_dialog_new (tool_info, description, NULL);
 
-      va_start (args, overlay);
-      gimp_dialog_add_buttons_valist (GIMP_DIALOG (private->dialog), args);
-      va_end (args);
+  va_end (args);
 
-      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);
-      gtk_widget_show (private->vbox);
-    }
+  gimp_tool_gui_create_dialog (gui);
 
   return gui;
 }
@@ -243,12 +264,9 @@ gimp_tool_gui_set_shell (GimpToolGui      *gui,
   if (shell == private->shell)
     return;
 
-  if (! private->overlay)
-    {
-      gimp_tool_dialog_set_shell (GIMP_TOOL_DIALOG (private->dialog), shell);
-    }
-
   private->shell = shell;
+
+  gimp_tool_gui_update_shell (gui);
 }
 
 void
@@ -262,12 +280,12 @@ gimp_tool_gui_set_viewable (GimpToolGui  *gui,
 
   private = GET_PRIVATE (gui);
 
-  if (! private->overlay)
-    {
-      gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (private->dialog),
-                                         viewable,
-                                         GIMP_CONTEXT (private->tool_info->tool_options));
-    }
+  if (private->viewable == viewable)
+    return;
+
+  private->viewable = viewable;
+
+  gimp_tool_gui_update_viewable (gui);
 }
 
 GtkWidget *
@@ -356,6 +374,11 @@ gimp_tool_gui_set_default_response (GimpToolGui *gui,
 
   private = GET_PRIVATE (gui);
 
+  g_return_if_fail (response_entry_find (private->response_entries,
+                                         response_id) != NULL);
+
+  private->default_response = response_id;
+
   if (private->overlay)
     {
       /* TODO */
@@ -373,11 +396,18 @@ gimp_tool_gui_set_response_sensitive (GimpToolGui *gui,
                                       gboolean     sensitive)
 {
   GimpToolGuiPrivate *private;
+  ResponseEntry      *entry;
 
   g_return_if_fail (GIMP_IS_TOOL_GUI (gui));
 
   private = GET_PRIVATE (gui);
 
+  entry = response_entry_find (private->response_entries, response_id);
+
+  g_return_if_fail (entry != NULL);
+
+  entry->sensitive = sensitive;
+
   if (private->overlay)
     {
       /* TODO */
@@ -396,10 +426,6 @@ 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));
@@ -408,24 +434,131 @@ gimp_tool_gui_set_alternative_button_order (GimpToolGui *gui,
 
   va_start (args, gui);
 
-  for (response_id = va_arg (args, gint);
+  for (response_id = va_arg (args, gint), i = 0;
        response_id != -1;
-       response_id = va_arg (args, gint))
+       response_id = va_arg (args, gint), i++)
     {
-      id_list = g_list_append (id_list, GINT_TO_POINTER (response_id));
+      ResponseEntry *entry = response_entry_find (private->response_entries,
+                                                  response_id);
+
+      if (entry)
+        entry->alternative_position = i;
     }
 
   va_end (args);
 
-  n_ids = g_list_length (id_list);
-  ids   = g_new0 (gint, n_ids);
+  gimp_tool_gui_update_buttons (gui);
+}
+
 
-  for (list = id_list, i = 0; list; list = g_list_next (list), i++)
+/*  private functions  */
+
+static void
+gimp_tool_gui_create_dialog (GimpToolGui *gui)
+{
+  GimpToolGuiPrivate *private = GET_PRIVATE (gui);
+  GList              *list;
+
+  if (private->overlay)
+    {
+      private->dialog = gimp_overlay_dialog_new (private->tool_info,
+                                                 private->description,
+                                                 NULL);
+      g_object_ref_sink (private->dialog);
+
+      for (list = private->response_entries; list; list = g_list_next (list))
+        {
+          ResponseEntry *entry = list->data;
+
+          gimp_overlay_dialog_add_button (GIMP_OVERLAY_DIALOG (private->dialog),
+                                          entry->stock_id,
+                                          entry->response_id);
+
+          /* FIXME */
+#if 0
+          if (! entry->sensitive)
+            gimp_overlay_dialog_set_response_sensitive (GIMP_OVERLAY_DIALOG (private->dialog),
+                                                        entry->response_id,
+                                                        FALSE);
+#endif
+        }
+
+      /* FIXME */
+#if 0
+      if (private->default_response != -1)
+        gimp_overlay_dialog_set_default_response (GIMP_OVERLAY_DIALOG (private->dialog),
+                                                  private->default_response);
+#endif
+
+      gtk_container_set_border_width (GTK_CONTAINER (private->dialog), 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);
+    }
+  else
     {
-      ids[i] = GPOINTER_TO_INT (list->data);
+      private->dialog = gimp_tool_dialog_new (private->tool_info,
+                                              private->description,
+                                              NULL);
+
+      for (list = private->response_entries; list; list = g_list_next (list))
+        {
+          ResponseEntry *entry = list->data;
+
+          gimp_dialog_add_button (GIMP_DIALOG (private->dialog),
+                                  entry->stock_id,
+                                  entry->response_id);
+
+          if (! entry->sensitive)
+            gtk_dialog_set_response_sensitive (GTK_DIALOG (private->dialog),
+                                               entry->response_id,
+                                               FALSE);
+        }
+
+      if (private->default_response != -1)
+        gtk_dialog_set_default_response (GTK_DIALOG (private->dialog),
+                                         private->default_response);
+
+      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);
+      gtk_widget_show (private->vbox);
     }
 
-  g_list_free (id_list);
+  gimp_tool_gui_update_buttons (gui);
+
+  if (private->shell)
+    gimp_tool_gui_update_shell (gui);
+
+  if (private->viewable)
+    gimp_tool_gui_update_viewable (gui);
+}
+
+static void
+gimp_tool_gui_update_buttons (GimpToolGui *gui)
+{
+  GimpToolGuiPrivate *private = GET_PRIVATE (gui);
+  GList              *list;
+  gint               *ids;
+  gint                n_ids;
+  gint                i;
+
+  n_ids = g_list_length (private->response_entries);
+  ids   = g_new0 (gint, n_ids);
+
+  for (list = private->response_entries, i = 0;
+       list;
+       list = g_list_next (list), i++)
+    {
+      ResponseEntry *entry = list->data;
+
+      if (entry->alternative_position >= 0 &&
+          entry->alternative_position < n_ids)
+        {
+          ids[entry->alternative_position] = entry->response_id;
+        }
+    }
 
   if (private->overlay)
     {
@@ -439,3 +572,65 @@ gimp_tool_gui_set_alternative_button_order (GimpToolGui *gui,
 
   g_free (ids);
 }
+
+static void
+gimp_tool_gui_update_shell (GimpToolGui *gui)
+{
+  GimpToolGuiPrivate *private = GET_PRIVATE (gui);
+
+  if (! private->overlay)
+    {
+      gimp_tool_dialog_set_shell (GIMP_TOOL_DIALOG (private->dialog),
+                                  private->shell);
+    }
+}
+
+static void
+gimp_tool_gui_update_viewable (GimpToolGui *gui)
+{
+  GimpToolGuiPrivate *private = GET_PRIVATE (gui);
+
+  if (! private->overlay)
+    {
+      gimp_viewable_dialog_set_viewable (GIMP_VIEWABLE_DIALOG (private->dialog),
+                                         private->viewable,
+                                         GIMP_CONTEXT (private->tool_info->tool_options));
+    }
+}
+
+static ResponseEntry *
+response_entry_new (gint         response_id,
+                    const gchar *stock_id)
+{
+  ResponseEntry *entry = g_slice_new0 (ResponseEntry);
+
+  entry->response_id          = response_id;
+  entry->stock_id             = g_strdup (stock_id);
+  entry->alternative_position = -1;
+  entry->sensitive            = TRUE;
+
+  return entry;
+}
+
+static void
+response_entry_free (ResponseEntry *entry)
+{
+  g_free (entry->stock_id);
+
+  g_slice_free (ResponseEntry, entry);
+}
+
+static ResponseEntry *
+response_entry_find (GList *entries,
+                     gint   response_id)
+{
+  for (; entries; entries = g_list_next (entries))
+    {
+      ResponseEntry *entry = entries->data;
+
+      if (entry->response_id == response_id)
+        return entry;
+    }
+
+  return NULL;
+}


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