[Gnucash-changes] Egg-port from gtk-2.4.0 of a useful programatic
menu-merge item from
Joshua Sled
jsled at cvs.gnucash.org
Sun May 2 16:40:54 EDT 2004
Log Message:
-----------
Egg-port from gtk-2.4.0 of a useful programatic menu-merge item from GtkUIManager.
Tags:
----
gnucash-gnome2-dev
Modified Files:
--------------
gnucash/lib/egg:
egg-menu-merge.c
egg-menu-merge.h
eggintl.h
Revision Data
-------------
Index: egg-menu-merge.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/lib/egg/Attic/egg-menu-merge.h,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -Llib/egg/egg-menu-merge.h -Llib/egg/egg-menu-merge.h -u -r1.1.2.2 -r1.1.2.3
--- lib/egg/egg-menu-merge.h
+++ lib/egg/egg-menu-merge.h
@@ -91,6 +91,22 @@
guint egg_menu_merge_add_ui_from_file (EggMenuMerge *self,
const gchar *filename,
GError **error);
+
+// +jsled; Moved over by jsled from 2.4.0 gtkuimanager.c .. totally useful
+// programatic function that will save us from having to create an XML
+// document just to place a menu item....
+void egg_menu_merge_add_ui (EggMenuMerge *self,
+ guint merge_id,
+ const gchar *path,
+ const gchar *name,
+ const gchar *action,
+ EggMenuMergeNodeType type,
+ gboolean top);
+
+guint egg_menu_merge_new_merge_id( EggMenuMerge *self );
+
+// -jsled
+
void egg_menu_merge_remove_ui (EggMenuMerge *self,
guint merge_id);
Index: egg-menu-merge.c
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/lib/egg/Attic/egg-menu-merge.c,v
retrieving revision 1.1.2.7
retrieving revision 1.1.2.8
diff -Llib/egg/egg-menu-merge.c -Llib/egg/egg-menu-merge.c -u -r1.1.2.7 -r1.1.2.8
--- lib/egg/egg-menu-merge.c
+++ lib/egg/egg-menu-merge.c
@@ -5,12 +5,46 @@
#include "eggintl.h"
#define NODE_INFO(node) ((EggMenuMergeNode *)node->data)
+//#define NODE_INFO(node) ((Node *)node->data)
typedef struct {
guint merge_id;
GQuark action_quark;
} NodeUIReference;
+typedef enum
+{
+ NODE_TYPE_UNDECIDED,
+ NODE_TYPE_ROOT,
+ NODE_TYPE_MENUBAR,
+ NODE_TYPE_MENU,
+ NODE_TYPE_TOOLBAR,
+ NODE_TYPE_MENU_PLACEHOLDER,
+ NODE_TYPE_TOOLBAR_PLACEHOLDER,
+ NODE_TYPE_POPUP,
+ NODE_TYPE_MENUITEM,
+ NODE_TYPE_TOOLITEM,
+ NODE_TYPE_SEPARATOR,
+ NODE_TYPE_ACCELERATOR
+} NodeType;
+
+typedef struct _Node Node;
+
+struct _Node {
+ NodeType type;
+
+ gchar *name;
+
+ GQuark action_name;
+ EggAction *action;
+ GtkWidget *proxy;
+ GtkWidget *extra; /* second separator for placeholders */
+
+ GList *uifiles;
+
+ guint dirty : 1;
+};
+
static void egg_menu_merge_class_init (EggMenuMergeClass *class);
static void egg_menu_merge_init (EggMenuMerge *merge);
@@ -282,6 +316,12 @@
return node;
}
+guint
+egg_menu_merge_new_merge_id( EggMenuMerge *self )
+{
+ return egg_menu_merge_next_merge_id( self );
+}
+
static guint
egg_menu_merge_next_merge_id (EggMenuMerge *self)
{
@@ -724,6 +764,152 @@
return res;
}
+
+/**
+ * gtk_ui_manager_add_ui:
+ * @self: a #GtkUIManager
+ * @merge_id: the merge id for the merged UI, see gtk_ui_manager_new_merge_id()
+ * @path: a path
+ * @name: the name for the added UI element
+ * @action: the name of the action to be proxied, or %NULL to add a separator
+ * @type: the type of UI element to add.
+ * @top: if %TRUE, the UI element is added before its siblings, otherwise it
+ * is added after its siblings.
+ *
+ * Adds a UI element to the current contents of @self.
+ *
+ * If @type is %GTK_UI_MANAGER_AUTO, GTK+ inserts a menuitem, toolitem or
+ * 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.
+ *
+ * Since: 2.4
+ **/
+void
+egg_menu_merge_add_ui (EggMenuMerge *self,
+ guint merge_id,
+ const gchar *path,
+ const gchar *name,
+ const gchar *action,
+ EggMenuMergeNodeType type,
+ gboolean top)
+{
+ GNode *node;
+ GNode *child;
+ EggMenuMergeNodeType node_type;
+ GQuark action_quark = 0;
+
+ g_return_if_fail (EGG_IS_MENU_MERGE (self));
+ g_return_if_fail (merge_id > 0);
+ g_return_if_fail (name != NULL);
+
+ node = egg_menu_merge_get_node (self, path, NODE_TYPE_UNDECIDED, FALSE);
+
+ if (node == NULL)
+ return;
+
+ node_type = NODE_TYPE_UNDECIDED;
+
+ switch (NODE_INFO (node)->type)
+ {
+ case NODE_TYPE_MENUBAR:
+ case NODE_TYPE_MENU:
+ case NODE_TYPE_POPUP:
+ case NODE_TYPE_MENU_PLACEHOLDER:
+ switch (type)
+ {
+ case EGG_MENU_MERGE_MENU:
+ node_type = NODE_TYPE_MENU;
+ break;
+ case EGG_MENU_MERGE_MENUITEM:
+ node_type = NODE_TYPE_MENUITEM;
+ break;
+ case EGG_MENU_MERGE_SEPARATOR:
+ node_type = NODE_TYPE_SEPARATOR;
+ break;
+ case EGG_MENU_MERGE_MENU_PLACEHOLDER:
+ node_type = NODE_TYPE_MENU_PLACEHOLDER;
+ break;
+ case EGG_MENU_MERGE_TOOLBAR_PLACEHOLDER:
+ node_type = NODE_TYPE_TOOLBAR_PLACEHOLDER;
+ break;
+ default: ;
+ /* do nothing */
+ }
+ break;
+ case NODE_TYPE_TOOLBAR:
+ case NODE_TYPE_TOOLBAR_PLACEHOLDER:
+ switch (type)
+ {
+ /*case EGG_MENU_MERGE_AUTO:
+ if (action != NULL)
+ node_type = NODE_TYPE_TOOLITEM;
+ else
+ node_type = NODE_TYPE_SEPARATOR;
+ break;
+ */
+ case EGG_MENU_MERGE_TOOLITEM:
+ node_type = NODE_TYPE_TOOLITEM;
+ break;
+ case EGG_MENU_MERGE_SEPARATOR:
+ node_type = NODE_TYPE_SEPARATOR;
+ break;
+ case EGG_MENU_MERGE_MENU_PLACEHOLDER:
+ node_type = NODE_TYPE_MENU_PLACEHOLDER;
+ break;
+ case EGG_MENU_MERGE_TOOLBAR_PLACEHOLDER:
+ node_type = NODE_TYPE_TOOLBAR_PLACEHOLDER;
+ break;
+ default: ;
+ /* do nothing */
+ }
+ break;
+ case NODE_TYPE_ROOT:
+ switch (type)
+ {
+ case EGG_MENU_MERGE_MENUBAR:
+ node_type = NODE_TYPE_MENUBAR;
+ break;
+ case EGG_MENU_MERGE_TOOLBAR:
+ node_type = NODE_TYPE_TOOLBAR;
+ break;
+ case EGG_MENU_MERGE_POPUP:
+ node_type = NODE_TYPE_POPUP;
+ break;
+ /*case EGG_MENU_MERGE_ACCELERATOR:
+ node_type = NODE_TYPE_ACCELERATOR;
+ break;*/
+ default: ;
+ /* do nothing */
+ }
+ break;
+ default: ;
+ /* do nothing */
+ }
+
+ if (node_type == NODE_TYPE_UNDECIDED)
+ return;
+
+ child = get_child_node (self, node,
+ name, strlen (name),
+ node_type, TRUE, top);
+
+ if (action != NULL)
+ action_quark = g_quark_from_string (action);
+
+ egg_menu_merge_node_prepend_ui_reference (NODE_INFO (child),
+ merge_id, action_quark);
+
+ if (NODE_INFO (node)->action_name == 0)
+ NODE_INFO (child)->action_name = action_quark;
+
+ NODE_INFO (child)->dirty = TRUE;
+
+ egg_menu_merge_queue_update (self);
+
+ g_object_notify (G_OBJECT (self), "ui");
+}
+
static gboolean
remove_ui (GNode *node, gpointer user_data)
Index: eggintl.h
===================================================================
RCS file: /home/cvs/cvsroot/gnucash/lib/egg/Attic/eggintl.h,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -Llib/egg/eggintl.h -Llib/egg/eggintl.h -u -r1.1.2.1 -r1.1.2.2
--- lib/egg/eggintl.h
+++ lib/egg/eggintl.h
@@ -7,4 +7,6 @@
#include <libgnome/gnome-i18n.h>
+#define P_(String) dgettext(GETTEXT_PACKAGE "-properties",String)
+
#endif /* __EGG_INTL_H__ */
More information about the Gnucash-changes
mailing list