aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRobin Burchell <robin+qt@viroteck.net>2013-12-04 22:18:36 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-12-11 02:31:29 +0100
commit4b2fae2a900f4e66db36ee9e0ee2615346eeccdc (patch)
tree177d5dbca669977b5ea10798d35b53041733b749
parent059ffd2d37446a095b3b01f615c4aea200cf6ef8 (diff)
Set highlight size for both dimensions, irrespective of ListView orientation
The assumption that all list delegates are the same size (dependent on ListView orientation) is not a correct one, even if it is correct most of the time. Task-number: QTBUG-31626 Change-Id: Iba6f3bc5f38d60e3be7632ab17d0c66ab8e73965 Reviewed-by: Matthew Vogt <matthew.vogt@qinetic.com.au> Reviewed-by: J-P Nurmi <jpnurmi@digia.com> Reviewed-by: Alan Alpert <aalpert@blackberry.com>
-rw-r--r--src/quick/items/qquicklistview.cpp52
-rw-r--r--tests/auto/quick/qquicklistview/data/HighlightResize.qml23
-rw-r--r--tests/auto/quick/qquicklistview/tst_qquicklistview.cpp21
3 files changed, 78 insertions, 18 deletions
diff --git a/src/quick/items/qquicklistview.cpp b/src/quick/items/qquicklistview.cpp
index d6754ddfd1..424b5ac385 100644
--- a/src/quick/items/qquicklistview.cpp
+++ b/src/quick/items/qquicklistview.cpp
@@ -143,7 +143,8 @@ public:
QQuickListView::SnapMode snapMode;
QSmoothedAnimation *highlightPosAnimator;
- QSmoothedAnimation *highlightSizeAnimator;
+ QSmoothedAnimation *highlightWidthAnimator;
+ QSmoothedAnimation *highlightHeightAnimator;
qreal highlightMoveVelocity;
qreal highlightResizeVelocity;
int highlightResizeDuration;
@@ -168,7 +169,7 @@ public:
, visiblePos(0)
, averageSize(100.0), spacing(0.0)
, snapMode(QQuickListView::NoSnap)
- , highlightPosAnimator(0), highlightSizeAnimator(0)
+ , highlightPosAnimator(0), highlightWidthAnimator(0), highlightHeightAnimator(0)
, highlightMoveVelocity(400), highlightResizeVelocity(400), highlightResizeDuration(-1)
, sectionCriteria(0), currentSectionItem(0), nextSectionItem(0)
, overshootDist(0.0), correctFlick(false), inFlickCorrection(false)
@@ -177,7 +178,8 @@ public:
}
~QQuickListViewPrivate() {
delete highlightPosAnimator;
- delete highlightSizeAnimator;
+ delete highlightWidthAnimator;
+ delete highlightHeightAnimator;
}
friend class QQuickViewSection;
@@ -855,9 +857,11 @@ void QQuickListViewPrivate::createHighlight()
highlight = 0;
delete highlightPosAnimator;
- delete highlightSizeAnimator;
+ delete highlightWidthAnimator;
+ delete highlightHeightAnimator;
highlightPosAnimator = 0;
- highlightSizeAnimator = 0;
+ highlightWidthAnimator = 0;
+ highlightHeightAnimator = 0;
changed = true;
}
@@ -878,11 +882,15 @@ void QQuickListViewPrivate::createHighlight()
highlightPosAnimator->velocity = highlightMoveVelocity;
highlightPosAnimator->userDuration = highlightMoveDuration;
- const QLatin1String sizeProp(orient == QQuickListView::Vertical ? "height" : "width");
- highlightSizeAnimator = new QSmoothedAnimation;
- highlightSizeAnimator->velocity = highlightResizeVelocity;
- highlightSizeAnimator->userDuration = highlightResizeDuration;
- highlightSizeAnimator->target = QQmlProperty(item, sizeProp);
+ highlightWidthAnimator = new QSmoothedAnimation;
+ highlightWidthAnimator->velocity = highlightResizeVelocity;
+ highlightWidthAnimator->userDuration = highlightResizeDuration;
+ highlightWidthAnimator->target = QQmlProperty(item, "width");
+
+ highlightHeightAnimator = new QSmoothedAnimation;
+ highlightHeightAnimator->velocity = highlightResizeVelocity;
+ highlightHeightAnimator->userDuration = highlightResizeDuration;
+ highlightHeightAnimator->target = QQmlProperty(item, "height");
highlight = newHighlight;
changed = true;
@@ -905,7 +913,8 @@ void QQuickListViewPrivate::updateHighlight()
highlightPosAnimator->to = isContentFlowReversed()
? -listItem->itemPosition()-listItem->itemSize()
: listItem->itemPosition();
- highlightSizeAnimator->to = listItem->itemSize();
+ highlightWidthAnimator->to = listItem->item->width();
+ highlightHeightAnimator->to = listItem->item->height();
if (orient == QQuickListView::Vertical) {
if (highlight->item->width() == 0)
highlight->item->setWidth(currentItem->item->width());
@@ -915,7 +924,8 @@ void QQuickListViewPrivate::updateHighlight()
}
highlightPosAnimator->restart();
- highlightSizeAnimator->restart();
+ highlightWidthAnimator->restart();
+ highlightHeightAnimator->restart();
}
updateTrackedItem();
}
@@ -1968,8 +1978,10 @@ void QQuickListView::setHighlightFollowsCurrentItem(bool autoHighlight)
if (!autoHighlight) {
if (d->highlightPosAnimator)
d->highlightPosAnimator->stop();
- if (d->highlightSizeAnimator)
- d->highlightSizeAnimator->stop();
+ if (d->highlightWidthAnimator)
+ d->highlightWidthAnimator->stop();
+ if (d->highlightHeightAnimator)
+ d->highlightHeightAnimator->stop();
}
QQuickItemView::setHighlightFollowsCurrentItem(autoHighlight);
}
@@ -2271,8 +2283,10 @@ void QQuickListView::setHighlightResizeVelocity(qreal speed)
Q_D(QQuickListView);
if (d->highlightResizeVelocity != speed) {
d->highlightResizeVelocity = speed;
- if (d->highlightSizeAnimator)
- d->highlightSizeAnimator->velocity = d->highlightResizeVelocity;
+ if (d->highlightWidthAnimator)
+ d->highlightWidthAnimator->velocity = d->highlightResizeVelocity;
+ if (d->highlightHeightAnimator)
+ d->highlightHeightAnimator->velocity = d->highlightResizeVelocity;
emit highlightResizeVelocityChanged();
}
}
@@ -2288,8 +2302,10 @@ void QQuickListView::setHighlightResizeDuration(int duration)
Q_D(QQuickListView);
if (d->highlightResizeDuration != duration) {
d->highlightResizeDuration = duration;
- if (d->highlightSizeAnimator)
- d->highlightSizeAnimator->userDuration = d->highlightResizeDuration;
+ if (d->highlightWidthAnimator)
+ d->highlightWidthAnimator->userDuration = d->highlightResizeDuration;
+ if (d->highlightHeightAnimator)
+ d->highlightHeightAnimator->userDuration = d->highlightResizeDuration;
emit highlightResizeDurationChanged();
}
}
diff --git a/tests/auto/quick/qquicklistview/data/HighlightResize.qml b/tests/auto/quick/qquicklistview/data/HighlightResize.qml
new file mode 100644
index 0000000000..2b07b39d20
--- /dev/null
+++ b/tests/auto/quick/qquicklistview/data/HighlightResize.qml
@@ -0,0 +1,23 @@
+import QtQuick 2.0
+
+ListView {
+ id: view
+
+ width: 400
+ height: 400
+ model: 5
+
+ highlight: Rectangle {
+ color: "skyblue"
+ }
+
+ delegate: Item {
+ width: 100 + index * 20
+ height: 100 + index * 10
+
+ Text {
+ anchors.centerIn: parent
+ text: model.index
+ }
+ }
+}
diff --git a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
index d888ba2b5c..d207a7eadc 100644
--- a/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
+++ b/tests/auto/quick/qquicklistview/tst_qquicklistview.cpp
@@ -216,6 +216,8 @@ private slots:
void typedModel();
+ void highlightItemGeometryChanges();
+
private:
template <class T> void items(const QUrl &source);
template <class T> void changed(const QUrl &source);
@@ -7012,6 +7014,25 @@ void tst_QQuickListView::typedModel()
QCOMPARE(listview->count(), 0);
}
+void tst_QQuickListView::highlightItemGeometryChanges()
+{
+ QQmlEngine engine;
+ QQmlComponent component(&engine, testFileUrl("HighlightResize.qml"));
+
+ QScopedPointer<QObject> object(component.create());
+
+ QQuickListView *listview = qobject_cast<QQuickListView *>(object.data());
+ QVERIFY(listview);
+
+ QCOMPARE(listview->count(), 5);
+
+ for (int i = 0; i < listview->count(); ++i) {
+ listview->setCurrentIndex(i);
+ QTRY_COMPARE(listview->highlightItem()->width(), qreal(100 + i * 20));
+ QTRY_COMPARE(listview->highlightItem()->height(), qreal(100 + i * 10));
+ }
+}
+
QTEST_MAIN(tst_QQuickListView)
#include "tst_qquicklistview.moc"