aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside6/libpyside
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2022-02-23 16:39:49 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2022-02-24 13:27:55 +0100
commit44504aa4cf33e128480ab0907c2df8682192693b (patch)
tree51d07963e6ed9937af4c0401f6ca98661ce63bd5 /sources/pyside6/libpyside
parent0f707c16f21d367ea4a6fa2b27ac8f436f904fe4 (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.cpp164
-rw-r--r--sources/pyside6/libpyside/pysideproperty.h10
-rw-r--r--sources/pyside6/libpyside/pysideproperty_p.h14
-rw-r--r--sources/pyside6/libpyside/signalmanager.cpp2
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())