4#include "pagestackattached.h"
6#include "formlayoutattached.h"
7#include "loggingcategory.h"
13using namespace Qt::StringLiterals;
15template<
typename... Args>
16bool callIfValid(
QObject *
object,
const char *method, Args &&...args)
18 auto metaObject =
object->metaObject();
19 auto index = metaObject->indexOfMethod(method);
21 auto method = metaObject->method(index);
22 return method.invoke(
object, args...);
30 const auto metaObject =
object->metaObject();
33 if (
auto index = metaObject->indexOfMethod(
name.
data()); index != -1) {
36 return metaObject->invokeMethod(
object, stackViewMethod.
data(), component, properties);
38 return metaObject->invokeMethod(
object, stackViewMethod.
data(), item, properties);
40 return metaObject->invokeMethod(
object, stackViewMethod.
data(), url, properties);
46PageStackAttached::PageStackAttached(
QObject *parent)
49 m_parentItem = qobject_cast<QQuickItem *>(parent);
52 qCDebug(KirigamiLayoutsLog) <<
"PageStack must be attached to an Item" << parent;
56 if (hasStackCapabilities(m_parentItem)) {
57 setPageStack(m_parentItem);
58 }
else if (!m_pageStack) {
61 if (hasStackCapabilities(candidate)) {
62 qmlAttachedPropertiesObject<PageStackAttached>(candidate,
true);
77void PageStackAttached::setPageStack(
QQuickItem *pageStack)
79 if (!pageStack || m_pageStack == pageStack || !hasStackCapabilities(pageStack)) {
84 m_pageStack = pageStack;
86 propagatePageStack(pageStack);
91void PageStackAttached::propagatePageStack(
QQuickItem *pageStack)
97 if (!m_customStack && m_pageStack != pageStack) {
98 m_pageStack = pageStack;
106 stackAttached->propagatePageStack(m_pageStack);
111void PageStackAttached::push(
const QVariant &page,
const QVariantMap &properties)
114 qCWarning(KirigamiLayoutsLog) <<
"Pushing in an empty PageStackAttached";
118 if (!tryCall(m_pageStack,
"push",
"pushItem", page, properties)) {
119 qCWarning(KirigamiLayoutsLog) <<
"Invalid parameters to push: " << page <<
properties;
123void PageStackAttached::replace(
const QVariant &page,
const QVariantMap &properties)
126 qCWarning(KirigamiLayoutsLog) <<
"replacing in an empty PageStackAttached";
130 if (!tryCall(m_pageStack,
"replace",
"replaceCurrentItem", page, properties)) {
131 qCWarning(KirigamiLayoutsLog) <<
"Invalid parameters to replace: " << page <<
properties;
135void PageStackAttached::pop(
const QVariant &page)
138 qCWarning(KirigamiLayoutsLog) <<
"Pushing in an empty PageStackAttached";
142 if (callIfValid(m_pageStack,
"pop(QVariant)", page)) {
144 }
else if (page.
canConvert<QQuickItem *>() && callIfValid(m_pageStack,
"popToItem(QQuickItem*)", page.
value<QQuickItem *>())) {
146 }
else if (callIfValid(m_pageStack,
"popCurrentItem()")) {
150 qCWarning(KirigamiLayoutsLog) <<
"Pop operation failed on stack" << m_pageStack <<
"with page" << page;
153void PageStackAttached::clear()
156 qCWarning(KirigamiLayoutsLog) <<
"Clearing in an empty PageStackAttached";
160 if (!callIfValid(m_pageStack,
"clear()")) {
161 qCWarning(KirigamiLayoutsLog) <<
"Call to clear() failed";
165bool PageStackAttached::hasStackCapabilities(
QQuickItem *candidate)
171 auto hasPageRowOrStackViewMethod = [
metaObject](QByteArrayView pageRowMethod, QByteArrayView stackViewMethod) ->
bool {
173 QByteArray
name = pageRowMethod +
"(QVariant,QVariant)";
179 name = stackViewMethod +
"(QQmlComponent*,QVariantMap)";
184 name = stackViewMethod +
"(QQuickItem*,QVariantMap)";
189 name = stackViewMethod +
"(QUrl,QVariantMap)";
197 if (!hasPageRowOrStackViewMethod(
"push",
"pushItem")) {
201 if (!hasPageRowOrStackViewMethod(
"replace",
"replaceCurrentItem")) {
205 auto index =
metaObject->indexOfMethod(
"pop(QVariant)");
207 index =
metaObject->indexOfMethod(
"popToItem(QQuickItem*)");
211 index =
metaObject->indexOfMethod(
"popCurrentItem()");
227 return new PageStackAttached(
object);
236 propagatePageStack(stackAttached->pageStack());
240#include "moc_pagestackattached.cpp"
This attached property makes possible to access from anywhere the page stack this page was pushed int...
KCRASH_EXPORT void initialize()
QString name(StandardAction id)
const_pointer data() const const
T qobject_cast(QObject *object)
QQuickAttachedPropertyPropagator(QObject *parent)
QList< QQuickAttachedPropertyPropagator * > attachedChildren() const const
QQuickItem * parentItem() const const
bool isEmpty() const const
bool canConvert() const const
QVariant fromValue(T &&value)