1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

fix(chatlog): fix stick to bottom behavior

This commit fixes the behavior when a message is received while the
chatlog is scrolled to the bottom. With this change, the chatlog will
stick to the bottom when it is scrolled all the way down. If it is
somewhere in the middle (e.g. for search) the chatlog will not change
its position.
This commit is contained in:
sudden6 2020-03-01 03:12:40 +01:00
parent 0b5f751104
commit f2fa601073
No known key found for this signature in database
GPG Key ID: 279509B499E032B9
2 changed files with 15 additions and 15 deletions

View File

@ -407,10 +407,9 @@ void ChatLog::insertChatlineAtBottom(const QList<ChatLine::Ptr>& newLines)
layout(lines.last()->getRow(), lines.size(), useableWidth()); layout(lines.last()->getRow(), lines.size(), useableWidth());
if (visibleLines.size() > 1) { // redo layout only when scrolled down
startResizeWorker(visibleLines[1]); if(stickToBottom()) {
} else { startResizeWorker(true);
startResizeWorker();
} }
} }
@ -463,9 +462,9 @@ void ChatLog::insertChatlinesOnTop(const QList<ChatLine::Ptr>& newLines)
// redo layout // redo layout
if (visibleLines.size() > 1) { if (visibleLines.size() > 1) {
startResizeWorker(visibleLines[1]); startResizeWorker(stickToBottom(), visibleLines[1]);
} else { } else {
startResizeWorker(); startResizeWorker(stickToBottom());
} }
} }
@ -481,7 +480,7 @@ void ChatLog::scrollToBottom()
verticalScrollBar()->setValue(verticalScrollBar()->maximum()); verticalScrollBar()->setValue(verticalScrollBar()->maximum());
} }
void ChatLog::startResizeWorker(ChatLine::Ptr anchorLine) void ChatLog::startResizeWorker(bool stick, ChatLine::Ptr anchorLine)
{ {
if (lines.empty()) { if (lines.empty()) {
isScroll = true; isScroll = true;
@ -491,11 +490,11 @@ void ChatLog::startResizeWorker(ChatLine::Ptr anchorLine)
// (re)start the worker // (re)start the worker
if (!workerTimer->isActive()) { if (!workerTimer->isActive()) {
// these values must not be reevaluated while the worker is running // these values must not be reevaluated while the worker is running
if (anchorLine) { workerStb = stick;
workerAnchorLine = anchorLine; if (stick) {
workerStb = false; workerAnchorLine = ChatLine::Ptr();
} else { } else {
workerStb = stickToBottom(); workerAnchorLine = anchorLine;
} }
} }
@ -765,7 +764,7 @@ int ChatLog::getNumRemove() const
void ChatLog::forceRelayout() void ChatLog::forceRelayout()
{ {
startResizeWorker(); startResizeWorker(stickToBottom());
} }
void ChatLog::checkVisibility(bool causedWheelEvent) void ChatLog::checkVisibility(bool causedWheelEvent)
@ -834,7 +833,7 @@ void ChatLog::resizeEvent(QResizeEvent* ev)
bool stb = stickToBottom(); bool stb = stickToBottom();
if (ev->size().width() != ev->oldSize().width()) { if (ev->size().width() != ev->oldSize().width()) {
startResizeWorker(); startResizeWorker(stb);
stb = false; // let the resize worker handle it stb = false; // let the resize worker handle it
} }
@ -901,8 +900,9 @@ QRectF ChatLog::calculateSceneRect() const
{ {
qreal bottom = (lines.empty() ? 0.0 : lines.last()->sceneBoundingRect().bottom()); qreal bottom = (lines.empty() ? 0.0 : lines.last()->sceneBoundingRect().bottom());
if (typingNotification.get() != nullptr) if (typingNotification.get() != nullptr) {
bottom += typingNotification->sceneBoundingRect().height() + lineSpacing; bottom += typingNotification->sceneBoundingRect().height() + lineSpacing;
}
return QRectF(-margins.left(), -margins.top(), useableWidth(), return QRectF(-margins.left(), -margins.top(), useableWidth(),
bottom + margins.bottom() + margins.top()); bottom + margins.bottom() + margins.top());

View File

@ -105,7 +105,7 @@ protected:
void updateSceneRect(); void updateSceneRect();
void checkVisibility(bool causedWheelEvent = false); void checkVisibility(bool causedWheelEvent = false);
void scrollToBottom(); void scrollToBottom();
void startResizeWorker(ChatLine::Ptr anchorLine = nullptr); void startResizeWorker(bool stick, ChatLine::Ptr anchorLine = nullptr);
virtual void mouseDoubleClickEvent(QMouseEvent* ev) final override; virtual void mouseDoubleClickEvent(QMouseEvent* ev) final override;
virtual void mousePressEvent(QMouseEvent* ev) final override; virtual void mousePressEvent(QMouseEvent* ev) final override;