X-Git-Url: https://git.danieliu.xyz/?p=taskasaur.git;a=blobdiff_plain;f=menu.c;h=816b5ddcf6c3c8e4705674566952b739b8f742f7;hp=ab1aa176952e87d5ac3940d0848f4c9a2fa0c000;hb=HEAD;hpb=62ca4f5c30c0518812acd4515259c36329b28d78 diff --git a/menu.c b/menu.c index ab1aa17..816b5dd 100644 --- a/menu.c +++ b/menu.c @@ -30,10 +30,11 @@ typedef struct Menu { int scroll_offset; bool focused; WINDOW* menu_win; - WINDOW* sub_win; int max_height; int max_width; void* userdata; + void (*render_item)(Menu*, int, int); + int (*item_height)(MenuItem*); } Menu; int swap_item(Menu* menu, int src_index, int dest_index); @@ -45,8 +46,8 @@ int menu_insert_mode(Menu* menu, int insert_index); MenuItem* create_blank_menuitem(void); /* rendering stuff */ -int render_item(Menu* menu, int item_index, int start_y); -int item_height(MenuItem* menuitem); +void default_render_item(Menu* menu, int item_index, int start_y); +int default_item_height(MenuItem* menuitem); int items_visible(Menu* menu, int offset); int items_visible_rev(Menu* menu, int offset); @@ -90,6 +91,9 @@ create_menu(char* menu_name, MenuItem** item_list) new_menu->selected_item = 0; new_menu->scroll_offset = 0; new_menu->focused = false; + new_menu->userdata = NULL; + new_menu->render_item = *default_render_item; + new_menu->item_height = *default_item_height; set_menu_win(new_menu, stdscr); return new_menu; @@ -102,12 +106,6 @@ get_menu_win(Menu* menu) return menu->menu_win; } -WINDOW* -get_menu_subwin(Menu* menu) -{ - return menu->sub_win; -} - MenuItem* get_menu_item(Menu* menu, int index) { @@ -116,12 +114,30 @@ get_menu_item(Menu* menu, int index) return menu->menu_items[index]; } +MenuItem** +get_menu_itemlist(Menu* menu) +{ + return menu->menu_items; +} + int get_selected_item(Menu* menu) { return menu->selected_item; } +MenuItem* +get_selected_menuitem(Menu* menu) +{ + return get_menu_item(menu, get_selected_item(menu)); +} + +bool +get_menu_focused(Menu* menu) +{ + return menu->focused; +} + int get_menu_length(Menu* menu) { @@ -168,16 +184,8 @@ set_menu_win(Menu* menu, WINDOW* win) menu->menu_win = win; getmaxyx(menu->menu_win, height, width); - /* create a subwin (also prob free old subwin?) */ menu->max_height = height-MENU_PAD_TOP-MENU_PAD_BOTTOM; menu->max_width = width-MENU_PAD_LEFT-MENU_PAD_RIGHT; - menu->sub_win = derwin( - menu->menu_win, - menu->max_height, - menu->max_width, - MENU_PAD_TOP, - MENU_PAD_LEFT - ); return 0; } @@ -203,6 +211,27 @@ set_menu_userdata(Menu* menu, void* userdata) return 0; } +int +set_menu_renderitem(Menu* menu, void (*render_item)(Menu*, int, int)) +{ + menu->render_item = render_item; + return 0; +} + +int +set_menu_itemheight(Menu* menu, int (*item_height)(MenuItem*)) +{ + menu->item_height = item_height; + return 0; +} + +int +set_menuitem_title(MenuItem* menuitem, char* title) +{ + menuitem->title = title; + return 0; +} + int set_menuitem_descrip(MenuItem* menuitem, char* descrip) { @@ -281,12 +310,12 @@ menu_insert_mode(Menu* menu, int insert_index) // account for multiline items insert_pos = menu->scroll_offset; for (int i = 0; i < insert_index; i++) { - insert_pos += item_height(menu->menu_items[i]); + insert_pos += menu->item_height(menu->menu_items[i]); } /* move cursor to right spot */ ungetstr(menu->menu_items[insert_index]->title); - mvwgetnstr(menu->sub_win, + mvwgetnstr(menu->menu_win, insert_pos, 0, temp, @@ -375,17 +404,7 @@ menu_driver(Menu* menu, MenuAction action) 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); + wclear(menu->menu_win); /* calculate scroll */ int visible; @@ -407,57 +426,38 @@ render_menu(Menu* menu) ); } - /* char abuf[20]; */ - /* int y; */ - /* int x; */ - /* getmaxyx(menu->sub_win, y, x); */ - /* sprintf(abuf, "%d,%d,%d max:%d,%d", menu->selected_item, visible, menu->scroll_offset,y,x); */ - /* mvprintw(19, 27, abuf); */ - + /* render menu items */ int curline = 0; for (int i = menu->scroll_offset; i < menu->menu_length; i++) { - curline += render_item(menu, i, curline); + menu->render_item(menu, i, curline); + curline += menu->item_height(menu->menu_items[i]); } - wrefresh(menu->sub_win); wrefresh(menu->menu_win); return 0; } -int -render_item(Menu* menu, int item_index, int start_y) +void +default_render_item(Menu* menu, int item_index, int start_y) { MenuItem* curitem; + int hlcolor; + curitem = menu->menu_items[item_index]; /* color selected item */ - wattron(menu->sub_win, COLOR_PAIR( - (item_index == menu->selected_item && menu->focused == true) ? - TS_SELECTED : TS_NONSELECTED - )); - mvwprintw(menu->sub_win, start_y, 0, curitem->title); - wattroff(menu->sub_win, COLOR_PAIR(0)); - - /* display number of items */ - if (strlen(curitem->description) > 0) { - mvwprintw(menu->sub_win, start_y+1, 0, curitem->description); - } - - return item_height(curitem); + hlcolor = COLOR_PAIR((item_index == menu->selected_item && menu->focused == true) ? TS_SELECTED : TS_NONSELECTED); + wattron(menu->menu_win, hlcolor); + mvwprintw(menu->menu_win, start_y, 0, curitem->title); + wattroff(menu->menu_win, hlcolor); } -int -item_height(MenuItem* menuitem) -{ - int lines; - lines = 1; - if (strlen(menuitem->description) > 0) { - lines += 1; - } - - return lines; +int +default_item_height(MenuItem* menuitem) +{ + return 1; // maybe account for line wrap by default } int @@ -466,13 +466,13 @@ items_visible(Menu* menu, int offset) int maxheight; int maxwidth; // unused - getmaxyx(menu->sub_win, maxheight, maxwidth); + getmaxyx(menu->menu_win, maxheight, maxwidth); int vis = 0; int lines = 0; for (int i = offset ; i < menu->menu_length; i++) { - lines += item_height(menu->menu_items[i]); + lines += menu->item_height(menu->menu_items[i]); if (lines > maxheight) break; vis += 1; @@ -487,13 +487,13 @@ items_visible_rev(Menu* menu, int offset) int maxheight; int maxwidth; // unused - getmaxyx(menu->sub_win, maxheight, maxwidth); + getmaxyx(menu->menu_win, maxheight, maxwidth); int vis = 0; int lines = 0; for (int i = offset; i > 0; i--) { - lines += item_height(menu->menu_items[i]); + lines += menu->item_height(menu->menu_items[i]); if (lines > maxheight) break; vis +=1;