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/pysideproperty.cpp | |
| 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/pysideproperty.cpp')
| -rw-r--r-- | sources/pyside6/libpyside/pysideproperty.cpp | 164 |
1 files changed, 75 insertions, 89 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 |
