From 69dd0485fb3b61bc0a642a75237a652873eadfa4 Mon Sep 17 00:00:00 2001 From: PatR Date: Sun, 29 Nov 2020 16:58:56 -0800 Subject: [PATCH] Qt message window: horizontal scrolling Multiple stints of flailing about without a clue finally led to a breakthrough. When writing a new message to the multi-line message window, force the view back to showing the starts of lines if player has scrolled it to the side and left it that way. Put another way, if it has been scrolled to the right, scroll it as far as possible back to the left. --- doc/fixes37.0 | 4 +++- win/Qt/qt_msg.cpp | 18 ++++++++++++++++-- win/Qt/qt_msg.h | 7 ++++--- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/doc/fixes37.0 b/doc/fixes37.0 index c5e5d77be..392ff76e2 100644 --- a/doc/fixes37.0 +++ b/doc/fixes37.0 @@ -1,4 +1,4 @@ -NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.366 $ $NHDT-Date: 1606504240 2020/11/27 19:10:40 $ +NHDT-Branch: NetHack-3.7 $:$NHDT-Revision: 1.367 $ $NHDT-Date: 1606697932 2020/11/30 00:58:52 $ General Fixes and Modified Features ----------------------------------- @@ -500,6 +500,8 @@ Qt: don't clobber an existing save file after choosing "new game" in the saved game selection widget Qt: don't get stuck in a loop after choosing "play" while the character name field is empty in the character selection widget +Qt: when a new message is issued, pan the message window to its left edge if + player panned it horizontally then didn't manually scroll it back Qt: {maybe just Qt+OSX:} when viewing a text window ('V' to look at 'history' for instance), clicking on [Search], entering a search target in the resulting popup and clicking on [Okay] or typing , the text diff --git a/win/Qt/qt_msg.cpp b/win/Qt/qt_msg.cpp index c9c3537b8..66fd93dae 100644 --- a/win/Qt/qt_msg.cpp +++ b/win/Qt/qt_msg.cpp @@ -23,9 +23,12 @@ extern "C" { namespace nethack_qt_ { NetHackQtMessageWindow::NetHackQtMessageWindow() : - list(new QListWidget()) + list(new QListWidget()), + scrollarea(new QScrollArea()) { list->setFocusPolicy(Qt::NoFocus); + scrollarea->setFocusPolicy(Qt::NoFocus); + scrollarea->takeWidget(); ::iflags.window_inited = 1; map = 0; currgetmsg = 0; @@ -39,7 +42,9 @@ NetHackQtMessageWindow::~NetHackQtMessageWindow() delete list; } -QWidget* NetHackQtMessageWindow::Widget() { return list; } +QWidget* NetHackQtMessageWindow::Widget() { + return list; +} void NetHackQtMessageWindow::setMap(NetHackQtMapWindow2* m) { @@ -152,6 +157,8 @@ void NetHackQtMessageWindow::PutStr(int attr, const QString& text) item->setBackground(bg); } } +#else + nhUse(attr); #endif if (list->count() >= (int) ::iflags.msg_history) @@ -163,6 +170,13 @@ void NetHackQtMessageWindow::PutStr(int attr, const QString& text) // selects most recent message, which causes it to be highlighted list->setCurrentRow(list->count() - 1); + // if message window has been scrolled right, force back to left edge + QScrollBar *sb = list->horizontalScrollBar(); + if (sb && sb->value() > 0) { + sb->setValue(0); + this->viewport()->update(); + } + if (map) map->putMessage(attr, text2); } diff --git a/win/Qt/qt_msg.h b/win/Qt/qt_msg.h index ca84acaf5..b3274bc13 100644 --- a/win/Qt/qt_msg.h +++ b/win/Qt/qt_msg.h @@ -13,7 +13,7 @@ namespace nethack_qt_ { class NetHackQtMapWindow2; -class NetHackQtMessageWindow : QObject, public NetHackQtWindow { +class NetHackQtMessageWindow : QScrollArea, public NetHackQtWindow { Q_OBJECT public: NetHackQtMessageWindow(); @@ -37,8 +37,9 @@ public: void AddToStr(const char *answerbuf); private: - QListWidget* list; - bool changed; + QListWidget *list; + QScrollArea *scrollarea; + bool changed; int currgetmsg; NetHackQtMapWindow2* map;