int scroll_offset;
bool focused;
WINDOW* menu_win;
- WINDOW* sub_win;
int max_height;
int max_width;
void* userdata;
+ void (*render_item)(Menu*, int, int);
+ int (*item_height)(MenuItem*);
} Menu;
int swap_item(Menu* menu, int src_index, int dest_index);
MenuItem* create_blank_menuitem(void);
/* rendering stuff */
-int render_item(Menu* menu, int item_index, int start_y);
-int item_height(MenuItem* menuitem);
+void default_render_item(Menu* menu, int item_index, int start_y);
+int default_item_height(MenuItem* menuitem);
int items_visible(Menu* menu, int offset);
int items_visible_rev(Menu* menu, int offset);
new_menu->selected_item = 0;
new_menu->scroll_offset = 0;
new_menu->focused = false;
+ new_menu->userdata = NULL;
+ new_menu->render_item = *default_render_item;
+ new_menu->item_height = *default_item_height;
set_menu_win(new_menu, stdscr);
return new_menu;
return menu->menu_win;
}
-WINDOW*
-get_menu_subwin(Menu* menu)
-{
- return menu->sub_win;
-}
-
MenuItem*
get_menu_item(Menu* menu, int index)
{
return menu->selected_item;
}
+bool
+get_menu_focused(Menu* menu)
+{
+ return menu->focused;
+}
+
int
get_menu_length(Menu* menu)
{
menu->menu_win = win;
getmaxyx(menu->menu_win, height, width);
- /* create a subwin (also prob free old subwin?) */
menu->max_height = height-MENU_PAD_TOP-MENU_PAD_BOTTOM;
menu->max_width = width-MENU_PAD_LEFT-MENU_PAD_RIGHT;
- menu->sub_win = derwin(
- menu->menu_win,
- menu->max_height,
- menu->max_width,
- MENU_PAD_TOP,
- MENU_PAD_LEFT
- );
return 0;
}
return 0;
}
+int
+set_menu_renderitem(Menu* menu, void (*render_item)(Menu*, int, int))
+{
+ menu->render_item = render_item;
+ return 0;
+}
+
+int
+set_menu_itemheight(Menu* menu, int (*item_height)(MenuItem*))
+{
+ menu->item_height = item_height;
+ return 0;
+}
+
int
set_menuitem_descrip(MenuItem* menuitem, char* descrip)
{
// account for multiline items
insert_pos = menu->scroll_offset;
for (int i = 0; i < insert_index; i++) {
- insert_pos += item_height(menu->menu_items[i]);
+ insert_pos += menu->item_height(menu->menu_items[i]);
}
/* move cursor to right spot */
ungetstr(menu->menu_items[insert_index]->title);
- mvwgetnstr(menu->sub_win,
+ mvwgetnstr(menu->menu_win,
insert_pos,
0,
temp,
int
render_menu(Menu* menu)
{
- /* draw outer menu (prob dont need this every render) */
- /* wclear(menu->menu_win); */
- int titlecolor;
- titlecolor = COLOR_PAIR((menu->focused == true) ? TS_MENU_SELECTED: TS_MENU_NONSELECTED);
- wattron(menu->menu_win, titlecolor);
- mvwprintw(menu->menu_win, 0, MENU_PAD_LEFT, menu->menu_name);
- wattroff(menu->menu_win, titlecolor);
-
- /* draw inner menu */
- wclear(menu->sub_win);
+ wclear(menu->menu_win);
/* calculate scroll */
int visible;
);
}
- /* char abuf[20]; */
- /* int y; */
- /* int x; */
- /* getmaxyx(menu->sub_win, y, x); */
- /* sprintf(abuf, "%d,%d,%d max:%d,%d", menu->selected_item, visible, menu->scroll_offset,y,x); */
- /* mvprintw(19, 27, abuf); */
-
+ /* render menu items */
int curline = 0;
for (int i = menu->scroll_offset; i < menu->menu_length; i++) {
- curline += render_item(menu, i, curline);
+ menu->render_item(menu, i, curline);
+ curline += menu->item_height(menu->menu_items[i]);
}
- wrefresh(menu->sub_win);
wrefresh(menu->menu_win);
return 0;
}
-int
-render_item(Menu* menu, int item_index, int start_y)
+void
+default_render_item(Menu* menu, int item_index, int start_y)
{
MenuItem* curitem;
int hlcolor;
+
curitem = menu->menu_items[item_index];
/* color selected item */
hlcolor = COLOR_PAIR((item_index == menu->selected_item && menu->focused == true) ? TS_SELECTED : TS_NONSELECTED);
- wattron(menu->sub_win, hlcolor);
- mvwprintw(menu->sub_win, start_y, 0, curitem->title);
- wattroff(menu->sub_win, hlcolor);
+ wattron(menu->menu_win, hlcolor);
+ mvwprintw(menu->menu_win, start_y, 0, curitem->title);
+ wattroff(menu->menu_win, hlcolor);
+}
- /* display number of items */
- if (strlen(curitem->description) > 0) {
- mvwprintw(menu->sub_win, start_y+1, 0, curitem->description);
- }
- return item_height(curitem);
+int
+default_item_height(MenuItem* menuitem)
+{
+ return 1; // maybe account for line wrap by default
}
-int
-item_height(MenuItem* menuitem)
-{
- int lines;
+/* int */
+/* item_height(MenuItem* menuitem) */
+/* { */
+/* int lines; */
- lines = 1;
- if (strlen(menuitem->description) > 0) {
- lines += 1;
- }
+/* lines = 1; */
+/* if (strlen(menuitem->description) > 0) { */
+/* lines += 1; */
+/* } */
- return lines;
-}
+/* return lines; */
+/* } */
int
items_visible(Menu* menu, int offset)
int maxheight;
int maxwidth; // unused
- getmaxyx(menu->sub_win, maxheight, maxwidth);
+ getmaxyx(menu->menu_win, maxheight, maxwidth);
int vis = 0;
int lines = 0;
for (int i = offset ; i < menu->menu_length; i++) {
- lines += item_height(menu->menu_items[i]);
+ lines += menu->item_height(menu->menu_items[i]);
if (lines > maxheight) break;
vis += 1;
int maxheight;
int maxwidth; // unused
- getmaxyx(menu->sub_win, maxheight, maxwidth);
+ getmaxyx(menu->menu_win, maxheight, maxwidth);
int vis = 0;
int lines = 0;
for (int i = offset; i > 0; i--) {
- lines += item_height(menu->menu_items[i]);
+ lines += menu->item_height(menu->menu_items[i]);
if (lines > maxheight) break;
vis +=1;