]> Pileus Git - lackey/blobdiff - view/year.c
More interactive views
[lackey] / view / year.c
index 9e892f073277679205f416bf7dd6a23fd2d2d443..9746261809623bfaf5d6a58a9fe05f4bf29870e9 100644 (file)
@@ -100,25 +100,51 @@ void year_draw(void)
 /* Year run */
 int year_run(int key, mmask_t btn, int row, int col)
 {
+       int d = DAY, m = MONTH, 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 */
+       year_draw();
+       wrefresh(win);
        return 0;
 }