summary refs log tree commit diff
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-07-23 21:54:13 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-07-23 21:54:13 +0300
commit6583686a7c5f118ae6388c69ce1537afbd24de0e (patch)
treec181585b41e34d5c340a8b7d733e58030c824695
parentSimplify the message shown when another app instance is detected (diff)
downloadnheko-6583686a7c5f118ae6388c69ce1537afbd24de0e.tar.xz
Remove spacer & set sizePolicy on the timeline view & widgets
This was causing some flickering when many messages were added.
Mostly visible on macOS.
-rw-r--r--src/timeline/TimelineItem.cpp11
-rw-r--r--src/timeline/TimelineItem.h3
-rw-r--r--src/timeline/TimelineView.cpp26
-rw-r--r--src/timeline/TimelineView.h2
4 files changed, 23 insertions, 19 deletions
diff --git a/src/timeline/TimelineItem.cpp b/src/timeline/TimelineItem.cpp
index 71b3156c..82d3ab92 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 db000078..04249b9c 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 95cde0f4..3e57fe7f 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 d622b698..740fb902 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);