aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/uimenu.internal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/uimenu.internal.h')
-rw-r--r--src/ui/uimenu.internal.h51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/ui/uimenu.internal.h b/src/ui/uimenu.internal.h
new file mode 100644
index 0000000..82360f5
--- /dev/null
+++ b/src/ui/uimenu.internal.h
@@ -0,0 +1,51 @@
+#ifndef UMPS_UIMENU_INTERNAL_H_INCLUDED
+#define UMPS_UIMENU_INTERNAL_H_INCLUDED
+
+#include <stdbool.h>
+
+#define UMPS__MENU_TYPE_SPACER (0)
+#define UMPS__MENU_TYPE_BUTTON (1)
+#define UMPS__MENU_TYPE_MENU (2)
+
+/* this header is right out of a university data structures slide deck */
+
+struct uimenu_item_header {
+ unsigned type;
+ struct uimenu_item_header *next, *prev;
+};
+
+struct uimenu_item_button;
+
+typedef void (uimenu_button_action)(struct uimenu_item_button *);
+
+struct uimenu_item_button {
+ struct uimenu_item_header header;
+ unsigned id;
+ char *text;
+
+ uimenu_button_action *action;
+
+ bool enabled;
+};
+
+struct uimenu_item_menu {
+ struct uimenu_item_header header;
+ char *text;
+
+ struct uimenu_item_header *head, *tail;
+ unsigned nchildren;
+};
+
+void uimenu_item_button_init(struct uimenu_item_button *button, unsigned id, const char *text, uimenu_button_action *action);
+void uimenu_item_menu_init(struct uimenu_item_menu *menu, const char *text);
+
+/* menu items will be freed on removal */
+void uimenu_menu_add_spacer(struct uimenu_item_menu *menu, struct uimenu_item_header *where, bool after);
+void uimenu_menu_add(struct uimenu_item_menu *menu, struct uimenu_item_header *where, struct uimenu_item_header *item, bool after);
+
+void uimenu_menu_remove(struct uimenu_item_menu *menu, struct uimenu_item_header *item);
+
+/* frees children */
+void uimenu_menu_free(struct uimenu_item_menu *menu);
+
+#endif /* include guard */