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