[gimp] app: Generalize GimpDockSeparator
- From: Martin Nordholts <martinn src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] app: Generalize GimpDockSeparator
- Date: Sun, 11 Oct 2009 11:58:10 +0000 (UTC)
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]