diff options
author | Nikita Krupenko <krnekit@gmail.com> | 2016-05-08 20:22:01 +0300 |
---|---|---|
committer | Nikita Krupenko <krnekit@gmail.com> | 2016-05-09 13:31:55 +0000 |
commit | 4dc0c0d4fa4e886650fb72161448bfb1f621b53b (patch) | |
tree | de516233a6abc9064cda43a95632d1606f117a8c | |
parent | 43b02ebb9687917082538f26ba321dc9c615d2fd (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.cpp | 10 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_tumbler.qml | 47 |
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); |