]> Pileus Git - lackey/commitdiff
Add popup views
authorAndy Spencer <andy753421@gmail.com>
Sun, 16 Jun 2013 04:38:19 +0000 (04:38 +0000)
committerAndy Spencer <andy753421@gmail.com>
Sun, 16 Jun 2013 04:38:59 +0000 (04:38 +0000)
src/view.c
src/view.h

index 86180f88c06b0ff336f98e9d257de951fd85d024..dfc087120f8b55d40d5b6d84488c6c02ee1cd1f0 100644 (file)
@@ -62,21 +62,23 @@ static const char *names[] = {
 };
 
 view_t views[] = {
-       { "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,         {                  } },
-       { "Events",   events_init,   events_size,   events_draw,   events_run,   {KEY_F(5), '5',    } },
-       { "Todo",     todo_init,     todo_size,     todo_draw,     todo_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', '?'} },
+       { "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,         {             } },
+       { "Events",   events_init,   events_size,   events_draw,   events_run,   {KEY_F(5), '5'} },
+       { "Todo",     todo_init,     todo_size,     todo_draw,     todo_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'} },
+       { NULL,       NULL,          NULL,          NULL,          NULL,         {             } },
 };
 
 /* Config data */
 int COMPACT = 0;
 int ACTIVE  = 0;
+int POPUP   = -1;
 
 /* Local functions */
 static void draw_header(void)
@@ -84,12 +86,21 @@ static void draw_header(void)
        move(0, 0);
        attron(COLOR_PAIR(COLOR_TITLE));
        for (int i = 0; i < N_ELEMENTS(views); i++) {
+               if (!views[i].name)
+                       break;
                if (i == ACTIVE)
                        attron(A_BOLD);
                printw("%s ", views[i].name);
                if (i == ACTIVE)
                        attroff(A_BOLD);
        }
+       clrtoeol();
+       if (POPUP >= 0) {
+               attron(A_BOLD);
+               move(0, COLS-strlen(views[POPUP].name)-2);
+               printw("[%s]", views[POPUP].name);
+               attroff(A_BOLD);
+       }
        attroff(COLOR_PAIR(COLOR_TITLE));
        if (!COMPACT)
                mvhline(1, 0, ACS_HLINE, COLS);
@@ -104,14 +115,18 @@ static int get_color(const char *cat)
               match(cat, "work")  ? COLOR_WORK  : COLOR_OTHER ;
 }
 
-static int view_set(int num)
+static int view_set(int active, int popup)
 {
-       if (ACTIVE != num) {
-               ACTIVE = num;
+       if (ACTIVE != active) {
+               ACTIVE = active;
                set_enum("view", 0, "active", ACTIVE,
                                names, N_ELEMENTS(names));
                view_draw();
        }
+       if (POPUP != popup) {
+               POPUP = popup;
+               view_draw();
+       }
        return 1;
 }
 
@@ -274,10 +289,11 @@ void view_resize(void)
 /* View draw */
 void view_draw(void)
 {
+       int view = POPUP >= 0 ? POPUP : ACTIVE;
        draw_header();
-       werase(views[ACTIVE].win);
-       views[ACTIVE].draw();
-       wrefresh(views[ACTIVE].win);
+       werase(views[view].win);
+       views[view].draw();
+       wrefresh(views[view].win);
 }
 
 /* View run */
@@ -298,7 +314,7 @@ int view_run(int key, mmask_t btn, int row, int col)
                for (int i = 0; i < N_ELEMENTS(views); i++) {
                        int end = start + strlen(views[i].name) - 1;
                        if (start <= col && col <= end && views[i].draw)
-                               return view_set(i);
+                               return view_set(i, -1);
                        start = end + 2;
                }
        }
@@ -309,7 +325,7 @@ int view_run(int key, mmask_t btn, int row, int col)
                        continue;
                for (int j = 0; j < N_ELEMENTS(views[i].keys); j++)
                        if (views[i].keys[j] == key)
-                               return view_set(i);
+                               return view_set(i, -1);
        }
 
        /* Shift windows */
@@ -321,9 +337,18 @@ int view_run(int key, mmask_t btn, int row, int col)
                num += N_ELEMENTS(views);
                num %= N_ELEMENTS(views);
                if (views[num].run)
-                       return view_set(num);
+                       return view_set(num, -1);
+       }
+
+       /* Handle popup views */
+       switch (key) {
+               case '\033': // escape
+                       return view_set(ACTIVE, -1);
+               case '?':    // help
+                       return view_set(ACTIVE, 9);
        }
 
        /* Pass key to active view */
-       return views[ACTIVE].run(key, btn, row, col);
+       int view = POPUP >= 0 ? POPUP : ACTIVE;
+       return views[view].run(key, btn, row, col);
 }
index 352359f8a98d542367403c72935499225fd51f93..25e9aaafb84d30ad9ca6e41ecc36330285339439 100644 (file)
@@ -31,6 +31,7 @@
 /* Config data */
 extern int COMPACT;
 extern int ACTIVE;
+extern int POPUP;
 
 /* Curses functions */
 void wmvresize(WINDOW *win, int top, int left, int rows, int cols);