add support for MENU_ITEMFLAGS_SKIPINVERT

Able to test:
win/tty
win/win32
win/curses

Unable to test:
win/X11
win/Qt
win/Qt3
win/gem
win/gnome
This commit is contained in:
nhmall
2019-12-23 08:36:44 -05:00
parent c9bc2f5a2a
commit 7012e7046f
18 changed files with 63 additions and 35 deletions
+8 -8
View File
@@ -13,14 +13,14 @@
/* menu structure */ /* menu structure */
typedef struct tty_mi { typedef struct tty_mi {
struct tty_mi *next; struct tty_mi *next;
anything identifier; /* user identifier */ anything identifier; /* user identifier */
long count; /* user count */ long count; /* user count */
char *str; /* description string (including accelerator) */ char *str; /* description string (including accelerator) */
int attr; /* string attribute */ int attr; /* string attribute */
boolean selected; /* TRUE if selected by user */ boolean selected; /* TRUE if selected by user */
unsigned int itemflags; /* */ unsigned itemflags; /* item flags */
char selector; /* keyboard accelerator */ char selector; /* keyboard accelerator */
char gselector; /* group accelerator */ char gselector; /* group accelerator */
} tty_menu_item; } tty_menu_item;
/* descriptor for tty-based windows */ /* descriptor for tty-based windows */
+3 -2
View File
@@ -107,8 +107,9 @@ typedef struct mi {
#define MENU_INVERT_PAGE '~' #define MENU_INVERT_PAGE '~'
#define MENU_SEARCH ':' #define MENU_SEARCH ':'
#define MENU_ITEMFLAGS_NONE 0x0000000 #define MENU_ITEMFLAGS_NONE 0x0000000U
#define MENU_ITEMFLAGS_SELECTED 0x0000001 #define MENU_ITEMFLAGS_SELECTED 0x0000001U
#define MENU_ITEMFLAGS_SKIPINVERT 0x0000002U
/* clang-format on */ /* clang-format on */
+2 -3
View File
@@ -376,13 +376,12 @@ void NetHackQtBind::qt_start_menu(winid wid)
void NetHackQtBind::qt_add_menu(winid wid, int glyph, void NetHackQtBind::qt_add_menu(winid wid, int glyph,
const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr, const ANY_P * identifier, CHAR_P ch, CHAR_P gch, int attr,
const char *str, unsigned int itemflags) const char *str, unsigned itemflags)
{ {
boolean presel = ((itemflags & MENU_ITEMFLAGS_SELECTED) != 0);
NetHackQtWindow* window=id_to_window[(int)wid]; NetHackQtWindow* window=id_to_window[(int)wid];
window->AddMenu(glyph, identifier, ch, gch, attr, window->AddMenu(glyph, identifier, ch, gch, attr,
QString::fromLatin1(str), QString::fromLatin1(str),
presel); itemflags);
} }
void NetHackQtBind::qt_end_menu(winid wid, const char *prompt) void NetHackQtBind::qt_end_menu(winid wid, const char *prompt)
+3 -1
View File
@@ -160,8 +160,9 @@ NetHackQtMenuWindow::MenuItem::~MenuItem()
} }
void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier, void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier,
char ch, char gch, int attr, const QString& str, bool presel) char ch, char gch, int attr, const QString& str, unsigned itemflags)
{ {
bool presel = (itemflags & MENU_ITEMFLAGS_SELECTED) != 0;
if (!ch && identifier->a_void!=0) { if (!ch && identifier->a_void!=0) {
// Supply a keyboard accelerator. Limited supply. // Supply a keyboard accelerator. Limited supply.
static char accel[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; static char accel[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
@@ -180,6 +181,7 @@ void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier,
itemlist[itemcount].attr=attr; itemlist[itemcount].attr=attr;
itemlist[itemcount].str=str; itemlist[itemcount].str=str;
itemlist[itemcount].selected=presel; itemlist[itemcount].selected=presel;
itemlist[itemcount].itemflags=itemflags;
itemlist[itemcount].count=-1; itemlist[itemcount].count=-1;
itemlist[itemcount].color = -1; itemlist[itemcount].color = -1;
// Display the boulder symbol correctly // Display the boulder symbol correctly
+3 -2
View File
@@ -55,7 +55,7 @@ public:
virtual void StartMenu(); virtual void StartMenu();
virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
const QString& str, bool presel); const QString& str, unsigned itemflags);
virtual void EndMenu(const QString& prompt); virtual void EndMenu(const QString& prompt);
virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
@@ -85,6 +85,7 @@ private:
char ch; char ch;
char gch; char gch;
bool selected; bool selected;
unsigned itemflags;
unsigned color; unsigned color;
bool Selectable() const { return identifier.a_void!=0; } bool Selectable() const { return identifier.a_void!=0; }
@@ -172,7 +173,7 @@ public:
// Menu // Menu
virtual void StartMenu(); virtual void StartMenu();
virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, virtual void AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
const QString& str, bool presel); const QString& str, unsigned itemflags);
virtual void EndMenu(const QString& prompt); virtual void EndMenu(const QString& prompt);
virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
+4 -2
View File
@@ -1447,7 +1447,7 @@ void NetHackQtWindow::CursorTo(int x,int y) { puts("unexpected CursorTo"); }
void NetHackQtWindow::PutStr(int attr, const char* text) { puts("unexpected PutStr"); } void NetHackQtWindow::PutStr(int attr, const char* text) { puts("unexpected PutStr"); }
void NetHackQtWindow::StartMenu() { puts("unexpected StartMenu"); } void NetHackQtWindow::StartMenu() { puts("unexpected StartMenu"); }
void NetHackQtWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr, void NetHackQtWindow::AddMenu(int glyph, const ANY_P* identifier, char ch, char gch, int attr,
const char* str, bool presel) { puts("unexpected AddMenu"); } const char* str, unsigned itemflags) { puts("unexpected AddMenu"); }
void NetHackQtWindow::EndMenu(const char* prompt) { puts("unexpected EndMenu"); } void NetHackQtWindow::EndMenu(const char* prompt) { puts("unexpected EndMenu"); }
int NetHackQtWindow::SelectMenu(int how, MENU_ITEM_P **menu_list) { puts("unexpected SelectMenu"); return 0; } int NetHackQtWindow::SelectMenu(int how, MENU_ITEM_P **menu_list) { puts("unexpected SelectMenu"); return 0; }
void NetHackQtWindow::ClipAround(int x,int y) { puts("unexpected ClipAround"); } void NetHackQtWindow::ClipAround(int x,int y) { puts("unexpected ClipAround"); }
@@ -2788,8 +2788,9 @@ NetHackQtMenuWindow::MenuItem::~MenuItem()
#define STR_MARGIN 4 #define STR_MARGIN 4
void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier, void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier,
char ch, char gch, int attr, const char* str, bool presel) char ch, char gch, int attr, const char* str, unsigned itemflags)
{ {
bool presel = (itemflags & MENU_ITEMFLAGS_SELECTED) != 0;
if (!ch && identifier->a_void!=0) { if (!ch && identifier->a_void!=0) {
// Supply a keyboard accelerator. Limited supply. // Supply a keyboard accelerator. Limited supply.
static char accel[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static char accel[]="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
@@ -2807,6 +2808,7 @@ void NetHackQtMenuWindow::AddMenu(int glyph, const ANY_P* identifier,
item[itemcount].attr=attr; item[itemcount].attr=attr;
item[itemcount].str=strdup(str); item[itemcount].str=strdup(str);
item[itemcount].selected=presel; item[itemcount].selected=presel;
item[itemcount].itemflags=itemflags;
item[itemcount].count=-1; item[itemcount].count=-1;
++itemcount; ++itemcount;
+4 -4
View File
@@ -258,7 +258,7 @@ class NetHackQtWindow
virtual void PutStr(int attr, const char *text); virtual void PutStr(int attr, const char *text);
virtual void StartMenu(); virtual void StartMenu();
virtual void AddMenu(int glyph, const ANY_P *identifier, char ch, virtual void AddMenu(int glyph, const ANY_P *identifier, char ch,
char gch, int attr, const char *str, bool presel); char gch, int attr, const char *str, unsigned itemflags);
virtual void EndMenu(const char *prompt); virtual void EndMenu(const char *prompt);
virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
virtual void ClipAround(int x, int y); virtual void ClipAround(int x, int y);
@@ -550,7 +550,7 @@ class NetHackQtMenuWindow : public QTableView, public NetHackQtWindow
virtual void StartMenu(); virtual void StartMenu();
virtual void AddMenu(int glyph, const ANY_P *identifier, char ch, virtual void AddMenu(int glyph, const ANY_P *identifier, char ch,
char gch, int attr, const char *str, bool presel); char gch, int attr, const char *str, unsigned itemflags);
virtual void EndMenu(const char *prompt); virtual void EndMenu(const char *prompt);
virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
@@ -699,7 +699,7 @@ class NetHackQtMenuOrTextWindow : public NetHackQtWindow
// Menu // Menu
virtual void StartMenu(); virtual void StartMenu();
virtual void AddMenu(int glyph, const ANY_P *identifier, char ch, virtual void AddMenu(int glyph, const ANY_P *identifier, char ch,
char gch, int attr, const char *str, bool presel); char gch, int attr, const char *str, unsigned itemflags);
virtual void EndMenu(const char *prompt); virtual void EndMenu(const char *prompt);
virtual int SelectMenu(int how, MENU_ITEM_P **menu_list); virtual int SelectMenu(int how, MENU_ITEM_P **menu_list);
}; };
@@ -854,7 +854,7 @@ class NetHackQtBind : NetHackQtBindBase
static void qt_start_menu(winid wid); static void qt_start_menu(winid wid);
static void qt_add_menu(winid wid, int glyph, const ANY_P *identifier, static void qt_add_menu(winid wid, int glyph, const ANY_P *identifier,
CHAR_P ch, CHAR_P gch, int attr, const char *str, CHAR_P ch, CHAR_P gch, int attr, const char *str,
unsigned int itemflags); unsigned itemflags);
static void qt_end_menu(winid wid, const char *prompt); static void qt_end_menu(winid wid, const char *prompt);
static int qt_select_menu(winid wid, int how, MENU_ITEM_P **menu_list); static int qt_select_menu(winid wid, int how, MENU_ITEM_P **menu_list);
static void qt_update_inventory(); static void qt_update_inventory();
+5 -2
View File
@@ -542,10 +542,12 @@ struct xwindow *wp;
reset_menu_count(wp->menu_information); reset_menu_count(wp->menu_information);
for (count = 0, curr = wp->menu_information->curr_menu.base; curr; for (count = 0, curr = wp->menu_information->curr_menu.base; curr;
curr = curr->next, count++) curr = curr->next, count++) {
if ((curr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
continue;
if (curr->identifier.a_void != 0) if (curr->identifier.a_void != 0)
invert_line(wp, curr, count, -1L); invert_line(wp, curr, count, -1L);
}
} }
static void static void
@@ -655,6 +657,7 @@ unsigned itemflags;
item->next = (x11_menu_item *) 0; item->next = (x11_menu_item *) 0;
item->identifier = *identifier; item->identifier = *identifier;
item->attr = attr; item->attr = attr;
item->itemflags = itemflags;
item->selected = item->preselected = preselected; item->selected = item->preselected = preselected;
item->pick_count = -1L; item->pick_count = -1L;
item->window = window; item->window = window;
+7 -3
View File
@@ -586,6 +586,7 @@ curs_new_menu_item(winid wid, const char *str)
new_item->str = new_str; new_item->str = new_str;
new_item->presel = FALSE; new_item->presel = FALSE;
new_item->selected = FALSE; new_item->selected = FALSE;
new_item->itemflags = MENU_ITEMFLAGS_NONE;
new_item->page_num = 0; new_item->page_num = 0;
new_item->line_num = 0; new_item->line_num = 0;
new_item->num_lines = 0; new_item->num_lines = 0;
@@ -598,10 +599,11 @@ curs_new_menu_item(winid wid, const char *str)
void void
curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier, curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier,
CHAR_P accelerator, CHAR_P group_accel, int attr, CHAR_P accelerator, CHAR_P group_accel, int attr,
const char *str, BOOLEAN_P presel) const char *str, unsigned itemflags)
{ {
nhmenu_item *new_item, *current_items, *menu_item_ptr; nhmenu_item *new_item, *current_items, *menu_item_ptr;
nhmenu *current_menu = get_menu(wid); nhmenu *current_menu = get_menu(wid);
boolean presel = (itemflags & MENU_ITEMFLAGS_SELECTED) != 0;
if (current_menu == NULL) { if (current_menu == NULL) {
impossible( impossible(
@@ -620,7 +622,7 @@ curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier,
new_item->group_accel = group_accel; new_item->group_accel = group_accel;
new_item->attr = attr; new_item->attr = attr;
new_item->presel = presel; new_item->presel = presel;
new_item->itemflags = itemflags;
current_items = current_menu->entries; current_items = current_menu->entries;
menu_item_ptr = current_items; menu_item_ptr = current_items;
@@ -1549,7 +1551,9 @@ menu_operation(WINDOW * win, nhmenu *menu, menu_op
} }
if (menu_item_ptr->identifier.a_void != NULL) { if (menu_item_ptr->identifier.a_void != NULL) {
menu_select_deselect(win, menu_item_ptr, operation, current_page); if (operation != INVERT
|| (menu_item_ptr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) == 0)
menu_select_deselect(win, menu_item_ptr, operation, current_page);
} }
menu_item_ptr = menu_item_ptr->next_item; menu_item_ptr = menu_item_ptr->next_item;
+1 -1
View File
@@ -15,7 +15,7 @@ int curses_ext_cmd(void);
void curses_create_nhmenu(winid wid); void curses_create_nhmenu(winid wid);
void curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier, void curses_add_nhmenu_item(winid wid, int glyph, const ANY_P *identifier,
CHAR_P accelerator, CHAR_P group_accel, int attr, CHAR_P accelerator, CHAR_P group_accel, int attr,
const char *str, BOOLEAN_P presel); const char *str, unsigned itemflags);
void curs_menu_set_bottom_heavy(winid); void curs_menu_set_bottom_heavy(winid);
void curses_finalize_nhmenu(winid wid, const char *prompt); void curses_finalize_nhmenu(winid wid, const char *prompt);
int curses_display_nhmenu(winid wid, int how, MENU_ITEM_P **_selected); int curses_display_nhmenu(winid wid, int how, MENU_ITEM_P **_selected);
+2 -2
View File
@@ -522,7 +522,7 @@ add_menu(winid wid, int glyph, const anything identifier,
void void
curses_add_menu(winid wid, int glyph, const ANY_P * identifier, curses_add_menu(winid wid, int glyph, const ANY_P * identifier,
CHAR_P accelerator, CHAR_P group_accel, int attr, CHAR_P accelerator, CHAR_P group_accel, int attr,
const char *str, unsigned int itemflags) const char *str, unsigned itemflags)
{ {
int curses_attr; int curses_attr;
boolean presel = ((itemflags & MENU_ITEMFLAGS_SELECTED) != 0); boolean presel = ((itemflags & MENU_ITEMFLAGS_SELECTED) != 0);
@@ -537,7 +537,7 @@ curses_add_menu(winid wid, int glyph, const ANY_P * identifier,
} }
curses_add_nhmenu_item(wid, glyph, identifier, accelerator, group_accel, curses_add_nhmenu_item(wid, glyph, identifier, accelerator, group_accel,
curses_attr, str, presel); curses_attr, str, itemflags);
} }
/* /*
+2 -1
View File
@@ -509,7 +509,8 @@ curses_puts(winid wid, int attr, const char *text)
return; return;
} }
Id = cg.zeroany; Id = cg.zeroany;
curses_add_nhmenu_item(wid, NO_GLYPH, &Id, 0, 0, attr, text, FALSE); curses_add_nhmenu_item(wid, NO_GLYPH, &Id, 0, 0, attr, text,
MENU_ITEMFLAGS_NONE);
} else { } else {
waddstr(win, text); waddstr(win, text);
wnoutrefresh(win); wnoutrefresh(win);
+1
View File
@@ -788,6 +788,7 @@ unsigned int itemflags; /* itemflags such as marked as selected */
G_item->Gmi_selected = preselected ? 1 : 0; G_item->Gmi_selected = preselected ? 1 : 0;
G_item->Gmi_accelerator = ch; G_item->Gmi_accelerator = ch;
G_item->Gmi_groupacc = gch; G_item->Gmi_groupacc = gch;
G_item->Gmi_itemflags = itemflags;
G_item->Gmi_attr = attr; G_item->Gmi_attr = attr;
G_item->Gmi_str = copy_of(newstr); G_item->Gmi_str = copy_of(newstr);
mar_add_menu(window, G_item); mar_add_menu(window, G_item);
+4 -1
View File
@@ -1783,7 +1783,9 @@ char acc;
for (curr = invent_list; start-- && curr; curr = curr->Gmi_next) for (curr = invent_list; start-- && curr; curr = curr->Gmi_next)
; ;
for (; page-- && curr; curr = curr->Gmi_next) for (; page-- && curr; curr = curr->Gmi_next) {
if ((curr->Gmi_itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
continue;
if (curr->Gmi_identifier && (acc == 0 || curr->Gmi_groupacc == acc)) { if (curr->Gmi_identifier && (acc == 0 || curr->Gmi_groupacc == acc)) {
if (curr->Gmi_selected) { if (curr->Gmi_selected) {
curr->Gmi_selected = FALSE; curr->Gmi_selected = FALSE;
@@ -1791,6 +1793,7 @@ char acc;
} else } else
curr->Gmi_selected = TRUE; curr->Gmi_selected = TRUE;
} }
}
} }
/************************* Inv_Handler and Inv_Init /************************* Inv_Handler and Inv_Init
+1
View File
@@ -723,6 +723,7 @@ gnome_add_menu(winid wid, int glyph, const ANY_P *identifier,
item.attr = attr; item.attr = attr;
item.str = str; item.str = str;
item.presel = presel; item.presel = presel;
item.itemflags = itemflags;
if (wid != -1 && gnome_windowlist[wid].win != NULL) { if (wid != -1 && gnome_windowlist[wid].win != NULL) {
gtk_signal_emit(GTK_OBJECT(gnome_windowlist[wid].win), gtk_signal_emit(GTK_OBJECT(gnome_windowlist[wid].win),
+1
View File
@@ -18,6 +18,7 @@ struct _GHackMenuItem {
CHAR_P accelerator; CHAR_P accelerator;
CHAR_P group_accel; CHAR_P group_accel;
int attr; int attr;
unsigned itemflags;
const char *str; const char *str;
BOOLEAN_P presel; BOOLEAN_P presel;
}; };
+8 -1
View File
@@ -1773,7 +1773,10 @@ char acc; /* group accelerator, 0 => all */
tty_menu_item *curr; tty_menu_item *curr;
int n; int n;
for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) for (n = 0, curr = page_start; curr != page_end; n++, curr = curr->next) {
if ((curr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
continue;
if (curr->identifier.a_void && (acc == 0 || curr->gselector == acc)) { if (curr->identifier.a_void && (acc == 0 || curr->gselector == acc)) {
if (curr->selected) { if (curr->selected) {
curr->selected = FALSE; curr->selected = FALSE;
@@ -1782,6 +1785,7 @@ char acc; /* group accelerator, 0 => all */
curr->selected = TRUE; curr->selected = TRUE;
set_item_state(window, n, curr); set_item_state(window, n, curr);
} }
}
} }
/* /*
@@ -1801,6 +1805,9 @@ char acc; /* group accelerator, 0 => all */
/* invert the rest */ /* invert the rest */
for (on_curr_page = FALSE, curr = cw->mlist; curr; curr = curr->next) { for (on_curr_page = FALSE, curr = cw->mlist; curr; curr = curr->next) {
if ((curr->itemflags & MENU_ITEMFLAGS_SKIPINVERT) != 0)
continue;
if (curr == page_start) if (curr == page_start)
on_curr_page = TRUE; on_curr_page = TRUE;
else if (curr == page_end) else if (curr == page_end)
+4 -2
View File
@@ -1306,7 +1306,8 @@ onListChar(HWND hWnd, HWND hwndList, WORD ch)
if (data->how == PICK_ANY) { if (data->how == PICK_ANY) {
reset_menu_count(hwndList, data); reset_menu_count(hwndList, data);
for (i = 0; i < data->menu.size; i++) { for (i = 0; i < data->menu.size; i++) {
SelectMenuItem(hwndList, data, i, if (!(data->menu.items[i].itemflags & MENU_ITEMFLAGS_SKIPINVERT))
SelectMenuItem(hwndList, data, i,
NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 NHMENU_IS_SELECTED(data->menu.items[i]) ? 0
: -1); : -1);
} }
@@ -1353,7 +1354,8 @@ onListChar(HWND hWnd, HWND hwndList, WORD ch)
from = max(0, topIndex); from = max(0, topIndex);
to = min(data->menu.size, from + pageSize); to = min(data->menu.size, from + pageSize);
for (i = from; i < to; i++) { for (i = from; i < to; i++) {
SelectMenuItem(hwndList, data, i, if (!(data->menu.items[i].itemflags & MENU_ITEMFLAGS_SKIPINVERT))
SelectMenuItem(hwndList, data, i,
NHMENU_IS_SELECTED(data->menu.items[i]) ? 0 NHMENU_IS_SELECTED(data->menu.items[i]) ? 0
: -1); : -1);
} }