From e109b31b0af76716326ef4e73bfee11ec4eba856 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sun, 19 Jun 2005 03:55:12 +0000 Subject: [PATCH] Make this work for inserting before/after an existing menuitem or 2005-06-18 Matthias Clasen * gtk/gtkuimanager.c (gtk_ui_manager_add_ui): Make this work for inserting before/after an existing menuitem or toolitem. (#155946, Christian Persch) * tests/testmerge.c (delayed_toggle_dynamic): Test the "insert after" functionality of gtk_ui_manager_add_ui. --- ChangeLog | 7 +++++ ChangeLog.pre-2-10 | 7 +++++ ChangeLog.pre-2-8 | 7 +++++ gtk/gtkuimanager.c | 68 +++++++++++++++++++++++++++++++++------------- tests/testmerge.c | 4 +-- 5 files changed, 72 insertions(+), 21 deletions(-) diff --git a/ChangeLog b/ChangeLog index 285b92065e..a7a215751d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2005-06-18 Matthias Clasen + * gtk/gtkuimanager.c (gtk_ui_manager_add_ui): Make this + work for inserting before/after an existing menuitem or + toolitem. (#155946, Christian Persch) + + * tests/testmerge.c (delayed_toggle_dynamic): Test the + "insert after" functionality of gtk_ui_manager_add_ui. + * gtk/gtkuimanager.c: Allow to construct menu tool buttons. (#300678, Sven Neumann) diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 285b92065e..a7a215751d 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,12 @@ 2005-06-18 Matthias Clasen + * gtk/gtkuimanager.c (gtk_ui_manager_add_ui): Make this + work for inserting before/after an existing menuitem or + toolitem. (#155946, Christian Persch) + + * tests/testmerge.c (delayed_toggle_dynamic): Test the + "insert after" functionality of gtk_ui_manager_add_ui. + * gtk/gtkuimanager.c: Allow to construct menu tool buttons. (#300678, Sven Neumann) diff --git a/ChangeLog.pre-2-8 b/ChangeLog.pre-2-8 index 285b92065e..a7a215751d 100644 --- a/ChangeLog.pre-2-8 +++ b/ChangeLog.pre-2-8 @@ -1,5 +1,12 @@ 2005-06-18 Matthias Clasen + * gtk/gtkuimanager.c (gtk_ui_manager_add_ui): Make this + work for inserting before/after an existing menuitem or + toolitem. (#155946, Christian Persch) + + * tests/testmerge.c (delayed_toggle_dynamic): Test the + "insert after" functionality of gtk_ui_manager_add_ui. + * gtk/gtkuimanager.c: Allow to construct menu tool buttons. (#300678, Sven Neumann) diff --git a/gtk/gtkuimanager.c b/gtk/gtkuimanager.c index ee690925bc..6233b3ca1d 100644 --- a/gtk/gtkuimanager.c +++ b/gtk/gtkuimanager.c @@ -127,6 +127,7 @@ static void dirty_all_nodes (GtkUIManager *self); static void mark_node_dirty (GNode *node); static GNode * get_child_node (GtkUIManager *self, GNode *parent, + GNode *sibling, const gchar *childname, gint childname_length, NodeType node_type, @@ -403,7 +404,7 @@ gtk_ui_manager_init (GtkUIManager *self) self->private_data->add_tearoffs = FALSE; merge_id = gtk_ui_manager_new_merge_id (self); - node = get_child_node (self, NULL, "ui", 2, + node = get_child_node (self, NULL, NULL, "ui", 2, NODE_TYPE_ROOT, TRUE, FALSE); node_prepend_ui_reference (node, merge_id, 0); } @@ -852,6 +853,7 @@ gtk_ui_manager_get_action (GtkUIManager *self, static GNode * get_child_node (GtkUIManager *self, GNode *parent, + GNode *sibling, const gchar *childname, gint childname_length, NodeType node_type, @@ -895,10 +897,22 @@ get_child_node (GtkUIManager *self, mnode->type = node_type; mnode->name = g_strndup (childname, childname_length); - if (top) - child = g_node_prepend_data (parent, mnode); + if (sibling) + { + if (top) + child = g_node_insert_before (parent, sibling, + g_node_new (mnode)); + else + child = g_node_insert_after (parent, sibling, + g_node_new (mnode)); + } else - child = g_node_append_data (parent, mnode); + { + if (top) + child = g_node_prepend_data (parent, mnode); + else + child = g_node_append_data (parent, mnode); + } mark_node_dirty (child); } @@ -957,7 +971,7 @@ get_node (GtkUIManager *self, else length = strlen (pos); - node = get_child_node (self, parent, pos, length, NODE_TYPE_UNDECIDED, + node = get_child_node (self, parent, NULL, pos, length, NODE_TYPE_UNDECIDED, create, FALSE); if (!node) return NULL; @@ -1160,7 +1174,7 @@ start_element_handler (GMarkupParseContext *context, if (ctx->state == STATE_ROOT && !strcmp (element_name, "accelerator")) { ctx->state = STATE_ACCELERATOR; - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_ACCELERATOR, TRUE, FALSE); @@ -1186,7 +1200,7 @@ start_element_handler (GMarkupParseContext *context, if (ctx->state == STATE_ROOT && !strcmp (element_name, "menubar")) { ctx->state = STATE_MENU; - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_MENUBAR, TRUE, FALSE); @@ -1200,7 +1214,7 @@ start_element_handler (GMarkupParseContext *context, } else if (ctx->state == STATE_MENU && !strcmp (element_name, "menu")) { - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_MENU, TRUE, top); @@ -1215,7 +1229,7 @@ start_element_handler (GMarkupParseContext *context, { ctx->state = STATE_MENU; - ctx->current = get_child_node (self, g_node_last_child (ctx->current), + ctx->current = get_child_node (self, g_node_last_child (ctx->current), NULL, node_name, strlen (node_name), NODE_TYPE_MENU, TRUE, top); @@ -1231,7 +1245,7 @@ start_element_handler (GMarkupParseContext *context, GNode *node; ctx->state = STATE_MENUITEM; - node = get_child_node (self, ctx->current, + node = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_MENUITEM, TRUE, top); @@ -1247,7 +1261,7 @@ start_element_handler (GMarkupParseContext *context, if (ctx->state == STATE_ROOT && !strcmp (element_name, "popup")) { ctx->state = STATE_MENU; - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_POPUP, TRUE, FALSE); @@ -1262,12 +1276,12 @@ start_element_handler (GMarkupParseContext *context, !strcmp (element_name, "placeholder")) { if (ctx->state == STATE_TOOLBAR) - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_TOOLBAR_PLACEHOLDER, TRUE, top); else - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_MENU_PLACEHOLDER, TRUE, top); @@ -1295,7 +1309,7 @@ start_element_handler (GMarkupParseContext *context, } else length = strlen (node_name); - node = get_child_node (self, ctx->current, + node = get_child_node (self, ctx->current, NULL, node_name, length, NODE_TYPE_SEPARATOR, TRUE, top); @@ -1314,7 +1328,7 @@ start_element_handler (GMarkupParseContext *context, if (ctx->state == STATE_ROOT && !strcmp (element_name, "toolbar")) { ctx->state = STATE_TOOLBAR; - ctx->current = get_child_node (self, ctx->current, + ctx->current = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_TOOLBAR, TRUE, FALSE); @@ -1330,7 +1344,7 @@ start_element_handler (GMarkupParseContext *context, GNode *node; ctx->state = STATE_TOOLITEM; - node = get_child_node (self, ctx->current, + node = get_child_node (self, ctx->current, NULL, node_name, strlen (node_name), NODE_TYPE_TOOLITEM, TRUE, top); @@ -1600,6 +1614,9 @@ gtk_ui_manager_add_ui_from_file (GtkUIManager *self, * separator if such an element can be inserted at the place determined by * @path. Otherwise @type must indicate an element that can be inserted at * the place determined by @path. + * + * If @path points to a menuitem or toolitem, the new element will be inserted + * before or after this item, depending on @top. * * Since: 2.4 **/ @@ -1613,6 +1630,7 @@ gtk_ui_manager_add_ui (GtkUIManager *self, gboolean top) { GNode *node; + GNode *sibling; GNode *child; NodeType node_type; GQuark action_quark = 0; @@ -1622,14 +1640,22 @@ gtk_ui_manager_add_ui (GtkUIManager *self, g_return_if_fail (name != NULL); node = get_node (self, path, NODE_TYPE_UNDECIDED, FALSE); - + sibling = NULL; + if (node == NULL) return; node_type = NODE_TYPE_UNDECIDED; + reswitch: switch (NODE_INFO (node)->type) { + case NODE_TYPE_SEPARATOR: + case NODE_TYPE_MENUITEM: + case NODE_TYPE_TOOLITEM: + sibling = node; + node = node->parent; + goto reswitch; case NODE_TYPE_MENUBAR: case NODE_TYPE_MENU: case NODE_TYPE_POPUP: @@ -1705,9 +1731,13 @@ gtk_ui_manager_add_ui (GtkUIManager *self, } if (node_type == NODE_TYPE_UNDECIDED) - return; + { + g_warning ("item type not suitable for adding at '%s'", + type, path); + return; + } - child = get_child_node (self, node, + child = get_child_node (self, node, sibling, name, strlen (name), node_type, TRUE, top); diff --git a/tests/testmerge.c b/tests/testmerge.c index d06be9767a..7a2654d730 100644 --- a/tests/testmerge.c +++ b/tests/testmerge.c @@ -105,8 +105,8 @@ delayed_toggle_dynamic (GtkUIManager *merge) "dyn1menu", "dyn1", GTK_UI_MANAGER_MENU, 0); gtk_ui_manager_add_ui (merge, merge_id, "/menubar/EditMenu/dyn1menu", "dyn1", "dyn1", GTK_UI_MANAGER_MENUITEM, 0); - gtk_ui_manager_add_ui (merge, merge_id, "/menubar/EditMenu/dyn1menu", - "dyn2", "dyn2", GTK_UI_MANAGER_AUTO, TRUE); + gtk_ui_manager_add_ui (merge, merge_id, "/menubar/EditMenu/dyn1menu/dyn1", + "dyn2", "dyn2", GTK_UI_MANAGER_AUTO, FALSE); } else {