Create private data structure to QProperty type.

Reviewer: Luciano Wolf <luciano.wolf@openbossa.org>
          Marcelo Lira <marcelo.lira@openbossa.org>
This commit is contained in:
renatofilho 2010-10-20 13:51:28 -03:00
commit 4f1a11b61f
3 changed files with 45 additions and 37 deletions

View file

@ -57,8 +57,7 @@ char* translateTypeName(PyObject* type)
extern "C" extern "C"
{ {
struct PySideQPropertyData { struct PySideQPropertyDataPrivate {
PyObject_HEAD
char* typeName; char* typeName;
PyObject* type; PyObject* type;
PyObject* fget; PyObject* fget;
@ -131,25 +130,27 @@ int qpropertyTpInit(PyObject* self, PyObject* args, PyObject* kwds)
{ {
PyObject* type = 0; PyObject* type = 0;
PySideQPropertyData* data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData* data = reinterpret_cast<PySideQPropertyData*>(self);
data->designable = true; PySideQPropertyDataPrivate* pData = (PySideQPropertyDataPrivate*) malloc(sizeof(PySideQPropertyDataPrivate*));
data->scriptable = true; data->d = pData;
data->stored = true; pData->designable = true;
pData->scriptable = true;
pData->stored = true;
static const char *kwlist[] = {"type", "fget", "fset", "freset", "fdel", "doc", static const char *kwlist[] = {"type", "fget", "fset", "freset", "fdel", "doc",
"designable", "scriptable", "stored", "user", "designable", "scriptable", "stored", "user",
"constant", "final", 0}; "constant", "final", 0};
if (!PyArg_ParseTupleAndKeywords(args, kwds, if (!PyArg_ParseTupleAndKeywords(args, kwds,
"OO|OOOsbbbbbb:QtCore.QProperty", (char**) kwlist, "OO|OOOsbbbbbb:QtCore.QProperty", (char**) kwlist,
/*OO*/ &type, &(data->fget), /*OO*/ &type, &(pData->fget),
/*OOOO*/ &(data->fset), &(data->freset), &(data->fdel), /*OOOO*/ &(pData->fset), &(pData->freset), &(pData->fdel),
/*s*/ &(data->doc), /*s*/ &(pData->doc),
/*bbbbbb*/ &(data->designable), &(data->scriptable), &(data->stored), &(data->user), &(data->constant), &(data->final))) /*bbbbbb*/ &(pData->designable), &(pData->scriptable), &(pData->stored), &(pData->user), &(pData->constant), &(pData->final)))
return 0; return 0;
if (!data->fset && data->fget) if (!pData->fset && pData->fget)
data->constant = true; pData->constant = true;
data->typeName = translateTypeName(type); pData->typeName = translateTypeName(type);
return 1; return 1;
} }
@ -158,9 +159,9 @@ void qpropertyFree(void *self)
PyObject *pySelf = reinterpret_cast<PyObject*>(self); PyObject *pySelf = reinterpret_cast<PyObject*>(self);
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
free(data->typeName); free(data->d->typeName);
free(data->doc); free(data->d->doc);
free(data->d);
pySelf->ob_type->tp_base->tp_free(self); pySelf->ob_type->tp_base->tp_free(self);
} }
@ -191,13 +192,13 @@ bool isQPropertyType(PyObject* pyObj)
int qpropertySet(PyObject* self, PyObject* source, PyObject* value) int qpropertySet(PyObject* self, PyObject* source, PyObject* value)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
if (data->fset) { if (data->d->fset) {
Shiboken::AutoDecRef args(PyTuple_New(2)); Shiboken::AutoDecRef args(PyTuple_New(2));
PyTuple_SET_ITEM(args, 0, source); PyTuple_SET_ITEM(args, 0, source);
PyTuple_SET_ITEM(args, 1, value); PyTuple_SET_ITEM(args, 1, value);
Py_INCREF(source); Py_INCREF(source);
Py_INCREF(value); Py_INCREF(value);
Shiboken::AutoDecRef result(PyObject_CallObject(data->fset, args)); Shiboken::AutoDecRef result(PyObject_CallObject(data->d->fset, args));
return (result.isNull() ? -1 : 0); return (result.isNull() ? -1 : 0);
} else { } else {
PyErr_SetString(PyExc_AttributeError, "Attibute read only"); PyErr_SetString(PyExc_AttributeError, "Attibute read only");
@ -208,11 +209,11 @@ int qpropertySet(PyObject* self, PyObject* source, PyObject* value)
PyObject* qpropertyGet(PyObject* self, PyObject* source) PyObject* qpropertyGet(PyObject* self, PyObject* source)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
if (data->fget) { if (data->d->fget) {
Shiboken::AutoDecRef args(PyTuple_New(1)); Shiboken::AutoDecRef args(PyTuple_New(1));
Py_INCREF(source); Py_INCREF(source);
PyTuple_SET_ITEM(args, 0, source); PyTuple_SET_ITEM(args, 0, source);
return PyObject_CallObject(data->fget, args); return PyObject_CallObject(data->d->fget, args);
} }
return 0; return 0;
} }
@ -220,11 +221,11 @@ PyObject* qpropertyGet(PyObject* self, PyObject* source)
int qpropertyReset(PyObject* self, PyObject* source) int qpropertyReset(PyObject* self, PyObject* source)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
if (data->freset) { if (data->d->freset) {
Shiboken::AutoDecRef args(PyTuple_New(1)); Shiboken::AutoDecRef args(PyTuple_New(1));
Py_INCREF(source); Py_INCREF(source);
PyTuple_SET_ITEM(args, 0, source); PyTuple_SET_ITEM(args, 0, source);
Shiboken::AutoDecRef result(PyObject_CallObject(data->freset, args)); Shiboken::AutoDecRef result(PyObject_CallObject(data->d->freset, args));
return (result.isNull() ? -1 : 0); return (result.isNull() ? -1 : 0);
} }
return -1; return -1;
@ -234,7 +235,7 @@ int qpropertyReset(PyObject* self, PyObject* source)
const char* qpropertyGetType(PyObject* self) const char* qpropertyGetType(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->typeName; return data->d->typeName;
} }
PyObject* qpropertyGetObject(PyObject* source, PyObject* name) PyObject* qpropertyGetObject(PyObject* source, PyObject* name)
@ -253,55 +254,55 @@ PyObject* qpropertyGetObject(PyObject* source, PyObject* name)
bool qpropertyIsReadable(PyObject* self) bool qpropertyIsReadable(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return (data->fget != 0); return (data->d->fget != 0);
} }
bool qpropertyIsWritable(PyObject* self) bool qpropertyIsWritable(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return (data->fset != 0); return (data->d->fset != 0);
} }
bool qpropertyHasReset(PyObject* self) bool qpropertyHasReset(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return (data->freset != 0); return (data->d->freset != 0);
} }
bool qpropertyIsDesignable(PyObject* self) bool qpropertyIsDesignable(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->designable; return data->d->designable;
} }
bool qpropertyIsScriptable(PyObject* self) bool qpropertyIsScriptable(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->scriptable; return data->d->scriptable;
} }
bool qpropertyIsStored(PyObject* self) bool qpropertyIsStored(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->stored; return data->d->stored;
} }
bool qpropertyIsUser(PyObject* self) bool qpropertyIsUser(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->user; return data->d->user;
} }
bool qpropertyIsConstant(PyObject* self) bool qpropertyIsConstant(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->constant; return data->d->constant;
} }
bool qpropertyIsFinal(PyObject* self) bool qpropertyIsFinal(PyObject* self)
{ {
PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self); PySideQPropertyData *data = reinterpret_cast<PySideQPropertyData*>(self);
return data->final; return data->d->final;
} }
} //namespace PySide } //namespace PySide

View file

@ -27,6 +27,18 @@
#include <Python.h> #include <Python.h>
#include <QObject> #include <QObject>
extern "C"
{
extern PYSIDE_API PyTypeObject PySideQPropertyType;
struct PySideQPropertyDataPrivate;
struct PYSIDE_API PySideQPropertyData
{
PyObject_HEAD
PySideQPropertyDataPrivate* d;
};
};
namespace PySide namespace PySide
{ {

View file

@ -25,11 +25,6 @@
#include <Python.h> #include <Python.h>
extern "C"
{
extern PyTypeObject PySideQPropertyType;
}; //extern "C"
namespace PySide namespace PySide
{ {