diff options
author | J-P Nurmi <jpnurmi@qt.io> | 2016-07-14 10:09:41 +0200 |
---|---|---|
committer | J-P Nurmi <jpnurmi@qt.io> | 2016-07-14 13:16:21 +0000 |
commit | acecb06f1890feab9fee20345cd768ae61a8ae35 (patch) | |
tree | 6276f226eba82d168af04150f297a012c2a55dd4 /src/quicktemplates2/qquickstackview_p.cpp | |
parent | 16a142977dd328689f2de4eb35c52340aceea204 (diff) |
Refactor QQuickStackView transition startup
Merge the separate but very similar looking popTransition(),
pushTransition(), and replaceTransition() methods to a single
startTransition() method, and pass the necessary arguments in
a QQuickStackTransition structure. This is an enabler step for
being able to specify the desired transition type for replace
(and push & pop, for that matter) operations.
Change-Id: Ia68bb94dc9280aace8718f4df0e798a7f1469e78
Reviewed-by: Mitch Curtis <mitch.curtis@qt.io>
Diffstat (limited to 'src/quicktemplates2/qquickstackview_p.cpp')
-rw-r--r-- | src/quicktemplates2/qquickstackview_p.cpp | 176 |
1 files changed, 93 insertions, 83 deletions
diff --git a/src/quicktemplates2/qquickstackview_p.cpp b/src/quicktemplates2/qquickstackview_p.cpp index c781f7fe..c021ba77 100644 --- a/src/quicktemplates2/qquickstackview_p.cpp +++ b/src/quicktemplates2/qquickstackview_p.cpp @@ -426,96 +426,28 @@ void QQuickStackViewPrivate::ensureTransitioner() } } -void QQuickStackViewPrivate::popTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, bool immediate) +void QQuickStackViewPrivate::startTransition(const QQuickStackTransition &first, const QQuickStackTransition &second, bool immediate) { - ensureTransitioner(); - - if (exit) { - exit->removal = true; - exit->setStatus(QQuickStackView::Deactivating); - exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, true); - } - if (enter) { - enter->setStatus(QQuickStackView::Activating); - enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::RemoveTransition, false); - } - - if (exit) { - if (immediate || !exit->item || !exit->prepareTransition(transitioner, viewBounds)) - completeTransition(exit, transitioner->removeTransition); - else - exit->startTransition(transitioner); - } - if (enter) { - if (immediate || !enter->item || !enter->prepareTransition(transitioner, QRectF())) - completeTransition(enter, transitioner->removeDisplacedTransition); - else - enter->startTransition(transitioner); - } - - if (transitioner) { - setBusy(!transitioner->runningJobs.isEmpty()); - transitioner->resetTargetLists(); - } -} - -void QQuickStackViewPrivate::pushTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, bool immediate) -{ - ensureTransitioner(); - - if (enter) { - enter->setStatus(QQuickStackView::Activating); - enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, true); + if (first.element) { + first.element->setStatus(first.status); + first.element->transitionNextReposition(transitioner, first.type, first.target); } - if (exit) { - exit->setStatus(QQuickStackView::Deactivating); - exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); + if (second.element) { + second.element->setStatus(second.status); + second.element->transitionNextReposition(transitioner, second.type, second.target); } - if (enter) { - if (immediate || !enter->item || !enter->prepareTransition(transitioner, viewBounds)) - completeTransition(enter, transitioner->addTransition); + if (first.element) { + if (immediate || !first.element->item || !first.element->prepareTransition(transitioner, first.viewBounds)) + completeTransition(first.element, transitioner->removeTransition); else - enter->startTransition(transitioner); + first.element->startTransition(transitioner); } - if (exit) { - if (immediate || !exit->item || !exit->prepareTransition(transitioner, QRectF())) - completeTransition(exit, transitioner->addDisplacedTransition); + if (second.element) { + if (immediate || !second.element->item || !second.element->prepareTransition(transitioner, second.viewBounds)) + completeTransition(second.element, transitioner->removeDisplacedTransition); else - exit->startTransition(transitioner); - } - - if (transitioner) { - setBusy(!transitioner->runningJobs.isEmpty()); - transitioner->resetTargetLists(); - } -} - -void QQuickStackViewPrivate::replaceTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, bool immediate) -{ - ensureTransitioner(); - - if (exit) { - exit->removal = true; - exit->setStatus(QQuickStackView::Deactivating); - exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, false); - } - if (enter) { - enter->setStatus(QQuickStackView::Activating); - enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, true); - } - - if (exit) { - if (immediate || !exit->item || !exit->prepareTransition(transitioner, QRectF())) - completeTransition(exit, transitioner->moveDisplacedTransition); - else - exit->startTransition(transitioner); - } - if (enter) { - if (immediate || !enter->item || !enter->prepareTransition(transitioner, viewBounds)) - completeTransition(enter, transitioner->moveTransition); - else - enter->startTransition(transitioner); + second.element->startTransition(transitioner); } if (transitioner) { @@ -569,4 +501,82 @@ void QQuickStackViewPrivate::setBusy(bool b) emit q->busyChanged(); } +QQuickStackTransition QQuickStackTransition::exit(Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + QQuickStackTransition st; + st.status = QQuickStackView::Deactivating; + st.transition = nullptr; + st.element = element; + + const QQuickItemViewTransitioner *transitioner = QQuickStackViewPrivate::get(view)->transitioner; + + switch (operation) { + case Push: + st.target = false; + st.type = QQuickItemViewTransitioner::AddTransition; + st.viewBounds = QRectF(); + if (transitioner) + st.transition = transitioner->addDisplacedTransition; + break; + case Replace: + st.target = false; + st.type = QQuickItemViewTransitioner::MoveTransition; + st.viewBounds = QRectF(); + if (transitioner) + st.transition = transitioner->moveDisplacedTransition; + break; + case Pop: + st.target = true; + st.type = QQuickItemViewTransitioner::RemoveTransition; + st.viewBounds = view->boundingRect(); + if (transitioner) + st.transition = transitioner->removeTransition; + break; + default: + Q_UNREACHABLE(); + break; + } + + return st; +} + +QQuickStackTransition QQuickStackTransition::enter(Operation operation, QQuickStackElement *element, QQuickStackView *view) +{ + QQuickStackTransition st; + st.status = QQuickStackView::Activating; + st.transition = nullptr; + st.element = element; + + const QQuickItemViewTransitioner *transitioner = QQuickStackViewPrivate::get(view)->transitioner; + + switch (operation) { + case Push: + st.target = true; + st.type = QQuickItemViewTransitioner::AddTransition; + st.viewBounds = view->boundingRect(); + if (transitioner) + st.transition = transitioner->addTransition; + break; + case Replace: + st.target = true; + st.type = QQuickItemViewTransitioner::MoveTransition; + st.viewBounds = view->boundingRect(); + if (transitioner) + st.transition = transitioner->moveTransition; + break; + case Pop: + st.target = false; + st.type = QQuickItemViewTransitioner::RemoveTransition; + st.viewBounds = QRectF(); + if (transitioner) + st.transition = transitioner->removeDisplacedTransition; + break; + default: + Q_UNREACHABLE(); + break; + } + + return st; +} + QT_END_NAMESPACE |