+/*
+ * Copyright (C) 2012 Andy Spencer <andy753421@gmail.com>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#define _XOPEN_SOURCE_EXTENDED
+
#include <string.h>
#include <ncurses.h>
-#include "main.h"
+
+#include "util.h"
+#include "date.h"
+#include "event.h"
#include "screen.h"
/* Types */
typedef struct {
char *name;
void (*init)(WINDOW*);
+ void (*size)(int,int);
void (*draw)(void);
int (*run)(int,mmask_t,int,int);
int keys[8];
/* Data */
view_t views[] = {
- { "Day", day_init, day_draw, day_run, {KEY_F(1), '1', 'd', } },
- { "Week", week_init, week_draw, week_run, {KEY_F(2), '2', 'w', } },
- { "Month", month_init, month_draw, month_run, {KEY_F(3), '3', 'm', } },
- { "Year", year_init, year_draw, year_run, {KEY_F(4), '4', 'y', } },
- { "|", NULL, NULL, NULL, { } },
- { "Todo", todo_init, todo_draw, todo_run, {KEY_F(5), '5', 't', } },
- { "Notes", notes_init, notes_draw, notes_run, {KEY_F(6), '6', 'n', } },
- { "|", NULL, NULL, NULL, { } },
- { "Settings", settings_init, settings_draw, settings_run, {KEY_F(7), '7', 's', } },
- { "Help", help_init, help_draw, help_run, {KEY_F(8), '8', 'h', '?'} },
+ { "Day", day_init, day_size, day_draw, day_run, {KEY_F(1), '1', } },
+ { "Week", week_init, week_size, week_draw, week_run, {KEY_F(2), '2', } },
+ { "Month", month_init, month_size, month_draw, month_run, {KEY_F(3), '3', } },
+ { "Year", year_init, year_size, year_draw, year_run, {KEY_F(4), '4', } },
+ { "|", NULL, NULL, NULL, NULL, { } },
+ { "Todo", todo_init, todo_size, todo_draw, todo_run, {KEY_F(5), '5', } },
+ { "Notes", notes_init, notes_size, notes_draw, notes_run, {KEY_F(6), '6', } },
+ { "|", NULL, NULL, NULL, NULL, { } },
+ { "Settings", settings_init, settings_size, settings_draw, settings_run, {KEY_F(7), '7', } },
+ { "Help", help_init, help_size, help_draw, help_run, {KEY_F(8), '8', '?'} },
};
-int active = 2;
+int active = 0;
/* Local functions */
void draw_header(void)
refresh();
}
+/* Helper functions */
+void event_box(WINDOW *win, event_t *event, int y, int x, int h, int w)
+{
+ int l = 0;
+ int s = y < 0 ? -y-1 : 0;
+
+ int color = event->cat == NULL ? 0 :
+ !strcmp(event->cat, "class") ? COLOR_CLASS :
+ !strcmp(event->cat, "ec") ? COLOR_EC :
+ !strcmp(event->cat, "work") ? COLOR_WORK : COLOR_OTHER ;
+
+ if (color) wattron(win, COLOR_PAIR(color));
+
+ if (h >= 2) mvwhline_set(win, y, x+1, WACS_T_HLINE, w-2);
+ if (h <= 1) mvwadd_wch(win, y, x, WACS_BULLET);
+ if (h >= 2) mvwadd_wch(win, y, x, WACS_T_ULCORNER);
+ if (h >= 2) mvwadd_wch(win, y, x+w-1, WACS_T_URCORNER);
+ if (h >= 3) mvwvline_set(win, y+1+s, x, WACS_T_VLINE, h-2-s);
+ if (h >= 3) mvwvline_set(win, y+1+s, x+w-1, WACS_T_VLINE, h-2-s);
+ if (h >= 2) mvwadd_wch(win, y+h-1, x, WACS_T_LLCORNER);
+ 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);
+
+ if (color) wattroff(win, COLOR_PAIR(color));
+
+ if (l<h && event->name) mvwprintw(win, y+l++, x+1, "%.*s", w-2, event->name);
+ if (l<h && event->loc) mvwprintw(win, y+l++, x+1, "@ %-*.*s", w-4, w-4, event->loc);
+ if (l<h && event->desc) mvwprintw(win, y+l++, x+1, "%-*.*s", w-2, w-2, event->desc);
+}
+
+void event_line(WINDOW *win, event_t *event, int y, int x, int w)
+{
+ int color = event->cat == NULL ? 0 :
+ !strcmp(event->cat, "class") ? COLOR_CLASS :
+ !strcmp(event->cat, "ec") ? COLOR_EC :
+ !strcmp(event->cat, "work") ? COLOR_WORK : COLOR_OTHER ;
+
+ if (color) wattron(win, COLOR_PAIR(color));
+ mvwaddch(win, y, x+0, ACS_BLOCK);
+ if (color) wattroff(win, COLOR_PAIR(color));
+
+ mvwprintw(win, y, x+1, "%-*.*s", w-1, w-1, event->name);
+}
+
+
/* Screen init */
void screen_init(void)
{
/* Screen draw */
void screen_resize(void)
{
- for (int i = 0; i < N_ELEMENTS(views); i++)
- if (views[i].init)
+ for (int i = 0; i < N_ELEMENTS(views); i++) {
+ if (views[i].win)
wresize(views[i].win, LINES-2, COLS);
+ if (views[i].size)
+ views[i].size(LINES-2, COLS);
+ }
}
/* Screen draw */
int start = 1;
for (int i = 0; i < N_ELEMENTS(views); i++) {
int end = start + strlen(views[i].name) - 1;
- if (start <= col && col <= end)
+ if (start <= col && col <= end && views[i].draw)
return screen_set(i);
start = end + 2;
}