+ return 0;
+}
+
+int
+menu_driver(Menu* menu, MenuAction action)
+{
+
+ switch (action) {
+ case MENU_UP:
+ menu->selected_item = menu->selected_item-1 >= 0 ? menu->selected_item-1 : 0;
+ break;
+
+ case MENU_DOWN:
+ menu->selected_item = menu->selected_item+1 <= menu->menu_length-1 ? menu->selected_item+1 : menu->menu_length-1;
+ break;
+
+ case MENU_TOP:
+ menu->selected_item = 0;
+ break;
+
+ case MENU_BOTTOM:
+ menu->selected_item = menu->menu_length-1;
+ break;
+
+ case MENU_MOVE_UP:
+ if (menu->selected_item <= 0) break;
+ swap_item(menu, menu->selected_item, menu->selected_item-1);
+ menu->selected_item -= 1;
+ break;
+
+ case MENU_MOVE_DOWN:
+ if (menu->selected_item >= menu->menu_length-1) break;
+ swap_item(menu, menu->selected_item, menu->selected_item+1);
+ menu->selected_item += 1;
+ break;
+
+ case MENU_DELETE:
+ delete_item(menu, menu->selected_item);
+ break;
+
+ case MENU_APPEND:
+ insert_item(menu, create_blank_menuitem(), menu->menu_length);
+ menu_insert_mode(menu, menu->selected_item);
+ break;
+
+ case MENU_INSERT_ABOVE:
+ insert_item(menu, create_blank_menuitem(), menu->selected_item);
+ menu_insert_mode(menu, menu->selected_item);
+ break;
+
+ case MENU_INSERT_BELOW:
+ insert_item(menu, create_blank_menuitem(), menu->selected_item+1);
+ menu_insert_mode(menu, menu->selected_item); // inserted item is cur now
+ break;
+
+ case MENU_EDIT:
+ menu_insert_mode(menu, menu->selected_item);
+ break;
+
+ default: // This is here for debug, disable later
+ fprintf(stderr, "Invalid menu action");
+ }
+
+ return 0;
+}
+
+int
+render_menu(Menu* menu)
+{
+ /* draw outer menu (prob dont need this every render) */
+ /* wclear(menu->menu_win); */
+ wattron(menu->menu_win, COLOR_PAIR(
+ (menu->focused == true) ?
+ TS_MENU_SELECTED: TS_MENU_NONSELECTED
+ ));
+ mvwprintw(menu->menu_win, 0, MENU_PAD_LEFT, menu->menu_name);
+ wattroff(menu->menu_win, COLOR_PAIR(0));
+
+ /* draw inner menu */
+ wclear(menu->sub_win);
+
+ int cur_line = 0;
+ for (int i = 0; i < menu->menu_length-menu->scroll_offset; i++) {
+
+ MenuItem* curitem;