mirror of
https://github.com/ipxe/ipxe
synced 2026-02-11 13:49:51 +03:00
[dynui] Generalise the concept of a menu to a dynamic user interface
We currently have an abstract model of a dynamic menu as a list of
items, each of which has a name, a description, and assorted metadata
such as a shortcut key. The "menu" and "item" commands construct
representations in this abstract model, and the "choose" command then
presents the items as a single-choice menu, with the selected item's
name used as the output value.
This same abstraction may be used to model a dynamic form as a list of
editable items, each of which has a corresponding setting name, an
optional description label, and assorted metadata such as a shortcut
key. By defining a "form" command as an alias for the "menu" command,
we could construct and present forms using commands such as:
#!ipxe
form Login to ${url}
item username Username or email address
item --secret password Password
present
or
#!ipxe
form Configure IPv4 networking for ${netX/ifname}
item netX/ip IPv4 address
item netX/netmask Subnet mask
item netX/gateway Gateway address
item netX/dns DNS server address
present
Reusing the same abstract model for both menus and forms allows us to
minimise the increase in code size, since the implementation of the
"form" and "item" commands is essentially zero-cost.
Rename everything within the abstract data model from "menu" to
"dynamic user interface" to reflect this generalisation.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
50
src/include/ipxe/dynui.h
Normal file
50
src/include/ipxe/dynui.h
Normal file
@@ -0,0 +1,50 @@
|
||||
#ifndef _IPXE_DYNUI_H
|
||||
#define _IPXE_DYNUI_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Dynamic user interfaces
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/list.h>
|
||||
|
||||
/** A dynamic user interface */
|
||||
struct dynamic_ui {
|
||||
/** List of dynamic user interfaces */
|
||||
struct list_head list;
|
||||
/** Name */
|
||||
const char *name;
|
||||
/** Title */
|
||||
const char *title;
|
||||
/** Dynamic user interface items */
|
||||
struct list_head items;
|
||||
};
|
||||
|
||||
/** A dynamic user interface item */
|
||||
struct dynamic_item {
|
||||
/** List of dynamic user interface items */
|
||||
struct list_head list;
|
||||
/** Name */
|
||||
const char *name;
|
||||
/** Text */
|
||||
const char *text;
|
||||
/** Shortcut key */
|
||||
int shortcut;
|
||||
/** Is default item */
|
||||
int is_default;
|
||||
};
|
||||
|
||||
extern struct dynamic_ui * create_dynui ( const char *name, const char *title );
|
||||
extern struct dynamic_item * add_dynui_item ( struct dynamic_ui *dynui,
|
||||
const char *name,
|
||||
const char *text, int shortcut,
|
||||
int is_default );
|
||||
extern void destroy_dynui ( struct dynamic_ui *dynui );
|
||||
extern struct dynamic_ui * find_dynui ( const char *name );
|
||||
extern int show_menu ( struct dynamic_ui *dynui, unsigned long timeout,
|
||||
const char *select, struct dynamic_item **selected );
|
||||
|
||||
#endif /* _IPXE_DYNUI_H */
|
||||
@@ -364,7 +364,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
#define ERRFILE_cms ( ERRFILE_OTHER | 0x002a0000 )
|
||||
#define ERRFILE_imgtrust ( ERRFILE_OTHER | 0x002b0000 )
|
||||
#define ERRFILE_menu_ui ( ERRFILE_OTHER | 0x002c0000 )
|
||||
#define ERRFILE_menu_cmd ( ERRFILE_OTHER | 0x002d0000 )
|
||||
#define ERRFILE_dynui_cmd ( ERRFILE_OTHER | 0x002d0000 )
|
||||
#define ERRFILE_validator ( ERRFILE_OTHER | 0x002e0000 )
|
||||
#define ERRFILE_ocsp ( ERRFILE_OTHER | 0x002f0000 )
|
||||
#define ERRFILE_nslookup ( ERRFILE_OTHER | 0x00300000 )
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
#ifndef _IPXE_MENU_H
|
||||
#define _IPXE_MENU_H
|
||||
|
||||
/** @file
|
||||
*
|
||||
* Menu selection
|
||||
*
|
||||
*/
|
||||
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <ipxe/list.h>
|
||||
|
||||
/** A menu */
|
||||
struct menu {
|
||||
/** List of menus */
|
||||
struct list_head list;
|
||||
/** Name */
|
||||
const char *name;
|
||||
/** Title */
|
||||
const char *title;
|
||||
/** Menu items */
|
||||
struct list_head items;
|
||||
};
|
||||
|
||||
/** A menu item */
|
||||
struct menu_item {
|
||||
/** List of menu items */
|
||||
struct list_head list;
|
||||
/** Name */
|
||||
const char *name;
|
||||
/** Text */
|
||||
const char *text;
|
||||
/** Shortcut key */
|
||||
int shortcut;
|
||||
/** Is default item */
|
||||
int is_default;
|
||||
};
|
||||
|
||||
extern struct menu * create_menu ( const char *name, const char *title );
|
||||
extern struct menu_item * add_menu_item ( struct menu *menu, const char *name,
|
||||
const char *text, int shortcut,
|
||||
int is_default );
|
||||
extern void destroy_menu ( struct menu *menu );
|
||||
extern struct menu * find_menu ( const char *name );
|
||||
extern int show_menu ( struct menu *menu, unsigned long timeout,
|
||||
const char *select, struct menu_item **selected );
|
||||
|
||||
#endif /* _IPXE_MENU_H */
|
||||
@@ -16,7 +16,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
struct net_device;
|
||||
struct net_device_configurator;
|
||||
struct menu;
|
||||
struct dynamic_ui;
|
||||
struct parameters;
|
||||
|
||||
/** A command-line option descriptor */
|
||||
@@ -142,7 +142,7 @@ extern int parse_netdev ( char *text, struct net_device **netdev );
|
||||
extern int
|
||||
parse_netdev_configurator ( char *text,
|
||||
struct net_device_configurator **configurator );
|
||||
extern int parse_menu ( char *text, struct menu **menu );
|
||||
extern int parse_dynui ( char *text, struct dynamic_ui **dynui );
|
||||
extern int parse_flag ( char *text __unused, int *flag );
|
||||
extern int parse_key ( char *text, unsigned int *key );
|
||||
extern int parse_settings ( char *text, struct settings **settings );
|
||||
|
||||
Reference in New Issue
Block a user