diff options
-rw-r--r-- | src/quicktemplates2/qquickstackview.cpp | 61 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview_p.cpp | 53 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview_p.h | 7 | ||||
-rw-r--r-- | src/quicktemplates2/qquickstackview_p_p.h | 10 | ||||
-rw-r--r-- | tests/auto/controls/data/tst_stackview.qml | 61 |
5 files changed, 152 insertions, 40 deletions
diff --git a/src/quicktemplates2/qquickstackview.cpp b/src/quicktemplates2/qquickstackview.cpp index 46c1d96e..6fd681c5 100644 --- a/src/quicktemplates2/qquickstackview.cpp +++ b/src/quicktemplates2/qquickstackview.cpp @@ -430,8 +430,11 @@ QQuickItem *QQuickStackView::find(const QJSValue &callback, LoadBehavior behavio An \a operation can be optionally specified as the last argument. Supported operations: - \value StackView.Transition An operation with transitions. + \value StackView.Transition An operation with default transitions (default). \value StackView.Immediate An immediate operation without transitions. + \value StackView.PushTransition An operation with push transitions (since QtQuick.Controls 2.1). + \value StackView.ReplaceTransition An operation with replace transitions (since QtQuick.Controls 2.1). + \value StackView.PopTransition An operation with pop transitions (since QtQuick.Controls 2.1). \sa initialItem */ @@ -447,7 +450,7 @@ void QQuickStackView::push(QQmlV4Function *args) QV4::ExecutionEngine *v4 = args->v4engine(); QV4::Scope scope(v4); - Operation operation = d->elements.isEmpty() ? Immediate : Transition; + Operation operation = d->elements.isEmpty() ? Immediate : PushTransition; QV4::ScopedValue lastArg(scope, (*args)[args->length() - 1]); if (lastArg->isInt32()) operation = static_cast<Operation>(lastArg->toInt32()); @@ -466,8 +469,8 @@ void QQuickStackView::push(QQmlV4Function *args) if (d->pushElements(elements)) { emit depthChanged(); QQuickStackElement *enter = d->elements.top(); - d->startTransition(QQuickStackTransition::enter(QQuickStackTransition::Push, enter, this), - QQuickStackTransition::exit(QQuickStackTransition::Push, exit, this), + d->startTransition(QQuickStackTransition::pushEnter(operation, enter, this), + QQuickStackTransition::pushExit(operation, exit, this), operation == Immediate); d->setCurrentItem(enter->item); } @@ -493,8 +496,11 @@ void QQuickStackView::push(QQmlV4Function *args) An \a operation can be optionally specified as the last argument. Supported operations: - \value StackView.Transition An operation with transitions. + \value StackView.Transition An operation with default transitions (default). \value StackView.Immediate An immediate operation without transitions. + \value StackView.PushTransition An operation with push transitions (since QtQuick.Controls 2.1). + \value StackView.ReplaceTransition An operation with replace transitions (since QtQuick.Controls 2.1). + \value StackView.PopTransition An operation with pop transitions (since QtQuick.Controls 2.1). Examples: \code @@ -540,7 +546,7 @@ void QQuickStackView::pop(QQmlV4Function *args) } } - Operation operation = Transition; + Operation operation = PopTransition; if (argc > 0) { QV4::ScopedValue lastArg(scope, (*args)[argc - 1]); if (lastArg->isInt32()) @@ -555,8 +561,8 @@ void QQuickStackView::pop(QQmlV4Function *args) previousItem = exit->item; } emit depthChanged(); - d->startTransition(QQuickStackTransition::exit(QQuickStackTransition::Pop, exit, this), - QQuickStackTransition::enter(QQuickStackTransition::Pop, enter, this), + d->startTransition(QQuickStackTransition::popExit(operation, exit, this), + QQuickStackTransition::popEnter(operation, enter, this), operation == Immediate); d->setCurrentItem(enter->item); } @@ -612,8 +618,39 @@ void QQuickStackView::pop(QQmlV4Function *args) An \a operation can be optionally specified as the last argument. Supported operations: - \value StackView.Transition An operation with transitions. + \value StackView.Transition An operation with default transitions (default). \value StackView.Immediate An immediate operation without transitions. + \value StackView.PushTransition An operation with push transitions (since QtQuick.Controls 2.1). + \value StackView.ReplaceTransition An operation with replace transitions (since QtQuick.Controls 2.1). + \value StackView.PopTransition An operation with pop transitions (since QtQuick.Controls 2.1). + + The following example illustrates the use of push and pop transitions with replace(). + + \code + StackView { + id: stackView + + initialItem: Component { + id: page + + Page { + Row { + spacing: 20 + anchors.centerIn: parent + + Button { + text: "<" + onClicked: stackView.replace(page, StackView.PopTransition) + } + Button { + text: ">" + onClicked: stackView.replace(page, StackView.PushTransition) + } + } + } + } + } + \endcode \sa push() */ @@ -629,7 +666,7 @@ void QQuickStackView::replace(QQmlV4Function *args) QV4::ExecutionEngine *v4 = args->v4engine(); QV4::Scope scope(v4); - Operation operation = d->elements.isEmpty() ? Immediate : Transition; + Operation operation = d->elements.isEmpty() ? Immediate : ReplaceTransition; QV4::ScopedValue lastArg(scope, (*args)[args->length() - 1]); if (lastArg->isInt32()) operation = static_cast<Operation>(lastArg->toInt32()); @@ -659,8 +696,8 @@ void QQuickStackView::replace(QQmlV4Function *args) if (exit) exit->removal = true; QQuickStackElement *enter = d->elements.top(); - d->startTransition(QQuickStackTransition::exit(QQuickStackTransition::Replace, exit, this), - QQuickStackTransition::enter(QQuickStackTransition::Replace, enter, this), + d->startTransition(QQuickStackTransition::replaceExit(operation, exit, this), + QQuickStackTransition::replaceEnter(operation, enter, this), operation == Immediate); d->setCurrentItem(enter->item); } diff --git a/src/quicktemplates2/qquickstackview_p.cpp b/src/quicktemplates2/qquickstackview_p.cpp index c021ba77..5d25793e 100644 --- a/src/quicktemplates2/qquickstackview_p.cpp +++ b/src/quicktemplates2/qquickstackview_p.cpp @@ -501,7 +501,7 @@ void QQuickStackViewPrivate::setBusy(bool b) emit q->busyChanged(); } -QQuickStackTransition QQuickStackTransition::exit(Operation operation, QQuickStackElement *element, QQuickStackView *view) +static QQuickStackTransition exitTransition(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) { QQuickStackTransition st; st.status = QQuickStackView::Deactivating; @@ -511,21 +511,21 @@ QQuickStackTransition QQuickStackTransition::exit(Operation operation, QQuickSta const QQuickItemViewTransitioner *transitioner = QQuickStackViewPrivate::get(view)->transitioner; switch (operation) { - case Push: + case QQuickStackView::PushTransition: st.target = false; st.type = QQuickItemViewTransitioner::AddTransition; st.viewBounds = QRectF(); if (transitioner) st.transition = transitioner->addDisplacedTransition; break; - case Replace: + case QQuickStackView::ReplaceTransition: st.target = false; st.type = QQuickItemViewTransitioner::MoveTransition; st.viewBounds = QRectF(); if (transitioner) st.transition = transitioner->moveDisplacedTransition; break; - case Pop: + case QQuickStackView::PopTransition: st.target = true; st.type = QQuickItemViewTransitioner::RemoveTransition; st.viewBounds = view->boundingRect(); @@ -540,7 +540,7 @@ QQuickStackTransition QQuickStackTransition::exit(Operation operation, QQuickSta return st; } -QQuickStackTransition QQuickStackTransition::enter(Operation operation, QQuickStackElement *element, QQuickStackView *view) +static QQuickStackTransition enterTransition(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) { QQuickStackTransition st; st.status = QQuickStackView::Activating; @@ -550,21 +550,21 @@ QQuickStackTransition QQuickStackTransition::enter(Operation operation, QQuickSt const QQuickItemViewTransitioner *transitioner = QQuickStackViewPrivate::get(view)->transitioner; switch (operation) { - case Push: + case QQuickStackView::PushTransition: st.target = true; st.type = QQuickItemViewTransitioner::AddTransition; st.viewBounds = view->boundingRect(); if (transitioner) st.transition = transitioner->addTransition; break; - case Replace: + case QQuickStackView::ReplaceTransition: st.target = true; st.type = QQuickItemViewTransitioner::MoveTransition; st.viewBounds = view->boundingRect(); if (transitioner) st.transition = transitioner->moveTransition; break; - case Pop: + case QQuickStackView::PopTransition: st.target = false; st.type = QQuickItemViewTransitioner::RemoveTransition; st.viewBounds = QRectF(); @@ -579,4 +579,41 @@ QQuickStackTransition QQuickStackTransition::enter(Operation operation, QQuickSt return st; } +static QQuickStackView::Operation operationTransition(QQuickStackView::Operation operation, QQuickStackView::Operation transition) +{ + if (operation == QQuickStackView::Immediate || operation == QQuickStackView::Transition) + return transition; + return operation; +} + +QQuickStackTransition QQuickStackTransition::popExit(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + return exitTransition(operationTransition(operation, QQuickStackView::PopTransition), element, view); +} + +QQuickStackTransition QQuickStackTransition::popEnter(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + return enterTransition(operationTransition(operation, QQuickStackView::PopTransition), element, view); +} + +QQuickStackTransition QQuickStackTransition::pushExit(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + return exitTransition(operationTransition(operation, QQuickStackView::PushTransition), element, view); +} + +QQuickStackTransition QQuickStackTransition::pushEnter(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + return enterTransition(operationTransition(operation, QQuickStackView::PushTransition), element, view); +} + +QQuickStackTransition QQuickStackTransition::replaceExit(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + return exitTransition(operationTransition(operation, QQuickStackView::ReplaceTransition), element, view); +} + +QQuickStackTransition QQuickStackTransition::replaceEnter(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + return enterTransition(operationTransition(operation, QQuickStackView::ReplaceTransition), element, view); +} + QT_END_NAMESPACE diff --git a/src/quicktemplates2/qquickstackview_p.h b/src/quicktemplates2/qquickstackview_p.h index 579a6c7f..c76f8167 100644 --- a/src/quicktemplates2/qquickstackview_p.h +++ b/src/quicktemplates2/qquickstackview_p.h @@ -121,8 +121,11 @@ public: Q_INVOKABLE QQuickItem *find(const QJSValue &callback, LoadBehavior behavior = DontLoad); enum Operation { - Transition, - Immediate + Transition = -1, // deprecated + Immediate = 0, + PushTransition = 1, + ReplaceTransition = 2, + PopTransition = 3, }; Q_ENUM(Operation) diff --git a/src/quicktemplates2/qquickstackview_p_p.h b/src/quicktemplates2/qquickstackview_p_p.h index 7fe7f005..c7691c40 100644 --- a/src/quicktemplates2/qquickstackview_p_p.h +++ b/src/quicktemplates2/qquickstackview_p_p.h @@ -140,10 +140,14 @@ public: struct QQuickStackTransition { - enum Operation { Push, Replace, Pop }; + static QQuickStackTransition popExit(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view); + static QQuickStackTransition popEnter(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view); - static QQuickStackTransition exit(Operation operation, QQuickStackElement *element, QQuickStackView *view); - static QQuickStackTransition enter(Operation operation, QQuickStackElement *element, QQuickStackView *view); + static QQuickStackTransition pushExit(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view); + static QQuickStackTransition pushEnter(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view); + + static QQuickStackTransition replaceExit(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view); + static QQuickStackTransition replaceEnter(QQuickStackView::Operation operation, QQuickStackElement *element, QQuickStackView *view); bool target; QQuickStackView::Status status; diff --git a/tests/auto/controls/data/tst_stackview.qml b/tests/auto/controls/data/tst_stackview.qml index 40e9d2d8..2de0fb98 100644 --- a/tests/auto/controls/data/tst_stackview.qml +++ b/tests/auto/controls/data/tst_stackview.qml @@ -572,29 +572,60 @@ TestCase { } } - function test_transitions() { + function test_transitions_data() { + return [ + { tag: "undefined", operation: undefined, + pushEnterRuns: [0,1,1,1], pushExitRuns: [0,1,1,1], replaceEnterRuns: [0,0,1,1], replaceExitRuns: [0,0,1,1], popEnterRuns: [0,0,0,1], popExitRuns: [0,0,0,1] }, + { tag: "immediate", operation: StackView.Immediate, + pushEnterRuns: [0,0,0,0], pushExitRuns: [0,0,0,0], replaceEnterRuns: [0,0,0,0], replaceExitRuns: [0,0,0,0], popEnterRuns: [0,0,0,0], popExitRuns: [0,0,0,0] }, + { tag: "push", operation: StackView.PushTransition, + pushEnterRuns: [1,2,3,4], pushExitRuns: [0,1,2,3], replaceEnterRuns: [0,0,0,0], replaceExitRuns: [0,0,0,0], popEnterRuns: [0,0,0,0], popExitRuns: [0,0,0,0] }, + { tag: "pop", operation: StackView.PopTransition, + pushEnterRuns: [0,0,0,0], pushExitRuns: [0,0,0,0], replaceEnterRuns: [0,0,0,0], replaceExitRuns: [0,0,0,0], popEnterRuns: [1,2,3,4], popExitRuns: [0,1,2,3] }, + { tag: "replace", operation: StackView.ReplaceTransition, + pushEnterRuns: [0,0,0,0], pushExitRuns: [0,0,0,0], replaceEnterRuns: [1,2,3,4], replaceExitRuns: [0,1,2,3], popEnterRuns: [0,0,0,0], popExitRuns: [0,0,0,0] }, + ] + } + + function test_transitions(data) { var control = transitionView.createObject(testCase) verify(control) - control.push(component) - verify(!control.busy) - compare(control.pushEnterRuns, 0) - compare(control.pushExitRuns, 0) - - control.push(component) + control.push(component, data.operation) + tryCompare(control, "busy", false) + compare(control.pushEnterRuns, data.pushEnterRuns[0]) + compare(control.pushExitRuns, data.pushExitRuns[0]) + compare(control.replaceEnterRuns, data.replaceEnterRuns[0]) + compare(control.replaceExitRuns, data.replaceExitRuns[0]) + compare(control.popEnterRuns, data.popEnterRuns[0]) + compare(control.popExitRuns, data.popExitRuns[0]) + + control.push(component, data.operation) tryCompare(control, "busy", false) - compare(control.pushEnterRuns, 1) - compare(control.pushExitRuns, 1) + compare(control.pushEnterRuns, data.pushEnterRuns[1]) + compare(control.pushExitRuns, data.pushExitRuns[1]) + compare(control.replaceEnterRuns, data.replaceEnterRuns[1]) + compare(control.replaceExitRuns, data.replaceExitRuns[1]) + compare(control.popEnterRuns, data.popEnterRuns[1]) + compare(control.popExitRuns, data.popExitRuns[1]) - control.replace(component) + control.replace(component, data.operation) tryCompare(control, "busy", false) - compare(control.replaceEnterRuns, 1) - compare(control.replaceExitRuns, 1) + compare(control.pushEnterRuns, data.pushEnterRuns[2]) + compare(control.pushExitRuns, data.pushExitRuns[2]) + compare(control.replaceEnterRuns, data.replaceEnterRuns[2]) + compare(control.replaceExitRuns, data.replaceExitRuns[2]) + compare(control.popEnterRuns, data.popEnterRuns[2]) + compare(control.popExitRuns, data.popExitRuns[2]) - control.pop() + control.pop(data.operation) tryCompare(control, "busy", false) - compare(control.popEnterRuns, 1) - compare(control.popExitRuns, 1) + compare(control.pushEnterRuns, data.pushEnterRuns[3]) + compare(control.pushExitRuns, data.pushExitRuns[3]) + compare(control.replaceEnterRuns, data.replaceEnterRuns[3]) + compare(control.replaceExitRuns, data.replaceExitRuns[3]) + compare(control.popEnterRuns, data.popEnterRuns[3]) + compare(control.popExitRuns, data.popExitRuns[3]) control.destroy() } |