]> Pileus Git - ~andy/gtk/commitdiff
Make this work for inserting before/after an existing menuitem or
authorMatthias Clasen <mclasen@redhat.com>
Sun, 19 Jun 2005 03:55:12 +0000 (03:55 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Sun, 19 Jun 2005 03:55:12 +0000 (03:55 +0000)
2005-06-18  Matthias Clasen  <mclasen@redhat.com>

* 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
ChangeLog.pre-2-10
ChangeLog.pre-2-8
gtk/gtkuimanager.c
tests/testmerge.c

index 285b92065ea2711fe06ba101e2de585590bdfc66..a7a215751dacda6f2e91fceec9d4d9d3719550a9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2005-06-18  Matthias Clasen  <mclasen@redhat.com>
 
+       * 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)
        
index 285b92065ea2711fe06ba101e2de585590bdfc66..a7a215751dacda6f2e91fceec9d4d9d3719550a9 100644 (file)
@@ -1,5 +1,12 @@
 2005-06-18  Matthias Clasen  <mclasen@redhat.com>
 
+       * 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)
        
index 285b92065ea2711fe06ba101e2de585590bdfc66..a7a215751dacda6f2e91fceec9d4d9d3719550a9 100644 (file)
@@ -1,5 +1,12 @@
 2005-06-18  Matthias Clasen  <mclasen@redhat.com>
 
+       * 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)
        
index ee690925bc922b99dc6c4e20d80dbc9cd8982431..6233b3ca1d6b3f8a286287b5463d4e46d5561361 100644 (file)
@@ -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);
 
index d06be9767a05fde7bd81addd68b7d3ee03b34b7a..7a2654d7302da513e38a27346f8a5bb9318436db 100644 (file)
@@ -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 
     {