]> Pileus Git - lackey/blob - src/screen.c
Add basic screen layout stuff
[lackey] / src / screen.c
1 #include <ncurses.h>
2 #include "main.h"
3 #include "screen.h"
4
5 /* Types */
6 typedef struct {
7         char  *name;
8         void (*init)(void);
9         void (*draw)(void);
10         int  (*run)(int);
11         int    keys[8];
12 } view_t;
13
14 /* Data */
15 view_t views[] = {
16         { "Day",      day_init,      day_draw,      day_run,      {KEY_F(1), '1', 'd',    } },
17         { "Week",     week_init,     week_draw,     week_run,     {KEY_F(2), '2', 'w',    } },
18         { "Month",    month_init,    month_draw,    month_run,    {KEY_F(3), '3', 'm',    } },
19         { "Year",     year_init,     year_draw,     year_run,     {KEY_F(4), '4', 'y',    } },
20         { "|",        NULL,          NULL,          NULL,         {                       } },
21         { "Todo",     todo_init,     todo_draw,     todo_run,     {KEY_F(5), '5', 't',    } },
22         { "Notes",    notes_init,    notes_draw,    notes_run,    {KEY_F(6), '6', 'n',    } },
23         { "|",        NULL,          NULL,          NULL,         {                       } },
24         { "Settings", settings_init, settings_draw, settings_run, {KEY_F(7), '7', 's',    } },
25         { "Help",     help_init,     help_draw,     help_run,     {KEY_F(8), '8', 'h', '?'} },
26 };
27
28 view_t *active = &views[0];
29
30 /* Local functions */
31 void draw_header(void)
32 {
33         move(0, 0);
34         attron(COLOR_PAIR(1));
35         for (int i = 0; i < N_ELEMENTS(views); i++) {
36                 if (active == &views[i])
37                         attron(A_BOLD);
38                 printw(" %s", views[i].name);
39                 if (active == &views[i])
40                         attroff(A_BOLD);
41         }
42         attroff(COLOR_PAIR(1));
43         mvhline(1, 0, ACS_HLINE, win_cols);
44 }
45
46 /* Screen init */
47 void screen_init(void)
48 {
49         init_pair(1, COLOR_GREEN, COLOR_BLACK);
50 }
51
52 /* Scren draw */
53 void screen_draw(void)
54 {
55         draw_header();
56         active->draw();
57 }
58
59 /* Screen run */
60 int screen_run(int chr)
61 {
62         /* Check for view change */
63         for (int i = 0; i < N_ELEMENTS(views); i++) {
64                 view_t *view = &views[i];
65                 if (view == active)
66                         continue;
67                 for (int j = 0; j < N_ELEMENTS(view->keys); j++)
68                         if (view->keys[j] == chr) {
69                                 active = view;
70                                 screen_draw();
71                         }
72         }
73
74         /* Pass key to active view */
75         return active->run(chr);
76 }