extended commands revision

Reorganize the logic for showing or suppressing an extended command
to avoid a slightly hairy 'foo || bar && quux' expression.

When searching and not finding anything, report "no matches" rather
just waiting for another menu selection.

Plus miscellaneous reformatting.
This commit is contained in:
PatR
2018-09-25 03:44:24 -07:00
parent d119eca297
commit d86e9eaec4
+77 -61
View File
@@ -371,11 +371,11 @@ doextlist(VOID_ARGS)
winid menuwin; winid menuwin;
anything any; anything any;
menu_item *selected; menu_item *selected;
int n, pass, maxpass = wizard ? 2 : 1; int n, pass;
int menumode = 0, menushown[2] = {0,0}, onelist = 0; int menumode = 0, menushown[2], onelist = 0;
boolean redisplay = TRUE, search = FALSE; boolean redisplay = TRUE, search = FALSE;
const char *headings[] = {"Extended commands", static const char *headings[] = { "Extended commands",
"Debugging Extended Commands"}; "Debugging Extended Commands" };
searchbuf[0] = '\0'; searchbuf[0] = '\0';
menuwin = create_nhwindow(NHW_MENU); menuwin = create_nhwindow(NHW_MENU);
@@ -386,24 +386,24 @@ doextlist(VOID_ARGS)
start_menu(menuwin); start_menu(menuwin);
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE, add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"Extended Commands List", MENU_UNSELECTED); "Extended Commands List", MENU_UNSELECTED);
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE, add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"", MENU_UNSELECTED); "", MENU_UNSELECTED);
Strcpy(buf, menumode ? "Show" : "Hide"); Strcpy(buf, menumode ? "Show" : "Hide");
Strcat(buf, " commands that don't autocomplete"); Strcat(buf, " commands that don't autocomplete");
if (!menumode) if (!menumode)
Strcat(buf, " (those not marked with [A] below)"); Strcat(buf, " (those not marked with [A])");
any.a_int = 1; any.a_int = 1;
add_menu(menuwin, NO_GLYPH, &any, 'a', 0, ATR_NONE, buf, MENU_UNSELECTED); add_menu(menuwin, NO_GLYPH, &any, 'a', 0, ATR_NONE, buf,
MENU_UNSELECTED);
if (strlen(searchbuf) == 0) { if (!*searchbuf) {
any.a_int = 2; any.a_int = 2;
add_menu(menuwin, NO_GLYPH, &any, 's', 0, ATR_NONE, add_menu(menuwin, NO_GLYPH, &any, 's', 0, ATR_NONE,
"Search extended commands", MENU_UNSELECTED); "Search extended commands", MENU_UNSELECTED);
} else { } else {
Strcpy(buf, "Show all, clear search"); Strcpy(buf, "Show all, clear search");
if ((strlen(buf) + strlen(searchbuf) + strlen(" (\"\")")) < QBUFSZ) if (strlen(buf) + strlen(searchbuf) + strlen(" (\"\")") < QBUFSZ)
Sprintf(eos(buf), " (\"%s\")", searchbuf); Sprintf(eos(buf), " (\"%s\")", searchbuf);
any.a_int = 3; any.a_int = 3;
add_menu(menuwin, NO_GLYPH, &any, 's', 0, ATR_NONE, add_menu(menuwin, NO_GLYPH, &any, 's', 0, ATR_NONE,
@@ -412,72 +412,88 @@ doextlist(VOID_ARGS)
if (wizard) { if (wizard) {
any.a_int = 4; any.a_int = 4;
add_menu(menuwin, NO_GLYPH, &any, 'z', 0, ATR_NONE, add_menu(menuwin, NO_GLYPH, &any, 'z', 0, ATR_NONE,
onelist ? "Show debugging commands in separate section" : onelist ? "Show debugging commands in separate section"
"Show all alphabetically, including debugging commands", : "Show all alphabetically, including debugging commands",
MENU_UNSELECTED); MENU_UNSELECTED);
} }
any = zeroany; any = zeroany;
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE, add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"", MENU_UNSELECTED); "", MENU_UNSELECTED);
menushown[0] = menushown[1] = 0; menushown[0] = menushown[1] = 0;
for (pass = 0; pass < maxpass; ++pass) { n = 0;
for (pass = 0; pass <= 1; ++pass) {
/* skip second pass if not in wizard mode or wizard mode
commands are being integrated into a single list */
if (pass == 1 && (onelist || !wizard))
break;
for (efp = extcmdlist; efp->ef_txt; efp++) { for (efp = extcmdlist; efp->ef_txt; efp++) {
boolean showit = (onelist || int wizc;
(!menumode ||
(menumode && (efp->flags & AUTOCOMPLETE))) &&
((!pass && !(efp->flags & WIZMODECMD)) ||
(pass && (efp->flags & WIZMODECMD))));
if (strlen(searchbuf) > 0) { /* if hiding non-autocomplete commands, skip such */
if (!((strstri(efp->ef_txt, searchbuf) != 0) || if (menumode == 1 && (efp->flags & AUTOCOMPLETE) == 0)
(strstri(efp->ef_desc, searchbuf) != 0))) continue;
showit = FALSE; /* if searching, skip this command if it doesn't match */
if (*searchbuf
&& !strstri(efp->ef_txt, searchbuf)
&& !strstri(efp->ef_desc, searchbuf))
continue;
/* skip wizard mode commands if not in wizard mode;
when showing two sections, skip wizard mode commands
in pass==0 and skip other commands in pass==1 */
wizc = (efp->flags & WIZMODECMD) != 0;
if (wizc && !wizard)
continue;
if (!onelist && pass != wizc)
continue;
/* We're about to show an item, have we shown the menu yet?
Doing menu in inner loop like this on demand avoids a
heading with no subordinate entries on the search
results menu. */
if (!menushown[pass]) {
Strcpy(buf, headings[pass]);
add_menu(menuwin, NO_GLYPH, &any, 0, 0,
iflags.menu_headings, buf, MENU_UNSELECTED);
menushown[pass] = 1;
} }
if (showit) { Sprintf(buf, " %-14s %-3s %s",
/* We're about to show an item, have we shown the menu yet? efp->ef_txt,
Doing menu in inner loop like this on demand avoids a (efp->flags & AUTOCOMPLETE) ? "[A]" : " ",
heading with no subordinate entries on the search efp->ef_desc);
results menu */ add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
if (!menushown[pass]) {
Strcpy(buf, headings[pass]);
add_menu(menuwin, NO_GLYPH, &any, 0, 0, iflags.menu_headings,
buf, MENU_UNSELECTED);
menushown[pass] = 1;
}
Sprintf(buf, " %-14s %-3s %s",
efp->ef_txt,
(efp->flags & AUTOCOMPLETE) ? "[A]" : " ",
efp->ef_desc);
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
buf, MENU_UNSELECTED); buf, MENU_UNSELECTED);
} ++n;
} }
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE, if (n)
"", MENU_UNSELECTED); add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"", MENU_UNSELECTED);
} }
if (*searchbuf && !n)
add_menu(menuwin, NO_GLYPH, &any, 0, 0, ATR_NONE,
"no matches", MENU_UNSELECTED);
end_menu(menuwin, (char *) 0); end_menu(menuwin, (char *) 0);
n = select_menu(menuwin, PICK_ONE, &selected); n = select_menu(menuwin, PICK_ONE, &selected);
if (n > 0) { if (n > 0) {
switch(selected[0].item.a_int) { switch (selected[0].item.a_int) {
case 1: case 1: /* 'a': toggle show/hide non-autocomplete */
menumode = 1 - menumode; /* toggle 0 -> 1, 1 -> 0 */ menumode = 1 - menumode; /* toggle 0 -> 1, 1 -> 0 */
redisplay = TRUE; redisplay = TRUE;
break; break;
case 2: case 2: /* 's' when not searching yet: enable search */
search = TRUE; search = TRUE;
break; break;
case 3: case 3: /* 's' when already searching: disable search */
search = FALSE; search = FALSE;
searchbuf[0] = '\0'; searchbuf[0] = '\0';
redisplay = TRUE; redisplay = TRUE;
break; break;
case 4: case 4: /* 'z': toggle showing wizard mode commands separately */
search = FALSE; search = FALSE;
searchbuf[0] = '\0'; searchbuf[0] = '\0';
onelist = 1 - onelist; /* toggle 0 -> 1, 1 -> 0 */ onelist = 1 - onelist; /* toggle 0 -> 1, 1 -> 0 */
maxpass = onelist ? 1 : wizard ? 2 : 1; redisplay = TRUE;
redisplay = TRUE; break;
break;
} }
free((genericptr_t) selected); free((genericptr_t) selected);
} else { } else {
@@ -491,7 +507,7 @@ doextlist(VOID_ARGS)
(void) mungspaces(searchbuf); (void) mungspaces(searchbuf);
if (searchbuf[0] == '\033') if (searchbuf[0] == '\033')
searchbuf[0] = '\0'; searchbuf[0] = '\0';
if (strlen(searchbuf) > 0) if (*searchbuf)
redisplay = TRUE; redisplay = TRUE;
search = FALSE; search = FALSE;
} }