From bfc7ff1dff587b125bd3e0a58d6fa4a895842302 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Sat, 6 Oct 2012 09:50:07 +0000 Subject: [PATCH] More interactive views --- view/day.c | 16 ++++++++++++++ view/week.c | 38 +++++++++++++++++++++++++++------ view/year.c | 60 ++++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 91 insertions(+), 23 deletions(-) diff --git a/view/day.c b/view/day.c index 58e65da..5d20672 100644 --- a/view/day.c +++ b/view/day.c @@ -36,6 +36,9 @@ void day_draw(void) const char *mstr = month_to_string(MONTH); const char *dstr = day_to_string(day_of_week(YEAR, MONTH, DAY)); + /* Clear */ + werase(win); + /* Print Header */ mvwprintw(win, 0, 0, "%s, %s %d", dstr, mstr, DAY+1); mvwprintw(win, 0, COLS-10, "%d-%02d-%02d", YEAR, MONTH, DAY+1); @@ -51,5 +54,18 @@ void day_draw(void) /* Day run */ int day_run(int key, mmask_t btn, int row, int col) { + int days = 0; + switch (key) + { + case 'h': days = -1; break; + case 'l': days = 1; break; + case 'i': days = -7; break; + case 'o': days = 7; break; + } + if (days) { + add_days(&YEAR, &MONTH, &DAY, days); + day_draw(); + wrefresh(win); + } return 0; } diff --git a/view/week.c b/view/week.c index e9988e9..bde7608 100644 --- a/view/week.c +++ b/view/week.c @@ -15,6 +15,8 @@ * along with this program. If not, see . */ +#define _XOPEN_SOURCE_EXTENDED + #include #include @@ -35,22 +37,26 @@ void week_draw(void) { int x = 6; int y = 3; - const float hstep = (float)(COLS-x)/5.0; + const float hstep = (float)(COLS-x)/7.0; + + /* Clear */ + werase(win); /* Get start of week */ year_t year = YEAR; month_t month = MONTH; day_t day = DAY; int shift = day_of_week(year, month, day); - add_days(&year, &month, &day, -shift+MON); + add_days(&year, &month, &day, -shift); /* Print Header */ mvwprintw(win, 1, 0, "%s", month_to_str(MONTH)); - for (int d = 0; d < 5; d++) { - // FIXME.. - const char *str = hstep >= 10 ? day_to_string(d+MON) : day_to_str(d+MON); + for (int d = 0; d < 7; d++) { + const char *str = hstep >= 10 ? day_to_string(d) : day_to_str(d); + if (d == shift) wattron(win, A_BOLD); mvwprintw(win, 0, x+ROUND(d*hstep), "%02d/%02d", month+1, day+1); mvwprintw(win, 1, x+ROUND(d*hstep), "%s", str); + if (d == shift) wattroff(win, A_BOLD); add_days(&year, &month, &day, 1); } @@ -61,12 +67,32 @@ void week_draw(void) /* Print lines */ mvwhline(win, y-1, 0, ACS_HLINE, COLS); - for (int d = 0; d < 5; d++) + for (int d = 0; d < 7; d++) mvwvline(win, y, x+ROUND(d*hstep)-1, ACS_VLINE, LINES-y-2); + + /* Draw today */ + int l = x+ROUND((shift+0)*hstep)-1; + int r = x+ROUND((shift+1)*hstep)-1; + mvwhline (win, y-1, l, ACS_BLOCK, r-l+1); + mvwvline_set(win, y, l, WACS_T_VLINE, LINES-y-2); + mvwvline_set(win, y, r, WACS_T_VLINE, LINES-y-2); } /* Week run */ int week_run(int key, mmask_t btn, int row, int col) { + int days = 0; + switch (key) + { + case 'h': days = -1; break; + case 'l': days = 1; break; + case 'i': days = -7; break; + case 'o': days = 7; break; + } + if (days) { + add_days(&YEAR, &MONTH, &DAY, days); + week_draw(); + wrefresh(win); + } return 0; } diff --git a/view/year.c b/view/year.c index 9e892f0..9746261 100644 --- a/view/year.c +++ b/view/year.c @@ -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; } -- 2.43.2