]> Pileus Git - lackey/blobdiff - view/year.c
Move drawing code to screen.c, work on day view
[lackey] / view / year.c
index 9e892f073277679205f416bf7dd6a23fd2d2d443..086c0e8e2f4efb6a47082a542711c852239e7763 100644 (file)
 #include <string.h>
 #include <ncurses.h>
 
-#include "main.h"
 #include "util.h"
+#include "date.h"
+#include "event.h"
+#include "screen.h"
 
 /* Constants */
 #define MW (2*7+6)
@@ -30,6 +32,7 @@ static WINDOW *win;
 /* Helper functions */
 static void print_month(month_t month, int y, int x)
 {
+       event_t    *event = EVENTS;
        const char *name  = month_to_string(month);
        const int   start = start_of_month(YEAR, month);
        const char  days  = days_in_month(YEAR, month);
@@ -40,9 +43,22 @@ static void print_month(month_t month, int y, int x)
        for (int d = 0; d < days; d++) {
                int row = (start + d) / 7;
                int col = (start + d) % 7;
-               if (month == MONTH && d == DAY) wattron(win, A_REVERSE);
+
+               int busy = 0;
+               while (event && before(&event->start, YEAR, month, d, 24, 0)) {
+                       if (!before(&event->start, YEAR, month, d, 0, 0))
+                               busy = 1;
+                       event = event->next;
+               }
+
+               int today = month == MONTH && d == DAY;
+
+               int attr  = (busy  ? A_BOLD|A_UNDERLINE : A_DIM)
+                         | (today ? A_REVERSE          : 0    );
+
+               wattron(win, attr);
                mvwprintw(win, y+2+row, x+col*3, "%2d", d+1);
-               if (month == MONTH && d == DAY) wattroff(win, A_REVERSE);
+               wattroff(win, attr);
        }
 }
 
@@ -52,6 +68,11 @@ void year_init(WINDOW *_win)
        win = _win;
 }
 
+/* Year size */
+void year_size(int rows, int cols)
+{
+}
+
 /* Year draw */
 void year_draw(void)
 {
@@ -60,9 +81,6 @@ void year_draw(void)
        int y = 0;
        int h[4] = {};
 
-       /* Clear */
-       werase(win);
-
        /* Determine heights */
        for (int m = 0; m < 12; m++) {
                int weeks = weeks_in_month(YEAR, m);
@@ -100,25 +118,54 @@ void year_draw(void)
 /* Year run */
 int year_run(int key, mmask_t btn, int row, int col)
 {
+       day_t d = DAY;
+       month_t m = MONTH;
+       year_t y = YEAR;
        wday_t day = day_of_week(YEAR, MONTH, DAY);
-       int days = 0, months = 0, years = 0;
-       switch (key)
-       {
-               case 'k': days   = -7; break;
-               case 'j': days   =  7; break;
-               case 'h': days   = -1; break;
-               case 'l': days   =  1; break;
-               case 'i': years  = -1; break;
-               case 'o': years  =  1; break;
+       int week = (start_of_month(y, m) + d) / 7;
+       int dir = 0;
+
+       /* Step years */
+       if (key == 'i')
+               YEAR--;
+       if (key == 'o')
+               YEAR++;
+
+       /* Get direction */
+       if (key == 'h' || key == 'k')
+               dir = -1;
+       if (key == 'j' || key == 'l')
+               dir =  1;
+
+       /* Step up/down */
+       if (key == 'j' || key == 'k') {
+               for (int i = 0; i < 90/7; i++) {
+                       add_days(&y, &m, &d, dir*7);
+                       if (day_of_week(y, m, d) == day &&
+                           y == YEAR && m%3 == MONTH%3) {
+                               MONTH = m;
+                               DAY = d;
+                               break;
+                       }
+               }
        }
-       if (day == SUN && days == -1) days = -22;
-       if (day == SAT && days ==  1) days =  22;
-       if (days || months || years) {
-               add_days(&YEAR, &MONTH, &DAY, days);
-               add_months(&YEAR, &MONTH, months);
-               YEAR += years;
-               year_draw();
-               wrefresh(win);
+
+       /* Step left/right */
+       if (key == 'h' || key == 'l') {
+               for (int i = 0; i < 90; i++) {
+                       add_days(&y, &m, &d, dir);
+                       if ((start_of_month(y, m) + d) / 7 == week &&
+                           y == YEAR && m/3 == MONTH/3) {
+                               MONTH = m;
+                               DAY = d;
+                               break;
+                       }
+               }
        }
+
+       /* Refresh */
+       werase(win);
+       year_draw();
+       wrefresh(win);
        return 0;
 }