diff options
Diffstat (limited to 'src/quicktemplates2/qquickstackview_p.cpp')
-rw-r--r-- | src/quicktemplates2/qquickstackview_p.cpp | 259 |
1 files changed, 161 insertions, 98 deletions
diff --git a/src/quicktemplates2/qquickstackview_p.cpp b/src/quicktemplates2/qquickstackview_p.cpp index c1b68652..0f5674c2 100644 --- a/src/quicktemplates2/qquickstackview_p.cpp +++ b/src/quicktemplates2/qquickstackview_p.cpp @@ -72,7 +72,7 @@ private: QQuickStackElement::QQuickStackElement() : QQuickItemViewTransitionableItem(nullptr), index(-1), init(false), removal(false), ownItem(false), ownComponent(false), widthValid(false), heightValid(false), - context(nullptr), component(nullptr), incubator(nullptr), view(nullptr), + context(nullptr), component(nullptr), view(nullptr), status(QQuickStackView::Inactive) { } @@ -107,7 +107,6 @@ QQuickStackElement::~QQuickStackElement() } delete context; - delete incubator; } QQuickStackElement *QQuickStackElement::fromString(const QString &str, QQuickStackView *view) @@ -120,12 +119,9 @@ QQuickStackElement *QQuickStackElement::fromString(const QString &str, QQuickSta QQuickStackElement *QQuickStackElement::fromObject(QObject *object, QQuickStackView *view) { + Q_UNUSED(view); QQuickStackElement *element = new QQuickStackElement; element->component = qobject_cast<QQmlComponent *>(object); - if (!element->component) { - element->component = new QQmlComponent(qmlEngine(view), view); - element->ownComponent = true; - } element->item = qobject_cast<QQuickItem *>(object); if (element->item) element->originalParent = element->item->parentItem(); @@ -144,9 +140,8 @@ bool QQuickStackElement::load(QQuickStackView *parent) context = new QQmlContext(creationContext); context->setContextObject(parent); - delete incubator; - incubator = new QQuickStackIncubator(this); - component->create(*incubator, context); + QQuickStackIncubator incubator(this); + component->create(incubator, context); if (component->isError()) qWarning() << qPrintable(component->errorString().trimmed()); } else { @@ -179,14 +174,15 @@ void QQuickStackElement::initialize() p->addItemChangeListener(this, QQuickItemPrivate::Destroyed); if (!properties.isUndefined()) { - QQmlComponentPrivate *d = QQmlComponentPrivate::get(component); - Q_ASSERT(d && d->engine); - QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(d->engine); + QQmlEngine *engine = qmlEngine(view); + Q_ASSERT(engine); + QV4::ExecutionEngine *v4 = QQmlEnginePrivate::getV4Engine(engine); Q_ASSERT(v4); QV4::Scope scope(v4); QV4::ScopedValue ipv(scope, properties.value()); QV4::Scoped<QV4::QmlContext> qmlContext(scope, qmlCallingContext.value()); - d->initializeObjectWithInitialProperties(qmlContext, ipv, item); + QV4::ScopedValue qmlObject(scope, QV4::QObjectWrapper::wrap(v4, item)); + QQmlComponentPrivate::setInitialProperties(v4, qmlContext, qmlObject, ipv); properties.clear(); } @@ -222,8 +218,28 @@ void QQuickStackElement::setStatus(QQuickStackView::Status value) status = value; QQuickStackAttached *attached = attachedStackObject(this); - if (attached) - emit attached->statusChanged(); + if (!attached) + return; + + switch (value) { + case QQuickStackView::Inactive: + emit attached->deactivated(); + break; + case QQuickStackView::Deactivating: + emit attached->deactivating(); + break; + case QQuickStackView::Activating: + emit attached->activating(); + break; + case QQuickStackView::Active: + emit attached->activated(); + break; + default: + Q_UNREACHABLE(); + break; + } + + emit attached->statusChanged(); } void QQuickStackElement::transitionNextReposition(QQuickItemViewTransitioner *transitioner, QQuickItemViewTransitioner::TransitionType type, bool asTarget) @@ -411,96 +427,28 @@ void QQuickStackViewPrivate::ensureTransitioner() } } -void QQuickStackViewPrivate::popTransition(QQuickStackElement *enter, QQuickStackElement *exit, const QRectF &viewBounds, 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 (exit) { - exit->setStatus(QQuickStackView::Deactivating); - exit->transitionNextReposition(transitioner, QQuickItemViewTransitioner::AddTransition, false); - } - - if (enter) { - if (immediate || !enter->item || !enter->prepareTransition(transitioner, viewBounds)) - completeTransition(enter, transitioner->addTransition); - else - enter->startTransition(transitioner); - } - if (exit) { - if (immediate || !exit->item || !exit->prepareTransition(transitioner, QRectF())) - completeTransition(exit, transitioner->addDisplacedTransition); - else - exit->startTransition(transitioner); - } - - if (transitioner) { - setBusy(!transitioner->runningJobs.isEmpty()); - transitioner->resetTargetLists(); - } -} - -void QQuickStackViewPrivate::replaceTransition(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::MoveTransition, false); + if (first.element) { + first.element->setStatus(first.status); + first.element->transitionNextReposition(transitioner, first.type, first.target); } - if (enter) { - enter->setStatus(QQuickStackView::Activating); - enter->transitionNextReposition(transitioner, QQuickItemViewTransitioner::MoveTransition, true); + if (second.element) { + second.element->setStatus(second.status); + second.element->transitionNextReposition(transitioner, second.type, second.target); } - if (exit) { - if (immediate || !exit->item || !exit->prepareTransition(transitioner, QRectF())) - completeTransition(exit, transitioner->moveDisplacedTransition); + if (first.element) { + if (immediate || !first.element->item || !first.element->prepareTransition(transitioner, first.viewBounds)) + completeTransition(first.element, transitioner->removeTransition); else - exit->startTransition(transitioner); + first.element->startTransition(transitioner); } - if (enter) { - if (immediate || !enter->item || !enter->prepareTransition(transitioner, viewBounds)) - completeTransition(enter, transitioner->moveTransition); + if (second.element) { + if (immediate || !second.element->item || !second.element->prepareTransition(transitioner, second.viewBounds)) + completeTransition(second.element, transitioner->removeDisplacedTransition); else - enter->startTransition(transitioner); + second.element->startTransition(transitioner); } if (transitioner) { @@ -554,4 +502,119 @@ void QQuickStackViewPrivate::setBusy(bool b) emit q->busyChanged(); } +static QQuickStackTransition exitTransition(QQuickStackView::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 QQuickStackView::PushTransition: + st.target = false; + st.type = QQuickItemViewTransitioner::AddTransition; + st.viewBounds = QRectF(); + if (transitioner) + st.transition = transitioner->addDisplacedTransition; + break; + case QQuickStackView::ReplaceTransition: + st.target = false; + st.type = QQuickItemViewTransitioner::MoveTransition; + st.viewBounds = QRectF(); + if (transitioner) + st.transition = transitioner->moveDisplacedTransition; + break; + case QQuickStackView::PopTransition: + st.target = true; + st.type = QQuickItemViewTransitioner::RemoveTransition; + st.viewBounds = view->boundingRect(); + if (transitioner) + st.transition = transitioner->removeTransition; + break; + default: + Q_UNREACHABLE(); + break; + } + + return st; +} + +static QQuickStackTransition enterTransition(QQuickStackView::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 QQuickStackView::PushTransition: + st.target = true; + st.type = QQuickItemViewTransitioner::AddTransition; + st.viewBounds = view->boundingRect(); + if (transitioner) + st.transition = transitioner->addTransition; + break; + case QQuickStackView::ReplaceTransition: + st.target = true; + st.type = QQuickItemViewTransitioner::MoveTransition; + st.viewBounds = view->boundingRect(); + if (transitioner) + st.transition = transitioner->moveTransition; + break; + case QQuickStackView::PopTransition: + st.target = false; + st.type = QQuickItemViewTransitioner::RemoveTransition; + st.viewBounds = QRectF(); + if (transitioner) + st.transition = transitioner->removeDisplacedTransition; + break; + default: + Q_UNREACHABLE(); + break; + } + + 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 |