]> Pileus Git - lackey/blob - src/screen.c
Add year view
[lackey] / src / screen.c
1 #include <string.h>
2 #include <ncurses.h>
3 #include "main.h"
4 #include "screen.h"
5
6 /* Types */
7 typedef struct {
8         char   *name;
9         void  (*init)(WINDOW*);
10         void  (*draw)(void);
11         int   (*run)(int,mmask_t,int,int);
12         int     keys[8];
13         WINDOW *win;
14 } view_t;
15
16 /* Data */
17 view_t views[] = {
18         { "Day",      day_init,      day_draw,      day_run,      {KEY_F(1), '1', 'd',    } },
19         { "Week",     week_init,     week_draw,     week_run,     {KEY_F(2), '2', 'w',    } },
20         { "Month",    month_init,    month_draw,    month_run,    {KEY_F(3), '3', 'm',    } },
21         { "Year",     year_init,     year_draw,     year_run,     {KEY_F(4), '4', 'y',    } },
22         { "|",        NULL,          NULL,          NULL,         {                       } },
23         { "Todo",     todo_init,     todo_draw,     todo_run,     {KEY_F(5), '5', 't',    } },
24         { "Notes",    notes_init,    notes_draw,    notes_run,    {KEY_F(6), '6', 'n',    } },
25         { "|",        NULL,          NULL,          NULL,         {                       } },
26         { "Settings", settings_init, settings_draw, settings_run, {KEY_F(7), '7', 's',    } },
27         { "Help",     help_init,     help_draw,     help_run,     {KEY_F(8), '8', 'h', '?'} },
28 };
29
30 int active = 3;
31
32 /* Local functions */
33 void draw_header(void)
34 {
35         move(0, 0);
36         attron(COLOR_PAIR(COLOR_TITLE));
37         for (int i = 0; i < N_ELEMENTS(views); i++) {
38                 if (i == active)
39                         attron(A_BOLD);
40                 printw("%s ", views[i].name);
41                 if (i == active)
42                         attroff(A_BOLD);
43         }
44         attroff(COLOR_PAIR(COLOR_TITLE));
45         mvhline(1, 0, ACS_HLINE, COLS);
46         refresh();
47 }
48
49 /* Screen init */
50 void screen_init(void)
51 {
52         for (int i = 0; i < N_ELEMENTS(views); i++) {
53                 if (views[i].init) {
54                         views[i].win = newwin(LINES-2, COLS, 2, 0);
55                         views[i].init(views[i].win);
56                 }
57         }
58 }
59
60 /* Screen draw */
61 void screen_resize(void)
62 {
63         for (int i = 0; i < N_ELEMENTS(views); i++)
64                 if (views[i].init)
65                         wresize(views[i].win, LINES-2, COLS);
66 }
67
68 /* Screen draw */
69 void screen_draw(void)
70 {
71         draw_header();
72         werase(views[active].win);
73         views[active].draw();
74         wrefresh(views[active].win);
75 }
76
77 /* Screen set */
78 int screen_set(int num)
79 {
80         if (active != num) {
81                 active = num;
82                 screen_draw();
83         }
84         return 1;
85 }
86
87 /* Screen run */
88 int screen_run(int key, mmask_t btn, int row, int col)
89 {
90         /* Check for mouse events */
91         if (key == KEY_MOUSE && row == 0) {
92                 int start = 1;
93                 for (int i = 0; i < N_ELEMENTS(views); i++) {
94                         int end = start + strlen(views[i].name) - 1;
95                         if (start <= col && col <= end)
96                                 return screen_set(i);
97                         start = end + 2;
98                 }
99         }
100
101         /* Check for view change */
102         for (int i = 0; i < N_ELEMENTS(views); i++) {
103                 if (i == active)
104                         continue;
105                 for (int j = 0; j < N_ELEMENTS(views[i].keys); j++)
106                         if (views[i].keys[j] == key)
107                                 return screen_set(i);
108         }
109
110         /* Shift windows */
111         int num   = active;
112         int shift = key == KEY_RIGHT ? +1 :
113                     key == KEY_LEFT  ? -1 : 0;
114         while (shift) {
115                 num += shift;
116                 num += N_ELEMENTS(views);
117                 num %= N_ELEMENTS(views);
118                 if (views[num].run)
119                         return screen_set(num);
120         }
121
122         /* Pass key to active view */
123         return views[active].run(key, btn, row, col);
124 }