mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
feat: edit position chat after load history
This commit is contained in:
parent
2a9648d12c
commit
c2d5b422b3
|
@ -693,7 +693,7 @@ void ChatLog::forceRelayout()
|
|||
startResizeWorker();
|
||||
}
|
||||
|
||||
void ChatLog::checkVisibility(bool causedByScroll)
|
||||
void ChatLog::checkVisibility(bool causedWheelEvent)
|
||||
{
|
||||
if (lines.empty())
|
||||
return;
|
||||
|
@ -734,10 +734,10 @@ void ChatLog::checkVisibility(bool causedByScroll)
|
|||
emit firstVisibleLineChanged(visibleLines.at(0));
|
||||
}
|
||||
|
||||
if (causedByScroll) {
|
||||
if (causedWheelEvent) {
|
||||
if (lowerBound != lines.cend() && lowerBound->get()->row == 0) {
|
||||
emit loadHistoryLower();
|
||||
} else if (upperBound != lines.cend() && upperBound->get()->row >= lines.size() - 10) {
|
||||
} else if (upperBound == lines.cend()) {
|
||||
emit loadHistoryUpper();
|
||||
}
|
||||
}
|
||||
|
@ -746,7 +746,7 @@ void ChatLog::checkVisibility(bool causedByScroll)
|
|||
void ChatLog::scrollContentsBy(int dx, int dy)
|
||||
{
|
||||
QGraphicsView::scrollContentsBy(dx, dy);
|
||||
checkVisibility(true);
|
||||
checkVisibility();
|
||||
}
|
||||
|
||||
void ChatLog::resizeEvent(QResizeEvent* ev)
|
||||
|
@ -942,6 +942,12 @@ void ChatLog::focusOutEvent(QFocusEvent* ev)
|
|||
}
|
||||
}
|
||||
|
||||
void ChatLog::wheelEvent(QWheelEvent *event)
|
||||
{
|
||||
QGraphicsView::wheelEvent(event);
|
||||
checkVisibility(true);
|
||||
}
|
||||
|
||||
void ChatLog::retranslateUi()
|
||||
{
|
||||
copyAction->setText(tr("Copy"));
|
||||
|
|
|
@ -97,7 +97,7 @@ protected:
|
|||
|
||||
void reposition(int start, int end, qreal deltaY);
|
||||
void updateSceneRect();
|
||||
void checkVisibility(bool causedByScroll = false);
|
||||
void checkVisibility(bool causedWheelEvent = false);
|
||||
void scrollToBottom();
|
||||
void startResizeWorker();
|
||||
|
||||
|
@ -110,6 +110,7 @@ protected:
|
|||
virtual void showEvent(QShowEvent*) final override;
|
||||
virtual void focusInEvent(QFocusEvent* ev) final override;
|
||||
virtual void focusOutEvent(QFocusEvent* ev) final override;
|
||||
virtual void wheelEvent(QWheelEvent *event) final override;
|
||||
|
||||
void updateMultiSelectionRect();
|
||||
void updateTypingNotification();
|
||||
|
|
|
@ -657,16 +657,47 @@ void GenericChatForm::loadHistory(const QDateTime &time, const LoadHistoryDialog
|
|||
chatWidget->clear();
|
||||
messages.clear();
|
||||
|
||||
auto begin = firstItemAfterDate(time.date(), chatLog);
|
||||
auto end = ChatLogIdx(begin.get() + 1);
|
||||
if (type == LoadHistoryDialog::from) {
|
||||
loadHistoryFrom(time);
|
||||
auto msg = messages.cbegin()->second;
|
||||
chatWidget->scrollToLine(msg);
|
||||
} else {
|
||||
loadHistoryTo(time);
|
||||
}
|
||||
}
|
||||
|
||||
void GenericChatForm::loadHistoryTo(const QDateTime &time)
|
||||
{
|
||||
auto end = ChatLogIdx(0);
|
||||
if (time.isNull()) {
|
||||
end = messages.begin()->first;
|
||||
} else {
|
||||
end = firstItemAfterDate(time.date(), chatLog);
|
||||
}
|
||||
|
||||
auto begin = ChatLogIdx(0);
|
||||
if (end.get() > 100) {
|
||||
begin = ChatLogIdx(end.get() - 100);
|
||||
}
|
||||
|
||||
renderMessages(begin, end);
|
||||
}
|
||||
|
||||
if (type == LoadHistoryDialog::from) {
|
||||
loadHistoryUpper();
|
||||
void GenericChatForm::loadHistoryFrom(const QDateTime &time)
|
||||
{
|
||||
auto begin = ChatLogIdx(0);
|
||||
if (time.isNull()) {
|
||||
begin = messages.rbegin()->first;
|
||||
} else {
|
||||
loadHistoryLower();
|
||||
begin = firstItemAfterDate(time.date(), chatLog);
|
||||
}
|
||||
|
||||
int add = 100;
|
||||
if (begin.get() + 100 > chatLog.getNextIdx().get()) {
|
||||
add = chatLog.getNextIdx().get() - (begin.get() + 100);
|
||||
}
|
||||
auto end = ChatLogIdx(begin.get() + add);
|
||||
renderMessages(begin, end);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1023,25 +1054,14 @@ void GenericChatForm::goToCurrentDate()
|
|||
|
||||
void GenericChatForm::loadHistoryLower()
|
||||
{
|
||||
auto end = messages.begin()->first;
|
||||
auto begin = ChatLogIdx(0);
|
||||
if (end.get() > 100) {
|
||||
begin = ChatLogIdx(end.get() - 100);
|
||||
}
|
||||
|
||||
renderMessages(begin, end);
|
||||
loadHistoryTo(QDateTime());
|
||||
}
|
||||
|
||||
void GenericChatForm::loadHistoryUpper()
|
||||
{
|
||||
auto begin = messages.rbegin()->first;
|
||||
|
||||
int add = 100;
|
||||
if (begin.get() + 100 > chatLog.getNextIdx().get()) {
|
||||
add = chatLog.getNextIdx().get() - (begin.get() + 100);
|
||||
}
|
||||
auto end = ChatLogIdx(begin.get() + add);
|
||||
renderMessages(begin, end);
|
||||
auto msg = messages.crbegin()->second;
|
||||
loadHistoryFrom(QDateTime());
|
||||
chatWidget->scrollToLine(msg);
|
||||
}
|
||||
|
||||
void GenericChatForm::updateShowDateInfo(const ChatLine::Ptr& line)
|
||||
|
|
|
@ -136,6 +136,8 @@ private:
|
|||
void addSystemDateMessage(const QDate& date);
|
||||
QDateTime getTime(const ChatLine::Ptr& chatLine) const;
|
||||
void loadHistory(const QDateTime& time, const LoadHistoryDialog::LoadType type);
|
||||
void loadHistoryTo(const QDateTime& time);
|
||||
void loadHistoryFrom(const QDateTime& time);
|
||||
|
||||
protected:
|
||||
ChatMessage::Ptr createMessage(const ToxPk& author, const QString& message,
|
||||
|
|
Loading…
Reference in New Issue
Block a user