menuconfig: Add Save/Load buttons

If menuconfig have Save/Load button like alternative
.config editors, xconfig, nconfig, etc.We will have
a obvious benefit when use menuconfig just like
when we use others, we can Save/Load our .config quickly
and conveniently.

This patch add the Save/Load button for menuconfig.

[remove trailing space while at it for below line:
"*)  Formerly when I used Page Down and Page Up, the cursor would be set"
]

Changes:
V1-V2:
1:use PATH_MAX instead of hard code suggested by Yann E. MORIN
2:drop the spurious empty-line removal suggested by Yann E. MORIN
V2-V3:
1:ajust buttons position well centered reported by Yann E. MORIN

Signed-off-by: Wang YanQing <udknight@gmail.com>
Reviewed-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Tested-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
This commit is contained in:
Wang YanQing 2012-12-19 09:50:58 +08:00 committed by Yann E. MORIN
parent 87727d453b
commit 6364fd0cb1
2 changed files with 37 additions and 15 deletions

View File

@ -26,7 +26,7 @@
* *
* *) A bugfix for the Page-Down problem * *) A bugfix for the Page-Down problem
* *
* *) Formerly when I used Page Down and Page Up, the cursor would be set * *) Formerly when I used Page Down and Page Up, the cursor would be set
* to the first position in the menu box. Now lxdialog is a bit * to the first position in the menu box. Now lxdialog is a bit
* smarter and works more like other menu systems (just have a look at * smarter and works more like other menu systems (just have a look at
* it). * it).
@ -154,12 +154,14 @@ static void print_arrows(WINDOW * win, int item_no, int scroll, int y, int x,
*/ */
static void print_buttons(WINDOW * win, int height, int width, int selected) static void print_buttons(WINDOW * win, int height, int width, int selected)
{ {
int x = width / 2 - 16; int x = width / 2 - 28;
int y = height - 2; int y = height - 2;
print_button(win, gettext("Select"), y, x, selected == 0); print_button(win, gettext("Select"), y, x, selected == 0);
print_button(win, gettext(" Exit "), y, x + 12, selected == 1); print_button(win, gettext(" Exit "), y, x + 12, selected == 1);
print_button(win, gettext(" Help "), y, x + 24, selected == 2); print_button(win, gettext(" Help "), y, x + 24, selected == 2);
print_button(win, gettext(" Save "), y, x + 36, selected == 3);
print_button(win, gettext(" Load "), y, x + 48, selected == 4);
wmove(win, y, x + 1 + 12 * selected); wmove(win, y, x + 1 + 12 * selected);
wrefresh(win); wrefresh(win);
@ -372,7 +374,7 @@ do_resize:
case TAB: case TAB:
case KEY_RIGHT: case KEY_RIGHT:
button = ((key == KEY_LEFT ? --button : ++button) < 0) button = ((key == KEY_LEFT ? --button : ++button) < 0)
? 2 : (button > 2 ? 0 : button); ? 4 : (button > 4 ? 0 : button);
print_buttons(dialog, height, width, button); print_buttons(dialog, height, width, button);
wrefresh(menu); wrefresh(menu);
@ -399,17 +401,17 @@ do_resize:
return 2; return 2;
case 's': case 's':
case 'y': case 'y':
return 3;
case 'n':
return 4;
case 'm':
return 5; return 5;
case ' ': case 'n':
return 6; return 6;
case '/': case 'm':
return 7; return 7;
case 'z': case ' ':
return 8; return 8;
case '/':
return 9;
case 'z':
return 10;
case '\n': case '\n':
return button; return button;
} }

View File

@ -280,6 +280,7 @@ static struct menu *current_menu;
static int child_count; static int child_count;
static int single_menu_mode; static int single_menu_mode;
static int show_all_options; static int show_all_options;
static int save_and_exit;
static void conf(struct menu *menu, struct menu *active_menu); static void conf(struct menu *menu, struct menu *active_menu);
static void conf_choice(struct menu *menu); static void conf_choice(struct menu *menu);
@ -657,6 +658,12 @@ static void conf(struct menu *menu, struct menu *active_menu)
show_helptext(_("README"), _(mconf_readme)); show_helptext(_("README"), _(mconf_readme));
break; break;
case 3: case 3:
conf_save();
break;
case 4:
conf_load();
break;
case 5:
if (item_is_tag('t')) { if (item_is_tag('t')) {
if (sym_set_tristate_value(sym, yes)) if (sym_set_tristate_value(sym, yes))
break; break;
@ -664,24 +671,24 @@ static void conf(struct menu *menu, struct menu *active_menu)
show_textbox(NULL, setmod_text, 6, 74); show_textbox(NULL, setmod_text, 6, 74);
} }
break; break;
case 4: case 6:
if (item_is_tag('t')) if (item_is_tag('t'))
sym_set_tristate_value(sym, no); sym_set_tristate_value(sym, no);
break; break;
case 5: case 7:
if (item_is_tag('t')) if (item_is_tag('t'))
sym_set_tristate_value(sym, mod); sym_set_tristate_value(sym, mod);
break; break;
case 6: case 8:
if (item_is_tag('t')) if (item_is_tag('t'))
sym_toggle_tristate_value(sym); sym_toggle_tristate_value(sym);
else if (item_is_tag('m')) else if (item_is_tag('m'))
conf(submenu, NULL); conf(submenu, NULL);
break; break;
case 7: case 9:
search_conf(); search_conf();
break; break;
case 8: case 10:
show_all_options = !show_all_options; show_all_options = !show_all_options;
break; break;
} }
@ -708,6 +715,17 @@ static void show_helptext(const char *title, const char *text)
show_textbox(title, text, 0, 0); show_textbox(title, text, 0, 0);
} }
static void conf_message_callback(const char *fmt, va_list ap)
{
char buf[PATH_MAX+1];
vsnprintf(buf, sizeof(buf), fmt, ap);
if (save_and_exit)
printf("%s", buf);
else
show_textbox(NULL, buf, 6, 60);
}
static void show_help(struct menu *menu) static void show_help(struct menu *menu)
{ {
struct gstr help = str_new(); struct gstr help = str_new();
@ -876,6 +894,7 @@ static int handle_exit(void)
{ {
int res; int res;
save_and_exit = 1;
dialog_clear(); dialog_clear();
if (conf_get_changed()) if (conf_get_changed())
res = dialog_yesno(NULL, res = dialog_yesno(NULL,
@ -947,6 +966,7 @@ int main(int ac, char **av)
} }
set_config_filename(conf_get_configname()); set_config_filename(conf_get_configname());
conf_set_message_callback(conf_message_callback);
do { do {
conf(&rootmenu, NULL); conf(&rootmenu, NULL);
res = handle_exit(); res = handle_exit();