[gimp] app: Generalize GimpDockSeparator



commit 3236b57a470a3f081bfde3af64e6ad2a5078cb3b
Author: Martin Nordholts <martinn src gnome org>
Date:   Sun Oct 11 13:59:02 2009 +0200

    app: Generalize GimpDockSeparator
    
    Add a callback to GimpDockSeparator to get rid of the GimpDock
    dependency so that we can reuse it also for GimpDockColumns later.

 app/widgets/gimpdock.c          |   81 ++++++++++++++++++++++++++++++++--
 app/widgets/gimpdockseparator.c |   92 ++++++++++-----------------------------
 app/widgets/gimpdockseparator.h |   14 +++---
 app/widgets/widgets-types.h     |   25 ++++++-----
 4 files changed, 121 insertions(+), 91 deletions(-)
---
diff --git a/app/widgets/gimpdock.c b/app/widgets/gimpdock.c
index fb2b24a..157a38f 100644
--- a/app/widgets/gimpdock.c
+++ b/app/widgets/gimpdock.c
@@ -90,6 +90,9 @@ static void      gimp_dock_real_book_added   (GimpDock              *dock,
                                               GimpDockbook          *dockbook);
 static void      gimp_dock_real_book_removed (GimpDock              *dock,
                                               GimpDockbook          *dockbook);
+static gboolean  gimp_dock_dropped_cb        (GimpDockSeparator     *separator,
+                                              GtkWidget             *source,
+                                              gpointer               data);
 static void      gimp_dock_show_separators   (GimpDock              *dock,
                                               gboolean               show);
 
@@ -202,8 +205,14 @@ gimp_dock_init (GimpDock *dock)
   gtk_container_add (GTK_CONTAINER (dock->p->main_vbox), dock->p->vbox);
   gtk_widget_show (dock->p->vbox);
 
-  dock->p->north_separator = gimp_dock_separator_new (dock, GTK_ANCHOR_NORTH);
-  gtk_box_pack_start (GTK_BOX (dock->p->vbox), dock->p->north_separator, FALSE, FALSE, 0);
+  dock->p->north_separator = gimp_dock_separator_new (GTK_ANCHOR_NORTH,
+                                                      gimp_dock_dropped_cb,
+                                                      dock);
+  gtk_box_pack_start (GTK_BOX (dock->p->vbox),
+                      dock->p->north_separator,
+                      FALSE,
+                      FALSE,
+                      0);
 
   dock_instances = g_list_prepend (dock_instances, dock);
 }
@@ -305,6 +314,66 @@ gimp_dock_real_book_removed (GimpDock     *dock,
 {
 }
 
+static gboolean
+gimp_dock_dropped_cb (GimpDockSeparator *separator,
+                      GtkWidget         *source,
+                      gpointer           data)
+{
+  GimpDock     *dock     = GIMP_DOCK (data);
+  GimpDockable *dockable = NULL;
+  GtkWidget    *dockbook = NULL;
+  gint          index    = -1;
+
+  if (GIMP_IS_DOCKABLE (source))
+    dockable = GIMP_DOCKABLE (source);
+  else
+    dockable = g_object_get_data (G_OBJECT (source), "gimp-dockable");
+
+  if (!dockable )
+    return FALSE;
+
+  g_object_set_data (G_OBJECT (dockable),
+                     "gimp-dock-drag-widget", NULL);
+
+  if (gimp_dock_separator_get_anchor (separator) == GTK_ANCHOR_NORTH)
+    index = 0;
+  else if (gimp_dock_separator_get_anchor (separator) == GTK_ANCHOR_SOUTH)
+    index = -1;
+
+  /*  if dropping to the same dock, take care that we don't try
+   *  to reorder the *only* dockable in the dock
+   */
+  if (gimp_dockbook_get_dock (dockable->dockbook) == dock)
+    {
+      GList *children;
+      gint   n_books;
+      gint   n_dockables;
+
+      n_books = g_list_length (gimp_dock_get_dockbooks (dock));
+
+      children = gtk_container_get_children (GTK_CONTAINER (dockable->dockbook));
+      n_dockables = g_list_length (children);
+      g_list_free (children);
+
+      if (n_books == 1 && n_dockables == 1)
+        return TRUE; /* successfully do nothing */
+    }
+
+  /* Detach the dockable from the old dockbook */
+  g_object_ref (dockable);
+  gimp_dockbook_remove (dockable->dockbook, dockable);
+
+  /* Create a new dockbook */
+  dockbook = gimp_dockbook_new (gimp_dock_get_dialog_factory (dock)->menu_factory);
+  gimp_dock_add_book (dock, GIMP_DOCKBOOK (dockbook), index);
+
+  /* Add the dockable to new new dockbook */
+  gimp_dockbook_add (GIMP_DOCKBOOK (dockbook), dockable, -1);
+  g_object_unref (dockable);
+
+  return TRUE;
+}
+
 static void
 gimp_dock_show_separators (GimpDock *dock,
                            gboolean  show)
@@ -523,8 +592,12 @@ gimp_dock_add_book (GimpDock     *dock,
       gtk_box_pack_start (GTK_BOX (dock->p->vbox), GTK_WIDGET (dockbook),
                           TRUE, TRUE, 0);
 
-      dock->p->south_separator = gimp_dock_separator_new (dock, GTK_ANCHOR_SOUTH);
-      gtk_box_pack_end (GTK_BOX (dock->p->vbox), dock->p->south_separator, FALSE, FALSE, 0);
+      dock->p->south_separator = gimp_dock_separator_new (GTK_ANCHOR_SOUTH,
+                                                          gimp_dock_dropped_cb,
+                                                          dock);
+      gtk_box_pack_end (GTK_BOX (dock->p->vbox),
+                        dock->p->south_separator,
+                        FALSE, FALSE, 0);
     }
   else
     {
diff --git a/app/widgets/gimpdockseparator.c b/app/widgets/gimpdockseparator.c
index 0d7deda..e489bf9 100644
--- a/app/widgets/gimpdockseparator.c
+++ b/app/widgets/gimpdockseparator.c
@@ -29,9 +29,6 @@
 #include "gimpdialogfactory.h"
 #include "gimpdnd.h"
 #include "gimphelp-ids.h"
-#include "gimpdock.h"
-#include "gimpdockable.h"
-#include "gimpdockbook.h"
 #include "gimpdockseparator.h"
 
 #include "gimp-intl.h"
@@ -45,12 +42,13 @@
 
 struct _GimpDockSeparatorPrivate
 {
-  GimpDock      *dock;
+  GimpDockSeparatorDroppedFunc  dropped_cb;
+  gpointer                     *dropped_cb_data;
 
-  GtkWidget     *frame;
-  GtkWidget     *label;
+  GtkWidget                    *frame;
+  GtkWidget                    *label;
 
-  GtkAnchorType  anchor;
+  GtkAnchorType                 anchor;
 };
 
 
@@ -107,8 +105,6 @@ gimp_dock_separator_init (GimpDockSeparator *separator)
   separator->p = G_TYPE_INSTANCE_GET_PRIVATE (separator,
                                               GIMP_TYPE_DOCK_SEPARATOR,
                                               GimpDockSeparatorPrivate);
-  separator->p->dock  = NULL;
-  separator->p->label = NULL;
 
   separator->p->frame = gtk_frame_new (NULL);
   gtk_frame_set_shadow_type (GTK_FRAME (separator->p->frame), GTK_SHADOW_OUT);
@@ -196,64 +192,14 @@ gimp_dock_separator_drag_drop (GtkWidget      *widget,
   if (GTK_WIDGET_CLASS (parent_class)->drag_drop)
     GTK_WIDGET_CLASS (parent_class)->drag_drop (widget, context, x, y, time);
 
+  if (! separator->p->dropped_cb)
+    return FALSE;
+
   source = gtk_drag_get_source_widget (context);
 
   if (source)
     {
-      GimpDock     *dock = separator->p->dock;
-      GimpDockable *dockable;
-
-      if (GIMP_IS_DOCKABLE (source))
-        dockable = GIMP_DOCKABLE (source);
-      else
-        dockable = g_object_get_data (G_OBJECT (source), "gimp-dockable");
-
-      if (dockable)
-        {
-          GtkWidget *dockbook;
-          gint       index = -1;
-
-          g_object_set_data (G_OBJECT (dockable),
-                             "gimp-dock-drag-widget", NULL);
-
-          if (separator->p->anchor == GTK_ANCHOR_NORTH)
-            index = 0;
-          else if (separator->p->anchor == GTK_ANCHOR_SOUTH)
-            index = -1;
-
-          /*  if dropping to the same dock, take care that we don't try
-           *  to reorder the *only* dockable in the dock
-           */
-          if (gimp_dockbook_get_dock (dockable->dockbook) == dock)
-            {
-              GList *children;
-              gint   n_books;
-              gint   n_dockables;
-
-              n_books = g_list_length (gimp_dock_get_dockbooks (dock));
-
-              children =
-                gtk_container_get_children (GTK_CONTAINER (dockable->dockbook));
-              n_dockables = g_list_length (children);
-              g_list_free (children);
-
-              if (n_books == 1 && n_dockables == 1)
-                return TRUE; /* successfully do nothing */
-            }
-
-          g_object_ref (dockable);
-
-          gimp_dockbook_remove (dockable->dockbook, dockable);
-
-          dockbook = gimp_dockbook_new (gimp_dock_get_dialog_factory (dock)->menu_factory);
-          gimp_dock_add_book (dock, GIMP_DOCKBOOK (dockbook), index);
-
-          gimp_dockbook_add (GIMP_DOCKBOOK (dockbook), dockable, -1);
-
-          g_object_unref (dockable);
-
-          return TRUE;
-        }
+      return separator->p->dropped_cb (separator, source, separator->p->dropped_cb_data);
     }
 
   return FALSE;
@@ -263,21 +209,29 @@ gimp_dock_separator_drag_drop (GtkWidget      *widget,
 /*  public functions  */
 
 GtkWidget *
-gimp_dock_separator_new (GimpDock      *dock,
-                         GtkAnchorType  anchor)
+gimp_dock_separator_new (GtkAnchorType                anchor,
+                         GimpDockSeparatorDroppedFunc dropped_cb,
+                         gpointer                     dropped_cb_data)
 {
   GimpDockSeparator *separator;
 
-  g_return_val_if_fail (GIMP_IS_DOCK (dock), NULL);
-
   separator = g_object_new (GIMP_TYPE_DOCK_SEPARATOR, NULL);
 
-  separator->p->dock   = dock;
-  separator->p->anchor = anchor;
+  separator->p->anchor          = anchor;
+  separator->p->dropped_cb      = dropped_cb;
+  separator->p->dropped_cb_data = dropped_cb_data;
 
   return GTK_WIDGET (separator);
 }
 
+GtkAnchorType
+gimp_dock_separator_get_anchor (GimpDockSeparator *separator)
+{
+  g_return_val_if_fail (GIMP_IS_DOCK_SEPARATOR (separator), GTK_ANCHOR_CENTER);
+
+  return separator->p->anchor;
+}
+
 void
 gimp_dock_separator_set_show_label (GimpDockSeparator *separator,
                                     gboolean           show)
diff --git a/app/widgets/gimpdockseparator.h b/app/widgets/gimpdockseparator.h
index 53a0bd6..f4dc5c4 100644
--- a/app/widgets/gimpdockseparator.h
+++ b/app/widgets/gimpdockseparator.h
@@ -52,13 +52,13 @@ struct _GimpDockSeparatorClass
 };
 
 
-GType       gimp_dock_separator_get_type       (void) G_GNUC_CONST;
-
-GtkWidget * gimp_dock_separator_new            (GimpDock          *dock,
-                                                GtkAnchorType      anchor);
-
-void        gimp_dock_separator_set_show_label (GimpDockSeparator *separator,
-                                                gboolean           show);
+GType          gimp_dock_separator_get_type       (void) G_GNUC_CONST;
+GtkWidget    * gimp_dock_separator_new            (GtkAnchorType                 anchor,
+                                                   GimpDockSeparatorDroppedFunc  dropped_cb,
+                                                   gpointer                      dropped_cb_data);
+GtkAnchorType  gimp_dock_separator_get_anchor     (GimpDockSeparator            *separator);
+void           gimp_dock_separator_set_show_label (GimpDockSeparator            *separator,
+                                                   gboolean                      show);
 
 
 #endif /* __GIMP_DOCK_SEPARATOR_H__ */
diff --git a/app/widgets/widgets-types.h b/app/widgets/widgets-types.h
index 49b0957..39e3bc2 100644
--- a/app/widgets/widgets-types.h
+++ b/app/widgets/widgets-types.h
@@ -245,17 +245,20 @@ typedef struct _GimpDialogFactoryEntry       GimpDialogFactoryEntry;
 
 /*  function types  */
 
-typedef void (* GimpActionGroupSetupFunc)  (GimpActionGroup *group);
-typedef void (* GimpActionGroupUpdateFunc) (GimpActionGroup *group,
-                                            gpointer         data);
-
-typedef void (* GimpUIManagerSetupFunc)    (GimpUIManager   *manager,
-                                            const gchar     *ui_path);
-
-typedef void (* GimpMenuPositionFunc)      (GtkMenu         *menu,
-                                            gint            *x,
-                                            gint            *y,
-                                            gpointer         data);
+typedef void     (* GimpActionGroupSetupFunc)     (GimpActionGroup *group);
+typedef void     (* GimpActionGroupUpdateFunc)    (GimpActionGroup *group,
+                                                   gpointer         data);
+
+typedef void     (* GimpUIManagerSetupFunc)       (GimpUIManager   *manager,
+                                                   const gchar     *ui_path);
+
+typedef void     (* GimpMenuPositionFunc)         (GtkMenu         *menu,
+                                                   gint            *x,
+                                                   gint            *y,
+                                                   gpointer         data);
+typedef gboolean (* GimpDockSeparatorDroppedFunc) (GimpDockSeparator *separator,
+                                                   GtkWidget         *source,
+                                                   gpointer           data);
 
 
 #endif /* __WIDGETS_TYPES_H__ */



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