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

revert(chatlog): "edit load history when scrolling"

This reverts commit 0a9e72020e.
This commit is contained in:
Anthony Bilinski 2020-04-04 22:54:45 -07:00
parent bd0ef5de82
commit 8f167f45a3
No known key found for this signature in database
GPG Key ID: 2AA8E0DA1B31FB3C
6 changed files with 42 additions and 94 deletions

View File

@ -366,7 +366,6 @@ void ChatLog::reposition(int start, int end, qreal deltaY)
void ChatLog::insertChatlineAtBottom(ChatLine::Ptr l) void ChatLog::insertChatlineAtBottom(ChatLine::Ptr l)
{ {
numRemove = 0;
if (!l.get()) if (!l.get())
return; return;
@ -390,14 +389,9 @@ void ChatLog::insertChatlineAtBottom(ChatLine::Ptr l)
void ChatLog::insertChatlineAtBottom(const QList<ChatLine::Ptr>& newLines) void ChatLog::insertChatlineAtBottom(const QList<ChatLine::Ptr>& newLines)
{ {
numRemove = 0;
if (newLines.isEmpty()) if (newLines.isEmpty())
return; return;
if (lines.size() + DEF_NUM_MSG_TO_LOAD >= maxMessages) {
removeFirsts(DEF_NUM_MSG_TO_LOAD);
}
for (ChatLine::Ptr l : newLines) { for (ChatLine::Ptr l : newLines) {
l->setRow(lines.size()); l->setRow(lines.size());
l->addToScene(scene); l->addToScene(scene);
@ -406,17 +400,11 @@ void ChatLog::insertChatlineAtBottom(const QList<ChatLine::Ptr>& newLines)
} }
layout(lines.last()->getRow(), lines.size(), useableWidth()); layout(lines.last()->getRow(), lines.size(), useableWidth());
startResizeWorker();
if (visibleLines.size() > 1) {
startResizeWorker(visibleLines[1]);
} else {
startResizeWorker();
}
} }
void ChatLog::insertChatlineOnTop(ChatLine::Ptr l) void ChatLog::insertChatlineOnTop(ChatLine::Ptr l)
{ {
numRemove = 0;
if (!l.get()) if (!l.get())
return; return;
@ -425,7 +413,6 @@ void ChatLog::insertChatlineOnTop(ChatLine::Ptr l)
void ChatLog::insertChatlinesOnTop(const QList<ChatLine::Ptr>& newLines) void ChatLog::insertChatlinesOnTop(const QList<ChatLine::Ptr>& newLines)
{ {
numRemove = 0;
if (newLines.isEmpty()) if (newLines.isEmpty())
return; return;
@ -445,10 +432,6 @@ void ChatLog::insertChatlinesOnTop(const QList<ChatLine::Ptr>& newLines)
combLines.push_back(l); combLines.push_back(l);
} }
if (lines.size() + DEF_NUM_MSG_TO_LOAD >= maxMessages) {
removeLasts(DEF_NUM_MSG_TO_LOAD);
}
// add the old lines // add the old lines
for (ChatLine::Ptr l : lines) { for (ChatLine::Ptr l : lines) {
l->setRow(i++); l->setRow(i++);
@ -462,12 +445,7 @@ void ChatLog::insertChatlinesOnTop(const QList<ChatLine::Ptr>& newLines)
scene->setItemIndexMethod(oldIndexMeth); scene->setItemIndexMethod(oldIndexMeth);
// redo layout // redo layout
if (visibleLines.size() > 1) { startResizeWorker();
startResizeWorker(visibleLines[1]);
} else {
startResizeWorker();
}
} }
bool ChatLog::stickToBottom() const bool ChatLog::stickToBottom() const
@ -481,22 +459,19 @@ void ChatLog::scrollToBottom()
verticalScrollBar()->setValue(verticalScrollBar()->maximum()); verticalScrollBar()->setValue(verticalScrollBar()->maximum());
} }
void ChatLog::startResizeWorker(ChatLine::Ptr anchorLine) void ChatLog::startResizeWorker()
{ {
if (lines.empty()) { if (lines.empty()) {
isScroll = true;
return; return;
} }
// (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 = stickToBottom();
workerAnchorLine = anchorLine;
workerStb = false; if (!visibleLines.empty())
} else { workerAnchorLine = visibleLines.first();
workerStb = stickToBottom();
}
} }
// switch to busy scene displaying the busy notification if there is a lot // 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()) if (!line.get())
return; return;
if (workerTimer->isActive()) { updateSceneRect();
workerAnchorLine = line; verticalScrollBar()->setValue(line->sceneBoundingRect().top());
workerStb = false;
} else {
updateSceneRect();
verticalScrollBar()->setValue(line->sceneBoundingRect().top()); // NOTE: start here
}
} }
void ChatLog::selectAll() void ChatLog::selectAll()
@ -731,7 +701,6 @@ void ChatLog::removeFirsts(const int num)
{ {
if (lines.size() > num) { if (lines.size() > num) {
lines.erase(lines.begin(), lines.begin()+num); lines.erase(lines.begin(), lines.begin()+num);
numRemove = num;
} else { } else {
lines.clear(); lines.clear();
} }
@ -747,22 +716,11 @@ void ChatLog::removeLasts(const int num)
{ {
if (lines.size() > num) { if (lines.size() > num) {
lines.erase(lines.end()-num, lines.end()); lines.erase(lines.end()-num, lines.end());
numRemove = num;
} else { } else {
lines.clear(); lines.clear();
} }
} }
void ChatLog::setScroll(const bool scroll)
{
isScroll = scroll;
}
int ChatLog::getNumRemove() const
{
return numRemove;
}
void ChatLog::forceRelayout() void ChatLog::forceRelayout()
{ {
startResizeWorker(); startResizeWorker();
@ -815,7 +773,6 @@ void ChatLog::checkVisibility(bool causedWheelEvent)
} }
if (causedWheelEvent) { if (causedWheelEvent) {
qDebug() << "causedWheelEvent";
if (lowerBound != lines.cend() && lowerBound->get()->row == 0) { if (lowerBound != lines.cend() && lowerBound->get()->row == 0) {
emit loadHistoryLower(); emit loadHistoryLower();
} else if (upperBound == lines.cend()) { } else if (upperBound == lines.cend()) {
@ -959,7 +916,6 @@ void ChatLog::onWorkerTimeout()
// hidden during busy screen // hidden during busy screen
verticalScrollBar()->show(); verticalScrollBar()->show();
isScroll = true;
emit workerTimeoutFinished(); emit workerTimeoutFinished();
} }
} }
@ -1027,10 +983,6 @@ void ChatLog::focusOutEvent(QFocusEvent* ev)
void ChatLog::wheelEvent(QWheelEvent *event) void ChatLog::wheelEvent(QWheelEvent *event)
{ {
if (!isScroll) {
return;
}
QGraphicsView::wheelEvent(event); QGraphicsView::wheelEvent(event);
checkVisibility(true); checkVisibility(true);
} }

View File

@ -35,8 +35,6 @@ class QTimer;
class ChatLineContent; class ChatLineContent;
struct ToxFile; struct ToxFile;
static const auto DEF_NUM_MSG_TO_LOAD = 100;
class ChatLog : public QGraphicsView class ChatLog : public QGraphicsView
{ {
Q_OBJECT Q_OBJECT
@ -60,8 +58,6 @@ public:
void reloadTheme(); void reloadTheme();
void removeFirsts(const int num); void removeFirsts(const int num);
void removeLasts(const int num); void removeLasts(const int num);
void setScroll(const bool scroll);
int getNumRemove() const;
QString getSelectedText() const; QString getSelectedText() const;
@ -105,7 +101,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();
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;
@ -175,7 +171,6 @@ private:
int clickCount = 0; int clickCount = 0;
QPoint lastClickPos; QPoint lastClickPos;
Qt::MouseButton lastClickButton; Qt::MouseButton lastClickButton;
bool isScroll{true};
// worker vars // worker vars
int workerLastIndex = 0; int workerLastIndex = 0;
@ -185,9 +180,6 @@ private:
// layout // layout
QMargins margins = QMargins(10, 10, 10, 10); QMargins margins = QMargins(10, 10, 10, 10);
qreal lineSpacing = 5.0f; qreal lineSpacing = 5.0f;
int numRemove{0};
const int maxMessages{300};
}; };
#endif // CHATLOG_H #endif // CHATLOG_H

View File

@ -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 // 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 // state of the message has to be marked according to our dispatch state
constexpr auto defaultNumMessagesToLoad = 100; auto firstChatLogIdx = sessionChatLog.getFirstIdx().get() < DEF_NUM_MSG_TO_LOAD
auto firstChatLogIdx = sessionChatLog.getFirstIdx().get() < defaultNumMessagesToLoad
? ChatLogIdx(0) ? ChatLogIdx(0)
: sessionChatLog.getFirstIdx() - defaultNumMessagesToLoad; : sessionChatLog.getFirstIdx() - DEF_NUM_MSG_TO_LOAD;
if (canUseHistory()) { if (canUseHistory()) {
loadHistoryIntoSessionChatLog(firstChatLogIdx); loadHistoryIntoSessionChatLog(firstChatLogIdx);

View File

@ -35,6 +35,8 @@
#include <cassert> #include <cassert>
static const auto DEF_NUM_MSG_TO_LOAD = 100;
using ChatLogIdx = using ChatLogIdx =
NamedType<size_t, struct ChatLogIdxTag, Orderable, UnderlyingAddable, UnitlessDifferencable, Incrementable>; NamedType<size_t, struct ChatLogIdxTag, Orderable, UnderlyingAddable, UnitlessDifferencable, Incrementable>;
Q_DECLARE_METATYPE(ChatLogIdx); Q_DECLARE_METATYPE(ChatLogIdx);

View File

@ -53,8 +53,6 @@
#include <QStringBuilder> #include <QStringBuilder>
#include <QtGlobal> #include <QtGlobal>
#include <QDebug>
#ifdef SPELL_CHECKING #ifdef SPELL_CHECKING
#include <KF5/SonnetUi/sonnet/spellcheckdecorator.h> #include <KF5/SonnetUi/sonnet/spellcheckdecorator.h>
#endif #endif
@ -657,7 +655,6 @@ void GenericChatForm::loadHistory(const QDateTime &time, const LoadHistoryDialog
if (type == LoadHistoryDialog::from) { if (type == LoadHistoryDialog::from) {
loadHistoryFrom(time); loadHistoryFrom(time);
auto msg = messages.cbegin()->second; auto msg = messages.cbegin()->second;
chatWidget->setScroll(true);
chatWidget->scrollToLine(msg); chatWidget->scrollToLine(msg);
} else { } else {
loadHistoryTo(time); loadHistoryTo(time);
@ -666,10 +663,15 @@ void GenericChatForm::loadHistory(const QDateTime &time, const LoadHistoryDialog
void GenericChatForm::loadHistoryTo(const QDateTime &time) void GenericChatForm::loadHistoryTo(const QDateTime &time)
{ {
chatWidget->setScroll(false);
auto end = ChatLogIdx(0); auto end = ChatLogIdx(0);
if (time.isNull()) { 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 { } else {
end = firstItemAfterDate(time.date(), chatLog); end = firstItemAfterDate(time.date(), chatLog);
} }
@ -679,27 +681,28 @@ void GenericChatForm::loadHistoryTo(const QDateTime &time)
begin = ChatLogIdx(end.get() - DEF_NUM_MSG_TO_LOAD); begin = ChatLogIdx(end.get() - DEF_NUM_MSG_TO_LOAD);
} }
if (begin != end) { renderMessages(begin, end);
renderMessages(begin, end);
} else {
chatWidget->setScroll(true);
}
} }
void GenericChatForm::loadHistoryFrom(const QDateTime &time) void GenericChatForm::loadHistoryFrom(const QDateTime &time)
{ {
chatWidget->setScroll(false);
auto begin = ChatLogIdx(0); auto begin = ChatLogIdx(0);
if (time.isNull()) { 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 { } else {
begin = firstItemAfterDate(time.date(), chatLog); begin = firstItemAfterDate(time.date(), chatLog);
} }
int add = DEF_NUM_MSG_TO_LOAD; int add = DEF_NUM_MSG_TO_LOAD;
if (begin.get() + DEF_NUM_MSG_TO_LOAD > chatLog.getNextIdx().get()) { if (begin.get() + DEF_NUM_MSG_TO_LOAD > chatLog.getNextIdx().get()) {
auto aTest = chatLog.getNextIdx().get(); add = chatLog.getNextIdx().get() - (begin.get() + DEF_NUM_MSG_TO_LOAD);
add = chatLog.getNextIdx().get() - begin.get();
} }
auto end = ChatLogIdx(begin.get() + add); auto end = ChatLogIdx(begin.get() + add);
renderMessages(begin, end); renderMessages(begin, end);
@ -1015,6 +1018,10 @@ void GenericChatForm::handleSearchResult(SearchResult result, SearchDirection di
void GenericChatForm::renderMessage(ChatLogIdx idx) void GenericChatForm::renderMessage(ChatLogIdx idx)
{ {
if (chatWidget->getLines().size() >= maxMessages) {
chatWidget->removeFirsts(optimalRemove);
removeFirstsMessages(optimalRemove);
}
renderMessages(idx, idx + 1); renderMessages(idx, idx + 1);
} }
@ -1041,13 +1048,8 @@ void GenericChatForm::renderMessages(ChatLogIdx begin, ChatLogIdx end,
} }
} }
if (beforeLines.isEmpty() && afterLines.isEmpty()) { for (auto const& line : afterLines) {
chatWidget->setScroll(true); chatWidget->insertChatlineAtBottom(line);
}
chatWidget->insertChatlineAtBottom(afterLines);
if (chatWidget->getNumRemove()) {
removeFirstsMessages(chatWidget->getNumRemove());
} }
if (!beforeLines.empty()) { if (!beforeLines.empty()) {
@ -1064,9 +1066,6 @@ void GenericChatForm::renderMessages(ChatLogIdx begin, ChatLogIdx end,
} }
chatWidget->insertChatlinesOnTop(beforeLines); chatWidget->insertChatlinesOnTop(beforeLines);
if (chatWidget->getNumRemove()) {
removeLastsMessages(chatWidget->getNumRemove());
}
} else if (onCompletion) { } else if (onCompletion) {
onCompletion(); onCompletion();
} }
@ -1076,7 +1075,7 @@ void GenericChatForm::goToCurrentDate()
{ {
chatWidget->clear(); chatWidget->clear();
messages.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); auto begin = end.get() > DEF_NUM_MSG_TO_LOAD ? ChatLogIdx(end.get() - DEF_NUM_MSG_TO_LOAD) : ChatLogIdx(0);
renderMessages(begin, end); renderMessages(begin, end);

View File

@ -199,6 +199,10 @@ protected:
SearchPos searchPos; SearchPos searchPos;
std::map<ChatLogIdx, ChatMessage::Ptr> messages; std::map<ChatLogIdx, ChatMessage::Ptr> messages;
bool colorizeNames = false; bool colorizeNames = false;
private:
const int maxMessages{300};
const int optimalRemove{50};
}; };
#endif // GENERICCHATFORM_H #endif // GENERICCHATFORM_H