[gnome-builder] workbench: add gb_workbench_views_foreach()



commit 8b82cdc3e5e372f5c15a886c41ea7ed45d553ec9
Author: Christian Hergert <christian hergert me>
Date:   Thu May 7 22:18:06 2015 -0700

    workbench: add gb_workbench_views_foreach()
    
    This is a helper to iterate all of the GbView in the workspaces.
    I don't particularly like this, but it keeps us moving forward.
    
    I'd really like to see something in the future that manages views,
    workspaces, layouts, etc in a cleaner way.

 src/editor/gb-editor-workspace.c |   32 ++++++++++++++++++++++++++++++++
 src/views/gb-view-stack.c        |   15 +++++++++++++++
 src/views/gb-view-stack.h        |    1 +
 src/workbench/gb-workbench.c     |   11 +++++++++++
 src/workbench/gb-workbench.h     |    3 +++
 src/workbench/gb-workspace.c     |   12 ++++++++++++
 src/workbench/gb-workspace.h     |    7 +++++++
 7 files changed, 81 insertions(+), 0 deletions(-)
---
diff --git a/src/editor/gb-editor-workspace.c b/src/editor/gb-editor-workspace.c
index f239af9..75872bc 100644
--- a/src/editor/gb-editor-workspace.c
+++ b/src/editor/gb-editor-workspace.c
@@ -240,6 +240,35 @@ gb_editor_workspace__project_paned_notify_position (GbEditorWorkspace *self,
 }
 
 static void
+gb_editor_workspace_views_foreach (GbWorkspace *workspace,
+                                   GtkCallback  callback,
+                                   gpointer     callback_data)
+{
+  GbEditorWorkspace *self = (GbEditorWorkspace *)workspace;
+  GList *stacks;
+  GList *stack;
+
+  g_assert (GB_IS_EDITOR_WORKSPACE (self));
+
+  stacks = gb_view_grid_get_stacks (self->view_grid);
+
+  for (stack = stacks; stack; stack = stack->next)
+    {
+      GList *views;
+      GList *iter;
+
+      views = gb_view_stack_get_views (stack->data);
+
+      for (iter = views; iter; iter = iter->next)
+        callback (iter->data, callback_data);
+
+      g_list_free (views);
+    }
+
+  g_list_free (stacks);
+}
+
+static void
 gb_editor_workspace_constructed (GObject *object)
 {
   GbEditorWorkspace *self = (GbEditorWorkspace *)object;
@@ -314,6 +343,7 @@ gb_editor_workspace_class_init (GbEditorWorkspaceClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+  GbWorkspaceClass *workspace_class = GB_WORKSPACE_CLASS (klass);
 
   object_class->constructed = gb_editor_workspace_constructed;
   object_class->finalize = gb_editor_workspace_finalize;
@@ -323,6 +353,8 @@ gb_editor_workspace_class_init (GbEditorWorkspaceClass *klass)
   widget_class->grab_focus = gb_editor_workspace_grab_focus;
   widget_class->hierarchy_changed = gb_editor_workspace_hierarchy_changed;
 
+  workspace_class->views_foreach = gb_editor_workspace_views_foreach;
+
   gParamSpecs [PROP_SHOW_PROJECT_TREE] =
     g_param_spec_boolean ("show-project-tree",
                           _("Show Project Tree"),
diff --git a/src/views/gb-view-stack.c b/src/views/gb-view-stack.c
index 818b6fa..540b546 100644
--- a/src/views/gb-view-stack.c
+++ b/src/views/gb-view-stack.c
@@ -821,3 +821,18 @@ gb_view_stack_find_document_typed (GbViewStack *self,
 
   return NULL;
 }
+
+/**
+ * gb_view_stack_get_views:
+ *
+ * Gets the views belonging to this #GbViewStack.
+ *
+ * Returns: (transfer container): A #GList of #GbView.
+ */
+GList *
+gb_view_stack_get_views (GbViewStack *self)
+{
+  g_return_val_if_fail (GB_IS_VIEW_STACK (self), NULL);
+
+  return gtk_container_get_children (GTK_CONTAINER (self->stack));
+}
diff --git a/src/views/gb-view-stack.h b/src/views/gb-view-stack.h
index 0139b6b..fa4b433 100644
--- a/src/views/gb-view-stack.h
+++ b/src/views/gb-view-stack.h
@@ -45,6 +45,7 @@ void        gb_view_stack_focus_document      (GbViewStack       *self,
                                                GbDocument        *document);
 void        gb_view_stack_focus_location      (GbViewStack       *self,
                                                IdeSourceLocation *location);
+GList      *gb_view_stack_get_views           (GbViewStack       *self);
 
 G_END_DECLS
 
diff --git a/src/workbench/gb-workbench.c b/src/workbench/gb-workbench.c
index da6f328..64b4f61 100644
--- a/src/workbench/gb-workbench.c
+++ b/src/workbench/gb-workbench.c
@@ -877,3 +877,14 @@ gb_workbench_get_closing (GbWorkbench *self)
 
   return (self->unloading || (self->disposing > 0));
 }
+
+void
+gb_workbench_views_foreach (GbWorkbench *self,
+                            GtkCallback  callback,
+                            gpointer     callback_data)
+{
+  g_return_if_fail (GB_IS_WORKBENCH (self));
+  g_return_if_fail (callback != NULL);
+
+  gb_workspace_views_foreach (GB_WORKSPACE (self->editor_workspace), callback, callback_data);
+}
diff --git a/src/workbench/gb-workbench.h b/src/workbench/gb-workbench.h
index c7490f3..1675710 100644
--- a/src/workbench/gb-workbench.h
+++ b/src/workbench/gb-workbench.h
@@ -54,6 +54,9 @@ GbCommandManager *gb_workbench_get_command_manager  (GbWorkbench         *self);
 gpointer          gb_workbench_get_workspace_typed  (GbWorkbench         *self,
                                                      GType                workspace_type);
 gboolean          gb_workbench_get_closing          (GbWorkbench         *self);
+void              gb_workbench_views_foreach        (GbWorkbench         *self,
+                                                     GtkCallback          callback,
+                                                     gpointer             callback_data);
 
 G_END_DECLS
 
diff --git a/src/workbench/gb-workspace.c b/src/workbench/gb-workspace.c
index dbe3094..b1b18fe 100644
--- a/src/workbench/gb-workspace.c
+++ b/src/workbench/gb-workspace.c
@@ -180,3 +180,15 @@ static void
 gb_workspace_init (GbWorkspace *workspace)
 {
 }
+
+void
+gb_workspace_views_foreach (GbWorkspace *self,
+                            GtkCallback  callback,
+                            gpointer     callback_data)
+{
+  g_return_if_fail (GB_IS_WORKSPACE (self));
+  g_return_if_fail (callback != NULL);
+
+  if (GB_WORKSPACE_GET_CLASS (self)->views_foreach)
+    GB_WORKSPACE_GET_CLASS (self)->views_foreach (self, callback, callback_data);
+}
diff --git a/src/workbench/gb-workspace.h b/src/workbench/gb-workspace.h
index cffbbed..6997a7e 100644
--- a/src/workbench/gb-workspace.h
+++ b/src/workbench/gb-workspace.h
@@ -32,6 +32,10 @@ G_DECLARE_DERIVABLE_TYPE (GbWorkspace, gb_workspace, GB, WORKSPACE, GtkBin)
 struct _GbWorkspaceClass
 {
   GtkBinClass parent_class;
+
+  void (*views_foreach) (GbWorkspace *workspace,
+                         GtkCallback  callback,
+                         gpointer     callback_data);
 };
 
 const gchar  *gb_workspace_get_icon_name (GbWorkspace *self);
@@ -40,6 +44,9 @@ void          gb_workspace_set_icon_name (GbWorkspace *self,
 const gchar  *gb_workspace_get_title     (GbWorkspace *self);
 void          gb_workspace_set_title     (GbWorkspace *self,
                                           const gchar *title);
+void          gb_workspace_views_foreach (GbWorkspace *self,
+                                          GtkCallback  callback,
+                                          gpointer     callback_data);
 
 G_END_DECLS
 


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