menu: Add support for user defined item choice function
Selecting menu items is currently done in menu_interactive_choice() by reading the user input strings from standard input. Extend menu_interactive_choice() to support user defined function for selecting menu items. This function and its argument can be specified when creating the menu. Signed-off-by: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Anatolij Gustschin <agust@denx.de>
This commit is contained in:
parent
009d75ccc1
commit
fc9d64ffcd
5 changed files with 41 additions and 15 deletions
|
@ -561,7 +561,8 @@ static char *menu_handle(struct menu_display *display)
|
|||
char *s;
|
||||
char temp[6][200];
|
||||
|
||||
m = menu_create(display->title, display->timeout, 1, ait_menu_print);
|
||||
m = menu_create(display->title, display->timeout, 1, ait_menu_print,
|
||||
NULL, NULL);
|
||||
|
||||
for (i = 0; display->menulist[i]; i++) {
|
||||
sprintf(key, "%d", i + 1);
|
||||
|
|
|
@ -1280,7 +1280,8 @@ static struct menu *pxe_menu_to_menu(struct pxe_menu *cfg)
|
|||
/*
|
||||
* Create a menu and add items for all the labels.
|
||||
*/
|
||||
m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print);
|
||||
m = menu_create(cfg->title, cfg->timeout, cfg->prompt, label_print,
|
||||
NULL, NULL);
|
||||
|
||||
if (!m)
|
||||
return NULL;
|
||||
|
|
|
@ -47,6 +47,8 @@ struct menu {
|
|||
char *title;
|
||||
int prompt;
|
||||
void (*item_data_print)(void *);
|
||||
char *(*item_choice)(void *);
|
||||
void *item_choice_data;
|
||||
struct list_head items;
|
||||
};
|
||||
|
||||
|
@ -204,18 +206,26 @@ static inline int menu_interactive_choice(struct menu *m, void **choice)
|
|||
|
||||
menu_display(m);
|
||||
|
||||
readret = readline_into_buffer("Enter choice: ", cbuf,
|
||||
m->timeout / 10);
|
||||
if (!m->item_choice) {
|
||||
readret = readline_into_buffer("Enter choice: ", cbuf,
|
||||
m->timeout / 10);
|
||||
|
||||
if (readret >= 0) {
|
||||
choice_item = menu_item_by_key(m, cbuf);
|
||||
|
||||
if (!choice_item) {
|
||||
printf("%s not found\n", cbuf);
|
||||
m->timeout = 0;
|
||||
if (readret >= 0) {
|
||||
choice_item = menu_item_by_key(m, cbuf);
|
||||
if (!choice_item)
|
||||
printf("%s not found\n", cbuf);
|
||||
} else {
|
||||
return menu_default_choice(m, choice);
|
||||
}
|
||||
} else
|
||||
return menu_default_choice(m, choice);
|
||||
} else {
|
||||
char *key = m->item_choice(m->item_choice_data);
|
||||
|
||||
if (key)
|
||||
choice_item = menu_item_by_key(m, key);
|
||||
}
|
||||
|
||||
if (!choice_item)
|
||||
m->timeout = 0;
|
||||
}
|
||||
|
||||
*choice = choice_item->data;
|
||||
|
@ -348,11 +358,19 @@ int menu_item_add(struct menu *m, char *item_key, void *item_data)
|
|||
* what must be entered to select an item, the item_data_print function should
|
||||
* make it obvious what the key for each entry is.
|
||||
*
|
||||
* item_choice - If not NULL, will be called when asking the user to choose an
|
||||
* item. Returns a key string corresponding to the choosen item or NULL if
|
||||
* no item has been selected.
|
||||
*
|
||||
* item_choice_data - Will be passed as the argument to the item_choice function
|
||||
*
|
||||
* Returns a pointer to the menu if successful, or NULL if there is
|
||||
* insufficient memory available to create the menu.
|
||||
*/
|
||||
struct menu *menu_create(char *title, int timeout, int prompt,
|
||||
void (*item_data_print)(void *))
|
||||
void (*item_data_print)(void *),
|
||||
char *(*item_choice)(void *),
|
||||
void *item_choice_data)
|
||||
{
|
||||
struct menu *m;
|
||||
|
||||
|
@ -365,6 +383,8 @@ struct menu *menu_create(char *title, int timeout, int prompt,
|
|||
m->prompt = prompt;
|
||||
m->timeout = timeout;
|
||||
m->item_data_print = item_data_print;
|
||||
m->item_choice = item_choice;
|
||||
m->item_choice_data = item_choice_data;
|
||||
|
||||
if (title) {
|
||||
m->title = strdup(title);
|
||||
|
|
|
@ -51,7 +51,9 @@ struct menu;
|
|||
* menu_create() - Creates a menu handle with default settings
|
||||
*/
|
||||
struct menu *menu_create(char *title, int timeout, int prompt,
|
||||
void (*item_data_print)(void *));
|
||||
void (*item_data_print)(void *),
|
||||
char *(*item_choice)(void *),
|
||||
void *item_choice_data);
|
||||
|
||||
/*
|
||||
* menu_item_add() - Adds or replaces a menu item
|
||||
|
|
|
@ -21,7 +21,9 @@
|
|||
struct menu;
|
||||
|
||||
struct menu *menu_create(char *title, int timeout, int prompt,
|
||||
void (*item_data_print)(void *));
|
||||
void (*item_data_print)(void *),
|
||||
char *(*item_choice)(void *),
|
||||
void *item_choice_data);
|
||||
int menu_default_set(struct menu *m, char *item_key);
|
||||
int menu_get_choice(struct menu *m, void **choice);
|
||||
int menu_item_add(struct menu *m, char *item_key, void *item_data);
|
||||
|
|
Loading…
Reference in a new issue