aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNikita Krupenko <krnekit@gmail.com>2016-05-08 20:22:01 +0300
committerNikita Krupenko <krnekit@gmail.com>2016-05-09 13:31:55 +0000
commit4dc0c0d4fa4e886650fb72161448bfb1f621b53b (patch)
treede516233a6abc9064cda43a95632d1606f117a8c
parent43b02ebb9687917082538f26ba321dc9c615d2fd (diff)
Tumbler: calculate proper displacement when count <= visibleItemCount
Task-number: QTBUG-53120 Change-Id: I78035b2cf75b2bc18326b7f735be3f9c930d472b Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
-rw-r--r--src/quicktemplates2/qquicktumbler.cpp10
-rw-r--r--tests/auto/controls/data/tst_tumbler.qml47
2 files changed, 35 insertions, 22 deletions
diff --git a/src/quicktemplates2/qquicktumbler.cpp b/src/quicktemplates2/qquicktumbler.cpp
index 546e699c..852803f0 100644
--- a/src/quicktemplates2/qquicktumbler.cpp
+++ b/src/quicktemplates2/qquicktumbler.cpp
@@ -403,7 +403,7 @@ public:
QQuickTumblerAttachedPrivate(QQuickItem *delegateItem) :
tumbler(nullptr),
index(-1),
- displacement(1)
+ displacement(0)
{
if (!delegateItem->parentItem()) {
qWarning() << "Tumbler: attached properties must be accessed from within a delegate item that has a parent";
@@ -489,8 +489,10 @@ void QQuickTumblerAttachedPrivate::_q_calculateDisplacement()
if (contentType == PathViewContentItem) {
offset = tumbler->contentItem()->property("offset").toReal();
- displacement = count - index - offset;
- int halfVisibleItems = tumbler->visibleItemCount() / 2 + 1;
+ displacement = count > 1 ? count - index - offset : 0;
+ // Don't add 1 if count <= visibleItemCount
+ const int visibleItems = tumbler->visibleItemCount();
+ int halfVisibleItems = visibleItems / 2 + (visibleItems < count ? 1 : 0);
if (displacement > halfVisibleItems)
displacement -= count;
else if (displacement < -halfVisibleItems)
@@ -522,6 +524,8 @@ QQuickTumblerAttached::QQuickTumblerAttached(QQuickItem *delegateItem) :
const char *contentItemSignal = contentType == PathViewContentItem
? SIGNAL(offsetChanged()) : SIGNAL(contentYChanged());
connect(d->tumbler->contentItem(), contentItemSignal, this, SLOT(_q_calculateDisplacement()));
+
+ d->_q_calculateDisplacement();
}
}
diff --git a/tests/auto/controls/data/tst_tumbler.qml b/tests/auto/controls/data/tst_tumbler.qml
index ec716f32..2de52924 100644
--- a/tests/auto/controls/data/tst_tumbler.qml
+++ b/tests/auto/controls/data/tst_tumbler.qml
@@ -237,25 +237,34 @@ TestCase {
function test_displacement_data() {
var data = [
// At 0 offset, the first item is current.
- { index: 0, offset: 0, expectedDisplacement: 0 },
- { index: 1, offset: 0, expectedDisplacement: -1 },
- { index: 5, offset: 0, expectedDisplacement: 1 },
+ { count: 6, index: 0, offset: 0, expectedDisplacement: 0 },
+ { count: 6, index: 1, offset: 0, expectedDisplacement: -1 },
+ { count: 6, index: 5, offset: 0, expectedDisplacement: 1 },
// When we start to move the first item down, the second item above it starts to become current.
- { index: 0, offset: 0.25, expectedDisplacement: -0.25 },
- { index: 1, offset: 0.25, expectedDisplacement: -1.25 },
- { index: 5, offset: 0.25, expectedDisplacement: 0.75 },
- { index: 0, offset: 0.5, expectedDisplacement: -0.5 },
- { index: 1, offset: 0.5, expectedDisplacement: -1.5 },
- { index: 5, offset: 0.5, expectedDisplacement: 0.5 },
+ { count: 6, index: 0, offset: 0.25, expectedDisplacement: -0.25 },
+ { count: 6, index: 1, offset: 0.25, expectedDisplacement: -1.25 },
+ { count: 6, index: 5, offset: 0.25, expectedDisplacement: 0.75 },
+ { count: 6, index: 0, offset: 0.5, expectedDisplacement: -0.5 },
+ { count: 6, index: 1, offset: 0.5, expectedDisplacement: -1.5 },
+ { count: 6, index: 5, offset: 0.5, expectedDisplacement: 0.5 },
// By this stage, the delegate at index 1 is destroyed, so we can't test its displacement.
- { index: 0, offset: 0.75, expectedDisplacement: -0.75 },
- { index: 5, offset: 0.75, expectedDisplacement: 0.25 },
- { index: 0, offset: 4.75, expectedDisplacement: 1.25 },
- { index: 1, offset: 4.75, expectedDisplacement: 0.25 },
- { index: 0, offset: 4.5, expectedDisplacement: 1.5 },
- { index: 1, offset: 4.5, expectedDisplacement: 0.5 },
- { index: 0, offset: 4.25, expectedDisplacement: 1.75 },
- { index: 1, offset: 4.25, expectedDisplacement: 0.75 }
+ { count: 6, index: 0, offset: 0.75, expectedDisplacement: -0.75 },
+ { count: 6, index: 5, offset: 0.75, expectedDisplacement: 0.25 },
+ { count: 6, index: 0, offset: 4.75, expectedDisplacement: 1.25 },
+ { count: 6, index: 1, offset: 4.75, expectedDisplacement: 0.25 },
+ { count: 6, index: 0, offset: 4.5, expectedDisplacement: 1.5 },
+ { count: 6, index: 1, offset: 4.5, expectedDisplacement: 0.5 },
+ { count: 6, index: 0, offset: 4.25, expectedDisplacement: 1.75 },
+ { count: 6, index: 1, offset: 4.25, expectedDisplacement: 0.75 },
+ // count == visibleItemCount
+ { count: 3, index: 0, offset: 0, expectedDisplacement: 0 },
+ { count: 3, index: 1, offset: 0, expectedDisplacement: -1 },
+ { count: 3, index: 2, offset: 0, expectedDisplacement: 1 },
+ // count < visibleItemCount
+ { count: 2, index: 0, offset: 0, expectedDisplacement: 0 },
+ { count: 2, index: 1, offset: 0, expectedDisplacement: 1 },
+ // count == 1
+ { count: 1, index: 0, offset: 0, expectedDisplacement: 0 }
];
for (var i = 0; i < data.length; ++i) {
var row = data[i];
@@ -283,8 +292,8 @@ TestCase {
// TODO: test setting these in the opposite order (delegate after model
// doesn't seem to cause a change in delegates in PathView)
tumbler.delegate = displacementDelegate;
- tumbler.model = 6;
- compare(tumbler.count, 6);
+ tumbler.model = data.count;
+ compare(tumbler.count, data.count);
var delegate = findChild(tumbler.contentItem, "delegate" + data.index);
verify(delegate);