From e2b87dda1fe4e8e22ea4231971085f4cd4852843 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Tue, 10 Nov 2020 21:01:35 +0100 Subject: QQuickStackView: Allow URLs in createElement() The value is intended to be a URL, therefore only accepting the string form is not enough. Task-number: QTBUG-88372 Change-Id: I4d31d1c5eacd49b7591f087c2e82c31b70a3bc1d Reviewed-by: Fabian Kosmale Reviewed-by: Mitch Curtis --- src/quicktemplates2/qquickstackview_p.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/quicktemplates2') diff --git a/src/quicktemplates2/qquickstackview_p.cpp b/src/quicktemplates2/qquickstackview_p.cpp index ce81a929..13e79e0e 100644 --- a/src/quicktemplates2/qquickstackview_p.cpp +++ b/src/quicktemplates2/qquickstackview_p.cpp @@ -42,6 +42,8 @@ #include #include #include +#include +#include #include #include @@ -155,6 +157,13 @@ QQuickStackElement *QQuickStackViewPrivate::findElement(const QV4::Value &value) return nullptr; } +static QUrl resolvedUrl(const QUrl &url, const QQmlRefPointer &context) +{ + if (url.isRelative()) + return context->resolvedUrl(url).toString(); + return url; +} + static QString resolvedUrl(const QString &str, const QQmlRefPointer &context) { QUrl url(str); @@ -170,6 +179,17 @@ QQuickStackElement *QQuickStackViewPrivate::createElement(const QV4::Value &valu return QQuickStackElement::fromString(resolvedUrl(s->toQString(), context), q, error); if (const QV4::QObjectWrapper *o = value.as()) return QQuickStackElement::fromObject(o->object(), q, error); + if (const QV4::UrlObject *u = value.as()) + return QQuickStackElement::fromString(resolvedUrl(u->href(), context), q, error); + + if (const QV4::Object *v = value.as()) { + const QVariant data = v->engine()->toVariant(value, QMetaType::QUrl); + if (data.typeId() == QMetaType::QUrl) { + return QQuickStackElement::fromString(resolvedUrl(data.toUrl(), context).toString(), q, + error); + } + } + return nullptr; } -- cgit v1.2.3