aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMitch Curtis <mitch.curtis@qt.io>2016-07-11 14:51:16 +0200
committerMitch Curtis <mitch.curtis@qt.io>2016-07-12 09:21:21 +0000
commitf06db0f1c6538305d226311044cca367fc031195 (patch)
tree5c93e7c24a875498c9ad7e4a930da1a4c0f8a34f /src
parent6a8513909cf3aaad6be41a325129cf22f61842bf (diff)
SwipeDelegate: reposition contentItem, background on width changes
Change-Id: I6af4f1a4517e79f2e34b0bbca401b0eefd0c6ff4 Task-number: QTBUG-54660 Reviewed-by: J-P Nurmi <jpnurmi@qt.io>
Diffstat (limited to 'src')
-rw-r--r--src/quicktemplates2/qquickswipedelegate.cpp48
-rw-r--r--src/quicktemplates2/qquickswipedelegate_p.h2
2 files changed, 43 insertions, 7 deletions
diff --git a/src/quicktemplates2/qquickswipedelegate.cpp b/src/quicktemplates2/qquickswipedelegate.cpp
index aedaf29a..dbf4fc95 100644
--- a/src/quicktemplates2/qquickswipedelegate.cpp
+++ b/src/quicktemplates2/qquickswipedelegate.cpp
@@ -92,6 +92,13 @@ QT_BEGIN_NAMESPACE
\sa {Customizing SwipeDelegate}, {Delegate Controls}
*/
+namespace {
+ enum PositionAnimation {
+ DontAnimatePosition,
+ AnimatePosition
+ };
+}
+
class QQuickSwipePrivate : public QObjectPrivate
{
Q_DECLARE_PUBLIC(QQuickSwipe)
@@ -117,6 +124,7 @@ public:
QQuickItem *createDelegateItem(QQmlComponent *component);
QQuickItem *showRelevantItemForPosition(qreal position);
QQuickItem *createRelevantItemForDistance(qreal distance);
+ void reposition(PositionAnimation animationPolicy);
void createLeftItem();
void createBehindItem();
void createRightItem();
@@ -234,6 +242,27 @@ QQuickItem *QQuickSwipePrivate::createRelevantItemForDistance(qreal distance)
return nullptr;
}
+void QQuickSwipePrivate::reposition(PositionAnimation animationPolicy)
+{
+ QQuickItem *relevantItem = showRelevantItemForPosition(position);
+ const qreal relevantWidth = relevantItem ? relevantItem->width() : 0.0;
+ const qreal contentItemX = position * relevantWidth + control->leftPadding();
+
+ // "Behavior on x" relies on the property system to know when it should update,
+ // so we can prevent it from animating by setting the x position directly.
+ if (animationPolicy == AnimatePosition) {
+ if (QQuickItem *contentItem = control->contentItem())
+ contentItem->setProperty("x", contentItemX);
+ if (QQuickItem *background = control->background())
+ background->setProperty("x", position * relevantWidth);
+ } else {
+ if (QQuickItem *contentItem = control->contentItem())
+ contentItem->setX(contentItemX);
+ if (QQuickItem *background = control->background())
+ background->setX(position * relevantWidth);
+ }
+}
+
void QQuickSwipePrivate::createLeftItem()
{
if (!leftItem) {
@@ -496,13 +525,7 @@ void QQuickSwipe::setPosition(qreal position)
return;
d->position = adjustedPosition;
-
- QQuickItem *relevantItem = d->showRelevantItemForPosition(d->position);
- const qreal relevantWidth = relevantItem ? relevantItem->width() : 0.0;
- d->control->contentItem()->setProperty("x", d->position * relevantWidth + d->control->leftPadding());
- if (QQuickItem *background = d->control->background())
- background->setProperty("x", d->position * relevantWidth);
-
+ d->reposition(AnimatePosition);
emit positionChanged();
}
@@ -845,6 +868,17 @@ void QQuickSwipeDelegate::mouseReleaseEvent(QMouseEvent *event)
d->handleMouseReleaseEvent(this, event);
}
+void QQuickSwipeDelegate::geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry)
+{
+ Q_D(QQuickSwipeDelegate);
+ QQuickControl::geometryChanged(newGeometry, oldGeometry);
+
+ if (!qFuzzyCompare(newGeometry.width(), oldGeometry.width())) {
+ QQuickSwipePrivate *swipePrivate = QQuickSwipePrivate::get(&d->swipe);
+ swipePrivate->reposition(DontAnimatePosition);
+ }
+}
+
QFont QQuickSwipeDelegate::defaultFont() const
{
return QQuickControlPrivate::themeFont(QPlatformTheme::ListViewFont);
diff --git a/src/quicktemplates2/qquickswipedelegate_p.h b/src/quicktemplates2/qquickswipedelegate_p.h
index b2bea3eb..e71455b0 100644
--- a/src/quicktemplates2/qquickswipedelegate_p.h
+++ b/src/quicktemplates2/qquickswipedelegate_p.h
@@ -71,6 +71,8 @@ protected:
void mouseMoveEvent(QMouseEvent *event) override;
void mouseReleaseEvent(QMouseEvent *event) override;
+ void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry) override;
+
QFont defaultFont() const override;
#ifndef QT_NO_ACCESSIBILITY