]> Pileus Git - lackey/blobdiff - views/todo.c
Move e key to views
[lackey] / views / todo.c
index 58c3b8b37bcb62d5ca5cf98fa50c50abd23fc3d4..d59307ec79eb8db1a33715cedb6d0e4950d2f68f 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 Andy Spencer <andy753421@gmail.com>
+ * Copyright (C) 2012-2013 Andy Spencer <andy753421@gmail.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 
 /* Static data */
 static WINDOW *win;
-static int     line;
-static int     rows;
+
+static int     line;   // scroll offset
+static int     rows;   // number of rows
+
+static int     srow;   // selected row 
+static int     cursor; // index of the selected row
+static int     items;  // number of items displayed
+static int     first;  // cursor on first item in group
+static int     last;   // cursor on last item in group
 
 static int show_new      = 1;
 static int show_started  = 1;
@@ -34,10 +41,21 @@ static int show_finished = 0;
 /* Helper functions */
 static int print_todos(WINDOW *win, int row, 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, row+n++, 4, COLS-4, 1);
+       int n = 0, found = 0;
+       for (todo_t *cur = todos; cur; cur = cur->next) {
+               if (low <= cur->status && cur->status <= high) {
+                       if (found)
+                               last = 0;
+                       if (items++ == cursor) {
+                               found = 1;
+                               first = n == 0;
+                               last  = 1;
+                               TODO  = cur;
+                               srow  = row+n;
+                       }
+                       todo_line(win, cur, row+n++, 4, COLS-4, SHOW_DETAILS | SHOW_ACTIVE);
+               }
+       }
        return n;
 }
 
@@ -80,6 +98,9 @@ void todo_draw(void)
 {
        int row = -line;
 
+       TODO = 0;
+       items = 0;
+
        row = print_group(win, row, TODOS,
                show_new, "New Tasks", NEW, NEW);
 
@@ -95,18 +116,38 @@ void todo_draw(void)
 /* Todo run */
 int todo_run(int key, mmask_t btn, int row, int col)
 {
-       int scroll = 0, ref = 0;
+       int scroll = 0, move = 0, ref = 0;
        switch (key)
        {
-               case 'g': ref = 1; scroll = -line;    break;
-               case 'G': ref = 1; scroll =  rows;    break;
-               case 'j': ref = 1; scroll =  1;       break;
-               case 'k': ref = 1; scroll = -1;       break;
-               case 'n': ref = 1; show_new      ^= 1; break;
-               case 's': ref = 1; show_started  ^= 1; break;
-               case 'f': ref = 1; show_finished ^= 1; break;
+               case 'g':    ref = 1; scroll = -line;     break;
+               case 'G':    ref = 1; scroll =  rows;     break;
+               case '\005': ref = 1; scroll =  1;        break; // ctrl-e
+               case '\031': ref = 1; scroll = -1;        break; // ctrl-y
+               case 'j':    ref = 1; move   =  1;        break;
+               case 'k':    ref = 1; move   = -1;        break;
+               case 'n':    ref = 1; show_new      ^= 1; break;
+               case 's':    ref = 1; show_started  ^= 1; break;
+               case 'f':    ref = 1; show_finished ^= 1; break;
+               case 'e':    view_edit(EDIT_TODO); return 1;
+               case '\012': view_edit(EDIT_TODO); return 1; // enter
        }
-       line = CLAMP(line+scroll, 0, rows-1);
+
+       /* Move more if we're on the edge of a group */
+       int extra = 0;
+       if (move < 0 && first) extra = -2;
+       if (move > 0 && last)  extra =  2;
+
+       /* Scroll window when we move off screen */
+       int next = line + srow + move + extra;
+       int ymax = getmaxy(win)-1;
+       while (next-line < 0)    line--;
+       while (next-line > ymax) line++;
+
+       /* Update line and cursor positions */
+       line   = CLAMP(line+scroll, 0, rows-1);
+       cursor = CLAMP(cursor+move, 0, items-1);
+
+       /* Repaint */
        if (ref) {
                werase(win);
                todo_draw();