[gimp] app: Allow more than one dock inside a dock window



commit e81c4f44dec9b7671db8136e37e76baf45ca78d9
Author: Martin Nordholts <martinn src gnome org>
Date:   Sun Oct 25 13:10:08 2009 +0100

    app: Allow more than one dock inside a dock window
    
    Put a GimpDockColumns inside GimpDockWindow so that there can be more
    than one dock inside a dock window. For now,
    gimp_dock_window_get_dock() returns the first dock. Eventually need to
    return all docks and refactor the other code as needed.

 app/widgets/gimpdialogfactory.c |    5 ++-
 app/widgets/gimpdockwindow.c    |   40 ++++++++++++++++++++++++++++++++++----
 app/widgets/gimpdockwindow.h    |    5 +++-
 3 files changed, 42 insertions(+), 8 deletions(-)
---
diff --git a/app/widgets/gimpdialogfactory.c b/app/widgets/gimpdialogfactory.c
index 75476c2..c9036a7 100644
--- a/app/widgets/gimpdialogfactory.c
+++ b/app/widgets/gimpdialogfactory.c
@@ -795,8 +795,9 @@ gimp_dialog_factory_dock_new (GimpDialogFactory *factory,
   if (dock)
     {
       /* Put the dock in the dock window */
-      gimp_dock_window_set_dock (GIMP_DOCK_WINDOW (dock_window),
-                                 GIMP_DOCK (dock));
+      gimp_dock_window_add_dock (GIMP_DOCK_WINDOW (dock_window),
+                                 GIMP_DOCK (dock),
+                                 -1);
     }
 
   return dock;
diff --git a/app/widgets/gimpdockwindow.c b/app/widgets/gimpdockwindow.c
index 4455119..c79342e 100644
--- a/app/widgets/gimpdockwindow.c
+++ b/app/widgets/gimpdockwindow.c
@@ -39,6 +39,7 @@
 #include "gimpdialogfactory.h"
 #include "gimpdock.h"
 #include "gimpdockbook.h"
+#include "gimpdockcolumns.h"
 #include "gimpdockwindow.h"
 #include "gimpmenufactory.h"
 #include "gimpsessioninfo.h"
@@ -73,6 +74,8 @@ struct _GimpDockWindowPrivate
   GimpUIManager     *ui_manager;
   GQuark             image_flush_handler_id;
 
+  GimpDockColumns   *dock_columns;
+
   gboolean           allow_dockbook_absence;
 
   guint              update_title_idle_id;
@@ -191,8 +194,13 @@ gimp_dock_window_init (GimpDockWindow *dock_window)
   dock_window->p->image_flush_handler_id = 0;
   dock_window->p->ID                     = dock_ID++;
   dock_window->p->update_title_idle_id   = 0;
+  dock_window->p->dock_columns           = g_object_new (GIMP_TYPE_DOCK_COLUMNS,
+                                                         NULL);
 
   /* Some common initialization for all dock windows */
+  gtk_container_add (GTK_CONTAINER (dock_window),
+                     GTK_WIDGET (dock_window->p->dock_columns));
+  gtk_widget_show (GTK_WIDGET (dock_window->p->dock_columns));
   gtk_window_set_resizable (GTK_WINDOW (dock_window), TRUE);
   gtk_window_set_focus_on_map (GTK_WINDOW (dock_window), FALSE);
 
@@ -526,14 +534,16 @@ gimp_dock_window_dock_book_removed (GimpDockWindow *dock_window,
 }
 
 void
-gimp_dock_window_set_dock (GimpDockWindow *dock_window,
-                           GimpDock       *dock)
+gimp_dock_window_add_dock (GimpDockWindow *dock_window,
+                           GimpDock       *dock,
+                           gint            index)
 {
   g_return_if_fail (GIMP_IS_DOCK_WINDOW (dock_window));
   g_return_if_fail (GIMP_IS_DOCK (dock));
 
-  /* FIXME: Handle more than one call to this function */
-  gtk_container_add (GTK_CONTAINER (dock_window), GTK_WIDGET (dock));
+  gimp_dock_columns_add_dock (dock_window->p->dock_columns,
+                              GIMP_DOCK (dock),
+                              index);
 
   /* Update window title now and when docks title is invalidated */
   gimp_dock_window_update_title (dock_window);
@@ -557,6 +567,24 @@ gimp_dock_window_set_dock (GimpDockWindow *dock_window,
                            G_CONNECT_SWAPPED);
 }
 
+void
+gimp_dock_window_remove_dock (GimpDockWindow *dock_window,
+                              GimpDock       *dock)
+{
+  gimp_dock_columns_remove_dock (dock_window->p->dock_columns,
+                                 GIMP_DOCK (dock));
+
+  g_signal_handlers_disconnect_by_func (dock,
+                                        gimp_dock_window_update_title,
+                                        dock_window);
+  g_signal_handlers_disconnect_by_func (dock,
+                                        gimp_dock_set_host_geometry_hints,
+                                        dock_window);
+  g_signal_handlers_disconnect_by_func (dock,
+                                        gimp_dock_window_dock_book_removed,
+                                        dock_window);
+}
+
 gint
 gimp_dock_window_get_id (GimpDockWindow *dock_window)
 {
@@ -608,5 +636,7 @@ gimp_dock_window_from_dock (GimpDock *dock)
 GimpDock *
 gimp_dock_window_get_dock (GimpDockWindow *dock_window)
 {
-  return GIMP_DOCK (gtk_bin_get_child (GTK_BIN (dock_window)));
+  GList *docks = gimp_dock_columns_get_docks (dock_window->p->dock_columns);
+
+  return g_list_length (docks) > 0 ? GIMP_DOCK (docks->data) : NULL;
 }
diff --git a/app/widgets/gimpdockwindow.h b/app/widgets/gimpdockwindow.h
index c52803c..e3c8617 100644
--- a/app/widgets/gimpdockwindow.h
+++ b/app/widgets/gimpdockwindow.h
@@ -57,7 +57,10 @@ struct _GimpDockWindowClass
 
 GType               gimp_dock_window_get_type       (void) G_GNUC_CONST;
 gint                gimp_dock_window_get_id         (GimpDockWindow *dock_window);
-void                gimp_dock_window_set_dock       (GimpDockWindow *dock_window,
+void                gimp_dock_window_add_dock       (GimpDockWindow *dock_window,
+                                                     GimpDock       *dock,
+                                                     gint            index);
+void                gimp_dock_window_remove_dock    (GimpDockWindow *dock_window,
                                                      GimpDock       *dock);
 GimpUIManager     * gimp_dock_window_get_ui_manager (GimpDockWindow *dock_window);
 GimpDockWindow    * gimp_dock_window_from_dock      (GimpDock       *dock);



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