pinosaur
/
taskasaur.git
/ blobdiff
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
calling render callbacks from render.c
[taskasaur.git]
/
menu.c
diff --git
a/menu.c
b/menu.c
index
abb2fdf
..
8b46187
100644
(file)
--- a/
menu.c
+++ b/
menu.c
@@
-33,6
+33,8
@@
typedef struct Menu {
int max_height;
int max_width;
void* userdata;
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);
} Menu;
int swap_item(Menu* menu, int src_index, int dest_index);
@@
-44,8
+46,8
@@
int menu_insert_mode(Menu* menu, int insert_index);
MenuItem* create_blank_menuitem(void);
/* rendering stuff */
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);
int items_visible(Menu* menu, int offset);
int items_visible_rev(Menu* menu, int offset);
@@
-89,6
+91,9
@@
create_menu(char* menu_name, MenuItem** item_list)
new_menu->selected_item = 0;
new_menu->scroll_offset = 0;
new_menu->focused = false;
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;
set_menu_win(new_menu, stdscr);
return new_menu;
@@
-115,6
+120,12
@@
get_selected_item(Menu* menu)
return menu->selected_item;
}
return menu->selected_item;
}
+bool
+get_menu_focused(Menu* menu)
+{
+ return menu->focused;
+}
+
int
get_menu_length(Menu* menu)
{
int
get_menu_length(Menu* menu)
{
@@
-161,7
+172,6
@@
set_menu_win(Menu* menu, WINDOW* win)
menu->menu_win = win;
getmaxyx(menu->menu_win, height, width);
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->max_height = height-MENU_PAD_TOP-MENU_PAD_BOTTOM;
menu->max_width = width-MENU_PAD_LEFT-MENU_PAD_RIGHT;
@@
-189,6
+199,20
@@
set_menu_userdata(Menu* menu, void* userdata)
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)
{
int
set_menuitem_descrip(MenuItem* menuitem, char* descrip)
{
@@
-267,7
+291,7
@@
menu_insert_mode(Menu* menu, int insert_index)
// account for multiline items
insert_pos = menu->scroll_offset;
for (int i = 0; i < insert_index; i++) {
// 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 */
}
/* move cursor to right spot */
@@
-386,20
+410,21
@@
render_menu(Menu* menu)
/* render menu items */
int curline = 0;
for (int i = menu->scroll_offset; i < menu->menu_length; i++) {
/* 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->menu_win);
wrefresh(menu->menu_win);
return 0;
}
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;
{
MenuItem* curitem;
int hlcolor;
+
curitem = menu->menu_items[item_index];
/* color selected item */
curitem = menu->menu_items[item_index];
/* color selected item */
@@
-407,29
+432,27
@@
render_item(Menu* menu, int item_index, int start_y)
wattron(menu->menu_win, hlcolor);
mvwprintw(menu->menu_win, start_y, 0, curitem->title);
wattroff(menu->menu_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) {
- wattron(menu->menu_win, COLOR_PAIR(TS_ITEMCOUNT));
- mvwprintw(menu->menu_win, start_y+1, 0, curitem->description);
- wattroff(menu->menu_win, COLOR_PAIR(TS_ITEMCOUNT));
- }
- 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
items_visible(Menu* menu, int offset)
@@
-443,7
+466,7
@@
items_visible(Menu* menu, int offset)
int lines = 0;
for (int i = offset ; i < menu->menu_length; i++) {
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;
if (lines > maxheight) break;
vis += 1;
@@
-464,7
+487,7
@@
items_visible_rev(Menu* menu, int offset)
int lines = 0;
for (int i = offset; i > 0; i--) {
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;
if (lines > maxheight) break;
vis +=1;