X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=menu.c;h=a7fbbecb9994adf74de10743749855f1b8d6d121;hb=6eb3a028f4d79ee91e9d94e9c02932f280cd0ac8;hp=d66ee07b6a13bf3871d30459a4bf228685eb0c5b;hpb=afa94c9493bdb91807c1dc2b4e1ffddbe2df1fd6;p=taskasaur.git diff --git a/menu.c b/menu.c index d66ee07..a7fbbec 100644 --- a/menu.c +++ b/menu.c @@ -19,6 +19,7 @@ typedef struct MenuItem { char* title; char* description; + void* userdata; } MenuItem; typedef struct Menu { @@ -32,6 +33,7 @@ typedef struct Menu { WINDOW* sub_win; int max_height; int max_width; + void* userdata; } Menu; int swap_item(Menu* menu, int src_index, int dest_index); @@ -42,15 +44,29 @@ int menu_insert_mode(Menu* menu, int insert_index); /* prob temp for now */ MenuItem* create_blank_menuitem(void); +/* rendering stuff */ +int render_item(Menu* menu, int item_index, int start_y); +int item_height(MenuItem* menuitem); +int items_visible(Menu* menu); MenuItem* create_menuitem(char* title) { MenuItem* new_menuitem; + TodoItem* new_userdata; new_menuitem = malloc(sizeof(MenuItem)); new_menuitem->title = title; - new_menuitem->description = 0; //TEMP FOR NOW + new_menuitem->description = strdup(""); //TEMP FOR NOW + + new_userdata = malloc(sizeof(TodoItem)); + new_userdata->item_name = title; + new_userdata->description = strdup(""); + new_userdata->due = strdup(""); + new_userdata->subtask_list = malloc(0); + new_userdata->subtask_count = 0; + + new_menuitem->userdata = new_userdata; return new_menuitem; } @@ -117,6 +133,12 @@ get_menu_name(Menu* menu) return menu->menu_name; } +void* +get_menu_userdata(Menu* menu) +{ + return menu->userdata; +} + char* get_menuitem_title(MenuItem* menuitem) { @@ -129,6 +151,12 @@ get_menuitem_descrip(MenuItem* menuitem) return menuitem->description; } +void* +get_menuitem_userdata(MenuItem* menuitem) +{ + return menuitem->userdata; +} + /* setters */ int @@ -157,7 +185,6 @@ int set_selected_item(Menu* menu, int selected_item) { menu->selected_item = selected_item; - return 0; } @@ -165,7 +192,27 @@ int set_menu_focus(Menu* menu, bool focus) { menu->focused = focus; - + return 0; +} + +int +set_menu_userdata(Menu* menu, void* userdata) +{ + menu->userdata = userdata; + return 0; +} + +int +set_menuitem_descrip(MenuItem* menuitem, char* descrip) +{ + menuitem->description = descrip; + return 0; +} + +int +set_menuitem_userdata(MenuItem* menuitem, void* userdata) +{ + menuitem->userdata = userdata; return 0; } @@ -197,8 +244,6 @@ delete_item(Menu* menu, int index) menu->selected_item = menu->menu_length-1; } - wclear(menu->sub_win); - return 0; } @@ -229,10 +274,6 @@ menu_insert_mode(Menu* menu, int insert_index) char temp[MAX_CONTENTS_LENGTH+1]; // remember null char* new_contents; - /* this is bad */ - wclear(menu->sub_win); - render_menu(menu); - curs_on(); /* move cursor to right spot */ @@ -324,9 +365,7 @@ int render_menu(Menu* menu) { /* draw outer menu (prob dont need this every render) */ - int menu_header_color; - - /* menu_header_color = */ + /* wclear(menu->menu_win); */ wattron(menu->menu_win, COLOR_PAIR( (menu->focused == true) ? TS_MENU_SELECTED: TS_MENU_NONSELECTED @@ -334,31 +373,28 @@ render_menu(Menu* menu) mvwprintw(menu->menu_win, 0, MENU_PAD_LEFT, menu->menu_name); wattroff(menu->menu_win, COLOR_PAIR(0)); - /* draw inner menu */ - int cur_line = 0; - for (int i = 0; i < menu->menu_length-menu->scroll_offset; i++) { - - int wrapped_lines; - char* wrapped_text; - - /* wrap text by inserting newlines (maxwidth-1 for newline char)*/ - wrapped_text = wrap_text(menu->menu_items[i]->title, menu->max_width-1, &wrapped_lines); + /* char buf[20]; */ + /* sprintf(buf, "%d", items_visible(menu)); */ + /* mvprintw(20, 20, buf); */ - /* color selected item */ - wattron(menu->sub_win, COLOR_PAIR( - (i == menu->selected_item && menu->focused == true) ? - TS_SELECTED : TS_NONSELECTED - )); - mvwprintw(menu->sub_win, cur_line, 0, wrapped_text); - wattroff(menu->sub_win, COLOR_PAIR(0)); + /* calculate scroll */ + int visible; - cur_line += wrapped_lines; + visible = items_visible(menu); - /* display number of items */ - /* if (menu->menu_items[i]->) */ + if (menu->selected_item > menu->scroll_offset+visible) { + // may be dangerous, assumes render after every action + menu->scroll_offset += 1; + } else if (menu->selected_item < menu->scroll_offset) { + menu->scroll_offset -= 1; + } - free(wrapped_text); + /* draw inner menu */ + wclear(menu->sub_win); + int curline = 0; + for (int i = menu->scroll_offset; i < menu->menu_length; i++) { + curline += render_item(menu, i, curline); } wrefresh(menu->sub_win); @@ -367,6 +403,62 @@ render_menu(Menu* menu) return 0; } +int +render_item(Menu* menu, int item_index, int start_y) +{ + MenuItem* curitem; + 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); +} + +int +item_height(MenuItem* menuitem) +{ + int lines; + + lines = 1; + if (strlen(menuitem->description) > 0) { + lines += 1; + } + + return lines; +} + +int +items_visible(Menu* menu) +{ + int maxheight; + int maxwidth; // unused + + getmaxyx(menu->sub_win, maxheight, maxwidth); + + int i = menu->scroll_offset; + int lines = 0; + for (; i < menu->menu_length; i++) { + + lines += item_height(menu->menu_items[i]); + + if (lines >= maxheight) break; + + } + + return i; +} + int free_menu(Menu* menu) {