7 #include "headers/menu.h"
8 #include "headers/render.h"
9 #include "headers/utils.h"
11 typedef struct MenuItem {
16 MenuItem** menu_items;
24 int swap_item(Menu* menu, int src_index, int dest_index);
25 int delete_item(Menu* menu, int index);
28 create_menuitem(char* contents)
30 MenuItem* new_menuitem;
32 new_menuitem = malloc(sizeof(MenuItem));
33 new_menuitem->contents = contents;
39 create_menu(MenuItem** item_list)
43 new_menu = malloc(sizeof(Menu));
44 new_menu->menu_items = item_list;
45 new_menu->menu_length = array_length(MenuItem*, item_list);
46 new_menu->selected_item = 0;
47 set_menu_win(new_menu, stdscr);
53 set_menu_win(Menu* menu, WINDOW* win)
56 getmaxyx(menu->menu_win, menu->max_height, menu->max_width);
62 get_menu_items(Menu* menu)
68 swap_item(Menu* menu, int src_index, int dest_index)
72 temp = menu->menu_items[dest_index];
73 menu->menu_items[dest_index] = menu->menu_items[src_index];
74 menu->menu_items[src_index] = temp;
80 delete_item(Menu* menu, int index)
82 if (index < 0 || index > menu->menu_length-1) return -1;
84 int temp_size = (menu->menu_length-index-1)*sizeof(MenuItem*);
85 MenuItem* temp[temp_size];
87 /* might break if last item? */
88 memcpy(temp, menu->menu_items[index+1], temp_size);
89 memcpy(menu->menu_items[index], temp, temp_size);
91 menu->menu_items = realloc(menu->menu_items, menu->menu_length*sizeof(MenuItem*));
92 menu->menu_items[menu->menu_length-1] = 0; // preserve null at end
94 menu->menu_length -= 1;
96 /* also move the current selected position if it's last */
97 if (menu->selected_item > menu->menu_length-1) {
98 menu->selected_item = menu->menu_length-1;
105 menu_driver(Menu* menu, MenuAction action)
110 menu->selected_item = menu->selected_item-1 >= 0 ? menu->selected_item-1 : 0;
114 menu->selected_item = menu->selected_item+1 <= menu->menu_length-1 ? menu->selected_item+1 : menu->menu_length-1;
118 menu->selected_item = 0;
122 menu->selected_item = menu->menu_length-1;
126 if (menu->selected_item <= 0) break;
127 swap_item(menu, menu->selected_item, menu->selected_item-1);
128 menu->selected_item -= 1;
132 if (menu->selected_item >= menu->menu_length-1) break;
133 swap_item(menu, menu->selected_item, menu->selected_item+1);
134 menu->selected_item += 1;
138 delete_item(menu, menu->selected_item);
139 wclear(menu->menu_win);
142 default: // This is here for debug, disable later
143 fprintf(stderr, "Invalid menu action");
150 render_menu(Menu* menu)
156 for (int i = 0; i < menu->menu_length; i++) {
162 /* wrap text by inserting newlines */
163 wrapped_text = wrap_text(menu->menu_items[i]->contents, menu->max_width, &wrapped_lines);
165 /* color selected item */
166 text_color = (i == menu->selected_item) ? TS_SELECTED : TS_NONSELECTED;
168 wattron(menu->menu_win, COLOR_PAIR(text_color));
169 mvwprintw(menu->menu_win, cur_line, 0, wrapped_text);
170 wattroff(menu->menu_win, COLOR_PAIR(text_color));
172 cur_line += wrapped_lines;
182 free_menu(Menu* menu)