1 #ifndef NM_MENU_H_
2 #define NM_MENU_H_
3 
4 #include <nm_string.h>
5 #include <nm_vector.h>
6 #include <nm_ncurses.h>
7 
8 typedef struct {
9     nm_vect_t *v;
10     size_t item_first;
11     size_t item_last;
12     uint32_t highlight;
13 } nm_menu_data_t;
14 
15 #define NM_INIT_MENU_DATA (nm_menu_data_t) { NULL, 0, 0, 0 }
16 
17 typedef struct {
18     const nm_str_t *name;
19     uint32_t status:1;
20 } nm_menu_item_t;
21 
22 #define NM_INIT_MENU_ITEM (nm_menu_item_t) { NULL, 0 }
23 
24 void nm_print_base_menu(nm_menu_data_t *ifs);
25 void nm_print_vm_menu(nm_menu_data_t *vm);
26 void nm_print_veth_menu(nm_menu_data_t *veth, int get_status);
27 void nm_menu_scroll(nm_menu_data_t *menu, size_t list_len, int ch);
28 void nm_print_dropdown_menu(nm_menu_data_t *values, nm_window_t *w);
29 
nm_vect_item(const nm_vect_t * v,const size_t index)30 static inline nm_menu_item_t *nm_vect_item(const nm_vect_t *v, const size_t index)
31 {
32     return (nm_menu_item_t *)nm_vect_at(v, index);
33 }
nm_vect_item_name(const nm_vect_t * v,const size_t index)34 static inline nm_str_t *nm_vect_item_name(const nm_vect_t *v, const size_t index)
35 {
36     return (nm_str_t*)nm_vect_item(v, index)->name;
37 }
nm_vect_item_name_ctx(const nm_vect_t * v,const size_t index)38 static inline char *nm_vect_item_name_ctx(const nm_vect_t *v, const size_t index)
39 {
40     return nm_vect_item_name(v, index)->data;
41 }
nm_vect_item_name_cur(const nm_menu_data_t * p)42 static inline nm_str_t *nm_vect_item_name_cur(const nm_menu_data_t *p)
43 {
44     return nm_vect_item_name(p->v, (p->item_first + p->highlight) - 1);
45 }
nm_vect_item_status(const nm_vect_t * v,const size_t index)46 static inline int nm_vect_item_status(const nm_vect_t *v, const size_t index)
47 {
48     return nm_vect_item(v, index)->status;
49 }
nm_vect_item_status_cur(const nm_menu_data_t * p)50 static inline int nm_vect_item_status_cur(const nm_menu_data_t *p)
51 {
52     return nm_vect_item_status(p->v, (p->item_first + p->highlight) - 1);
53 }
nm_vect_set_item_status(nm_vect_t * v,const size_t index,const int s)54 static inline void nm_vect_set_item_status(nm_vect_t *v, const size_t index, const int s)
55 {
56     nm_vect_item(v, index)->status = s;
57 }
58 
59 #endif /* NM_MENU_H_ */
60 /* vim:set ts=4 sw=4: */
61