aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp')
-rw-r--r--sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp41
1 files changed, 32 insertions, 9 deletions
diff --git a/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp b/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
index 1dd0507f7..b3d2b31fe 100644
--- a/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
+++ b/sources/pyside6/PySide6/QtQml/pysideqmlregistertype.cpp
@@ -370,7 +370,8 @@ static int getGlobalInt(const char *name)
enum class RegisterMode {
Normal,
Anonymous,
- Uncreatable
+ Uncreatable,
+ Singleton
};
static PyObject *qmlElementMacroHelper(PyObject *pyObj,
@@ -411,21 +412,36 @@ static PyObject *qmlElementMacroHelper(PyObject *pyObj,
if (minorVersion == -1)
minorVersion = 0;
- if (PySide::qmlRegisterType(pyObj, importName.c_str(), majorVersion, minorVersion,
- mode != RegisterMode::Anonymous ? typeName : nullptr,
- noCreationReason,
- mode == RegisterMode::Normal) == -1) {
- PyErr_Format(PyExc_TypeError, "Failed to register type %s.", typeName);
+ const char *uri = importName.c_str();
+ const int result = mode == RegisterMode::Singleton
+ ? PySide::qmlRegisterSingletonType(pyObj, uri, majorVersion, minorVersion,
+ typeName, nullptr,
+ PySide::isQObjectDerived(pyObjType, false),
+ false)
+ : PySide::qmlRegisterType(pyObj, uri, majorVersion, minorVersion,
+ mode != RegisterMode::Anonymous ? typeName : nullptr,
+ noCreationReason,
+ mode == RegisterMode::Normal);
+
+ if (result == -1) {
+ PyErr_Format(PyExc_TypeError, "%s: Failed to register type %s.",
+ decoratorName, typeName);
}
return pyObj;
}
+// FIXME: Store this in PySide::TypeUserData once it is moved to libpyside?
+static QList<PyObject *> decoratedSingletons;
+
PyObject *PySide::qmlElementMacro(PyObject *pyObj)
{
- auto *noCreationReason = PySide::qmlNoCreationReason(pyObj);
- const auto mode = noCreationReason != nullptr
- ? RegisterMode::Uncreatable : RegisterMode::Normal;
+ const char *noCreationReason = nullptr;
+ RegisterMode mode = RegisterMode::Normal;
+ if (decoratedSingletons.contains(pyObj))
+ mode = RegisterMode::Singleton;
+ else if ((noCreationReason = PySide::qmlNoCreationReason(pyObj)))
+ mode = RegisterMode::Uncreatable;
return qmlElementMacroHelper(pyObj, "QmlElement", mode, noCreationReason);
}
@@ -434,3 +450,10 @@ PyObject *PySide::qmlAnonymousMacro(PyObject *pyObj)
return qmlElementMacroHelper(pyObj, "QmlAnonymous",
RegisterMode::Anonymous);
}
+
+PyObject *PySide::qmlSingletonMacro(PyObject *pyObj)
+{
+ decoratedSingletons.append(pyObj);
+ Py_INCREF(pyObj);
+ return pyObj;
+}