colors on select
[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 render_menu(Menu* menu)
75 {
76     int cur_line;
77
78     cur_line = 0;
79
80     for (int i = 0; i < menu->menu_length; i++) {
81
82         int wrapped_lines;
83         char* wrapped_text;
84         int text_color;
85         
86         /* wrap text by inserting newlines */
87         wrapped_text = wrap_text(menu->menu_items[i]->contents, menu->max_width, &wrapped_lines);        
88
89         /* color selected item */
90         text_color = (i == menu->selected_item) ? TS_SELECTED : TS_NONSELECTED;
91
92         wattron(menu->menu_win, COLOR_PAIR(text_color));
93         mvwprintw(menu->menu_win, cur_line, 0, wrapped_text);
94         wattroff(menu->menu_win, COLOR_PAIR(text_color));
95
96         cur_line += wrapped_lines;
97
98         free(wrapped_text);
99
100     }
101
102     return 0;
103 }
104
105 int
106 free_menu(Menu* menu)
107 {
108     return 0;
109 }
110