+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;
+}
+