From 6583686a7c5f118ae6388c69ce1537afbd24de0e Mon Sep 17 00:00:00 2001 From: Konstantinos Sideris Date: Mon, 23 Jul 2018 21:54:13 +0300 Subject: [PATCH] Remove spacer & set sizePolicy on the timeline view & widgets This was causing some flickering when many messages were added. Mostly visible on macOS. --- src/timeline/TimelineItem.cpp | 11 +++++++---- src/timeline/TimelineItem.h | 3 ++- src/timeline/TimelineView.cpp | 26 +++++++++++++------------- src/timeline/TimelineView.h | 2 +- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/src/timeline/TimelineItem.cpp b/src/timeline/TimelineItem.cpp index 71b3156..82d3ab9 100644 --- a/src/timeline/TimelineItem.cpp +++ b/src/timeline/TimelineItem.cpp @@ -184,7 +184,7 @@ TimelineItem::init() topLayout_->setContentsMargins( conf::timeline::msgLeftMargin, conf::timeline::msgTopMargin, 0, 0); topLayout_->setSpacing(0); - topLayout_->addLayout(mainLayout_, 1); + topLayout_->addLayout(mainLayout_); mainLayout_->setContentsMargins(conf::timeline::headerLeftMargin, 0, 0, 0); mainLayout_->setSpacing(0); @@ -196,6 +196,9 @@ TimelineItem::init() statusIndicator_ = new StatusIndicator(this); statusIndicator_->setFixedWidth(tsFm.height() - tsFm.leading()); statusIndicator_->setFixedHeight(tsFm.height() - tsFm.leading()); + + parentWidget()->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); } /* @@ -586,7 +589,7 @@ TimelineItem::generateUserName(const QString &user_id, const QString &displaynam userName_->setToolTip(user_id); userName_->setToolTipDuration(1500); userName_->setAttribute(Qt::WA_Hover); - userName_->setAlignment(Qt::AlignLeft); + userName_->setAlignment(Qt::AlignLeft | Qt::AlignTop); userName_->setFixedWidth(QFontMetrics(userName_->font()).width(userName_->text())); auto filter = new UserProfileFilter(user_id, userName_); @@ -659,10 +662,10 @@ TimelineItem::setupAvatarLayout(const QString &userName) userAvatar_->setLetter(QChar(userName[1]).toUpper()); topLayout_->insertWidget(0, userAvatar_); - topLayout_->setAlignment(userAvatar_, Qt::AlignTop); + topLayout_->setAlignment(userAvatar_, Qt::AlignTop | Qt::AlignLeft); if (userName_) - mainLayout_->insertWidget(0, userName_); + mainLayout_->insertWidget(0, userName_, Qt::AlignTop | Qt::AlignLeft); } void diff --git a/src/timeline/TimelineItem.h b/src/timeline/TimelineItem.h index db00007..04249b9 100644 --- a/src/timeline/TimelineItem.h +++ b/src/timeline/TimelineItem.h @@ -115,7 +115,8 @@ public: &TextLabel::adjustHeight); document()->setDocumentMargin(0); - setFixedHeight(20); + setFixedHeight(QFontMetrics(QFont()).lineSpacing() + 4); + setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed); } void wheelEvent(QWheelEvent *event) override { event->ignore(); } diff --git a/src/timeline/TimelineView.cpp b/src/timeline/TimelineView.cpp index 95cde0f..3e57fe7 100644 --- a/src/timeline/TimelineView.cpp +++ b/src/timeline/TimelineView.cpp @@ -183,7 +183,7 @@ TimelineView::addBackwardsEvents(const mtx::responses::Messages &msgs) // The RoomList message preview will be updated only if this // is the first batch of messages received through /messages // i.e there are no other messages currently present. - if (!topMessages_.empty() && scroll_layout_->count() == 1) + if (!topMessages_.empty() && scroll_layout_->count() == 0) notifyForLastEvent(findFirstViewableEvent(topMessages_)); if (isVisible()) { @@ -513,7 +513,6 @@ TimelineView::init() scroll_layout_ = new QVBoxLayout(scroll_widget_); scroll_layout_->setContentsMargins(4, 0, 15, 15); - scroll_layout_->addStretch(1); scroll_layout_->setSpacing(0); scroll_layout_->setObjectName("timelinescrollarea"); @@ -610,8 +609,13 @@ TimelineView::addTimelineItem(QWidget *item, TimelineDirection direction) const auto newDate = getDate(item); if (direction == TimelineDirection::Bottom) { - const auto lastItemPosition = scroll_layout_->count() - 1; - const auto lastItem = scroll_layout_->itemAt(lastItemPosition)->widget(); + QWidget *lastItem = nullptr; + int lastItemPosition = 0; + + if (scroll_layout_->count() > 0) { + lastItemPosition = scroll_layout_->count() - 1; + lastItem = scroll_layout_->itemAt(lastItemPosition)->widget(); + } if (lastItem) { const auto oldDate = getDate(lastItem); @@ -626,10 +630,8 @@ TimelineView::addTimelineItem(QWidget *item, TimelineDirection direction) pushTimelineItem(item); } else { - // The first item (position 0) is a stretch widget that pushes - // the widgets to the bottom of the page. - if (scroll_layout_->count() > 1) { - const auto firstItem = scroll_layout_->itemAt(1)->widget(); + if (scroll_layout_->count() > 0) { + const auto firstItem = scroll_layout_->itemAt(0)->widget(); if (firstItem) { const auto oldDate = getDate(firstItem); @@ -638,12 +640,12 @@ TimelineView::addTimelineItem(QWidget *item, TimelineDirection direction) auto separator = new DateSeparator(oldDate); if (separator) - scroll_layout_->insertWidget(1, separator); + scroll_layout_->insertWidget(0, separator); } } } - scroll_layout_->insertWidget(1, item); + scroll_layout_->insertWidget(0, item); } } @@ -1010,8 +1012,6 @@ TimelineView::clearTimeline() firstSender_.clear(); lastSender_.clear(); - - scroll_layout_->addStretch(1); } void @@ -1100,7 +1100,7 @@ TimelineView::relativeWidget(QWidget *item, int dt) const pos = pos + dt; - bool isOutOfBounds = (pos <= 0 || pos > scroll_layout_->count() - 1); + bool isOutOfBounds = (pos < 0 || pos > scroll_layout_->count() - 1); return isOutOfBounds ? nullptr : scroll_layout_->itemAt(pos)->widget(); } diff --git a/src/timeline/TimelineView.h b/src/timeline/TimelineView.h index d622b69..740fb90 100644 --- a/src/timeline/TimelineView.h +++ b/src/timeline/TimelineView.h @@ -144,7 +144,7 @@ public slots: void addBackwardsEvents(const mtx::responses::Messages &msgs); // Whether or not the initial batch has been loaded. - bool hasLoaded() { return scroll_layout_->count() > 1 || isTimelineFinished; } + bool hasLoaded() { return scroll_layout_->count() > 0 || isTimelineFinished; } void handleFailedMessage(const std::string &txn_id);