]> Pileus Git - lackey/commitdiff
Start keeping track of calendars
authorAndy Spencer <andy753421@gmail.com>
Mon, 10 Jun 2013 08:16:21 +0000 (08:16 +0000)
committerAndy Spencer <andy753421@gmail.com>
Mon, 10 Jun 2013 08:19:43 +0000 (08:19 +0000)
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
cals/ical.c
src/cal.c
src/cal.h
views/events.c
views/settings.c
views/todo.c

index 4e55adef9823db5bba27c84657e60154df78dee9..250b1de09f252fe0dde87d44c7636b81c2e3c5b4 100644 (file)
@@ -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)
 {
index c8147371411db4a77c185eb8411e0b3348caabbd..aafbc99d425521982f63ef6b20e6eea828e16e3a 100644 (file)
@@ -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);
 
index 627feaee9ff18799607fbec24ad5ff8e05e2be49..31e30852f010595c9bfbc2052fdc61563b0cc6e4 100644 (file)
--- 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)
index 48e1af4d20b1b0daf2cb0846c862283f76a9ae41..f3f7a5fe41abef340f219e7ea8fcbb9ee93f4a6b 100644 (file)
--- 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;
 
index 248a942fa04870b645cfa548ab27baeb867a8bdd..3e31effe46c1125e1c300410e8ecf70b8db18bec 100644 (file)
@@ -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);
index eef3a4b9ac4f646b7ade2a27b5cdf860472a122a..579e27172da1e668672cf11275b770770a5661c8 100644 (file)
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
+#include <string.h>
 #include <ncurses.h>
 
+#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 */
index 784d6e15bc6147f23362523eebc073bcbdfbcf0f..58c3b8b37bcb62d5ca5cf98fa50c50abd23fc3d4 100644 (file)
@@ -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)