#include <string.h>
#include <ncurses.h>
-#include "main.h"
#include "util.h"
+#include "date.h"
+#include "event.h"
+#include "screen.h"
/* Constants */
#define MW (2*7+6)
/* Helper functions */
static void print_month(month_t month, int y, int x)
{
+ event_t *event = EVENTS;
const char *name = month_to_string(month);
const int start = start_of_month(YEAR, month);
const char days = days_in_month(YEAR, month);
for (int d = 0; d < days; d++) {
int row = (start + d) / 7;
int col = (start + d) % 7;
- if (month == MONTH && d == DAY) wattron(win, A_REVERSE);
+
+ int busy = 0;
+ while (event && before(&event->start, YEAR, month, d, 24, 0)) {
+ if (!before(&event->start, YEAR, month, d, 0, 0))
+ busy = 1;
+ event = event->next;
+ }
+
+ int today = month == MONTH && d == DAY;
+
+ int attr = (busy ? A_BOLD|A_UNDERLINE : A_DIM)
+ | (today ? A_REVERSE : 0 );
+
+ wattron(win, attr);
mvwprintw(win, y+2+row, x+col*3, "%2d", d+1);
- if (month == MONTH && d == DAY) wattroff(win, A_REVERSE);
+ wattroff(win, attr);
}
}
win = _win;
}
+/* Year size */
+void year_size(int rows, int cols)
+{
+}
+
/* Year draw */
void year_draw(void)
{
int y = 0;
int h[4] = {};
- /* Clear */
- werase(win);
-
/* Determine heights */
for (int m = 0; m < 12; m++) {
int weeks = weeks_in_month(YEAR, m);
/* Year run */
int year_run(int key, mmask_t btn, int row, int col)
{
+ day_t d = DAY;
+ month_t m = MONTH;
+ year_t y = YEAR;
wday_t day = day_of_week(YEAR, MONTH, DAY);
- int days = 0, months = 0, years = 0;
- switch (key)
- {
- case 'k': days = -7; break;
- case 'j': days = 7; break;
- case 'h': days = -1; break;
- case 'l': days = 1; break;
- case 'i': years = -1; break;
- case 'o': years = 1; break;
+ int week = (start_of_month(y, m) + d) / 7;
+ int dir = 0;
+
+ /* Step years */
+ if (key == 'i')
+ YEAR--;
+ if (key == 'o')
+ YEAR++;
+
+ /* Get direction */
+ if (key == 'h' || key == 'k')
+ dir = -1;
+ if (key == 'j' || key == 'l')
+ dir = 1;
+
+ /* Step up/down */
+ if (key == 'j' || key == 'k') {
+ for (int i = 0; i < 90/7; i++) {
+ add_days(&y, &m, &d, dir*7);
+ if (day_of_week(y, m, d) == day &&
+ y == YEAR && m%3 == MONTH%3) {
+ MONTH = m;
+ DAY = d;
+ break;
+ }
+ }
}
- if (day == SUN && days == -1) days = -22;
- if (day == SAT && days == 1) days = 22;
- if (days || months || years) {
- add_days(&YEAR, &MONTH, &DAY, days);
- add_months(&YEAR, &MONTH, months);
- YEAR += years;
- year_draw();
- wrefresh(win);
+
+ /* Step left/right */
+ if (key == 'h' || key == 'l') {
+ for (int i = 0; i < 90; i++) {
+ add_days(&y, &m, &d, dir);
+ if ((start_of_month(y, m) + d) / 7 == week &&
+ y == YEAR && m/3 == MONTH/3) {
+ MONTH = m;
+ DAY = d;
+ break;
+ }
+ }
}
+
+ /* Refresh */
+ werase(win);
+ year_draw();
+ wrefresh(win);
return 0;
}