]> Pileus Git - lackey/blobdiff - src/view.c
Add event selection to day and week views
[lackey] / src / view.c
index 387e5840fe5aba0cdb5440c6fe9258f2a4e627d8..7c62671f32d4631ae8957c27737d3bb18bf2baef 100644 (file)
@@ -81,8 +81,12 @@ view_t *menu[] = {
        &spacer, &settings_view, &help_view
 };
 
-/* Global data */
+/* Config data */
 int COMPACT = 0;
+int MORNING = 8;
+
+/* Global data */
+edit_t EDIT = EDIT_NONE;
 
 /* Local data */
 view_t *view   = &day_view;
@@ -94,6 +98,9 @@ static void draw_header(void)
 {
        move(0, 0);
        attron(COLOR_PAIR(COLOR_TITLE));
+       clrtoeol();
+
+       /* Draw menu */
        for (int i = 0; i < N_ELEMENTS(menu); i++) {
                if (menu[i] == active)
                        attron(A_BOLD);
@@ -101,13 +108,21 @@ static void draw_header(void)
                if (menu[i] == active)
                        attroff(A_BOLD);
        }
-       clrtoeol();
+
+       /* Draw popup window */
        if (popup) {
+               printw("| ");
                attron(A_BOLD);
-               move(0, COLS-strlen(popup->title)-2);
                printw("[%s]", popup->title);
                attroff(A_BOLD);
        }
+
+       /* Draw date */
+       move(0, COLS-19);
+       printw("%04d-%02d-%02d %02d:%02d:%02d",
+                       NOW.year, NOW.month+1, NOW.day+1,
+                       NOW.hour, NOW.min,     NOW.sec);
+
        attroff(COLOR_PAIR(COLOR_TITLE));
        if (!COMPACT)
                mvhline(1, 0, ACS_HLINE, COLS);
@@ -163,7 +178,7 @@ void wshrink(WINDOW *win, int top)
 /* Helper functions */
 void event_box(WINDOW *win, event_t *event, int y, int x, int h, int w)
 {
-       int l = 0;
+       int i, l = 0;
        int s = y < 0 ? -y-1 : 0;
 
        int color = get_color(event->cat);
@@ -180,14 +195,21 @@ void event_box(WINDOW *win, event_t *event, int y, int x, int h, int w)
        if (h >= 2) mvwadd_wch(win,   y+h-1, x+w-1, WACS_T_LRCORNER);
        if (h >= 2) mvwhline_set(win, y+h-1, x+1,   WACS_T_HLINE, w-2);
 
+       for (i = 1; i < h-1; i++)
+               mvwhline(win, y+i, x+1, ' ', w-2);
+
        if (color) wattroff(win, COLOR_PAIR(color));
 
+       if (event == EVENT)     wattron(win, WA_BOLD | WA_REVERSE);
+       if (event == EVENT)     mvwhline(win, y+s, x, ' ', w);
        if (l<h && event->name) mvwprintw(win, y+l++, x+1, "%.*s",   w-2, event->name);
+       if (event == EVENT)     wattroff(win, WA_REVERSE);
        if (l<h && event->loc)  mvwprintw(win, y+l++, x+1, "@ %.*s", w-4, event->loc);
        if (l<h && event->desc) mvwprintw(win, y+l++, x+1, "%.*s",   w-2, event->desc);
+       if (event == EVENT)     wattroff(win, WA_BOLD);
 }
 
-void event_line(WINDOW *win, event_t *event, int y, int x, int w, int full)
+void event_line(WINDOW *win, event_t *event, int y, int x, int w, int flags)
 {
        int color = get_color(event->cat);
 
@@ -195,26 +217,31 @@ void event_line(WINDOW *win, event_t *event, int y, int x, int w, int full)
        mvwaddch(win, y, x++, ACS_BLOCK);
        if (color) wattroff(win, COLOR_PAIR(color));
 
-       if (full) {
+       if (flags & SHOW_ACTIVE && event == EVENT)
+               wattron(win, A_REVERSE | A_BOLD);
+       if (flags & SHOW_DETAILS) {
                if (all_day(&event->start, &event->end))
-                       mvwprintw(win, y, x, " [all day]   -");
+                       mvwprintw(win, y, x+1, "[all day]   - ");
                else
-                       mvwprintw(win, y, x, " %2d:%02d-%2d:%02d -",
+                       mvwprintw(win, y, x+1, "%2d:%02d-%2d:%02d - ",
                                        event->start.hour, event->start.min,
                                        event->end.hour,   event->end.min);
                x += 15;
+               w -= 15;
        }
        if (event->name) {
                const char *label = event->name ?: event->desc;
                mvwprintw(win, y, x, "%-*.*s", w-1, w-1, label);
                x += MIN(strlen(label), w-1);
        }
-       if (full && event->loc) {
+       if (flags & SHOW_DETAILS && event->loc) {
                mvwprintw(win, y, x, " @ %s", event->loc);
        }
+       if (flags & SHOW_ACTIVE && event == EVENT)
+               wattroff(win, A_REVERSE | A_BOLD);
 }
 
-void todo_line(WINDOW *win, todo_t *todo, int y, int x, int w, int full)
+void todo_line(WINDOW *win, todo_t *todo, int y, int x, int w, int flags)
 {
        char perc[16];
        char desc[LINES];
@@ -233,6 +260,11 @@ void todo_line(WINDOW *win, todo_t *todo, int y, int x, int w, int full)
        if (cat) wattroff(win, COLOR_PAIR(cat));
        x += 2;
 
+       /* Set background */
+       if (flags & SHOW_ACTIVE && todo == TODO)
+               wattron(win, A_REVERSE | A_BOLD);
+       mvwhline(win, y, x, ' ', COLS-x);
+
        /* Print time */
        if (no_date(&todo->due))
                mvwprintw(win, y, x, "[no due date]");
@@ -252,6 +284,10 @@ void todo_line(WINDOW *win, todo_t *todo, int y, int x, int w, int full)
 
        /* Print description */
        mvwprintw(win, y, x, "%s", desc);
+
+       /* Reset flags */
+       if (flags & SHOW_ACTIVE && todo == TODO)
+               wattroff(win, A_REVERSE | A_BOLD);
 }
 
 /* View init */
@@ -271,6 +307,8 @@ void view_config(const char *group, const char *name, const char *key, const cha
        if (match(group, "view")) {
                if (match(key, "compact")) {
                        COMPACT = get_bool(value);
+               } else if (match(key, "morning")) {
+                       MORNING = get_number(value);
                } else if (match(key, "active")) {
                        for (int i = 0; i < N_ELEMENTS(views); i++) {
                                if (match(value, views[i]->name)) {
@@ -306,6 +344,9 @@ void view_draw(void)
 /* View run */
 int view_run(int key, mmask_t btn, int row, int col)
 {
+       /* Refresh timestamp */
+       draw_header();
+
        /* Check for mouse events on the menu */
        if (key == KEY_MOUSE && row == 0) {
                int start = 1;
@@ -359,3 +400,10 @@ int view_run(int key, mmask_t btn, int row, int col)
        /* Pass key to active view */
        return view->run(key, btn, row, col);
 }
+
+/* View event */
+void view_edit(edit_t mode)
+{
+       EDIT = mode;
+       set_view(active, &edit_view);
+}