From: Andy Spencer Date: Fri, 22 Jun 2018 09:36:16 +0000 (+0000) Subject: Add option to show and hide weekends. X-Git-Url: http://pileus.org/git/?p=lackey;a=commitdiff_plain;h=9f9ede043dd04a20245f060bc6c89dd109ced36f Add option to show and hide weekends. --- diff --git a/src/view.c b/src/view.c index cfff88e..a66fb85 100644 --- a/src/view.c +++ b/src/view.c @@ -85,8 +85,9 @@ view_t *menu[] = { }; /* Config data */ -int COMPACT = 0; -int MORNING = 8; +int COMPACT = 0; +int MORNING = 8; +int WEEKENDS = 0; /* Global data */ edit_t EDIT = EDIT_NONE; @@ -425,6 +426,8 @@ void view_config(const char *group, const char *name, const char *key, const cha COMPACT = get_bool(value); } else if (match(key, "morning")) { MORNING = get_number(value); + } else if (match(key, "weekends")) { + WEEKENDS = get_bool(value); } else if (match(key, "active")) { for (int i = 0; i < N_ELEMENTS(views); i++) { if (match(value, views[i]->name)) { diff --git a/src/view.h b/src/view.h index b896bea..bc86c11 100644 --- a/src/view.h +++ b/src/view.h @@ -41,8 +41,9 @@ typedef enum { } edit_t; /* Config data */ -extern int COMPACT; // reduce layout spacing -extern int MORNING; // first line to display +extern int COMPACT; // reduce layout spacing +extern int MORNING; // first line to display +extern int WEEKENDS; // show weekends in week view /* Global data */ extern edit_t EDIT; // edit mode 0=cal 1=event 3=todo diff --git a/views/week.c b/views/week.c index 3386947..911677c 100644 --- a/views/week.c +++ b/views/week.c @@ -20,6 +20,7 @@ #include #include "util.h" +#include "conf.h" #include "date.h" #include "cal.h" #include "view.h" @@ -56,7 +57,6 @@ void week_draw(void) { int x = 6; int y = 3 - COMPACT; - const float hstep = (float)(COLS-x)/7.0; int ex, ey, ew, eh; event_t *event, *ee; @@ -64,15 +64,22 @@ void week_draw(void) year_t year = SEL.year; month_t month = SEL.month; day_t day = SEL.day; - int shift = day_of_week(year, month, day); - add_days(&year, &month, &day, -shift); + wday_t wday = day_of_week(year, month, day); + add_days(&year, &month, &day, -wday); /* Load cal data */ cal_load(year, month, day, 7); /* For today */ - int l = ROUND((shift+0)*hstep); - int r = ROUND((shift+1)*hstep); + int wstart = WEEKENDS ? SUN : MON; + int wend = WEEKENDS ? SAT : FRI; + int wdays = wend - wstart + 1; + float hstep = (float)(COLS-x)/wdays; + add_days(&year, &month, &day, wstart); + + /* For today */ + int l = ROUND((wday-wstart+0)*hstep); + int r = ROUND((wday-wstart+1)*hstep); /* Print Header */ int rev = COMPACT ? A_REVERSE | A_BOLD : 0; @@ -83,12 +90,13 @@ void week_draw(void) mvwhline(win, 0, x+l, ' ', r-l-1); mvwhline(win, 1, x+l, ' ', r-l-1); wattron(win, rev); - for (int d = 0; d < 7; d++) { - const char *str = hstep >= 10 ? day_to_string(d) : day_to_str(d); - if (d == shift) wattrset(win, A_BOLD); - mvwprintw(win, 0, x+ROUND(d*hstep), "%s", str); - mvwprintw(win, 1, x+ROUND(d*hstep), "%02d/%02d", month+1, day+1); - if (d == shift) wattrset(win, rev); + for (int i = 0; i < wdays; i++) { + const char *str = hstep >= 10 ? day_to_string(wstart+i) + : day_to_str(wstart+i); + if (wstart+i == wday) wattrset(win, A_BOLD); + mvwprintw(win, 0, x+ROUND(i*hstep), "%s", str); + mvwprintw(win, 1, x+ROUND(i*hstep), "%02d/%02d", month+1, day+1); + if (wstart+i == wday) wattrset(win, rev); add_days(&year, &month, &day, 1); } wattroff(win, rev); @@ -96,14 +104,14 @@ void week_draw(void) /* Print all day events */ int allday = 0; event = EVENTS; - add_days(&year, &month, &day, -7); - for (int d = 0; d < 7; d++) { + add_days(&year, &month, &day, -wdays); + for (int i = 0; i < wdays; i++) { int n = 0; while (event && before(&event->start, year, month, day, 24, 0)) { if (!before(&event->end, year, month, day, 0, 1) && get_mins(&event->start, &event->end) > 23*60) { - int s = ROUND(d*hstep); - int w = ROUND((d+1)*hstep) - 1 - s; + int s = ROUND(i*hstep); + int w = ROUND((i+1)*hstep) - 1 - s; event_line(win, event, y+n++, x+s, w, SHOW_ACTIVE); } event = event->next; @@ -129,10 +137,10 @@ void week_draw(void) EVENT = find_event(&SEL); ee = NULL; event = EVENTS; - add_days(&year, &month, &day, -7); + add_days(&year, &month, &day, -wdays); event_t *active[5] = {}; int ncols = 0; - for (int d = 0; d < 7; d++, add_days(&year,&month,&day,1)) + for (int i = 0; i < wdays; i++, add_days(&year,&month,&day,1)) for (int h = 0; h < 24; h++) for (int m = 0; m < 60; m+=15) while (event && before(&event->start, @@ -141,9 +149,9 @@ void week_draw(void) get_mins(&event->start, &event->end) <= 23*60) { int col = get_col(active, N_ELEMENTS(active), event, &ncols); int y = h*4 + m/15 - line + !COMPACT; - int x = ROUND(d*hstep) + 1 + (col*3); + int x = ROUND(i*hstep) + 1 + (col*3); int h = (get_mins(&event->start, &event->end)-1)/15+1; - int w = ROUND((d+1)*hstep) - x - ((ncols-1)-col)*3; + int w = ROUND((i+1)*hstep) - x - ((ncols-1)-col)*3; if (event == EVENT) { ee = event; ex = x; ey = y; ew = w; eh = h; } else @@ -163,8 +171,9 @@ void week_draw(void) mvwhline(win, y-1+allday, 0, ACS_HLINE, COLS); /* Print day lines */ - for (int d = 0; d < 7; d++) - mvwvline(body, !COMPACT, ROUND(d*hstep), ACS_VLINE, LINES-y-2+COMPACT-allday); + for (int i = 0; i < wdays; i++) + mvwvline(body, !COMPACT, ROUND(i*hstep), + ACS_VLINE, LINES-y-2+COMPACT-allday); mvwvline_set(body, 0, l, WACS_T_VLINE, LINES-y-1+COMPACT); mvwvline_set(body, 0, r, WACS_T_VLINE, LINES-y-1+COMPACT); for (int h = (line+3)/4; h < 24; h++) { @@ -178,7 +187,7 @@ void week_draw(void) /* Week run */ int week_run(int key, mmask_t btn, int row, int col) { - int days = 0, events = 0, lines = 0; + int days = 0, events = 0, lines = 0, toggle = 0; switch (key) { case 'h': days = -1; break; case 'l': days = 1; break; @@ -188,11 +197,24 @@ int week_run(int key, mmask_t btn, int row, int col) case 'j': events = 1; break; case '\031': lines = -1; break; // ctrl-y case '\005': lines = 1; break; // ctrl-e + case 'w': toggle = 1; break; case 'e': view_edit(EDIT_EVENT); return 1; case '\012': view_edit(EDIT_EVENT); return 1; // enter default: return 0; // not found } + wday_t wday = day_of_week(SEL.year, SEL.month, SEL.day); + if (!WEEKENDS && ((wday == MON && days == -1) || + (wday == FRI && days == 1))) + days *= 3; + + if (toggle) { + WEEKENDS = !WEEKENDS; + if (wday == SUN) days = 1; + if (wday == SAT) days = -1; + set_bool("view", NULL, "weekends", WEEKENDS); + } + if (lines) line = CLAMP(line+lines, 0, 24*4); if (days || events)