aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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
-rw-r--r--sources/pyside6/libpysideqml/pysideqmllistproperty.cpp87
5 files changed, 128 insertions, 149 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())
diff --git a/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp b/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp
index df3a0f1d0..47c33b3e2 100644
--- a/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp
+++ b/sources/pyside6/libpysideqml/pysideqmllistproperty.cpp
@@ -44,35 +44,42 @@
#include <signature.h>
#include <pysideproperty.h>
+#include <pysideproperty_p.h>
#include <QtCore/QObject>
#include <QtQml/QQmlListProperty>
-// Forward declarations.
-static void propListMetaCall(PySideProperty *pp, PyObject *self, QMetaObject::Call call,
- void **args);
+// This is the user data we store in the property.
+class QmlListPropertyPrivate : public PySidePropertyPrivate
+{
+public:
+ void metaCall(PyObject *source, QMetaObject::Call call, void **args) override;
+
+ PyTypeObject *type = nullptr;
+ PyObject *append = nullptr;
+ PyObject *count = nullptr;
+ PyObject *at = nullptr;
+ PyObject *clear = nullptr;
+ PyObject *replace = nullptr;
+ PyObject *removeLast = nullptr;
+};
extern "C"
{
-// This is the user data we store in the property.
-struct QmlListProperty
+static PyObject *propList_tp_new(PyTypeObject *subtype, PyObject * /* args */, PyObject * /* kwds */)
{
- PyTypeObject *type;
- PyObject *append;
- PyObject *count;
- PyObject *at;
- PyObject *clear;
- PyObject *replace;
- PyObject *removeLast;
-};
+ PySideProperty *me = reinterpret_cast<PySideProperty *>(subtype->tp_alloc(subtype, 0));
+ me->d = new QmlListPropertyPrivate;
+ return reinterpret_cast<PyObject *>(me);
+}
static int propListTpInit(PyObject *self, PyObject *args, PyObject *kwds)
{
static const char *kwlist[] = {"type", "append", "count", "at", "clear", "replace", "removeLast", 0};
PySideProperty *pySelf = reinterpret_cast<PySideProperty *>(self);
- QmlListProperty *data = new QmlListProperty;
- memset(data, 0, sizeof(QmlListProperty));
+
+ auto *data = static_cast<QmlListPropertyPrivate *>(pySelf->d);
if (!PyArg_ParseTupleAndKeywords(args, kwds,
"O|OOOOOO:QtQml.ListProperty", (char **) kwlist,
@@ -83,7 +90,6 @@ static int propListTpInit(PyObject *self, PyObject *args, PyObject *kwds)
&data->clear,
&data->replace,
&data->removeLast)) {
- delete data;
return -1;
}
@@ -92,7 +98,6 @@ static int propListTpInit(PyObject *self, PyObject *args, PyObject *kwds)
if (!PySequence_Contains(data->type->tp_mro, reinterpret_cast<PyObject *>(qobjectType))) {
PyErr_Format(PyExc_TypeError, "A type inherited from %s expected, got %s.",
qobjectType->tp_name, data->type->tp_name);
- delete data;
return -1;
}
@@ -103,29 +108,17 @@ static int propListTpInit(PyObject *self, PyObject *args, PyObject *kwds)
(data->replace && data->replace != Py_None && !PyCallable_Check(data->replace)) ||
(data->removeLast && data->removeLast != Py_None && !PyCallable_Check(data->removeLast))) {
PyErr_Format(PyExc_TypeError, "Non-callable parameter given");
- delete data;
return -1;
}
- PySide::Property::setMetaCallHandler(pySelf, &propListMetaCall);
- PySide::Property::setTypeName(pySelf, "QQmlListProperty<QObject>");
- PySide::Property::setUserData(pySelf, data);
+ data->typeName = QByteArrayLiteral("QQmlListProperty<QObject>");
return 0;
}
-void propListTpFree(void *self)
-{
- auto pySelf = reinterpret_cast<PySideProperty *>(self);
- delete reinterpret_cast<QmlListProperty *>(PySide::Property::userData(pySelf));
- // calls base type constructor
- Py_TYPE(pySelf)->tp_base->tp_free(self);
-}
-
static PyType_Slot PropertyListType_slots[] = {
+ {Py_tp_new, reinterpret_cast<void *>(propList_tp_new)},
{Py_tp_init, reinterpret_cast<void *>(propListTpInit)},
- {Py_tp_free, reinterpret_cast<void *>(propListTpFree)},
- {Py_tp_dealloc, reinterpret_cast<void *>(Sbk_object_dealloc)},
{0, nullptr}
};
static PyType_Spec PropertyListType_spec = {
@@ -158,7 +151,7 @@ void propListAppender(QQmlListProperty<QObject> *propList, QObject *item)
PyTuple_SET_ITEM(args, 1,
Shiboken::Conversions::pointerToPython(qobjectType, item));
- auto data = reinterpret_cast<QmlListProperty *>(propList->data);
+ auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->append, args));
if (PyErr_Occurred())
@@ -174,7 +167,7 @@ qsizetype propListCount(QQmlListProperty<QObject> *propList)
PyTuple_SET_ITEM(args, 0,
Shiboken::Conversions::pointerToPython(qObjectType(), propList->object));
- auto data = reinterpret_cast<QmlListProperty *>(propList->data);
+ auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->count, args));
// Check return type
@@ -203,7 +196,7 @@ QObject *propListAt(QQmlListProperty<QObject> *propList, qsizetype index)
PyTuple_SET_ITEM(args, 1,
Shiboken::Conversions::copyToPython(converter, &index));
- auto data = reinterpret_cast<QmlListProperty *>(propList->data);
+ auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->at, args));
QObject *result = 0;
@@ -224,7 +217,7 @@ void propListClear(QQmlListProperty<QObject> * propList)
PyTuple_SET_ITEM(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
- auto data = reinterpret_cast<QmlListProperty *>(propList->data);
+ auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->clear, args));
if (PyErr_Occurred())
@@ -246,7 +239,7 @@ void propListReplace(QQmlListProperty<QObject> *propList, qsizetype index, QObje
PyTuple_SET_ITEM(args, 2,
Shiboken::Conversions::pointerToPython(qobjectType, value));
- auto data = reinterpret_cast<QmlListProperty *>(propList->data);
+ auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->replace, args));
if (PyErr_Occurred())
@@ -263,7 +256,7 @@ void propListRemoveLast(QQmlListProperty<QObject> *propList)
PyTuple_SET_ITEM(args, 0,
Shiboken::Conversions::pointerToPython(qobjectType, propList->object));
- auto data = reinterpret_cast<QmlListProperty *>(propList->data);
+ auto *data = reinterpret_cast<QmlListPropertyPrivate *>(propList->data);
Shiboken::AutoDecRef retVal(PyObject_CallObject(data->removeLast, args));
if (PyErr_Occurred())
@@ -271,24 +264,22 @@ void propListRemoveLast(QQmlListProperty<QObject> *propList)
}
// qt_metacall specialization for ListProperties
-static void propListMetaCall(PySideProperty *pp, PyObject *self,
- QMetaObject::Call call, void **args)
+void QmlListPropertyPrivate::metaCall(PyObject *source, QMetaObject::Call call, void **args)
{
if (call != QMetaObject::ReadProperty)
return;
- auto data = reinterpret_cast<QmlListProperty *>(PySide::Property::userData(pp));
QObject *qobj;
PyTypeObject *qobjectType = qObjectType();
- Shiboken::Conversions::pythonToCppPointer(qobjectType, self, &qobj);
+ Shiboken::Conversions::pythonToCppPointer(qobjectType, source, &qobj);
QQmlListProperty<QObject> declProp(
- qobj, data,
- data->append && data->append != Py_None ? &propListAppender : nullptr,
- data->count && data->count != Py_None ? &propListCount : nullptr,
- data->at && data->at != Py_None ? &propListAt : nullptr,
- data->clear && data->clear != Py_None ? &propListClear : nullptr,
- data->replace && data->replace != Py_None ? &propListReplace : nullptr,
- data->removeLast && data->removeLast != Py_None ? &propListRemoveLast : nullptr);
+ qobj, this,
+ append && append != Py_None ? &propListAppender : nullptr,
+ count && count != Py_None ? &propListCount : nullptr,
+ at && at != Py_None ? &propListAt : nullptr,
+ clear && clear != Py_None ? &propListClear : nullptr,
+ replace && replace != Py_None ? &propListReplace : nullptr,
+ removeLast && removeLast != Py_None ? &propListRemoveLast : nullptr);
// Copy the data to the memory location requested by the meta call
void *v = args[0];