aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2023-10-10 14:36:09 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2023-10-23 12:26:07 +0200
commitab2cc5e4056a7f67682584fc0fdf81f183a05906 (patch)
tree2f6eaf4f3fdd8791e6d5d3107ea4ea92c4022960 /sources/pyside6
parenta9bf1c71b632e5799af09347a3a6bb39b0e5793e (diff)
QML registration code: Introduce a struct for import data
Reduces the function parameter count. Task-number: PYSIDE-2484 Change-Id: I53b243ae90600c548a35f5362b47f623c37d9f3f Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Diffstat (limited to 'sources/pyside6')
-rw-r--r--sources/pyside6/libpysideqml/pysideqmlregistertype.cpp118
1 files changed, 82 insertions, 36 deletions
diff --git a/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp b/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp
index cf3b4dc52..42b049c43 100644
--- a/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmlregistertype.cpp
@@ -8,6 +8,7 @@
#include "pysideqmlextended_p.h"
#include <limits>
+#include <optional>
// shiboken
#include <shiboken.h>
@@ -111,11 +112,49 @@ static int getGlobalInt(const char *name)
return value;
}
+struct ImportData
+{
+ QByteArray importName;
+ int majorVersion = 0;
+ int minorVersion = 0;
+
+ QTypeRevision toTypeRevision() const;
+};
+
+QTypeRevision ImportData::toTypeRevision() const
+{
+ return QTypeRevision::fromVersion(majorVersion, minorVersion);
+}
+
+std::optional<ImportData> getGlobalImportData(const char *decoratorName)
+{
+ ImportData result{getGlobalString("QML_IMPORT_NAME"),
+ getGlobalInt("QML_IMPORT_MAJOR_VERSION"),
+ getGlobalInt("QML_IMPORT_MINOR_VERSION")};
+
+ if (result.importName.isEmpty()) {
+ PyErr_Format(PyExc_TypeError, "You need specify QML_IMPORT_NAME in order to use %s.",
+ decoratorName);
+ return {};
+ }
+
+ if (result.majorVersion == -1) {
+ PyErr_Format(PyExc_TypeError, "You need specify QML_IMPORT_MAJOR_VERSION in order to use %s.",
+ decoratorName);
+ return {};
+ }
+
+ // Specifying a minor version is optional
+ if (result.minorVersion == -1)
+ result.minorVersion = 0;
+ return result;
+}
+
namespace PySide::Qml {
-int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor,
- int versionMinor, const char *qmlName, const char *noCreationReason,
- bool creatable)
+static int qmlRegisterType(PyObject *pyObj, const ImportData &importData,
+ const char *qmlName, const char *noCreationReason,
+ bool creatable)
{
using namespace Shiboken;
@@ -154,8 +193,8 @@ int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor,
pyObj, // userdata
QString::fromUtf8(noCreationReason),
nullptr, // createValueType (Remove in Qt 7)
- uri,
- QTypeRevision::fromVersion(versionMajor, versionMinor), // version
+ importData.importName.constData(),
+ importData.toTypeRevision(), // version
qmlName, // elementName
metaObject,
attachedInfo.factory, // attachedPropertiesFunction
@@ -194,9 +233,17 @@ int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor,
return qmlTypeId;
}
-int qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versionMajor,
- int versionMinor, const char *qmlName, PyObject *callback,
- bool isQObject, bool hasCallback)
+int qmlRegisterType(PyObject *pyObj, const char *uri, int versionMajor, int versionMinor,
+ const char *qmlName, const char *noCreationReason,
+ bool creatable)
+{
+ return qmlRegisterType(pyObj, {uri, versionMajor, versionMinor}, qmlName,
+ noCreationReason, creatable);
+}
+
+static int qmlRegisterSingletonType(PyObject *pyObj, const ImportData &importData,
+ const char *qmlName, PyObject *callback,
+ bool isQObject, bool hasCallback)
{
using namespace Shiboken;
@@ -238,8 +285,8 @@ int qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versionMajor,
QQmlPrivate::RegisterSingletonType type {
QQmlPrivate::RegisterType::StructVersion::Base, // structVersion
- uri,
- QTypeRevision::fromVersion(versionMajor, versionMinor), // version
+ importData.importName.constData(),
+ importData.toTypeRevision(), // version
qmlName, // typeName
{}, // scriptApi
{}, // qObjectApi
@@ -313,9 +360,16 @@ int qmlRegisterSingletonType(PyObject *pyObj, const char *uri, int versionMajor,
return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &type);
}
-int qmlRegisterSingletonInstance(PyObject *pyObj, const char *uri, int versionMajor,
- int versionMinor, const char *qmlName,
- PyObject *instanceObject)
+int qmlRegisterSingletonType(PyObject *pyObj,const char *uri,
+ int versionMajor, int versionMinor, const char *qmlName,
+ PyObject *callback, bool isQObject, bool hasCallback)
+{
+ return qmlRegisterSingletonType(pyObj, {uri, versionMajor, versionMinor}, qmlName,
+ callback, isQObject, hasCallback);
+}
+
+static int qmlRegisterSingletonInstance(PyObject *pyObj, const ImportData &importData,
+ const char *qmlName, PyObject *instanceObject)
{
using namespace Shiboken;
@@ -343,8 +397,8 @@ int qmlRegisterSingletonInstance(PyObject *pyObj, const char *uri, int versionMa
QQmlPrivate::RegisterSingletonType type {
QQmlPrivate::RegisterType::StructVersion::Base, // structVersion
- uri,
- QTypeRevision::fromVersion(versionMajor, versionMinor), // version
+ importData.importName.constData(),
+ importData.toTypeRevision(), // version
qmlName, // typeName
{}, // scriptApi
registrationFunctor, // qObjectApi
@@ -358,6 +412,14 @@ int qmlRegisterSingletonInstance(PyObject *pyObj, const char *uri, int versionMa
return QQmlPrivate::qmlregister(QQmlPrivate::SingletonRegistration, &type);
}
+int qmlRegisterSingletonInstance(PyObject *pyObj, const char *uri, int versionMajor,
+ int versionMinor, const char *qmlName,
+ PyObject *instanceObject)
+{
+ return qmlRegisterSingletonInstance(pyObj, {uri, versionMajor, versionMinor},
+ qmlName, instanceObject);
+}
+
} // namespace PySide::Qml
enum class RegisterMode {
@@ -387,33 +449,17 @@ static PyObject *qmlElementMacroHelper(PyObject *pyObj,
return nullptr;
}
- const auto importName = getGlobalString("QML_IMPORT_NAME");
- int majorVersion = getGlobalInt("QML_IMPORT_MAJOR_VERSION");
- int minorVersion = getGlobalInt("QML_IMPORT_MINOR_VERSION");
-
- if (importName.isEmpty()) {
- PyErr_Format(PyExc_TypeError, "You need specify QML_IMPORT_NAME in order to use %s.",
- decoratorName);
+ const auto importDataO = getGlobalImportData(decoratorName);
+ if (!importDataO.has_value())
return nullptr;
- }
-
- if (majorVersion == -1) {
- PyErr_Format(PyExc_TypeError, "You need specify QML_IMPORT_MAJOR_VERSION in order to use %s.",
- decoratorName);
- return nullptr;
- }
-
- // Specifying a minor version is optional
- if (minorVersion == -1)
- minorVersion = 0;
+ const auto importData = importDataO.value();
- const char *uri = importName.constData();
const int result = mode == RegisterMode::Singleton
- ? PySide::Qml::qmlRegisterSingletonType(pyObj, uri, majorVersion, minorVersion,
+ ? PySide::Qml::qmlRegisterSingletonType(pyObj, importData,
typeName, nullptr,
PySide::isQObjectDerived(pyObjType, false),
false)
- : PySide::Qml::qmlRegisterType(pyObj, uri, majorVersion, minorVersion,
+ : PySide::Qml::qmlRegisterType(pyObj, importData,
mode != RegisterMode::Anonymous ? typeName : nullptr,
noCreationReason,
mode == RegisterMode::Normal);