aboutsummaryrefslogtreecommitdiffstats
path: root/src/quicktemplates2/qquickstackview_p.cpp
diff options
context:
space:
mode:
authorJ-P Nurmi <jpnurmi@qt.io>2016-07-14 10:09:41 +0200
committerJ-P Nurmi <jpnurmi@qt.io>2016-07-14 13:16:21 +0000
commitacecb06f1890feab9fee20345cd768ae61a8ae35 (patch)
tree6276f226eba82d168af04150f297a012c2a55dd4 /src/quicktemplates2/qquickstackview_p.cpp
parent16a142977dd328689f2de4eb35c52340aceea204 (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.cpp176
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