]> Pileus Git - lackey/blob - src/view/year.c
Add year view
[lackey] / src / view / year.c
1 #include <string.h>
2 #include <ncurses.h>
3
4 #include "util.h"
5
6 /* Macros */
7 #define MAX(a,b) ((a) > (b) ? (a) : (b))
8 #define MW (2*7+6)
9
10 /* Static data */
11 static WINDOW *win;
12
13 /* Test data */
14 const static int YEAR  = 2012;
15 const static int MONTH = SEP;
16 const static int DAY   = 29;
17
18 /* Helper functions */
19 static void print_month(month_t month, int y, int x)
20 {
21         const char *name  = month_to_string(month);
22         const int   start = start_of_month(YEAR, month);
23         const char  days  = days_in_month(YEAR, month);
24         mvwprintw(win, y, x+MW/2-strlen(name)/2, "%s", name);
25         wmove(win, y+1, x);
26         for (int d = 0; d < 7; d++)
27                 wprintw(win, "%-3s", day_to_st(d));
28         for (int d = 0; d < days; d++) {
29                 int row = (start + d) / 7;
30                 int col = (start + d) % 7;
31                 mvwprintw(win, y+2+row, x+col*3, "%d", d+1);
32         }
33 }
34
35 /* Year init */
36 void year_init(WINDOW *_win)
37 {
38         win = _win;
39 }
40
41 /* Year draw */
42 void year_draw(void)
43 {
44         int w = MW*3 + 2*3;
45         int x = COLS/2 - w/2;
46         int y = 0;
47         int h[4] = {};
48
49         /* Determine heights */
50         for (int m = 0; m < 12; m++) {
51                 int weeks = weeks_in_month(YEAR, m);
52                 h[m/3] = MAX(h[m/3], weeks+2);
53         }
54         int sum = h[0]+h[1]+h[2]+h[3];
55
56         /* Print Header */
57         mvwprintw(win, y++, COLS/2-2, "%d", YEAR);
58
59         /* Print Months */
60         for (int m = 0; m < 12; m++) {
61                 print_month(m, y, x);
62                 if (m % 3 == 2) {
63                         x  = COLS/2 - w/2;
64                         y += h[m/3]+1;
65                 } else {
66                         x += 3+MW;
67                 }
68         }
69
70         /* Print Lines */
71         y = 1;
72         mvwvline(win, y, x+(MW+3)*1-2, ACS_VLINE, sum+3);
73         mvwvline(win, y, x+(MW+3)*2-2, ACS_VLINE, sum+3);
74         for (int i = 0; i < 3; i++) {
75                 y += h[i];
76                 mvwhline(win, y, x,        ACS_HLINE, w);
77                 mvwaddch(win, y, x+(MW+3)*1-2, ACS_PLUS);
78                 mvwaddch(win, y, x+(MW+3)*2-2, ACS_PLUS);
79                 y++;
80         }
81 }
82
83 /* Year run */
84 int year_run(int key, mmask_t btn, int row, int col)
85 {
86         return 0;
87 }