X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=menu.c;h=621607bb1ec15c91d390d7e512711e2f076aa0c6;hb=abf215afaba441f488105fb9d30d95264c2e5850;hp=797789611bc53c5b48fa8bce57b7bcb28d99989b;hpb=edba973b080b9c28bc29fe3e10fd63de5a2f7356;p=taskasaur.git diff --git a/menu.c b/menu.c index 7977896..621607b 100644 --- a/menu.c +++ b/menu.c @@ -44,16 +44,30 @@ 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 = 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; } @@ -259,13 +273,20 @@ menu_insert_mode(Menu* menu, int insert_index) { char temp[MAX_CONTENTS_LENGTH+1]; // remember null char* new_contents; + int insert_pos; curs_on(); + // 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]); + } + /* move cursor to right spot */ ungetstr(menu->menu_items[insert_index]->title); mvwgetnstr(menu->sub_win, - insert_index, // account for wrap later too + insert_pos, 0, temp, MAX_CONTENTS_LENGTH @@ -323,16 +344,19 @@ menu_driver(Menu* menu, MenuAction action) case MENU_APPEND: insert_item(menu, create_blank_menuitem(), menu->menu_length); + render_menu(menu); // refresh after inserting menu_insert_mode(menu, menu->selected_item); break; case MENU_INSERT_ABOVE: insert_item(menu, create_blank_menuitem(), menu->selected_item); + render_menu(menu); menu_insert_mode(menu, menu->selected_item); break; case MENU_INSERT_BELOW: insert_item(menu, create_blank_menuitem(), menu->selected_item+1); + render_menu(menu); menu_insert_mode(menu, menu->selected_item); // inserted item is cur now break; @@ -359,45 +383,91 @@ render_menu(Menu* menu) mvwprintw(menu->menu_win, 0, MENU_PAD_LEFT, menu->menu_name); wattroff(menu->menu_win, COLOR_PAIR(0)); + /* char buf[20]; */ + /* sprintf(buf, "%d", items_visible(menu)); */ + /* mvprintw(20, 20, buf); */ + + /* calculate scroll */ + int visible; + + visible = items_visible(menu); + + 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 = menu->scroll_offset-1; + if (menu->scroll_offset < 0) menu->scroll_offset = 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; - int wrapped_lines; - char* wrapped_text; + int curline = 0; + for (int i = menu->scroll_offset; i < menu->menu_length; i++) { + curline += render_item(menu, i, curline); + } - curitem = menu->menu_items[i]; - - /* wrap text by inserting newlines (maxwidth-1 for newline char)*/ - wrapped_text = wrap_text(curitem->title, menu->max_width-1, &wrapped_lines); + wrefresh(menu->sub_win); + wrefresh(menu->menu_win); - /* 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)); + return 0; +} - cur_line += wrapped_lines; +int +render_item(Menu* menu, int item_index, int start_y) +{ + MenuItem* curitem; + curitem = menu->menu_items[item_index]; - /* display number of items */ - if (strlen(curitem->description) > 0) { - mvwprintw(menu->sub_win, cur_line, 0, curitem->description); - cur_line += 1; - } + /* 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)); - free(wrapped_text); + /* 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; } - wrefresh(menu->sub_win); - wrefresh(menu->menu_win); + return lines; +} - return 0; +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