1 #include "menu.h"
2 #include "func_items.h"
3 #include <stdarg.h>
4 #include "creation.h"
5
6 struct func_item
7 {
8 item_t item;
9 char *display_text;
10 void *param1;
11 int param2;
12 void (*func)(item_t *,void *, int);
13 };
14
itemtype_func_render(menu_t * menu,item_t * item,int state)15 void itemtype_func_render(menu_t *menu, item_t *item, int state)
16 {
17 struct func_item *it = (struct func_item *)item;
18 int x,y;
19 x = menu->x + item->x;
20 y = menu->y + item->y;
21
22 video_draw_text(x,y, state, it->display_text, item->w);
23 }
24
itemtype_func_invoke(menu_t * menu,item_t * item,int key)25 void itemtype_func_invoke(menu_t *menu, item_t *item, int key)
26 {
27 struct func_item *it = (struct func_item *)item;
28 switch(key)
29 {
30 case KEY_ACTIVATE:
31 if (it->func)
32 {
33 it->func(item, it->param1, it->param2);
34 }
35 break;
36 }
37 }
38
itemtype_func_alloc(menu_t * menu,va_list args)39 item_t *itemtype_func_alloc(menu_t *menu, va_list args)
40 {
41 //char *s;
42 struct func_item *item = (struct func_item *)malloc(sizeof(struct func_item));
43 if (!item) return NULL;
44 menu_item_init(&item->item);
45
46 item->display_text = va_arg(args, char *);
47 item->func = va_arg(args, void *);
48 item->param1 = va_arg(args, void *);
49 item->param2 = va_arg(args, int);
50
51 item->item.f_render = itemtype_func_render;
52 item->item.f_save = NULL;
53 item->item.f_invoke = itemtype_func_invoke;
54 item->item.f_load = NULL;
55
56 item->item.w = item->item.front_width = strlen(item->display_text);
57 item->item.back_width = 0;
58 item->item.h = 1;
59 item->item.disabled = false;
60
61 return (item_t *)item;
62 }
63
64 struct submenu_item
65 {
66 item_t item;
67 char *display_text;
68 char *menu;
69 };
70
itemtype_submenu_render(menu_t * menu,item_t * item,int state)71 void itemtype_submenu_render(menu_t *menu, item_t *item, int state)
72 {
73 struct func_item *it = (struct func_item *)item;
74 int x,y;
75 x = menu->x + item->x;
76 y = menu->y + item->y;
77
78 video_draw_text(x,y, state, it->display_text, item->w);
79 }
80
itemtype_submenu_invoke(menu_t * menu,item_t * item,int key)81 void itemtype_submenu_invoke(menu_t *menu, item_t *item, int key)
82 {
83 char *men_name;
84 switch(key)
85 {
86 case KEY_ACTIVATE:
87 case KEY_NEXT_OPTION:
88 case KEY_PREV_OPTION:
89 break;
90 default:
91 return;
92 }
93
94 men_name = ((struct submenu_item *)item)->menu;
95 menu_form_switch_menu(menu->parent_form, men_name);
96 }
97
itemtype_submenu_alloc(menu_t * menu,va_list args)98 item_t *itemtype_submenu_alloc(menu_t *menu, va_list args)
99 {
100 struct submenu_item *item = (struct submenu_item *)malloc(sizeof(struct submenu_item));
101 if (!item) return NULL;
102 menu_item_init(&item->item);
103
104 item->display_text = va_arg(args, char *);
105 item->menu = va_arg(args, char *);
106
107 item->item.f_render = itemtype_submenu_render;
108 item->item.f_save = NULL;
109 item->item.f_invoke = itemtype_submenu_invoke;
110 item->item.f_load = NULL;
111
112 item->item.w = item->item.front_width = strlen(item->display_text);
113 item->item.back_width = 0;
114 item->item.h = 1;
115 item->item.disabled = false;
116
117 return (item_t *)item;
118 }
119