From ccaedc3987e1c7d664584ad3220c601373f63fd2 Mon Sep 17 00:00:00 2001 From: kornes <28986062+kornes@users.noreply.github.com> Date: Fri, 13 Oct 2023 17:19:52 +0000 Subject: [PATCH] perf: reduce repaints amount caused by selection (#4889) Co-authored-by: nerix Co-authored-by: Rasmus Karlsson --- CHANGELOG.md | 1 + src/messages/Selection.hpp | 12 +++++++- src/widgets/helper/ChannelView.cpp | 46 +++++++++--------------------- src/widgets/helper/ChannelView.hpp | 1 - 4 files changed, 26 insertions(+), 34 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 99074077f..af1f47a88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -39,6 +39,7 @@ - Dev: Add a compile-time flag `USE_SYSTEM_MINIAUDIO` which can be turned on to use the system miniaudio. (#4867) - Dev: Update vcpkg to use Qt6. (#4872) - Dev: Replace `boost::optional` with `std::optional`. (#4877) +- Dev: Improve performance by reducing repaints caused by selections. (#4889) ## 2.4.6 diff --git a/src/messages/Selection.hpp b/src/messages/Selection.hpp index 6563ff9e2..5af3612bc 100644 --- a/src/messages/Selection.hpp +++ b/src/messages/Selection.hpp @@ -38,7 +38,7 @@ struct SelectionItem { bool operator!=(const SelectionItem &b) const { - return this->operator==(b); + return !this->operator==(b); } }; @@ -62,6 +62,16 @@ struct Selection { } } + bool operator==(const Selection &b) const + { + return this->start == b.start && this->end == b.end; + } + + bool operator!=(const Selection &b) const + { + return !this->operator==(b); + } + bool isEmpty() const { return this->start == this->end; diff --git a/src/widgets/helper/ChannelView.cpp b/src/widgets/helper/ChannelView.cpp index 31272e601..de185eb62 100644 --- a/src/widgets/helper/ChannelView.cpp +++ b/src/widgets/helper/ChannelView.cpp @@ -1091,18 +1091,13 @@ void ChannelView::resizeEvent(QResizeEvent *) void ChannelView::setSelection(const SelectionItem &start, const SelectionItem &end) { - // selections - if (!this->selecting_ && start != end) + auto newSelection = Selection(start, end); + if (this->selection_ != newSelection) { - // this->messagesAddedSinceSelectionPause_ = 0; - - this->selecting_ = true; - // this->pausedBySelection_ = true; + this->selection_ = newSelection; + this->selectionChanged.invoke(); + this->update(); } - - this->selection_ = Selection(start, end); - - this->selectionChanged.invoke(); } MessageElementFlags ChannelView::getFlags() const @@ -1520,13 +1515,10 @@ void ChannelView::mouseMoveEvent(QMouseEvent *event) // is selecting if (this->isLeftMouseDown_) { - // this->pause(PauseReason::Selecting, 300); auto index = layout->getSelectionIndex(relativePos); this->setSelection(this->selection_.start, SelectionItem(messageIndex, index)); - - this->queueUpdate(); } // message under cursor is collapsed @@ -1980,6 +1972,15 @@ void ChannelView::mouseReleaseEvent(QMouseEvent *event) { return; } + + // Triple-clicking a message selects the whole message + if (foundElement && this->clickTimer_->isActive() && + (fabsf(distanceBetweenPoints(this->lastDClickPosition_, + event->screenPos())) < 10.f)) + { + this->selectWholeMessage(layout.get(), messageIndex); + return; + } } else { @@ -2061,15 +2062,6 @@ void ChannelView::mouseReleaseEvent(QMouseEvent *event) const MessageLayoutElement *hoverLayoutElement = layout->getElementAt(relativePos); - // Triple-clicking a message selects the whole message - if (this->clickTimer_->isActive() && this->selecting_) - { - if (fabsf(distanceBetweenPoints(this->lastDClickPosition_, - event->screenPos())) < 10.f) - { - this->selectWholeMessage(layout.get(), messageIndex); - } - } // handle the click this->handleMouseClick(event, hoverLayoutElement, layout); @@ -2084,16 +2076,6 @@ void ChannelView::handleMouseClick(QMouseEvent *event, switch (event->button()) { case Qt::LeftButton: { - if (this->selecting_) - { - // this->pausedBySelection = false; - this->selecting_ = false; - // this->pauseTimeout.stop(); - // this->pausedTemporarily = false; - - this->queueLayout(); - } - if (hoveredElement == nullptr) { return; diff --git a/src/widgets/helper/ChannelView.hpp b/src/widgets/helper/ChannelView.hpp index a728920cb..27ae83cfe 100644 --- a/src/widgets/helper/ChannelView.hpp +++ b/src/widgets/helper/ChannelView.hpp @@ -330,7 +330,6 @@ private: } cursors_; Selection selection_; - bool selecting_ = false; const Context context_;