diff options
| author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-02-23 16:39:49 +0100 |
|---|---|---|
| committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-02-24 13:27:55 +0100 |
| commit | 44504aa4cf33e128480ab0907c2df8682192693b (patch) | |
| tree | 51d07963e6ed9937af4c0401f6ca98661ce63bd5 /sources/pyside6/libpyside | |
| parent | 0f707c16f21d367ea4a6fa2b27ac8f436f904fe4 (diff) | |
Refactor handling of QmlListProperty
PySidePropertyPrivate had a function pointer for the meta call
handler that was set to an internal function for most properties.
QmlListProperty would set it to a different function along with
user data. Turn this into a virtual function of PySidePropertyPrivate
and override it in QmlListPropertyPrivate. The function pointer
and the user data pointer can then be removed.
Task-number: PYSIDE-1827
Change-Id: I9c6452e2d39d5fd9b14d4c74ab7ed2fad483af29
Reviewed-by: Christian Tismer <tismer@stackless.com>
Diffstat (limited to 'sources/pyside6/libpyside')
| -rw-r--r-- | sources/pyside6/libpyside/pysideproperty.cpp | 164 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysideproperty.h | 10 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/pysideproperty_p.h | 14 | ||||
| -rw-r--r-- | sources/pyside6/libpyside/signalmanager.cpp | 2 |
4 files changed, 89 insertions, 101 deletions
diff --git a/sources/pyside6/libpyside/pysideproperty.cpp b/sources/pyside6/libpyside/pysideproperty.cpp index d6dda6708..720050335 100644 --- a/sources/pyside6/libpyside/pysideproperty.cpp +++ b/sources/pyside6/libpyside/pysideproperty.cpp @@ -121,46 +121,82 @@ PyTypeObject *PySideProperty_TypeF(void) return type; } -static void qpropertyMetaCall(PySideProperty *pp, PyObject *self, QMetaObject::Call call, void **args) -{ - Shiboken::Conversions::SpecificConverter converter(pp->d->typeName); - Q_ASSERT(converter); - - switch(call) { - case QMetaObject::ReadProperty: - { - PyObject *value = PySide::Property::getValue(pp, self); - if (value) { - converter.toCpp(value, args[0]); - Py_DECREF(value); - } - break; - } +PySidePropertyPrivate::~PySidePropertyPrivate() = default; - case QMetaObject::WriteProperty: - { - Shiboken::AutoDecRef value(converter.toPython(args[0])); - PySide::Property::setValue(pp, self, value); - break; - } +PyObject *PySidePropertyPrivate::getValue(PyObject *source) +{ + if (fget) { + Shiboken::AutoDecRef args(PyTuple_New(1)); + Py_INCREF(source); + PyTuple_SET_ITEM(args, 0, source); + return PyObject_CallObject(fget, args); + } + return nullptr; +} - case QMetaObject::ResetProperty: - { - PySide::Property::reset(pp, self); - break; - } +int PySidePropertyPrivate::setValue(PyObject *source, PyObject *value) +{ + if (fset && value) { + Shiboken::AutoDecRef args(PyTuple_New(2)); + PyTuple_SET_ITEM(args, 0, source); + PyTuple_SET_ITEM(args, 1, value); + Py_INCREF(source); + Py_INCREF(value); + Shiboken::AutoDecRef result(PyObject_CallObject(fset, args)); + return (result.isNull() ? -1 : 0); + } + if (fdel) { + Shiboken::AutoDecRef args(PyTuple_New(1)); + PyTuple_SET_ITEM(args, 0, source); + Py_INCREF(source); + Shiboken::AutoDecRef result(PyObject_CallObject(fdel, args)); + return (result.isNull() ? -1 : 0); + } + PyErr_SetString(PyExc_AttributeError, "Attribute is read only"); + return -1; +} - // just to avoid gcc warnings - case QMetaObject::BindableProperty: - case QMetaObject::InvokeMetaMethod: - case QMetaObject::CreateInstance: - case QMetaObject::IndexOfMethod: - case QMetaObject::RegisterPropertyMetaType: - case QMetaObject::RegisterMethodArgumentMetaType: - break; +int PySidePropertyPrivate::reset(PyObject *source) +{ + if (freset) { + Shiboken::AutoDecRef args(PyTuple_New(1)); + Py_INCREF(source); + PyTuple_SET_ITEM(args, 0, source); + Shiboken::AutoDecRef result(PyObject_CallObject(freset, args)); + return (result.isNull() ? -1 : 0); } + return -1; } +void PySidePropertyPrivate::metaCall(PyObject *source, QMetaObject::Call call, void **args) +{ + switch (call) { + case QMetaObject::ReadProperty: { + Shiboken::Conversions::SpecificConverter converter(typeName); + Q_ASSERT(converter); + if (PyObject *value = getValue(source)) { + converter.toCpp(value, args[0]); + Py_DECREF(value); + } + } + break; + + case QMetaObject::WriteProperty: { + Shiboken::Conversions::SpecificConverter converter(typeName); + Q_ASSERT(converter); + Shiboken::AutoDecRef value(converter.toPython(args[0])); + setValue(source, value); + } + break; + + case QMetaObject::ResetProperty: + reset(source); + break; + + default: + break; + } +} static PyObject *qpropertyTpNew(PyTypeObject *subtype, PyObject * /* args */, PyObject * /* kwds */) { @@ -174,7 +210,6 @@ static int qpropertyTpInit(PyObject *self, PyObject *args, PyObject *kwds) PyObject *type = nullptr; auto data = reinterpret_cast<PySideProperty *>(self); PySidePropertyPrivate *pData = data->d; - pData->metaCallHandler = &qpropertyMetaCall; static const char *kwlist[] = {"type", "fget", "fset", "freset", "fdel", "doc", "notify", "designable", "scriptable", "stored", @@ -471,53 +506,19 @@ bool checkType(PyObject *pyObj) return false; } -int setValue(PySideProperty *self, PyObject *source, PyObject *value) +PyObject *getValue(PySideProperty *self, PyObject *source) { - PyObject *fset = self->d->fset; - if (fset && value) { - Shiboken::AutoDecRef args(PyTuple_New(2)); - PyTuple_SET_ITEM(args, 0, source); - PyTuple_SET_ITEM(args, 1, value); - Py_INCREF(source); - Py_INCREF(value); - Shiboken::AutoDecRef result(PyObject_CallObject(fset, args)); - return (result.isNull() ? -1 : 0); - } - PyObject *fdel = self->d->fdel; - if (fdel) { - Shiboken::AutoDecRef args(PyTuple_New(1)); - PyTuple_SET_ITEM(args, 0, source); - Py_INCREF(source); - Shiboken::AutoDecRef result(PyObject_CallObject(fdel, args)); - return (result.isNull() ? -1 : 0); - } - PyErr_SetString(PyExc_AttributeError, "Attibute read only"); - return -1; + return self->d->getValue(source); } -PyObject *getValue(PySideProperty *self, PyObject *source) +int setValue(PySideProperty *self, PyObject *source, PyObject *value) { - PyObject *fget = self->d->fget; - if (fget) { - Shiboken::AutoDecRef args(PyTuple_New(1)); - Py_INCREF(source); - PyTuple_SET_ITEM(args, 0, source); - return PyObject_CallObject(fget, args); - } - return nullptr; + return self->d->setValue(source, value); } int reset(PySideProperty *self, PyObject *source) { - PyObject *freset = self->d->freset; - if (freset) { - Shiboken::AutoDecRef args(PyTuple_New(1)); - Py_INCREF(source); - PyTuple_SET_ITEM(args, 0, source); - Shiboken::AutoDecRef result(PyObject_CallObject(freset, args)); - return (result.isNull() ? -1 : 0); - } - return -1; + return self->d->reset(source); } const char *getTypeName(const PySideProperty *self) @@ -598,25 +599,10 @@ const char *getNotifyName(PySideProperty *self) ? nullptr : self->d->notifySignature.constData(); } -void setMetaCallHandler(PySideProperty *self, MetaCallHandler handler) -{ - self->d->metaCallHandler = handler; -} - void setTypeName(PySideProperty *self, const char *typeName) { self->d->typeName = typeName; } -void setUserData(PySideProperty *self, void *data) -{ - self->d->userData = data; -} - -void *userData(PySideProperty *self) -{ - return self->d->userData; -} - } //namespace Property } //namespace PySide diff --git a/sources/pyside6/libpyside/pysideproperty.h b/sources/pyside6/libpyside/pysideproperty.h index c5a48caed..489341d53 100644 --- a/sources/pyside6/libpyside/pysideproperty.h +++ b/sources/pyside6/libpyside/pysideproperty.h @@ -46,11 +46,12 @@ #include <QtCore/QMetaObject> +class PySidePropertyPrivate; + extern "C" { extern PYSIDE_API PyTypeObject *PySideProperty_TypeF(void); - struct PySidePropertyPrivate; struct PYSIDE_API PySideProperty { PyObject_HEAD @@ -60,8 +61,6 @@ extern "C" namespace PySide { namespace Property { -typedef void (*MetaCallHandler)(PySideProperty*,PyObject*,QMetaObject::Call, void**); - PYSIDE_API bool checkType(PyObject *pyObj); /** @@ -103,13 +102,8 @@ PYSIDE_API const char *getNotifyName(PySideProperty *self); **/ PYSIDE_API PySideProperty *getObject(PyObject *source, PyObject *name); -PYSIDE_API void setMetaCallHandler(PySideProperty *self, MetaCallHandler handler); - PYSIDE_API void setTypeName(PySideProperty *self, const char *typeName); -PYSIDE_API void setUserData(PySideProperty *self, void *data); -PYSIDE_API void* userData(PySideProperty *self); - } //namespace Property } //namespace PySide diff --git a/sources/pyside6/libpyside/pysideproperty_p.h b/sources/pyside6/libpyside/pysideproperty_p.h index e7b6e4d77..4b6498158 100644 --- a/sources/pyside6/libpyside/pysideproperty_p.h +++ b/sources/pyside6/libpyside/pysideproperty_p.h @@ -44,13 +44,22 @@ #include <QtCore/QByteArray> #include <QMetaObject> #include "pysideproperty.h" +#include <pysidemacros.h> struct PySideProperty; -struct PySidePropertyPrivate +class PYSIDE_API PySidePropertyPrivate { +public: + virtual ~PySidePropertyPrivate(); + + virtual void metaCall(PyObject *source, QMetaObject::Call call, void **args); + + PyObject *getValue(PyObject *source); + int setValue(PyObject *source, PyObject *value); + int reset(PyObject *source); + QByteArray typeName; - PySide::Property::MetaCallHandler metaCallHandler = nullptr; PyObject *fget = nullptr; PyObject *fset = nullptr; PyObject *freset = nullptr; @@ -65,7 +74,6 @@ struct PySidePropertyPrivate bool user = false; bool constant = false; bool final = false; - void *userData = nullptr; }; namespace PySide { namespace Property { diff --git a/sources/pyside6/libpyside/signalmanager.cpp b/sources/pyside6/libpyside/signalmanager.cpp index 1b5a0dee7..5fb9b85c1 100644 --- a/sources/pyside6/libpyside/signalmanager.cpp +++ b/sources/pyside6/libpyside/signalmanager.cpp @@ -410,7 +410,7 @@ int SignalManager::SignalManagerPrivate::qtPropertyMetacall(QObject *object, qWarning("Invalid property: %s.", mp.name()); return false; } - pp->d->metaCallHandler(pp, pySelf, call, args); + pp->d->metaCall(pySelf, call, args); Py_XDECREF(pp); if (PyErr_Occurred()) |
