diff options
Diffstat (limited to 'sources/pyside6/PySide6/QtQuick/pysidequickregistertype.cpp')
-rw-r--r-- | sources/pyside6/PySide6/QtQuick/pysidequickregistertype.cpp | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.cpp b/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.cpp new file mode 100644 index 000000000..f7749b4e7 --- /dev/null +++ b/sources/pyside6/PySide6/QtQuick/pysidequickregistertype.cpp @@ -0,0 +1,76 @@ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only + +#include "pysidequickregistertype.h" + +#include <pyside.h> +#include <pysideqmlregistertype.h> +#include <pyside_p.h> +#include <shiboken.h> + +#include <QtQuick/QQuickPaintedItem> + +#if QT_CONFIG(opengl) || QT_CONFIG(opengles2) || QT_CONFIG(opengles3) +# include <QtQuick/QQuickFramebufferObject> +#endif + +bool pyTypeObjectInheritsFromClass(PyTypeObject *pyObjType, const char *classPtrName) +{ + PyTypeObject *classPyType = Shiboken::Conversions::getPythonTypeObject(classPtrName); + bool isDerived = PySequence_Contains(pyObjType->tp_mro, + reinterpret_cast<PyObject *>(classPyType)); + return isDerived; +} + +template <class WrappedClass> +bool registerTypeIfInheritsFromClass(const char *classPtrName, + PyTypeObject *typeToRegister, + QQmlPrivate::RegisterTypeAndRevisions *type) +{ + if (!pyTypeObjectInheritsFromClass(typeToRegister, classPtrName)) + return false; + type->parserStatusCast = + QQmlPrivate::StaticCastSelector<WrappedClass, QQmlParserStatus>::cast(); + type->valueSourceCast = + QQmlPrivate::StaticCastSelector<WrappedClass, QQmlPropertyValueSource>::cast(); + type->valueInterceptorCast = + QQmlPrivate::StaticCastSelector<WrappedClass, QQmlPropertyValueInterceptor>::cast(); + return true; +} + +bool quickRegisterType(PyObject *pyObj, QQmlPrivate::RegisterTypeAndRevisions *type) +{ + using namespace Shiboken; + + PyTypeObject *pyObjType = reinterpret_cast<PyTypeObject *>(pyObj); + PyTypeObject *qQuickItemPyType = + Shiboken::Conversions::getPythonTypeObject("QQuickItem*"); + bool isQuickItem = PySequence_Contains(pyObjType->tp_mro, + reinterpret_cast<PyObject *>(qQuickItemPyType)); + + // Register only classes that inherit QQuickItem or its children. + if (!isQuickItem) + return false; + + return registerTypeIfInheritsFromClass<QQuickPaintedItem>("QQuickPaintedItem*", + pyObjType, type) +#if QT_CONFIG(opengl) || QT_CONFIG(opengles2) || QT_CONFIG(opengles3) + || registerTypeIfInheritsFromClass<QQuickFramebufferObject>("QQuickFramebufferObject*", + pyObjType, type) +#endif + || registerTypeIfInheritsFromClass<QQuickItem>("QQuickItem*", + pyObjType, type); +} + +void PySide::initQuickSupport(PyObject *module) +{ + Q_UNUSED(module); + // We need to manually register a pointer version of these types in order for them to be used as property types. + qRegisterMetaType<QQuickPaintedItem*>("QQuickPaintedItem*"); +#if QT_CONFIG(opengl) || QT_CONFIG(opengles2) || QT_CONFIG(opengles3) + qRegisterMetaType<QQuickFramebufferObject*>("QQuickFramebufferObject*"); +#endif + qRegisterMetaType<QQuickItem*>("QQuickItem*"); + + Qml::setQuickRegisterItemFunction(quickRegisterType); +} |