redo status_hilite_menu_fld() [pull request #740]

Pull request #740 by argrath removes some redundant code.  Instead
of adopting that, this rewrites the section of code in question.

The menu involved allows the user to select both "delete hilites"
and "add new hilite" but if both are selected it would only do
deletion.  It also falsely claimed to have done something if delete
was chosen but no highlights were selected to be deleted.  And it
only added one new highlight for the specified field when adding.
This supports both add and delete on the same menu invocation, for
addition it keeps adding until no new highlight is specified, and
has caller do the highlight updating if any changes are made.

Supersedes #740
This commit is contained in:
PatR
2022-04-20 22:22:36 -07:00
parent a9a9d19038
commit 0f1674a262

View File

@@ -3886,7 +3886,7 @@ status_hilite_menu_fld(int fld)
int count = status_hilite_linestr_countfield(fld);
struct _status_hilite_line_str *hlstr;
char buf[BUFSZ];
boolean acted = FALSE;
boolean acted;
if (!count) {
if (status_hilite_menu_add(fld)) {
@@ -3944,55 +3944,37 @@ status_hilite_menu_fld(int fld)
any = cg.zeroany;
any.a_int = -2;
add_menu(tmpwin, &nul_glyphinfo, &any, 'Z', 0, ATR_NONE,
"Add a new hilite", MENU_ITEMFLAGS_NONE);
"Add new hilites", MENU_ITEMFLAGS_NONE);
}
Sprintf(buf, "Current %s hilites:", initblstats[fld].fldname);
end_menu(tmpwin, buf);
acted = FALSE;
if ((res = select_menu(tmpwin, PICK_ANY, &picks)) > 0) {
int mode = 0;
int idx;
unsigned mode = 0;
for (i = 0; i < res; i++) {
int idx = picks[i].item.a_int;
if (idx == -1) {
/* delete selected hilites */
if (mode)
goto shlmenu_free;
mode = -1;
break;
} else if (idx == -2) {
/* create a new hilite */
if (mode)
goto shlmenu_free;
mode = -2;
break;
idx = picks[i].item.a_int;
if (idx == -1)
mode |= 1; /* delete selected hilites */
else if (idx == -2)
mode |= 2; /* create new hilites */
}
if (mode & 1) { /* delete selected hilites */
for (i = 0; i < res; i++) {
idx = picks[i].item.a_int;
if (idx > 0 && status_hilite_remove(idx))
acted = TRUE;
}
}
if (mode == -1) {
/* delete selected hilites */
for (i = 0; i < res; i++) {
int idx = picks[i].item.a_int;
if (idx > 0)
(void) status_hilite_remove(idx);
}
reset_status_hilites();
acted = TRUE;
} else if (mode == -2) {
/* create a new hilite */
if (status_hilite_menu_add(fld))
if (mode & 2) { /* create new hilites */
while (status_hilite_menu_add(fld))
acted = TRUE;
}
free((genericptr_t) picks);
free((genericptr_t) picks), picks = 0;
}
shlmenu_free:
picks = (menu_item *) 0;
destroy_nhwindow(tmpwin);
return acted;
}
@@ -4072,10 +4054,12 @@ status_hilite_menu(void)
end_menu(tmpwin, "Status hilites:");
if ((res = select_menu(tmpwin, PICK_ONE, &picks)) > 0) {
i = picks->item.a_int - 1;
if (i < 0)
if (i < 0) {
status_hilites_viewall();
else
(void) status_hilite_menu_fld(i);
} else {
if (status_hilite_menu_fld(i))
reset_status_hilites();
}
free((genericptr_t) picks), picks = (menu_item *) 0;
redo = TRUE;
}