Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
13861fa34e
@ -44,7 +44,7 @@ public:
|
||||
void fetchUserAvatar(const QString &userId, const QUrl &avatarUrl);
|
||||
void fetchOwnAvatar(const QUrl &avatar_url);
|
||||
void downloadImage(const QString &event_id, const QUrl &url);
|
||||
void messages(const QString &room_id, const QString &from_token) noexcept;
|
||||
void messages(const QString &room_id, const QString &from_token, int limit = 20) noexcept;
|
||||
|
||||
inline QUrl getHomeServer();
|
||||
inline int transactionId();
|
||||
|
@ -104,4 +104,5 @@ inline RoomState RoomInfoListItem::state() const
|
||||
inline void RoomInfoListItem::setAvatar(const QImage &img)
|
||||
{
|
||||
roomAvatar_ = QPixmap::fromImage(img.scaled(IconSize, IconSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
|
||||
update();
|
||||
}
|
||||
|
@ -111,12 +111,16 @@ private:
|
||||
bool isInitialized = false;
|
||||
bool isTimelineFinished = false;
|
||||
bool isInitialSync = true;
|
||||
bool isPaginationScrollPending_ = false;
|
||||
|
||||
const int SCROLL_BAR_GAP = 300;
|
||||
const int SCROLL_BAR_GAP = 400;
|
||||
|
||||
int scroll_height_ = 0;
|
||||
int previous_max_height_ = 0;
|
||||
|
||||
int oldPosition_;
|
||||
int oldHeight_;
|
||||
|
||||
QList<PendingMessage> pending_msgs_;
|
||||
QSharedPointer<MatrixClient> client_;
|
||||
};
|
||||
|
@ -541,7 +541,7 @@ void MatrixClient::initialSync() noexcept
|
||||
};
|
||||
|
||||
QJsonObject filter{{"room",
|
||||
QJsonObject{{"timeline", QJsonObject{{"limit", 70}}},
|
||||
QJsonObject{{"timeline", QJsonObject{{"limit", 20}}},
|
||||
{"ephemeral", QJsonObject{{"limit", 0}}}}},
|
||||
{"presence", QJsonObject{{"not_types", excluded_presence}}}};
|
||||
|
||||
@ -677,12 +677,13 @@ void MatrixClient::fetchOwnAvatar(const QUrl &avatar_url)
|
||||
reply->setProperty("endpoint", static_cast<int>(Endpoint::GetOwnAvatar));
|
||||
}
|
||||
|
||||
void MatrixClient::messages(const QString &room_id, const QString &from_token) noexcept
|
||||
void MatrixClient::messages(const QString &room_id, const QString &from_token, int limit) noexcept
|
||||
{
|
||||
QUrlQuery query;
|
||||
query.addQueryItem("access_token", token_);
|
||||
query.addQueryItem("from", from_token);
|
||||
query.addQueryItem("dir", "b");
|
||||
query.addQueryItem("limit", QString::number(limit));
|
||||
|
||||
QUrl endpoint(server_);
|
||||
endpoint.setPath(api_url_ + QString("/rooms/%1/messages").arg(room_id));
|
||||
|
@ -189,13 +189,13 @@ void RoomInfoListItem::paintEvent(QPaintEvent *event)
|
||||
void RoomInfoListItem::updateUnreadMessageCount(int count)
|
||||
{
|
||||
unreadMsgCount_ += count;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void RoomInfoListItem::clearUnreadMessageCount()
|
||||
{
|
||||
unreadMsgCount_ = 0;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void RoomInfoListItem::setPressedState(bool state)
|
||||
@ -212,7 +212,7 @@ void RoomInfoListItem::setPressedState(bool state)
|
||||
void RoomInfoListItem::setState(const RoomState &new_state)
|
||||
{
|
||||
state_ = new_state;
|
||||
repaint();
|
||||
update();
|
||||
}
|
||||
|
||||
void RoomInfoListItem::contextMenuEvent(QContextMenuEvent *event)
|
||||
|
@ -24,6 +24,7 @@ Splitter::Splitter(QWidget *parent)
|
||||
: QSplitter(parent)
|
||||
{
|
||||
connect(this, &QSplitter::splitterMoved, this, &Splitter::onSplitterMoved);
|
||||
setChildrenCollapsible(false);
|
||||
}
|
||||
|
||||
void Splitter::onSplitterMoved(int pos, int index)
|
||||
|
@ -58,6 +58,15 @@ void TimelineView::sliderRangeChanged(int min, int max)
|
||||
|
||||
if (max - scroll_area_->verticalScrollBar()->value() < SCROLL_BAR_GAP)
|
||||
scroll_area_->verticalScrollBar()->setValue(max);
|
||||
|
||||
if (isPaginationScrollPending_) {
|
||||
isPaginationScrollPending_ = false;
|
||||
|
||||
int currentHeight = scroll_widget_->size().height();
|
||||
int diff = currentHeight - oldHeight_;
|
||||
|
||||
scroll_area_->verticalScrollBar()->setValue(oldPosition_ + diff);
|
||||
}
|
||||
}
|
||||
|
||||
void TimelineView::scrollDown()
|
||||
@ -67,7 +76,7 @@ void TimelineView::scrollDown()
|
||||
|
||||
// The first time we enter the room move the scroll bar to the bottom.
|
||||
if (!isInitialized) {
|
||||
scroll_area_->ensureVisible(0, scroll_widget_->size().height(), 0, 0);
|
||||
scroll_area_->verticalScrollBar()->setValue(max);
|
||||
isInitialized = true;
|
||||
return;
|
||||
}
|
||||
@ -88,17 +97,14 @@ void TimelineView::sliderMoved(int position)
|
||||
return;
|
||||
|
||||
// Prevent user from moving up when there is pagination in progress.
|
||||
if (isPaginationInProgress_) {
|
||||
scroll_area_->verticalScrollBar()->setValue(SCROLL_BAR_GAP);
|
||||
// TODO: Keep a map of the event ids to filter out duplicates.
|
||||
if (isPaginationInProgress_)
|
||||
return;
|
||||
}
|
||||
|
||||
isPaginationInProgress_ = true;
|
||||
scroll_height_ = scroll_area_->verticalScrollBar()->value();
|
||||
previous_max_height_ = scroll_area_->verticalScrollBar()->maximum();
|
||||
|
||||
// FIXME: Maybe move this to TimelineViewManager to remove the extra calls?
|
||||
client_.data()->messages(room_id_, prev_batch_token_);
|
||||
client_->messages(room_id_, prev_batch_token_);
|
||||
}
|
||||
}
|
||||
|
||||
@ -130,11 +136,15 @@ void TimelineView::addBackwardsEvents(const QString &room_id, const RoomMessages
|
||||
// Reverse again to render them.
|
||||
std::reverse(items.begin(), items.end());
|
||||
|
||||
oldPosition_ = scroll_area_->verticalScrollBar()->value();
|
||||
oldHeight_ = scroll_widget_->size().height();
|
||||
|
||||
for (const auto &item : items)
|
||||
addTimelineItem(item, TimelineDirection::Top);
|
||||
|
||||
prev_batch_token_ = msgs.end();
|
||||
isPaginationInProgress_ = false;
|
||||
isPaginationScrollPending_ = true;
|
||||
}
|
||||
|
||||
TimelineItem *TimelineView::parseMessageEvent(const QJsonObject &event, TimelineDirection direction)
|
||||
@ -216,11 +226,6 @@ int TimelineView::addEvents(const Timeline &timeline)
|
||||
QSettings settings;
|
||||
QString localUser = settings.value("auth/user_id").toString();
|
||||
|
||||
if (isInitialSync) {
|
||||
prev_batch_token_ = timeline.previousBatch();
|
||||
isInitialSync = false;
|
||||
}
|
||||
|
||||
for (const auto &event : timeline.events()) {
|
||||
TimelineItem *item = parseMessageEvent(event.toObject(), TimelineDirection::Bottom);
|
||||
auto sender = event.toObject().value("sender").toString();
|
||||
@ -233,6 +238,13 @@ int TimelineView::addEvents(const Timeline &timeline)
|
||||
}
|
||||
}
|
||||
|
||||
if (isInitialSync) {
|
||||
prev_batch_token_ = timeline.previousBatch();
|
||||
isInitialSync = false;
|
||||
|
||||
client_->messages(room_id_, prev_batch_token_);
|
||||
}
|
||||
|
||||
return message_count;
|
||||
}
|
||||
|
||||
|
@ -119,9 +119,10 @@ void TimelineViewManager::setHistoryView(const QString &room_id)
|
||||
|
||||
active_room_ = room_id;
|
||||
auto widget = views_.value(room_id);
|
||||
widget->scrollDown();
|
||||
|
||||
setCurrentWidget(widget.data());
|
||||
|
||||
widget->scrollDown();
|
||||
}
|
||||
|
||||
QMap<QString, QString> TimelineViewManager::NICK_COLORS;
|
||||
|
Loading…
Reference in New Issue
Block a user