diff --git a/src/chatlog/chatlog.cpp b/src/chatlog/chatlog.cpp index 45f40fff2..e7fe8237c 100644 --- a/src/chatlog/chatlog.cpp +++ b/src/chatlog/chatlog.cpp @@ -366,7 +366,6 @@ void ChatLog::reposition(int start, int end, qreal deltaY) void ChatLog::insertChatlineAtBottom(ChatLine::Ptr l) { - numRemove = 0; if (!l.get()) return; @@ -390,14 +389,9 @@ void ChatLog::insertChatlineAtBottom(ChatLine::Ptr l) void ChatLog::insertChatlineAtBottom(const QList& newLines) { - numRemove = 0; if (newLines.isEmpty()) return; - if (lines.size() + DEF_NUM_MSG_TO_LOAD >= maxMessages) { - removeFirsts(DEF_NUM_MSG_TO_LOAD); - } - for (ChatLine::Ptr l : newLines) { l->setRow(lines.size()); l->addToScene(scene); @@ -406,17 +400,11 @@ void ChatLog::insertChatlineAtBottom(const QList& newLines) } layout(lines.last()->getRow(), lines.size(), useableWidth()); - - if (visibleLines.size() > 1) { - startResizeWorker(visibleLines[1]); - } else { - startResizeWorker(); - } + startResizeWorker(); } void ChatLog::insertChatlineOnTop(ChatLine::Ptr l) { - numRemove = 0; if (!l.get()) return; @@ -425,7 +413,6 @@ void ChatLog::insertChatlineOnTop(ChatLine::Ptr l) void ChatLog::insertChatlinesOnTop(const QList& newLines) { - numRemove = 0; if (newLines.isEmpty()) return; @@ -445,10 +432,6 @@ void ChatLog::insertChatlinesOnTop(const QList& newLines) combLines.push_back(l); } - if (lines.size() + DEF_NUM_MSG_TO_LOAD >= maxMessages) { - removeLasts(DEF_NUM_MSG_TO_LOAD); - } - // add the old lines for (ChatLine::Ptr l : lines) { l->setRow(i++); @@ -462,12 +445,7 @@ void ChatLog::insertChatlinesOnTop(const QList& newLines) scene->setItemIndexMethod(oldIndexMeth); // redo layout - if (visibleLines.size() > 1) { - startResizeWorker(visibleLines[1]); - } else { - startResizeWorker(); - } - + startResizeWorker(); } bool ChatLog::stickToBottom() const @@ -481,22 +459,19 @@ void ChatLog::scrollToBottom() verticalScrollBar()->setValue(verticalScrollBar()->maximum()); } -void ChatLog::startResizeWorker(ChatLine::Ptr anchorLine) +void ChatLog::startResizeWorker() { if (lines.empty()) { - isScroll = true; return; } // (re)start the worker if (!workerTimer->isActive()) { // these values must not be reevaluated while the worker is running - if (anchorLine) { - workerAnchorLine = anchorLine; - workerStb = false; - } else { - workerStb = stickToBottom(); - } + workerStb = stickToBottom(); + + if (!visibleLines.empty()) + workerAnchorLine = visibleLines.first(); } // switch to busy scene displaying the busy notification if there is a lot @@ -683,13 +658,8 @@ void ChatLog::scrollToLine(ChatLine::Ptr line) if (!line.get()) return; - if (workerTimer->isActive()) { - workerAnchorLine = line; - workerStb = false; - } else { - updateSceneRect(); - verticalScrollBar()->setValue(line->sceneBoundingRect().top()); // NOTE: start here - } + updateSceneRect(); + verticalScrollBar()->setValue(line->sceneBoundingRect().top()); } void ChatLog::selectAll() @@ -731,7 +701,6 @@ void ChatLog::removeFirsts(const int num) { if (lines.size() > num) { lines.erase(lines.begin(), lines.begin()+num); - numRemove = num; } else { lines.clear(); } @@ -747,22 +716,11 @@ void ChatLog::removeLasts(const int num) { if (lines.size() > num) { lines.erase(lines.end()-num, lines.end()); - numRemove = num; } else { lines.clear(); } } -void ChatLog::setScroll(const bool scroll) -{ - isScroll = scroll; -} - -int ChatLog::getNumRemove() const -{ - return numRemove; -} - void ChatLog::forceRelayout() { startResizeWorker(); @@ -815,7 +773,6 @@ void ChatLog::checkVisibility(bool causedWheelEvent) } if (causedWheelEvent) { - qDebug() << "causedWheelEvent"; if (lowerBound != lines.cend() && lowerBound->get()->row == 0) { emit loadHistoryLower(); } else if (upperBound == lines.cend()) { @@ -959,7 +916,6 @@ void ChatLog::onWorkerTimeout() // hidden during busy screen verticalScrollBar()->show(); - isScroll = true; emit workerTimeoutFinished(); } } @@ -1027,10 +983,6 @@ void ChatLog::focusOutEvent(QFocusEvent* ev) void ChatLog::wheelEvent(QWheelEvent *event) { - if (!isScroll) { - return; - } - QGraphicsView::wheelEvent(event); checkVisibility(true); } diff --git a/src/chatlog/chatlog.h b/src/chatlog/chatlog.h index 4b6ae1721..31ae1048a 100644 --- a/src/chatlog/chatlog.h +++ b/src/chatlog/chatlog.h @@ -35,8 +35,6 @@ class QTimer; class ChatLineContent; struct ToxFile; -static const auto DEF_NUM_MSG_TO_LOAD = 100; - class ChatLog : public QGraphicsView { Q_OBJECT @@ -60,8 +58,6 @@ public: void reloadTheme(); void removeFirsts(const int num); void removeLasts(const int num); - void setScroll(const bool scroll); - int getNumRemove() const; QString getSelectedText() const; @@ -105,7 +101,7 @@ protected: void updateSceneRect(); void checkVisibility(bool causedWheelEvent = false); void scrollToBottom(); - void startResizeWorker(ChatLine::Ptr anchorLine = nullptr); + void startResizeWorker(); virtual void mouseDoubleClickEvent(QMouseEvent* ev) final override; virtual void mousePressEvent(QMouseEvent* ev) final override; @@ -175,7 +171,6 @@ private: int clickCount = 0; QPoint lastClickPos; Qt::MouseButton lastClickButton; - bool isScroll{true}; // worker vars int workerLastIndex = 0; @@ -185,9 +180,6 @@ private: // layout QMargins margins = QMargins(10, 10, 10, 10); qreal lineSpacing = 5.0f; - - int numRemove{0}; - const int maxMessages{300}; }; #endif // CHATLOG_H diff --git a/src/model/chathistory.cpp b/src/model/chathistory.cpp index 0b4585763..9aa75e98e 100644 --- a/src/model/chathistory.cpp +++ b/src/model/chathistory.cpp @@ -94,10 +94,9 @@ ChatHistory::ChatHistory(Friend& f_, History* history_, const ICoreIdHandler& co // NOTE: this has to be done _after_ sending all sent messages since initial // state of the message has to be marked according to our dispatch state - constexpr auto defaultNumMessagesToLoad = 100; - auto firstChatLogIdx = sessionChatLog.getFirstIdx().get() < defaultNumMessagesToLoad + auto firstChatLogIdx = sessionChatLog.getFirstIdx().get() < DEF_NUM_MSG_TO_LOAD ? ChatLogIdx(0) - : sessionChatLog.getFirstIdx() - defaultNumMessagesToLoad; + : sessionChatLog.getFirstIdx() - DEF_NUM_MSG_TO_LOAD; if (canUseHistory()) { loadHistoryIntoSessionChatLog(firstChatLogIdx); diff --git a/src/model/ichatlog.h b/src/model/ichatlog.h index 2144c2d0d..1438610d6 100644 --- a/src/model/ichatlog.h +++ b/src/model/ichatlog.h @@ -35,6 +35,8 @@ #include +static const auto DEF_NUM_MSG_TO_LOAD = 100; + using ChatLogIdx = NamedType; Q_DECLARE_METATYPE(ChatLogIdx); diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index 106f8e48b..315f4c8bf 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -53,8 +53,6 @@ #include #include -#include - #ifdef SPELL_CHECKING #include #endif @@ -657,7 +655,6 @@ void GenericChatForm::loadHistory(const QDateTime &time, const LoadHistoryDialog if (type == LoadHistoryDialog::from) { loadHistoryFrom(time); auto msg = messages.cbegin()->second; - chatWidget->setScroll(true); chatWidget->scrollToLine(msg); } else { loadHistoryTo(time); @@ -666,10 +663,15 @@ void GenericChatForm::loadHistory(const QDateTime &time, const LoadHistoryDialog void GenericChatForm::loadHistoryTo(const QDateTime &time) { - chatWidget->setScroll(false); auto end = ChatLogIdx(0); if (time.isNull()) { - end = messages.begin()->first; + if (messages.size() + DEF_NUM_MSG_TO_LOAD >= maxMessages) { + end = ChatLogIdx(messages.rbegin()->first.get() - DEF_NUM_MSG_TO_LOAD); + chatWidget->removeLasts(DEF_NUM_MSG_TO_LOAD); + removeLastsMessages(DEF_NUM_MSG_TO_LOAD); + } else { + end = messages.begin()->first; + } } else { end = firstItemAfterDate(time.date(), chatLog); } @@ -679,27 +681,28 @@ void GenericChatForm::loadHistoryTo(const QDateTime &time) begin = ChatLogIdx(end.get() - DEF_NUM_MSG_TO_LOAD); } - if (begin != end) { - renderMessages(begin, end); - } else { - chatWidget->setScroll(true); - } + renderMessages(begin, end); } void GenericChatForm::loadHistoryFrom(const QDateTime &time) { - chatWidget->setScroll(false); auto begin = ChatLogIdx(0); if (time.isNull()) { - begin = messages.rbegin()->first; + if (messages.size() + DEF_NUM_MSG_TO_LOAD >= maxMessages) { + begin = ChatLogIdx(messages.rbegin()->first.get() + DEF_NUM_MSG_TO_LOAD); + chatWidget->removeFirsts(DEF_NUM_MSG_TO_LOAD); + removeFirstsMessages(DEF_NUM_MSG_TO_LOAD); + } else { + begin = messages.rbegin()->first; + } + } else { begin = firstItemAfterDate(time.date(), chatLog); } int add = DEF_NUM_MSG_TO_LOAD; if (begin.get() + DEF_NUM_MSG_TO_LOAD > chatLog.getNextIdx().get()) { - auto aTest = chatLog.getNextIdx().get(); - add = chatLog.getNextIdx().get() - begin.get(); + add = chatLog.getNextIdx().get() - (begin.get() + DEF_NUM_MSG_TO_LOAD); } auto end = ChatLogIdx(begin.get() + add); renderMessages(begin, end); @@ -1015,6 +1018,10 @@ void GenericChatForm::handleSearchResult(SearchResult result, SearchDirection di void GenericChatForm::renderMessage(ChatLogIdx idx) { + if (chatWidget->getLines().size() >= maxMessages) { + chatWidget->removeFirsts(optimalRemove); + removeFirstsMessages(optimalRemove); + } renderMessages(idx, idx + 1); } @@ -1041,13 +1048,8 @@ void GenericChatForm::renderMessages(ChatLogIdx begin, ChatLogIdx end, } } - if (beforeLines.isEmpty() && afterLines.isEmpty()) { - chatWidget->setScroll(true); - } - - chatWidget->insertChatlineAtBottom(afterLines); - if (chatWidget->getNumRemove()) { - removeFirstsMessages(chatWidget->getNumRemove()); + for (auto const& line : afterLines) { + chatWidget->insertChatlineAtBottom(line); } if (!beforeLines.empty()) { @@ -1064,9 +1066,6 @@ void GenericChatForm::renderMessages(ChatLogIdx begin, ChatLogIdx end, } chatWidget->insertChatlinesOnTop(beforeLines); - if (chatWidget->getNumRemove()) { - removeLastsMessages(chatWidget->getNumRemove()); - } } else if (onCompletion) { onCompletion(); } @@ -1076,7 +1075,7 @@ void GenericChatForm::goToCurrentDate() { chatWidget->clear(); messages.clear(); - auto end = ChatLogIdx(chatLog.size()); + auto end = ChatLogIdx(chatLog.size() - 1); auto begin = end.get() > DEF_NUM_MSG_TO_LOAD ? ChatLogIdx(end.get() - DEF_NUM_MSG_TO_LOAD) : ChatLogIdx(0); renderMessages(begin, end); diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index 7fe3867d8..34623abca 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -199,6 +199,10 @@ protected: SearchPos searchPos; std::map messages; bool colorizeNames = false; + +private: + const int maxMessages{300}; + const int optimalRemove{50}; }; #endif // GENERICCHATFORM_H