diff --git a/CHANGELOG.md b/CHANGELOG.md index 99074077f08..af1f47a8807 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 6563ff9e28e..5af3612bc59 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 31272e601eb..de185eb6292 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 a728920cb1a..27ae83cfe14 100644 --- a/src/widgets/helper/ChannelView.hpp +++ b/src/widgets/helper/ChannelView.hpp @@ -330,7 +330,6 @@ class ChannelView final : public BaseWidget } cursors_; Selection selection_; - bool selecting_ = false; const Context context_;