X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=render.c;h=7db2db36adf9eb87d0d32c7e948c43217cf62ef8;hb=1efefba2657678809bc2e718f71ea7776495fd5e;hp=d6a04ff6371d8e88c55b2f5b1496d229e051d801;hpb=b93f9808ed43d0b1ef875aaaa4047a9ce8123eda;p=taskasaur.git diff --git a/render.c b/render.c index d6a04ff..7db2db3 100644 --- a/render.c +++ b/render.c @@ -84,6 +84,8 @@ create_board_menu(Board* board) new_boardmenu->menu_list = make_menus(board, board->todolist_count); new_boardmenu->menu_count = board->todolist_count; new_boardmenu->selected = 0; + new_boardmenu->popup_menu = NULL; + new_boardmenu->popup_open = 0; return new_boardmenu; } @@ -160,14 +162,25 @@ boardmenu_to_board(BoardMenu* boardmenu) for (int j = 0; j < get_menu_length(curmenu); j++) { MenuItem* curmenuitem = get_menu_item(curmenu, j); + TodoItem* itemdata = get_menuitem_userdata(curmenuitem); TodoItem* new_todoitem = malloc(sizeof(TodoItem)); + SubTask** new_subtask_list = malloc(itemdata->subtask_count*sizeof(SubTask*)); new_todoitem->item_name = strdup(get_menuitem_title(curmenuitem)); - new_todoitem->description = strdup(get_menuitem_descrip(curmenuitem)); - new_todoitem->due = strdup(""); //TEMP! - new_todoitem->subtask_list = malloc(0); //TEMP! - new_todoitem->subtask_count = 0; //TEMP! + new_todoitem->description = strdup(itemdata->description); + new_todoitem->due = strdup(itemdata->due); + new_todoitem->subtask_count = itemdata->subtask_count; + for (int k = 0; k < itemdata->subtask_count; k++) { + SubTask* new_subtask = malloc(sizeof(SubTask)); + + new_subtask->subtask_name = itemdata->subtask_list[k]->subtask_name; + new_subtask->done = itemdata->subtask_list[k]->done; + + new_subtask_list[k] = new_subtask; + } + + new_todoitem->subtask_list = new_subtask_list; new_item_list[j] = new_todoitem; } @@ -200,6 +213,7 @@ set_selected_menu(BoardMenu* boardmenu, int index) /* also try to jump to a similar position if possible */ /* rn theres a bug if old menu is empty */ new_pos = min(get_selected_item(old_menu), get_menu_length(new_menu)-1); + if (new_pos < 0) new_pos = 0; set_selected_item(new_menu, new_pos); boardmenu->selected = index; @@ -245,17 +259,27 @@ update_menuitem_descrip(MenuItem* menuitem) if (strlen(item_data->description) > 0) { /* strcat(new_descrip, "☰ "); */ - 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 */ - int substask_len = 1+item_data->subtask_count+1+ 1+1; + 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, "[%d/]", item_data->subtask_count); + sprintf(subtask_text, "[%s/%d]", subtask_done, item_data->subtask_count); strcat(new_descrip, subtask_text); } @@ -269,10 +293,66 @@ update_menuitem_descrip(MenuItem* menuitem) } /* popup */ -WINDOW* -create_popup_win() +Menu* +make_popup_menu(TodoItem* itemdata) { - return NULL; + MenuItem** subtask_menuitems; + Menu* new_popup_menu; + WINDOW* popup_win; + + subtask_menuitems = subtasklist_to_menuitem(itemdata->subtask_list, itemdata->subtask_count); + new_popup_menu = create_menu(strdup(""), subtask_menuitems); + + /* popup win */ + int maxheight, maxwidth; + getmaxyx(stdscr, maxheight, maxwidth); + popup_win = newwin( + maxheight-2*POPUP_BORDER, + maxwidth-2*2*POPUP_BORDER, + POPUP_BORDER, + POPUP_BORDER*2 + ); + box(popup_win, 0, 0); + + set_menu_win(new_popup_menu, popup_win); + + return new_popup_menu; +} + +int +render_popup_menu(Menu* popup_menu) +{ + WINDOW* popup_win; + + popup_win = get_menu_win(popup_menu); + wclear(popup_win); + + /* box(popup_win, 0, 0); */ + render_menu(popup_menu); + + wrefresh(popup_win); + + return 0; +} + +/* this is copy paste of other, prob abstract */ +MenuItem** +subtasklist_to_menuitem(SubTask** subtask_list, int list_length) +{ + MenuItem** items; + + items = malloc((list_length+1)*sizeof(MenuItem*)); + for (int i = 0; i < list_length; i++) { + MenuItem* new_menuitem; + new_menuitem = create_menuitem(subtask_list[i]->subtask_name); + /* using same struct, careful if it gets freed */ + set_menuitem_userdata(new_menuitem, subtask_list[i]); + + items[i] = new_menuitem; + } + + items[list_length] = 0; //null terminate + return items; } /* helpers */