[kitemlistview]: Animate rubberband fading out

This commit is contained in:
Carson Black 2020-10-20 22:04:44 -04:00 committed by Elvis Angelaccio
parent 78c7429a35
commit ad9c955835
2 changed files with 57 additions and 0 deletions

View file

@ -27,6 +27,7 @@
#include <QPropertyAnimation>
#include <QStyleOptionRubberBand>
#include <QTimer>
#include <QVariantAnimation>
namespace {
@ -36,6 +37,11 @@ namespace {
// Delay in ms for triggering the next autoscroll
const int RepeatingAutoScrollDelay = 1000 / 60;
// Copied from the Kirigami.Units.shortDuration
const int RubberFadeSpeed = 150;
const char* RubberPropertyName = "_kitemviews_rubberBandPosition";
}
#ifndef QT_NO_ACCESSIBILITY
@ -660,6 +666,30 @@ void KItemListView::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt
{
QGraphicsWidget::paint(painter, option, widget);
for (auto animation : qAsConst(m_rubberBandAnimations)) {
QRectF rubberBandRect = animation->property(RubberPropertyName).toRectF();
const QPointF topLeft = rubberBandRect.topLeft();
if (scrollOrientation() == Qt::Vertical) {
rubberBandRect.moveTo(topLeft.x(), topLeft.y() - scrollOffset());
} else {
rubberBandRect.moveTo(topLeft.x() - scrollOffset(), topLeft.y());
}
QStyleOptionRubberBand opt;
initStyleOption(&opt);
opt.shape = QRubberBand::Rectangle;
opt.opaque = false;
opt.rect = rubberBandRect.toRect();
painter->save();
painter->setOpacity(animation->currentValue().toReal());
style()->drawControl(QStyle::CE_RubberBand, &opt, painter);
painter->restore();
}
if (m_rubberBand->isActive()) {
QRectF rubberBandRect = QRectF(m_rubberBand->startPosition(),
m_rubberBand->endPosition()).normalized();
@ -1455,6 +1485,30 @@ void KItemListView::slotRubberBandActivationChanged(bool active)
connect(m_rubberBand, &KItemListRubberBand::endPositionChanged, this, &KItemListView::slotRubberBandPosChanged);
m_skipAutoScrollForRubberBand = true;
} else {
QRectF rubberBandRect = QRectF(m_rubberBand->startPosition(),
m_rubberBand->endPosition()).normalized();
auto animation = new QVariantAnimation(this);
animation->setStartValue(1.0);
animation->setEndValue(0.0);
animation->setDuration(RubberFadeSpeed);
animation->setProperty(RubberPropertyName, rubberBandRect);
QEasingCurve curve;
curve.setType(QEasingCurve::BezierSpline);
curve.addCubicBezierSegment(QPointF(0.4, 0.0), QPointF(1.0, 1.0), QPointF(1.0, 1.0));
animation->setEasingCurve(curve);
connect(animation, &QVariantAnimation::valueChanged, this, [=](const QVariant&) {
update();
});
connect(animation, &QVariantAnimation::finished, this, [=]() {
m_rubberBandAnimations.removeAll(animation);
delete animation;
});
animation->start();
m_rubberBandAnimations << animation;
disconnect(m_rubberBand, &KItemListRubberBand::startPositionChanged, this, &KItemListView::slotRubberBandPosChanged);
disconnect(m_rubberBand, &KItemListRubberBand::endPositionChanged, this, &KItemListView::slotRubberBandPosChanged);
m_skipAutoScrollForRubberBand = false;

View file

@ -32,6 +32,7 @@ class KItemListWidgetInformant;
class KItemListWidgetCreatorBase;
class QTimer;
class QPropertyAnimation;
class QVariantAnimation;
/**
* @brief Represents the view of an item-list.
@ -747,6 +748,8 @@ private:
// by KItemListView::showDropIndicator() and KItemListView::hideDropIndicator().
QRectF m_dropIndicator;
QList<QVariantAnimation*> m_rubberBandAnimations;
friend class KItemListContainer; // Accesses scrollBarRequired()
friend class KItemListHeader; // Accesses m_headerWidget
friend class KItemListController;