[gnome-builder/wip/tree-menu: 43/46] tree: allow builders to populate GMenu rather than old style GtkMenuShell



commit 9cf6d0100b97140d8121995ddb1bf6719d1f0848
Author: Christian Hergert <christian hergert me>
Date:   Sun Apr 5 21:13:57 2015 -0700

    tree: allow builders to populate GMenu rather than old style GtkMenuShell

 src/editor/gb-editor-workspace.c |    6 --
 src/tree/gb-tree-builder.c       |   13 ++--
 src/tree/gb-tree-builder.h       |    6 +-
 src/tree/gb-tree.c               |  128 +++++++++++++-------------------------
 4 files changed, 55 insertions(+), 98 deletions(-)
---
diff --git a/src/editor/gb-editor-workspace.c b/src/editor/gb-editor-workspace.c
index 550ff3d..55a7bec 100644
--- a/src/editor/gb-editor-workspace.c
+++ b/src/editor/gb-editor-workspace.c
@@ -146,8 +146,6 @@ static void
 gb_editor_workspace_constructed (GObject *object)
 {
   GbEditorWorkspace *self = (GbEditorWorkspace *)object;
-  GApplication *app;
-  GMenu *menu;
 
   IDE_ENTRY;
 
@@ -155,10 +153,6 @@ gb_editor_workspace_constructed (GObject *object)
 
   gb_editor_workspace_actions_init (self);
 
-  app = g_application_get_default ();
-  menu = gtk_application_get_menu_by_id (GTK_APPLICATION (app), "project-tree-menu");
-  gb_tree_set_menu (self->project_tree, menu);
-
   IDE_EXIT;
 }
 
diff --git a/src/tree/gb-tree-builder.c b/src/tree/gb-tree-builder.c
index 7f155e9..d18b212 100644
--- a/src/tree/gb-tree-builder.c
+++ b/src/tree/gb-tree-builder.c
@@ -67,14 +67,15 @@ gb_tree_builder_node_activated (GbTreeBuilder *builder,
 
 void
 gb_tree_builder_node_popup (GbTreeBuilder *builder,
-                            GbTreeNode    *node)
+                            GbTreeNode    *node,
+                            GMenu         *menu)
 {
-   g_return_if_fail(GB_IS_TREE_BUILDER(builder));
-   g_return_if_fail(GB_IS_TREE_NODE(node));
+   g_return_if_fail (GB_IS_TREE_BUILDER (builder));
+   g_return_if_fail (GB_IS_TREE_NODE (node));
+   g_return_if_fail (G_IS_MENU (menu));
 
-   if (GB_TREE_BUILDER_GET_CLASS(builder)->node_popup) {
-      GB_TREE_BUILDER_GET_CLASS(builder)->node_popup(builder, node);
-   }
+   if (GB_TREE_BUILDER_GET_CLASS(builder)->node_popup)
+      GB_TREE_BUILDER_GET_CLASS(builder)->node_popup (builder, node, menu);
 }
 
 /**
diff --git a/src/tree/gb-tree-builder.h b/src/tree/gb-tree-builder.h
index 53b11c9..9e9c610 100644
--- a/src/tree/gb-tree-builder.h
+++ b/src/tree/gb-tree-builder.h
@@ -64,7 +64,8 @@ struct _GbTreeBuilderClass
   void     (*node_unselected) (GbTreeBuilder *builder,
                                GbTreeNode    *node);
   void     (*node_popup)      (GbTreeBuilder *builder,
-                               GbTreeNode    *node);
+                               GbTreeNode    *node,
+                               GMenu         *menu);
 };
 
 GtkWidget *gb_tree_builder_get_tree        (GbTreeBuilder *builder);
@@ -74,7 +75,8 @@ void       gb_tree_builder_build_node      (GbTreeBuilder *builder,
 gboolean   gb_tree_builder_node_activated  (GbTreeBuilder *builder,
                                             GbTreeNode    *node);
 void       gb_tree_builder_node_popup      (GbTreeBuilder *builder,
-                                            GbTreeNode    *node);
+                                            GbTreeNode    *node,
+                                            GMenu         *menu);
 void       gb_tree_builder_node_selected   (GbTreeBuilder *builder,
                                             GbTreeNode    *node);
 void       gb_tree_builder_node_unselected (GbTreeBuilder *builder,
diff --git a/src/tree/gb-tree.c b/src/tree/gb-tree.c
index 7864487..d8730b4 100644
--- a/src/tree/gb-tree.c
+++ b/src/tree/gb-tree.c
@@ -27,7 +27,6 @@
 struct _GbTreePrivate
 {
   GPtrArray    *builders;
-  GMenu        *menu;
   GbTreeNode   *root;
   GbTreeNode   *selection;
   GtkTreeStore *store;
@@ -38,7 +37,6 @@ G_DEFINE_TYPE_WITH_PRIVATE (GbTree, gb_tree, GTK_TYPE_TREE_VIEW)
 
 enum {
   PROP_0,
-  PROP_MENU,
   PROP_ROOT,
   PROP_SELECTION,
   LAST_PROP
@@ -56,44 +54,6 @@ static GParamSpec *gParamSpecs [LAST_PROP];
 static guint gSignals [LAST_SIGNAL];
 
 /**
- * gb_tree_get_menu:
- * @tree: (in): A #GbTree.
- *
- * Gets the #GMenu to be displayed when right clicking on an item in the tree.
- * Node's should update actions sensitivity in their selection callbacks.
- *
- * Returns: (transfer none): A #GMenu or %NULL.
- */
-GMenu *
-gb_tree_get_menu (GbTree *tree)
-{
-  g_return_val_if_fail (GB_IS_TREE (tree), NULL);
-
-  return tree->priv->menu;
-}
-
-/**
- * gb_tree_set_menu:
- * @menu: (in) (transfer none): A #GMenu or %NULL.
- *
- * Set the menu to be used when a popup is to be shown.
- */
-void
-gb_tree_set_menu (GbTree *tree,
-                  GMenu  *menu)
-{
-  g_return_if_fail (GB_IS_TREE (tree));
-  g_return_if_fail (!menu || G_IS_MENU (menu));
-
-  if (menu != tree->priv->menu)
-    {
-      g_clear_object (&tree->priv->menu);
-      tree->priv->menu = menu ? g_object_ref (menu) : NULL;
-      g_object_notify_by_pspec (G_OBJECT (tree), gParamSpecs [PROP_MENU]);
-    }
-}
-
-/**
  * gb_tree_unselect:
  * @tree: (in): A #GbTree.
  *
@@ -180,6 +140,35 @@ check_visible_foreach (GtkWidget *widget,
     *at_least_one_visible = TRUE;
 }
 
+static GMenu *
+gb_tree_create_menu (GbTree     *self,
+                     GbTreeNode *node)
+{
+  GtkApplication *app;
+  GMenu *menu;
+  GMenu *submenu;
+  guint i;
+
+  g_return_val_if_fail (GB_IS_TREE (self), NULL);
+  g_return_val_if_fail (GB_IS_TREE_NODE (node), NULL);
+
+  menu = g_menu_new ();
+  app = GTK_APPLICATION (g_application_get_default ());
+
+  submenu = gtk_application_get_menu_by_id (app, "gb-tree-display-options");
+  g_menu_append_section (menu, NULL, G_MENU_MODEL (submenu));
+
+  for (i = 0; i < self->priv->builders->len; i++)
+    {
+      GbTreeBuilder *builder;
+
+      builder = g_ptr_array_index (self->priv->builders, i);
+      gb_tree_builder_node_popup (builder, node, menu);
+    }
+
+  return menu;
+}
+
 static void
 gb_tree_popup (GbTree         *tree,
                GbTreeNode     *node,
@@ -187,12 +176,10 @@ gb_tree_popup (GbTree         *tree,
                gint            target_x,
                gint            target_y)
 {
-  GbTreePrivate *priv;
-  GbTreeBuilder *builder;
-  GtkWidget *menu;
   GdkPoint loc = { -1, -1 };
   gboolean at_least_one_visible = FALSE;
-  guint i;
+  GtkWidget *menu_widget;
+  GMenu *menu;
   gint button;
   gint event_time;
 
@@ -201,25 +188,11 @@ gb_tree_popup (GbTree         *tree,
   g_return_if_fail (GB_IS_TREE (tree));
   g_return_if_fail (GB_IS_TREE_NODE (node));
 
-  priv = tree->priv;
-
-  if (priv->menu == NULL)
-    IDE_EXIT;
-
-  menu = gtk_menu_new_from_model (G_MENU_MODEL (priv->menu));
+  menu = gb_tree_create_menu (tree, node);
+  menu_widget = gtk_menu_new_from_model (G_MENU_MODEL (menu));
+  g_clear_object (&menu);
 
-  if (menu == NULL)
-    IDE_EXIT;
-
-  gtk_menu_attach_to_widget (GTK_MENU (menu), GTK_WIDGET (tree), NULL);
-
-  g_signal_emit (tree, gSignals [POPULATE_POPUP], 0, menu);
-
-  for (i = 0; i < priv->builders->len; i++)
-    {
-      builder = g_ptr_array_index (priv->builders, i);
-      gb_tree_builder_node_popup (builder, node);
-    }
+  g_signal_emit (tree, gSignals [POPULATE_POPUP], 0, menu_widget);
 
   if ((target_x >= 0) && (target_y >= 0))
     {
@@ -228,7 +201,7 @@ gb_tree_popup (GbTree         *tree,
       loc.x -= 12;
     }
 
-  gtk_container_foreach (GTK_CONTAINER (menu),
+  gtk_container_foreach (GTK_CONTAINER (menu_widget),
                          check_visible_foreach,
                          &at_least_one_visible);
 
@@ -244,9 +217,14 @@ gb_tree_popup (GbTree         *tree,
     }
 
   if (at_least_one_visible)
-    gtk_menu_popup (GTK_MENU (menu), NULL, NULL,
-                    gb_tree_menu_position_func, &loc,
-                    button, event_time);
+    {
+      gtk_menu_attach_to_widget (GTK_MENU (menu_widget),
+                                 GTK_WIDGET (tree),
+                                 NULL);
+      gtk_menu_popup (GTK_MENU (menu_widget), NULL, NULL,
+                      gb_tree_menu_position_func, &loc,
+                      button, event_time);
+    }
 
   IDE_EXIT;
 }
@@ -853,7 +831,6 @@ gb_tree_finalize (GObject *object)
   GbTreePrivate *priv = GB_TREE (object)->priv;
 
   g_ptr_array_unref (priv->builders);
-  g_clear_object (&priv->menu);
   g_clear_object (&priv->store);
   g_clear_object (&priv->root);
 
@@ -879,10 +856,6 @@ gb_tree_get_property (GObject    *object,
 
   switch (prop_id)
     {
-    case PROP_MENU:
-      g_value_set_object (value, tree->priv->menu);
-      break;
-
     case PROP_ROOT:
       g_value_set_object (value, tree->priv->root);
       break;
@@ -915,10 +888,6 @@ gb_tree_set_property (GObject      *object,
 
   switch (prop_id)
     {
-    case PROP_MENU:
-      gb_tree_set_menu (tree, g_value_get_object (value));
-      break;
-
     case PROP_ROOT:
       gb_tree_set_root (tree, g_value_get_object (value));
       break;
@@ -952,15 +921,6 @@ gb_tree_class_init (GbTreeClass *klass)
   widget_class = GTK_WIDGET_CLASS (klass);
   widget_class->popup_menu = gb_tree_popup_menu;
 
-  gParamSpecs [PROP_MENU] =
-    g_param_spec_object ("menu",
-                         _("Menu"),
-                         _("The context menu for the tree."),
-                         G_TYPE_MENU,
-                         (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (object_class, PROP_MENU,
-                                   gParamSpecs [PROP_MENU]);
-
   gParamSpecs[PROP_ROOT] =
     g_param_spec_object ("root",
                          _ ("Root"),


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