vim movement
[taskasaur.git] / menu.c
1
2 #include <stdlib.h>
3 #include <stddef.h>
4 #include <ncurses.h>
5
6 #include "headers/menu.h"
7 #include "headers/render.h"
8 #include "headers/utils.h"
9
10 typedef struct MenuItem {
11     char* contents;
12 } MenuItem;
13
14 typedef struct Menu {
15     MenuItem** menu_items;
16     int menu_length;
17     int selected_item;
18     WINDOW* menu_win;
19     int max_height;
20     int max_width;
21 } Menu;
22
23 int render_menu(Menu* menu);
24
25 MenuItem*
26 create_menuitem(char* contents)
27 {
28     MenuItem* new_menuitem;
29
30     new_menuitem = malloc(sizeof(MenuItem));
31     new_menuitem->contents = contents;
32
33     return new_menuitem;
34 }
35
36 Menu* 
37 create_menu(MenuItem** item_list)
38 {
39     Menu* new_menu;
40
41     new_menu = malloc(sizeof(Menu));
42     set_menu_items(new_menu, item_list);
43     new_menu->selected_item = 0;
44     set_menu_win(new_menu, stdscr);
45
46     return new_menu;
47 }
48
49 int
50 set_menu_items(Menu* menu, MenuItem** item_list)
51 {
52     menu->menu_items = item_list;
53     menu->menu_length = array_length(MenuItem*, item_list);
54
55     return 0;
56 }
57
58 int
59 set_menu_win(Menu* menu, WINDOW* win)
60 {
61     menu->menu_win = win;
62     getmaxyx(menu->menu_win, menu->max_height, menu->max_width);
63
64     return 0;
65 }
66
67 MenuItem*
68 get_menu_items(Menu* menu)
69 {
70     return NULL;
71 }
72
73 int
74 menu_driver(Menu* menu, MenuAction action)
75 {
76
77     switch (action) {
78         case MENU_UP:
79             menu->selected_item = menu->selected_item-1 >= 0 ? menu->selected_item-1 : 0;
80             break;
81         case MENU_DOWN:
82             menu->selected_item = menu->selected_item+1 <= menu->menu_length-1 ? menu->selected_item+1 : menu->menu_length-1;
83             break;
84         case MENU_TOP:
85             menu->selected_item = 0;
86             break;
87         case MENU_BOTTOM:
88             menu->selected_item = menu->menu_length-1;
89             break;
90         default:
91             fprintf(stderr, "Invalid menu action");
92     }
93
94     return 0;
95 }
96
97 int
98 render_menu(Menu* menu)
99 {
100     int cur_line;
101
102     cur_line = 0;
103
104     for (int i = 0; i < menu->menu_length; i++) {
105
106         int wrapped_lines;
107         char* wrapped_text;
108         int text_color;
109         
110         /* wrap text by inserting newlines */
111         wrapped_text = wrap_text(menu->menu_items[i]->contents, menu->max_width, &wrapped_lines);        
112
113         /* color selected item */
114         text_color = (i == menu->selected_item) ? TS_SELECTED : TS_NONSELECTED;
115
116         wattron(menu->menu_win, COLOR_PAIR(text_color));
117         mvwprintw(menu->menu_win, cur_line, 0, wrapped_text);
118         wattroff(menu->menu_win, COLOR_PAIR(text_color));
119
120         cur_line += wrapped_lines;
121
122         free(wrapped_text);
123
124     }
125
126     return 0;
127 }
128
129 int
130 free_menu(Menu* menu)
131 {
132     return 0;
133 }
134