From b90716f36fac6e8c16dabd981cd47eeb9a8ec4f1 Mon Sep 17 00:00:00 2001 From: Andy Spencer Date: Mon, 10 Jun 2013 08:16:21 +0000 Subject: [PATCH] Start keeping track of calendars This also add a read-only settings view, which is mostly for debugging at this point, and make some header formatting more constant. --- cals/dummy.c | 8 +++++++- cals/ical.c | 36 ++++++++++++++++++++++++------------ src/cal.c | 23 +++++++++++++++++++++-- src/cal.h | 10 ++++++---- views/events.c | 4 ++-- views/settings.c | 43 ++++++++++++++++++++++++++++++++++++++++++- views/todo.c | 2 ++ 7 files changed, 104 insertions(+), 22 deletions(-) diff --git a/cals/dummy.c b/cals/dummy.c index 4e55ade..250b1de 100644 --- a/cals/dummy.c +++ b/cals/dummy.c @@ -24,9 +24,9 @@ /* Test data */ static cal_t cal = { + .type = "dummy", .name = "dummy", .desc = "dummy calendar", - .data = NULL, }; static event_t event = { @@ -54,6 +54,12 @@ void dummy_config(const char *group, const char *name, const char *key, const ch enable = get_bool(value); } +/* Cal functions */ +cal_t *dummy_cals(void) +{ + return &cal; +} + /* Event functions */ event_t *dummy_events(date_t start, date_t end) { diff --git a/cals/ical.c b/cals/ical.c index c814737..aafbc99 100644 --- a/cals/ical.c +++ b/cals/ical.c @@ -35,11 +35,11 @@ typedef struct { } ical_inst; typedef struct ical_t { - char *name; + cal_t cal; char *location; char *username; char *password; - icalcomponent *ical; + icalcomponent *comp; struct ical_t *next; } ical_t; @@ -145,7 +145,7 @@ static void add_recur(icalarray *array, icalcomponent *comp, static void read_icals(void) { for (ical_t *cal = calendars; cal; cal = cal->next) { - if (cal->ical == NULL && cal->location) { + if (cal->comp == NULL && cal->location) { wordexp_t wexp; wordexp(cal->location, &wexp, WRDE_NOCMD); if (wexp.we_wordc == 0) @@ -157,7 +157,7 @@ static void read_icals(void) icalparser *parser = icalparser_new(); icalparser_set_gen_data(parser, file); - cal->ical = icalparser_parse(parser, (void*)fgets); + cal->comp = icalparser_parse(parser, (void*)fgets); icalparser_free(parser); } } @@ -248,13 +248,14 @@ void ical_config(const char *group, const char *name, const char *key, const cha /* Find existing calendar */ for (cal = calendars; cal; last = cal, cal = cal->next) - if (match(cal->name, name)) + if (match(cal->cal.name, name)) break; /* Create new calendar */ if (!cal) { cal = new0(ical_t); - cal->name = get_name(name); + cal->cal.type = "ical"; + cal->cal.name = get_name(name); if (last) last->next = cal; else @@ -271,6 +272,17 @@ void ical_config(const char *group, const char *name, const char *key, const cha cal->password = get_string(value); } +/* Cal functions */ +cal_t *ical_cals(void) +{ + read_icals(); + + for (ical_t *cal = calendars; cal; cal = cal->next) + cal->cal.next = &cal->next->cal; + + return &calendars->cal; +} + /* Event functions */ event_t *ical_events(date_t _start, date_t _end) { @@ -280,7 +292,7 @@ event_t *ical_events(date_t _start, date_t _end) icaltimetype end = to_itime(_end); icalarray *array = icalarray_new(sizeof(ical_inst), 1); for (ical_t *cal = calendars; cal; cal = cal->next) - add_recur(array, cal->ical, start, end, ICAL_VEVENT_COMPONENT); + add_recur(array, cal->comp, start, end, ICAL_VEVENT_COMPONENT); icalarray_sort(array, ical_compare); event_t *events = to_events(array); icalarray_free(array); @@ -297,7 +309,7 @@ todo_t *ical_todos(date_t _start, date_t _end) icaltimetype end = to_itime(_end); icalarray *array = icalarray_new(sizeof(ical_inst), 1); for (ical_t *cal = calendars; cal; cal = cal->next) - add_recur(array, cal->ical, start, end, ICAL_VTODO_COMPONENT); + add_recur(array, cal->comp, start, end, ICAL_VTODO_COMPONENT); icalarray_sort(array, ical_compare); todo_t *todos = to_todos(array); icalarray_free(array); @@ -332,7 +344,7 @@ void ical_test(void) FILE *file = fopen("data/all.ics", "r"); icalparser *parser = icalparser_new(); icalparser_set_gen_data(parser, file); - icalcomponent *ical = icalparser_parse(parser, (void*)fgets); + icalcomponent *comp = icalparser_parse(parser, (void*)fgets); /* Misc */ icalarray *array; @@ -341,20 +353,20 @@ void ical_test(void) /* Find events */ array = icalarray_new(sizeof(ical_inst), 1); - add_recur(array, ical, start, end, ICAL_VEVENT_COMPONENT); + add_recur(array, comp, start, end, ICAL_VEVENT_COMPONENT); icalarray_sort(array, ical_compare); event_t *events = to_events(array); icalarray_free(array); /* Find Todos */ array = icalarray_new(sizeof(ical_inst), 1); - add_recur(array, ical, start, end, ICAL_VTODO_COMPONENT); + add_recur(array, comp, start, end, ICAL_VTODO_COMPONENT); icalarray_sort(array, ical_compare); todo_t *todos = to_todos(array); icalarray_free(array); /* Print */ - //ical_printr(ical, 0); + //ical_printr(comp, 0); //print_events(events); print_todos(todos); diff --git a/src/cal.c b/src/cal.c index 627feae..31e3085 100644 --- a/src/cal.c +++ b/src/cal.c @@ -24,6 +24,7 @@ /* Macros */ #define CAL(name) \ void name##_config(const char *group, const char *name, const char *key, const char *value); \ + cal_t *name##_cals(void); \ event_t *name##_events(date_t start, date_t end); \ todo_t *name##_todos(date_t start, date_t end) @@ -32,6 +33,7 @@ CAL(dummy); CAL(ical); /* Global data */ +cal_t *CALS; event_t *EVENTS; todo_t *TODOS; @@ -60,6 +62,18 @@ static void add_todo(todo_t **first, todo_t **last, todo_t **next) (*next) = (*next)->next; } +static cal_t *merge_cals(cal_t *a, cal_t *b) +{ + // TODO - we should sort these + if (!a) return b; + if (!b) return a; + cal_t *last = a; + while (last->next) + last = last->next; + last->next = b; + return a; +} + static event_t *merge_events(event_t *a, event_t *b) { event_t *first = NULL, *last = NULL; @@ -89,8 +103,13 @@ static todo_t *merge_todos(todo_t *a, todo_t *b) /* Initialize */ void cal_init(void) { - /* Load a year's worth of data */ - cal_load(YEAR-1, DEC, 31-7, 366+7+7); + /* Load calendars */ + CALS = merge_cals( + dummy_cals(), + ical_cals()); + + /* Load data */ + cal_load(YEAR, MONTH, DAY, 1); /* Debug */ for (event_t *e = EVENTS; e; e = e->next) diff --git a/src/cal.h b/src/cal.h index 48e1af4..f3f7a5f 100644 --- a/src/cal.h +++ b/src/cal.h @@ -22,10 +22,11 @@ typedef enum { } status_t; /* Calendar type */ -typedef struct { - char *name; - char *desc; - void *data; +typedef struct cal_t { + char *type; + char *name; + char *desc; + struct cal_t *next; } cal_t; /* Calendar item types */ @@ -52,6 +53,7 @@ typedef struct todo_t { } todo_t; /* Global data */ +extern cal_t *CALS; extern event_t *EVENTS; extern todo_t *TODOS; diff --git a/views/events.c b/views/events.c index 248a942..3e31eff 100644 --- a/views/events.c +++ b/views/events.c @@ -69,12 +69,12 @@ void events_draw(void) row++; if (newdate) { wday_t wday = day_of_week(next.year, next.month, next.day); - wattron(win, A_UNDERLINE); + wattron(win, A_BOLD); mvwprintw(win, row-line, 0, "%04d-%02d-%02d", next.year, next.month+1, next.day+1); mvwprintw(win, row-line, 13, "%s, %s %d", day_to_string(wday), month_to_string(next.month), next.day); - wattroff(win, A_UNDERLINE); + wattroff(win, A_BOLD); row++; } event_line(win, event, row++-line, 4, COLS-2, 1); diff --git a/views/settings.c b/views/settings.c index eef3a4b..579e271 100644 --- a/views/settings.c +++ b/views/settings.c @@ -15,11 +15,34 @@ * along with this program. If not, see . */ +#include #include +#include "util.h" +#include "conf.h" +#include "date.h" +#include "cal.h" +#include "view.h" + +/* Constant data */ +#define PAD " " + /* Static data */ static WINDOW *win; +/* Helper functions */ +static void heading(WINDOW *win, char *label) +{ + wattron(win, A_BOLD); + wprintw(win, "%s", label); + wattroff(win, A_BOLD); +} + +static void checkbox(WINDOW *win, char *label, int *value) +{ + wprintw(win, PAD "[%c] %s", *value?'x':' ', label); +} + /* Settings init */ void settings_init(WINDOW *_win) { @@ -34,7 +57,25 @@ void settings_size(int rows, int cols) /* Settings draw */ void settings_draw(void) { - mvwprintw(win, 0, 1, "%s\n", "settings"); + int wtype = 0, wname = 0; + + /* Figure out cal widths */ + for (cal_t *cal = CALS; cal; cal = cal->next) { + if (strlen(cal->type) > wtype) + wtype = strlen(cal->type); + if (strlen(cal->name) > wname) + wname = strlen(cal->name); + } + + heading(win, "Current Settings\n"); + checkbox(win, "Compact layout\n", &COMPACT); + + heading(win, "\nLoaded Calendars\n"); + for (cal_t *cal = CALS; cal; cal = cal->next) + wprintw(win, PAD "%s:%*s \"%s\"%*s - %s\n", + cal->type, wtype-strlen(cal->type), "", + cal->name, wname-strlen(cal->name), "", + cal->desc ?: "(no description)"); } /* Settings run */ diff --git a/views/todo.c b/views/todo.c index 784d6e1..58c3b8b 100644 --- a/views/todo.c +++ b/views/todo.c @@ -47,7 +47,9 @@ static int print_group(WINDOW *win, int row, todo_t *todos, int n = 1; /* Label */ + wattron(win, A_BOLD); mvwprintw(win, row, 0, "%s", label); + wattroff(win, A_BOLD); /* Todos */ if (show) -- 2.43.2