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.
This commit is contained in:
@@ -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 <return>, the text
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user