From 2a762ab641913466d0902f038f8019a4a2295f39 Mon Sep 17 00:00:00 2001 From: PatR Date: Mon, 31 Aug 2020 00:30:36 -0700 Subject: [PATCH] Qt prompt responses in message window When Qt issues a prompt string in the message window, update it with the player's response once that has been obtained. --- doc/fixes37.0 | 4 +++- win/Qt/qt_bind.cpp | 18 +++++++++++++++++- win/Qt/qt_msg.cpp | 15 ++++++++++++++- win/Qt/qt_msg.h | 2 ++ 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index d0d6e975f..b28eb8afc 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1,4 +1,4 @@ -NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.293 $ $NHDT-Date: 1598852985 2020/08/31 05:49:45 $ +NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.294 $ $NHDT-Date: 1598859031 2020/08/31 07:30:31 $ General Fixes and Modified Features ----------------------------------- @@ -394,6 +394,8 @@ Qt: menu choices All, None, Invert were setting, unsetting, or toggling menu entry checkboxes internally but didn't redraw the menu to show that Qt: fix the F1/F2/Tab macro keys to not require that number_pad be On Qt: unhighlight highlighted message (last one issued) after player has seen it +Qt: update message window's last message with player's response if it's a + prompt string for a single-character of input (ynaq or invent letter) Qt+QSX: fix control key Qt+OSX: rename menu entry "nethack->Preferences..." for invoking nethack's 'O' command to "Game->Run-time options" and entry "Game->Qt settings" diff --git a/win/Qt/qt_bind.cpp b/win/Qt/qt_bind.cpp index e6492aaea..76028c65a 100644 --- a/win/Qt/qt_bind.cpp +++ b/win/Qt/qt_bind.cpp @@ -524,7 +524,8 @@ int NetHackQtBind::qt_doprev_message() return 0; } -char NetHackQtBind::qt_yn_function(const char *question_, const char *choices, CHAR_P def) +char NetHackQtBind::qt_yn_function(const char *question_, + const char *choices, CHAR_P def) { QString question(QString::fromLatin1(question_)); QString message; @@ -548,6 +549,8 @@ char NetHackQtBind::qt_yn_function(const char *question_, const char *choices, C // Similar to X11 windowport `slow' feature. int result = -1; + char cbuf[40]; + cbuf[0] = '\0'; #ifdef USE_POPUPS if (choices) { @@ -575,21 +578,34 @@ char NetHackQtBind::qt_yn_function(const char *question_, const char *choices, C NetHackQtBind::qt_putstr(WIN_MESSAGE, ATR_BOLD, message); while (result < 0) { + cbuf[0] = '\0'; char ch=NetHackQtBind::qt_nhgetch(); if (ch=='\033') { result=yn_esc_map; + Strcpy(cbuf, "ESC"); } else if (choices && !strchr(choices,ch)) { if (def && (ch==' ' || ch=='\r' || ch=='\n')) { result=def; + Strcpy(cbuf, visctrl(def)); } else { NetHackQtBind::qt_nhbell(); // and try again... } } else { result=ch; + Strcpy(cbuf, (ch == ' ') ? "SPC" : visctrl(ch)); } } + // if answer was supplied via popup, it will already be appended + // to the prompt, so included above, and cbuf[] will be empty + if (cbuf[0]) { + NetHackQtWindow *window = id_to_window[WIN_MESSAGE]; + NetHackQtMessageWindow *mesgwin + = static_cast (window); + mesgwin->AddToStr(cbuf); + } + NetHackQtBind::qt_clear_nhwindow(WIN_MESSAGE); return result; diff --git a/win/Qt/qt_msg.cpp b/win/Qt/qt_msg.cpp index dcb643efb..abde5c179 100644 --- a/win/Qt/qt_msg.cpp +++ b/win/Qt/qt_msg.cpp @@ -62,7 +62,10 @@ void NetHackQtMessageWindow::Scroll(int dx UNUSED, int dy UNUSED) void NetHackQtMessageWindow::Clear() { - if ( map ) + if (list) + NetHackQtMessageWindow::unhighlight_mesgs(); + + if (map) map->clearMessages(); } @@ -146,6 +149,16 @@ void NetHackQtMessageWindow::PutStr(int attr, const QString& text) map->putMessage(attr, text2); } +// append the user's answer to a prompt message +void NetHackQtMessageWindow::AddToStr(const char *answer) +{ + if (list) { + QListWidgetItem *item = list->currentItem(); + if (item) + item->setText(item->text() + QString(" %1").arg(answer)); + } +} + // are there any highlighted messages? bool NetHackQtMessageWindow::hilit_mesgs() { diff --git a/win/Qt/qt_msg.h b/win/Qt/qt_msg.h index 1aa2b94c8..c3cd4275c 100644 --- a/win/Qt/qt_msg.h +++ b/win/Qt/qt_msg.h @@ -32,6 +32,8 @@ public: bool hilit_mesgs(); void unhighlight_mesgs(); + // for adding the answer for yn() to its prompt string + void AddToStr(const char *answerbuf); private: QListWidget* list;