From 4c7ecb60247a0e0d84442e506ae5122204ffb328 Mon Sep 17 00:00:00 2001 From: TriKriSta Date: Thu, 30 May 2019 16:30:31 +0300 Subject: [PATCH] feat: remove part messages from chat --- src/chatlog/chatlog.cpp | 22 ++++++++++++++++ src/chatlog/chatlog.h | 2 ++ src/widget/form/genericchatform.cpp | 39 +++++++++++++++++++++++++++-- src/widget/form/genericchatform.h | 6 +++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/src/chatlog/chatlog.cpp b/src/chatlog/chatlog.cpp index 0d1063cac..1d8edd5e3 100644 --- a/src/chatlog/chatlog.cpp +++ b/src/chatlog/chatlog.cpp @@ -688,6 +688,28 @@ void ChatLog::reloadTheme() } } +void ChatLog::removeFirsts(const int num) +{ + if (lines.size() > num) { + lines.erase(lines.begin(), lines.begin()+num); + } else { + lines.clear(); + } + + for (int i = 0; i < lines.size(); ++i) { + lines[i]->setRow(i); + } +} + +void ChatLog::removeLasts(const int num) +{ + if (lines.size() > num) { + lines.erase(lines.end()-num, lines.end()); + } else { + lines.clear(); + } +} + void ChatLog::forceRelayout() { startResizeWorker(); diff --git a/src/chatlog/chatlog.h b/src/chatlog/chatlog.h index 403ecce53..133a896ed 100644 --- a/src/chatlog/chatlog.h +++ b/src/chatlog/chatlog.h @@ -56,6 +56,8 @@ public: void selectAll(); void fontChanged(const QFont& font); void reloadTheme(); + void removeFirsts(const int num); + void removeLasts(const int num); QString getSelectedText() const; diff --git a/src/widget/form/genericchatform.cpp b/src/widget/form/genericchatform.cpp index 65b5384af..2c59c8846 100644 --- a/src/widget/form/genericchatform.cpp +++ b/src/widget/form/genericchatform.cpp @@ -670,7 +670,13 @@ void GenericChatForm::loadHistoryTo(const QDateTime &time) { auto end = ChatLogIdx(0); if (time.isNull()) { - end = messages.begin()->first; + if (messages.size() + 100 >= maxMessages) { + end = ChatLogIdx(messages.rbegin()->first.get() - 100); + chatWidget->removeLasts(100); + removeLastsMessages(100); + } else { + end = messages.begin()->first; + } } else { end = firstItemAfterDate(time.date(), chatLog); } @@ -687,7 +693,14 @@ void GenericChatForm::loadHistoryFrom(const QDateTime &time) { auto begin = ChatLogIdx(0); if (time.isNull()) { - begin = messages.rbegin()->first; + if (messages.size() + 100 >= maxMessages) { + begin = ChatLogIdx(messages.rbegin()->first.get() + 100); + chatWidget->removeFirsts(100); + removeFirstsMessages(100); + } else { + begin = messages.rbegin()->first; + } + } else { begin = firstItemAfterDate(time.date(), chatLog); } @@ -700,6 +713,24 @@ void GenericChatForm::loadHistoryFrom(const QDateTime &time) renderMessages(begin, end); } +void GenericChatForm::removeFirstsMessages(const int num) +{ + if (messages.size() > num) { + messages.erase(messages.begin(), std::next(messages.begin(), num)); + } else { + messages.clear(); + } +} + +void GenericChatForm::removeLastsMessages(const int num) +{ + if (messages.size() > 100) { + messages.erase(std::next(messages.end(), -100), messages.end()); + } else { + messages.clear(); + } +} + void GenericChatForm::disableSearchText() { @@ -993,6 +1024,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); } diff --git a/src/widget/form/genericchatform.h b/src/widget/form/genericchatform.h index 6d2a17990..aa4935a16 100644 --- a/src/widget/form/genericchatform.h +++ b/src/widget/form/genericchatform.h @@ -138,6 +138,8 @@ private: void loadHistory(const QDateTime& time, const LoadHistoryDialog::LoadType type); void loadHistoryTo(const QDateTime& time); void loadHistoryFrom(const QDateTime& time); + void removeFirstsMessages(const int num); + void removeLastsMessages(const int num); protected: ChatMessage::Ptr createMessage(const ToxPk& author, const QString& message, @@ -199,6 +201,10 @@ protected: SearchPos searchPos; std::map messages; bool colorizeNames = false; + +private: + const int maxMessages{300}; + const int optimalRemove{50}; }; #endif // GENERICCHATFORM_H