aboutsummaryrefslogtreecommitdiffstats
path: root/src/ui/uimenu.internal.h
blob: f52ba4fd59cb70a5aca435cd507df31c6f716dfc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#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 */