Skip to content
This repository has been archived by the owner on Feb 12, 2023. It is now read-only.

Commit

Permalink
feat: remove part messages from chat
Browse files Browse the repository at this point in the history
  • Loading branch information
TriKriSta committed Jul 22, 2019
1 parent c2d5b42 commit 4c7ecb6
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 2 deletions.
22 changes: 22 additions & 0 deletions src/chatlog/chatlog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down
2 changes: 2 additions & 0 deletions src/chatlog/chatlog.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@ class ChatLog : public QGraphicsView
void selectAll();
void fontChanged(const QFont& font);
void reloadTheme();
void removeFirsts(const int num);
void removeLasts(const int num);

QString getSelectedText() const;

Expand Down
39 changes: 37 additions & 2 deletions src/widget/form/genericchatform.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand All @@ -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);
}
Expand All @@ -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()
{
Expand Down Expand Up @@ -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);
}

Expand Down
6 changes: 6 additions & 0 deletions src/widget/form/genericchatform.h
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ protected slots:
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,
Expand Down Expand Up @@ -199,6 +201,10 @@ protected slots:
SearchPos searchPos;
std::map<ChatLogIdx, ChatMessage::Ptr> messages;
bool colorizeNames = false;

private:
const int maxMessages{300};
const int optimalRemove{50};
};

#endif // GENERICCHATFORM_H

0 comments on commit 4c7ecb6

Please sign in to comment.