[gnome-builder/wip/tree-menu: 43/46] tree: allow builders to populate GMenu rather than old style GtkMenuShell
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/tree-menu: 43/46] tree: allow builders to populate GMenu rather than old style GtkMenuShell
- Date: Wed, 8 Apr 2015 07:47:37 +0000 (UTC)
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]