-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmenu.c
61 lines (58 loc) · 2 KB
/
menu.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <ncurses.h>
#include <string.h>
static size_t longest_menu_item_lenght(char **menu_items, int items_n)
{
size_t max_len = 0;
for (int i = 0; i < items_n; i++)
{
if (strlen(menu_items[i]) > max_len)
max_len = strlen(menu_items[i]);
}
return max_len;
}
static void print_menu_items(WINDOW *menu_win, char **menu_items, int items_n, int selection, int border_size)
{
for (int i = 0; i < items_n; i++)
{
if (i == selection)
{
wattron(menu_win, A_REVERSE);
mvwprintw(menu_win, i + border_size / 2, border_size, menu_items[i]);
wattroff(menu_win, A_REVERSE);
}
else
{
mvwprintw(menu_win, i + border_size / 2, border_size, menu_items[i]);
}
}
}
int show_menu(char **menu_items, int items_n, int border_size)
{
int selection = 0; // = Kivalasztott elem
int screen_size_y, screen_size_x, c; // = Terminal magassag, szelesseg, a 'c' valtozo a billentyu bemenet tarolasahoz kell
getmaxyx(stdscr, screen_size_y, screen_size_x);
WINDOW *menu_win = newwin(items_n + border_size, longest_menu_item_lenght(menu_items, items_n) + border_size * 2, (screen_size_y - (items_n + border_size)) / 2, (screen_size_x - (longest_menu_item_lenght(menu_items, items_n) + border_size * 2)) / 2);
keypad(menu_win, TRUE);
box(menu_win, ACS_VLINE, ACS_HLINE);
print_menu_items(menu_win, menu_items, items_n, selection, border_size);
wrefresh(menu_win);
while ((c = wgetch(menu_win)) != 10)
{
switch (c)
{
case KEY_UP:
selection == 0 ? selection = items_n - 1 : selection--;
break;
case KEY_DOWN:
selection == items_n - 1 ? selection = 0 : selection++;
break;
default:
break;
}
print_menu_items(menu_win, menu_items, items_n, selection, border_size);
wrefresh(menu_win);
}
wclear(menu_win);
delwin(menu_win);
return selection;
}