This will make it easier to tinker for best results.
E char *FDECL(encglyph, (int));
E char *FDECL(decode_mixed, (char *, const char *));
E void FDECL(genl_putmixed, (winid, int, const char *));
+E boolean FDECL(menuitem_invert_test, (int, unsigned, BOOLEAN_P));
/* ### mcastu.c ### */
*/
unsigned msg_history; /* hint: # of top lines to save */
int getpos_coords; /* show coordinates when getting cursor position */
+ int menuinvertmode; /* 0 = invert toggles every item;
+ 1 = invert skips 'all items' item */
int menu_headings; /* ATR for menu headings */
int *opt_booldup; /* for duplication of boolean opts in config file */
int *opt_compdup; /* for duplication of compound opts in conf file */
putstr(window, attr, decode_mixed(buf, str));
}
+/*
+ * Window port helper function for menu invert routines to move the decision
+ * logic into one place instead of 7 different window-port routines.
+ */
+boolean
+menuitem_invert_test(mode, itemflags, is_selected)
+int mode;
+unsigned itemflags; /* The itemflags for the item */
+boolean is_selected; /* The current selection status of the item */
+{
+ boolean skipinvert = (itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0;
+
+ if ((iflags.menuinvertmode == 1 || iflags.menuinvertmode == 2)
+ && !mode && skipinvert && !is_selected)
+ return FALSE;
+ else if (iflags.menuinvertmode == 2
+ && !mode && skipinvert && is_selected)
+ return TRUE;
+ else
+ return TRUE;
+}
+
/*mapglyph.c*/
{ "horsename", "the name of your (first) horse (e.g., horsename:Silver)",
PL_PSIZ, DISP_IN_GAME },
{ "map_mode", "map display mode under Windows", 20, DISP_IN_GAME }, /*WC*/
+ { "menuinvertmode", "behaviour of menu iverts", 5, SET_IN_GAME },
{ "menustyle", "user interface for object selection", MENUTYPELEN,
SET_IN_GAME },
{ "menu_deselect_all", "deselect all items in a menu", 4, SET_IN_FILE },
return retval;
}
+ /* menuinvertmode=0 or 1 or 2 (2 is experimental) */
+ fullname = "menuinvertmode";
+ if (match_optname(opts, fullname, 5, TRUE)) {
+ if (negated) {
+ bad_negation(fullname, FALSE);
+ return FALSE;
+ } else {
+ int mode = atoi(op);
+
+ if (mode < 0 || mode > 2) {
+ config_error_add("Illegal %s parameter '%s'", fullname, op);
+ return FALSE;
+ }
+ iflags.menuinvertmode = mode;
+ }
+ return retval;
+ }
+
fullname = "msghistory";
if (match_optname(opts, fullname, 3, TRUE)) {
if (duplicate)
: (i == MAP_MODE_ASCII_FIT_TO_SCREEN)
? "fit_to_screen"
: defopt);
- } else if (!strcmp(optname, "menustyle"))
+ } else if (!strcmp(optname, "menuinvertmode"))
+ Sprintf(buf, "%d", iflags.menuinvertmode);
+ else if (!strcmp(optname, "menustyle"))
Sprintf(buf, "%s", menutype[(int) flags.menu_style]);
else if (!strcmp(optname, "menu_deselect_all"))
Sprintf(buf, "%s", to_be_done);
return;
for (int i=0; i<itemcount; i++) {
- if ((itemlist[i].itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
+ if (!menuitem_invert_test(0, itemlist[i].itemflags,
+ itemlist[i].selected))
continue;
QTableWidgetItem *count = table->item(i, 0);
reset_menu_count(wp->menu_information);
for (count = 0, curr = wp->menu_information->curr_menu.base; curr;
curr = curr->next, count++) {
- if ((curr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
+ if (!menuitem_invert_test(0, curr->itemflags, curr->selected))
continue;
if (curr->identifier.a_void != 0)
invert_line(wp, curr, count, -1L);
if (menu_item_ptr->identifier.a_void != NULL) {
if (operation != INVERT
- || (menu_item_ptr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) == 0)
+ || menuitem_invert_test(0, menu_item_ptr->itemflags,
+ menu_item_ptr->selected))
menu_select_deselect(win, menu_item_ptr, operation, current_page);
}
for (curr = invent_list; start-- && curr; curr = curr->Gmi_next)
;
for (; page-- && curr; curr = curr->Gmi_next) {
- if ((curr->Gmi_itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
+ if (!menuitem_invert_test(0, curr->Gmi_itemflags, curr->Gmi_selected)
continue;
+
if (curr->Gmi_identifier && (acc == 0 || curr->Gmi_groupacc == acc)) {
if (curr->Gmi_selected) {
curr->Gmi_selected = FALSE;
int n;
for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) {
- if ((curr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
+ if (!menuitem_invert_test(0, curr->itemflags, curr->selected))
continue;
if (curr->identifier.a_void && (acc == 0 || curr->gselector == acc)) {
if (!on_curr_page && curr->identifier.a_void
&& (acc == 0 || curr->gselector == acc)) {
- if ((curr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) == 0) {
+ if (menuitem_invert_test(0, curr->itemflags, curr->selected)) {
if (curr->selected) {
curr->selected = FALSE;
curr->count = -1;
} else
- curr->selected = TRUE;
+ curr->selected = TRUE;
}
}
}
if (data->how == PICK_ANY) {
reset_menu_count(hwndList, data);
for (i = 0; i < data->menu.size; i++) {
- if (!(data->menu.items[i].itemflags & MENU_ITEMFLAGS_SKIPINVERT))
+ if (menuitem_invert_test(0, data->menu.items[i].itemflags,
+ NHMENU_IS_SELECTED(data->menu.items[i])))
SelectMenuItem(hwndList, data, i,
NHMENU_IS_SELECTED(data->menu.items[i]) ? 0
: -1);
from = max(0, topIndex);
to = min(data->menu.size, from + pageSize);
for (i = from; i < to; i++) {
- if (!(data->menu.items[i].itemflags & MENU_ITEMFLAGS_SKIPINVERT))
+ if (menuitem_invert_test(0, data->menu.items[i].itemflags,
+ NHMENU_IS_SELECTED(data->menu.items[i])))
SelectMenuItem(hwndList, data, i,
NHMENU_IS_SELECTED(data->menu.items[i]) ? 0
: -1);