X-Git-Url: https://git.danieliu.xyz/?p=taskasaur.git;a=blobdiff_plain;f=render.c;h=df82ce27d39898096e8fd0cef822fea2cc654626;hp=0c0270e17b192a20aceb9949715b1e61bda60bb0;hb=HEAD;hpb=f06db8e7f1fd2769ad824d76ce5c047189da2a48 diff --git a/render.c b/render.c index 0c0270e..df82ce2 100644 --- a/render.c +++ b/render.c @@ -11,6 +11,14 @@ int init_tscolors(void); int create_todowin(void); +/* menu render callbacks */ +void render_menuitem(Menu* menu, int item_index, int start_y); +int menuitem_height(MenuItem* menuitem); + +void render_popup_menuitem(Menu* menu, int item_index, int start_y); +int popup_menuitem_height(MenuItem* menuitem); + + /* init stuff */ int init_tscurses(void) @@ -120,6 +128,10 @@ make_menus(Board* board, int todolist_length) set_menu_win(new_menu, win); set_menu_focus(new_menu, i == 0); // make first win focused + /* set menu render callbacks */ + set_menu_renderitem(new_menu, *render_menuitem); + set_menu_itemheight(new_menu, *menuitem_height); + /* refresh */ refresh(); wrefresh(win); @@ -130,6 +142,58 @@ make_menus(Board* board, int todolist_length) return menu_list; } +void +render_menuitem(Menu* menu, int item_index, int start_y) +{ + MenuItem* curitem; + WINDOW* menu_win; + TodoItem* item_data; + int hlcolor; + + curitem = get_menu_item(menu, item_index); + menu_win = get_menu_win(menu); + item_data = (TodoItem*)get_menuitem_userdata(curitem); + + /* color selected item */ + hlcolor = COLOR_PAIR((item_index == get_selected_item(menu) && get_menu_focused(menu) == true) ? TS_SELECTED : TS_NONSELECTED); + wattron(menu_win, hlcolor); + mvwprintw(menu_win, start_y, 0, get_menuitem_title(curitem)); + wattroff(menu_win, hlcolor); + + /* item tag line */ + wmove(menu_win, start_y+1, 0); + wattron(menu_win, COLOR_PAIR(TS_ITEMCOUNT)); + /* display tiny character to indicate item has a descrip */ + if (strlen(item_data->description) > 0) { + wprintw(menu_win, "# "); + } + /* display number of complete tasks */ + if (item_data->subtask_count > 0) { + int tasks_complete = 0; + for (int i = 0; i < item_data->subtask_count; i++) { + if (item_data->subtask_list[i]->done == SubTaskState_done) + tasks_complete += 1; + } + wprintw(menu_win, "[%d/%d]", tasks_complete, item_data->subtask_count); + } + wattroff(menu_win, COLOR_PAIR(TS_ITEMCOUNT)); +} + +int +menuitem_height(MenuItem* menuitem) +{ + TodoItem* item_data; + int lines; + + item_data = get_menuitem_userdata(menuitem); + lines = 1; + if (item_data->subtask_count > 0 || strlen(item_data->description) > 0) { + lines += 1; + } + + return lines; +} + MenuItem** todolist_to_menuitem(TodoItem** item_list, int list_length) { @@ -259,52 +323,6 @@ swap_menu(BoardMenu* boardmenu, int src_index, int dest_index) return 0; } -/* menuitem */ -int -update_menuitem_descrip(MenuItem* menuitem) -{ /* need to do something about colored text */ - - TodoItem* item_data; - char* new_descrip; - - item_data = (TodoItem*)get_menuitem_userdata(menuitem); - new_descrip = strdup(""); - - if (strlen(item_data->description) > 0) { - /* strcat(new_descrip, "☰ "); */ - strcat(new_descrip, "# "); - } - if (strlen(item_data->due) > 0) { - strcat(new_descrip, item_data->due); - strcat(new_descrip, " "); - } - if (item_data->subtask_count > 0) { - - int tasks_complete = 0; - for (int i = 0; i < item_data->subtask_count; i++) { - if (item_data->subtask_list[i]->done == SubTaskState_done) { - tasks_complete += 1; - } - } - - /* [, # done, /, # total, ], null */ - char subtask_done[4]; // assume there wont be more than 999 subtasks (possibly danger?) - snprintf(subtask_done, 4, "%d", tasks_complete); - int substask_len = 1+item_data->subtask_count+1+strlen(subtask_done)+1+1; - char subtask_text[substask_len]; - sprintf(subtask_text, "[%s/%d]", subtask_done, item_data->subtask_count); - strcat(new_descrip, subtask_text); - } - - /* free old string */ - if (strlen(new_descrip) > 0) { - free(get_menuitem_descrip(menuitem)); - set_menuitem_descrip(menuitem, new_descrip); - } - - return 0; -} - /* popup */ PopupMenu* make_popupmenu(TodoItem* itemdata) @@ -341,7 +359,10 @@ make_popupmenu(TodoItem* itemdata) ); set_menu_win(popupmenu_menu, popupmenu_menu_win); + set_menu_userdata(popupmenu_menu, itemdata); set_menu_focus(popupmenu_menu, 1); + set_menu_renderitem(popupmenu_menu, render_popup_menuitem); + set_menu_itemheight(popupmenu_menu, popup_menuitem_height); box(popupmenu_win, 0, 0); /* move this stuff to render phase later? */ @@ -355,13 +376,67 @@ make_popupmenu(TodoItem* itemdata) return new_popupmenu; } +void +render_popup_menuitem(Menu* menu, int item_index, int start_y) +{ + MenuItem* curitem; + WINDOW* menu_win; + int hlcolor; + + curitem = get_menu_item(menu, item_index); + menu_win = get_menu_win(menu); + + /* color selected item */ + hlcolor = COLOR_PAIR((item_index == get_selected_item(menu) && get_menu_focused(menu) == true) ? TS_SELECTED : TS_NONSELECTED); + wattron(menu_win, hlcolor); + + wmove(menu_win, start_y, 0); + /* print subtask done indicator */ + if (strlen(get_menuitem_title(curitem)) > 0) + wprintw( + menu_win, + (((SubTask*)get_menuitem_userdata(curitem))->done == SubTaskState_done) ? "[X] " : "[ ] " + /* (((TodoItem*)get_menu_userdata(menu))->subtask_list[item_index]->done == SubTaskState_done) ? "[X] " : "[ ] " */ + ); + wprintw(menu_win, get_menuitem_title(curitem)); + /* wprintw(menu_win, ((TodoItem*)get_menu_userdata(menu))->subtask_list[item_index]->subtask_name); */ + + wattroff(menu_win, hlcolor); +} + int -render_popupmenu(PopupMenu* popupmenu) +popup_menuitem_height(MenuItem* menuitem) { - render_menu(popupmenu->menu); - wrefresh(popupmenu->win); + return 1; // account for wrap later +} - return 0; +/* save menu state to userdata */ +/* sorta duct tape rn */ +/* find a way to tie TodoItem and MenuItem together better in the future */ +void +close_popupmenu(Menu* popupmenu_menu) +{ + TodoItem* item_data; + SubTask** updated_subtasklist; + + item_data = (TodoItem*)get_menu_userdata(popupmenu_menu); + updated_subtasklist = menuitem_to_subtasklist( + get_menu_itemlist(popupmenu_menu), + get_menu_length(popupmenu_menu) + ); + + /* remember to free old subtask list */ + item_data->subtask_list = updated_subtasklist; + item_data->subtask_count = get_menu_length(popupmenu_menu); + + /* this is messy but since subtask rendering uses menuitem title instead + * of userdata subtask title, this needs to be done :( */ + /* for (int i = 0; i < get_menu_length(popupmenu_menu); i++) { */ + /* set_menuitem_title( */ + /* get_menu_item(popupmenu_menu, i), */ + /* strdup(item_data->subtask_list[i]->subtask_name) */ + /* ); */ + /* } */ } /* this is copy paste of other, prob abstract */ @@ -384,6 +459,32 @@ subtasklist_to_menuitem(SubTask** subtask_list, int list_length) return items; } +SubTask** +menuitem_to_subtasklist(MenuItem** menuitem_list, int list_length) +{ + SubTask** new_subtasklist; + + new_subtasklist = malloc(list_length*sizeof(SubTask*)); + + for (int i = 0; i < list_length; i++) { + SubTask* cur_subtask; + SubTask* new_subtask; + + cur_subtask = (SubTask*)get_menuitem_userdata(menuitem_list[i]); + new_subtask = malloc(sizeof(SubTask)); + + new_subtask->subtask_name = strdup(cur_subtask->subtask_name); + new_subtask->done = cur_subtask->done; + + new_subtasklist[i] = new_subtask; + } + + /* new_subtasklist[list_length] = 0; */ + + return new_subtasklist; +} + + /* helpers */ int ungetstr(char* str)