]> Pileus Git - lackey/blobdiff - views/todo.c
Add todo view
[lackey] / views / todo.c
index e6027f9dedf0c2c4d5f627d520b97cf7b09d6257..27fdfcd93a871ba967a86166a2943d62b7409baa 100644 (file)
 
 #include <ncurses.h>
 
+#include "util.h"
+#include "date.h"
+#include "cal.h"
+#include "view.h"
+
 /* Static data */
 static WINDOW *win;
 
+static int show_new      = 1;
+static int show_started  = 1;
+static int show_finished = 1;
+
+/* Helper functions */
+static int print_todos(WINDOW *win, int y, todo_t *todos, status_t low, status_t high)
+{
+       int n = 0;
+       for (todo_t *cur = todos; cur; cur = cur->next)
+               if (low <= cur->status && cur->status <= high)
+                       todo_line(win, cur, y+n++, 2, COLS-2, 1);
+       return n;
+}
+
+static int print_group(WINDOW *win, int y, todo_t *todos,
+               int show, const char *label, status_t low, status_t high)
+{
+       int n = 1;
+
+       /* Label */
+       mvwprintw(win, y, 0, "%s", label);
+
+       /* Todos */
+       if (show)
+               n = print_todos(win, y+1, todos, low, high);
+
+       /* Status */
+       if (!show)
+               mvwprintw(win, y+1, 4, "[hidden]");
+       if (n == 0)
+               mvwprintw(win, y+1, 4, "[no tasks]");
+
+       return y+1+MAX(n,1)+1;
+}
+
 /* Todo init */
 void todo_init(WINDOW *_win)
 {
@@ -34,11 +74,32 @@ void todo_size(int rows, int cols)
 /* Todo draw */
 void todo_draw(void)
 {
-       mvwprintw(win, 0, 1, "%s\n", "todo");
+       int y = 0;
+
+       y = print_group(win, y, TODOS,
+               show_new, "New Tasks", NEW, NEW);
+
+       y = print_group(win, y, TODOS,
+               show_started, "Started Tasks", NEW+1, DONE-1);
+
+       y = print_group(win, y, TODOS,
+               show_finished, "Finished Tasks", DONE, DONE);
 }
 
 /* Todo run */
 int todo_run(int key, mmask_t btn, int row, int col)
 {
+       int ref = 0;
+       switch (key)
+       {
+               case 'n': ref = 1; show_new      ^= 1; break;
+               case 's': ref = 1; show_started  ^= 1; break;
+               case 'f': ref = 1; show_finished ^= 1; break;
+       }
+       if (ref) {
+               werase(win);
+               todo_draw();
+               wrefresh(win);
+       }
        return 0;
 }