menuconfig: Add "breadcrumbs" navigation aid
Displays a trail of the menu entries used to get to the current menu. Signed-off-by: Benjamin Poirier <bpoirier@suse.de> Tested-by: "Yann E. MORIN" <yann.morin.1998@free.fr> [yann.morin.1998@free.fr: small, trivial code re-ordering] Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
This commit is contained in:

committed by
Yann E. MORIN

parent
edb749f439
commit
9a69abf80e
@@ -311,6 +311,50 @@ static void set_config_filename(const char *config_filename)
|
||||
filename[sizeof(filename)-1] = '\0';
|
||||
}
|
||||
|
||||
struct subtitle_part {
|
||||
struct list_head entries;
|
||||
const char *text;
|
||||
};
|
||||
static LIST_HEAD(trail);
|
||||
|
||||
static struct subtitle_list *subtitles;
|
||||
static void set_subtitle(void)
|
||||
{
|
||||
struct subtitle_part *sp;
|
||||
struct subtitle_list *pos, *tmp;
|
||||
|
||||
for (pos = subtitles; pos != NULL; pos = tmp) {
|
||||
tmp = pos->next;
|
||||
free(pos);
|
||||
}
|
||||
|
||||
subtitles = NULL;
|
||||
list_for_each_entry(sp, &trail, entries) {
|
||||
if (sp->text) {
|
||||
if (pos) {
|
||||
pos->next = xcalloc(sizeof(*pos), 1);
|
||||
pos = pos->next;
|
||||
} else {
|
||||
subtitles = pos = xcalloc(sizeof(*pos), 1);
|
||||
}
|
||||
pos->text = sp->text;
|
||||
}
|
||||
}
|
||||
|
||||
set_dialog_subtitles(subtitles);
|
||||
}
|
||||
|
||||
static void reset_subtitle(void)
|
||||
{
|
||||
struct subtitle_list *pos, *tmp;
|
||||
|
||||
for (pos = subtitles; pos != NULL; pos = tmp) {
|
||||
tmp = pos->next;
|
||||
free(pos);
|
||||
}
|
||||
subtitles = NULL;
|
||||
set_dialog_subtitles(subtitles);
|
||||
}
|
||||
|
||||
struct search_data {
|
||||
struct list_head *head;
|
||||
@@ -353,6 +397,8 @@ static void search_conf(void)
|
||||
char *dialog_input;
|
||||
int dres, vscroll = 0, hscroll = 0;
|
||||
bool again;
|
||||
struct gstr sttext;
|
||||
struct subtitle_part stpart;
|
||||
|
||||
title = str_new();
|
||||
str_printf( &title, _("Enter %s (sub)string to search for "
|
||||
@@ -379,6 +425,11 @@ again:
|
||||
if (strncasecmp(dialog_input_result, CONFIG_, strlen(CONFIG_)) == 0)
|
||||
dialog_input += strlen(CONFIG_);
|
||||
|
||||
sttext = str_new();
|
||||
str_printf(&sttext, "Search (%s)", dialog_input_result);
|
||||
stpart.text = str_get(&sttext);
|
||||
list_add_tail(&stpart.entries, &trail);
|
||||
|
||||
sym_arr = sym_re_search(dialog_input);
|
||||
do {
|
||||
LIST_HEAD(head);
|
||||
@@ -392,6 +443,7 @@ again:
|
||||
struct jump_key *pos, *tmp;
|
||||
|
||||
res = get_relations_str(sym_arr, &head);
|
||||
set_subtitle();
|
||||
dres = show_textbox_ext(_("Search Results"), (char *)
|
||||
str_get(&res), 0, 0, keys, &vscroll,
|
||||
&hscroll, &update_text, (void *)
|
||||
@@ -408,6 +460,8 @@ again:
|
||||
} while (again);
|
||||
free(sym_arr);
|
||||
str_free(&title);
|
||||
list_del(trail.prev);
|
||||
str_free(&sttext);
|
||||
}
|
||||
|
||||
static void build_conf(struct menu *menu)
|
||||
@@ -592,16 +646,24 @@ static void conf(struct menu *menu, struct menu *active_menu)
|
||||
{
|
||||
struct menu *submenu;
|
||||
const char *prompt = menu_get_prompt(menu);
|
||||
struct subtitle_part stpart;
|
||||
struct symbol *sym;
|
||||
int res;
|
||||
int s_scroll = 0;
|
||||
|
||||
if (menu != &rootmenu)
|
||||
stpart.text = menu_get_prompt(menu);
|
||||
else
|
||||
stpart.text = NULL;
|
||||
list_add_tail(&stpart.entries, &trail);
|
||||
|
||||
while (1) {
|
||||
item_reset();
|
||||
current_menu = menu;
|
||||
build_conf(menu);
|
||||
if (!child_count)
|
||||
break;
|
||||
set_subtitle();
|
||||
dialog_clear();
|
||||
res = dialog_menu(prompt ? _(prompt) : _("Main Menu"),
|
||||
_(menu_instructions),
|
||||
@@ -643,13 +705,17 @@ static void conf(struct menu *menu, struct menu *active_menu)
|
||||
case 2:
|
||||
if (sym)
|
||||
show_help(submenu);
|
||||
else
|
||||
else {
|
||||
reset_subtitle();
|
||||
show_helptext(_("README"), _(mconf_readme));
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
reset_subtitle();
|
||||
conf_save();
|
||||
break;
|
||||
case 4:
|
||||
reset_subtitle();
|
||||
conf_load();
|
||||
break;
|
||||
case 5:
|
||||
@@ -682,6 +748,8 @@ static void conf(struct menu *menu, struct menu *active_menu)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
list_del(trail.prev);
|
||||
}
|
||||
|
||||
static int show_textbox_ext(const char *title, char *text, int r, int c, int
|
||||
@@ -884,6 +952,7 @@ static int handle_exit(void)
|
||||
int res;
|
||||
|
||||
save_and_exit = 1;
|
||||
reset_subtitle();
|
||||
dialog_clear();
|
||||
if (conf_get_changed())
|
||||
res = dialog_yesno(NULL,
|
||||
|
Reference in New Issue
Block a user