diff options
-rw-r--r-- | libpyside/dynamicqmetaobject.cpp | 47 | ||||
-rw-r--r-- | libpyside/dynamicqmetaobject_p.h | 6 | ||||
-rw-r--r-- | libpyside/pysideproperty.cpp | 13 | ||||
-rw-r--r-- | tests/QtCore/qobject_property_test.py | 14 |
4 files changed, 51 insertions, 29 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp index 14fbe864e..43aeae66d 100644 --- a/libpyside/dynamicqmetaobject.cpp +++ b/libpyside/dynamicqmetaobject.cpp @@ -132,7 +132,6 @@ static bool isQRealType(const char *type) } - /* * Avoid API break keep this on cpp */ @@ -164,25 +163,31 @@ uint PropertyData::flags() const if (PySide::Property::hasReset(m_data)) flags |= Resettable; - if (!PySide::Property::isDesignable(m_data)) - flags |= ResolveDesignable; - else + if (PySide::Property::isDesignable(m_data)) flags |= Designable; - - if (!PySide::Property::isScriptable(m_data)) - flags |= ResolveScriptable; else - flags |= Scriptable; + flags |= ResolveDesignable; - if (!PySide::Property::isStored(m_data)) - flags |= ResolveStored; + if (PySide::Property::isScriptable(m_data)) + flags |= Scriptable; else - flags |= Stored; + flags |= ResolveScriptable; - if (!PySide::Property::isUser(m_data)) - flags |= ResolveUser; + if (PySide::Property::isStored(m_data)) + flags |= Stored; else + flags |= ResolveStored; + + //EDITABLE + flags |= ResolveEditable; + + if (PySide::Property::isUser(m_data)) flags |= User; + else + flags |= ResolveUser; + + if (m_notifyId != -1) + flags |= Notify; if (PySide::Property::isConstant(m_data)) flags |= Constant; @@ -190,9 +195,6 @@ uint PropertyData::flags() const if (PySide::Property::isFinal(m_data)) flags |= Final; - if (m_notifyId) - flags |= Notify; - return flags; } @@ -247,7 +249,7 @@ PropertyData::PropertyData() { } -PropertyData::PropertyData(const char* name, uint notifyId, PySideProperty* data) +PropertyData::PropertyData(const char* name, int notifyId, PySideProperty* data) : m_name(name), m_notifyId(notifyId), m_data(data) { } @@ -268,7 +270,7 @@ QByteArray PropertyData::name() const return m_name; } -uint PropertyData::notifyId() const +int PropertyData::notifyId() const { return m_notifyId; } @@ -370,10 +372,10 @@ void DynamicQMetaObject::addProperty(const char* propertyName, PyObject* data) // retrieve notifyId PySideProperty* property = reinterpret_cast<PySideProperty*>(data); const char* signalNotify = PySide::Property::getNotifyName(property); - uint notifyId = 0; + int notifyId = -1; if (signalNotify) { QByteArray signalSignature(signalNotify); - notifyId = m_d->m_signals.indexOf(signalNotify) + 1; + notifyId = m_d->m_signals.indexOf(signalNotify); } //search for a empty space @@ -553,9 +555,8 @@ void DynamicQMetaObject::DynamicQMetaObjectPrivate::updateMetaObject(QMetaObject } //write properties notify - foreach(PropertyData pp, m_properties) { - data[index++] = pp.notifyId(); //signal notify index - } + foreach(PropertyData pp, m_properties) + data[index++] = pp.notifyId() >= 0 ? pp.notifyId() : 0; //signal notify index data[index++] = 0; // the end diff --git a/libpyside/dynamicqmetaobject_p.h b/libpyside/dynamicqmetaobject_p.h index d2717524e..e69270041 100644 --- a/libpyside/dynamicqmetaobject_p.h +++ b/libpyside/dynamicqmetaobject_p.h @@ -54,18 +54,18 @@ namespace PySide { public: PropertyData(); - PropertyData(const char* name, uint notifyId=0, PySideProperty* data = 0); + PropertyData(const char* name, int notifyId=0, PySideProperty* data = 0); QByteArray name() const; QByteArray type() const; uint flags() const; bool isValid() const; - uint notifyId() const; + int notifyId() const; bool operator==(const PropertyData& other) const; bool operator==(const char* name) const; private: QByteArray m_name; - uint m_notifyId; + int m_notifyId; PySideProperty* m_data; }; } diff --git a/libpyside/pysideproperty.cpp b/libpyside/pysideproperty.cpp index 51f848d67..72b718c58 100644 --- a/libpyside/pysideproperty.cpp +++ b/libpyside/pysideproperty.cpp @@ -117,6 +117,7 @@ int qpropertyTpInit(PyObject* self, PyObject* args, PyObject* kwds) pData->fget = 0; pData->freset = 0; pData->fdel = 0; + pData->final = 0; pData->designable = true; pData->scriptable = true; pData->stored = true; @@ -124,6 +125,7 @@ int qpropertyTpInit(PyObject* self, PyObject* args, PyObject* kwds) pData->doc = 0; pData->notify = 0; pData->notifySignature = 0; + pData->constant = 0; static const char *kwlist[] = {"type", "fget", "fset", "freset", "fdel", "doc", "notify", "designable", "scriptable", "stored", "user", @@ -134,12 +136,17 @@ int qpropertyTpInit(PyObject* self, PyObject* args, PyObject* kwds) /*OOO*/ &(pData->fset), &(pData->freset), &(pData->fdel), /*s*/ &(pData->doc), /*O*/ &(pData->notify), - /*bbbbbb*/ &(pData->designable), &(pData->scriptable), &(pData->stored), &(pData->user), &(pData->constant), &(pData->final))) + /*bbbbbb*/ &(pData->designable), &(pData->scriptable), &(pData->stored), &(pData->user), &(pData->constant), &(pData->final))) { + free(pData); return 0; + } - if (!pData->fset && pData->fget) - pData->constant = true; + if (pData->constant && (pData->fset || pData->notify)) { + free(pData); + PyErr_SetString(PyExc_AttributeError, "A constant property cannot have a WRITE method or a NOTIFY signal."); + return 0; + } pData->typeName = PySide::Signal::getTypeName(type); return 1; } diff --git a/tests/QtCore/qobject_property_test.py b/tests/QtCore/qobject_property_test.py index adb1679f3..6e7046d92 100644 --- a/tests/QtCore/qobject_property_test.py +++ b/tests/QtCore/qobject_property_test.py @@ -188,6 +188,20 @@ class PropertyWithNotify(unittest.TestCase): obj.myProperty = 10 self.assert_(self.called_) +class MetaPropertyTest(unittest.TestCase): + def testConstant(self): + obj = MyObject() + mo = obj.metaObject() + self.assertEqual(mo.propertyCount(), 2) + p = mo.property(1) + self.assertTrue(p.isConstant()) + + obj = MyObjectWithNotifyProperty() + mo = obj.metaObject() + self.assertEqual(mo.propertyCount(), 2) + p = mo.property(1) + self.assertFalsee(p.isConstant()) + if __name__ == '__main__': unittest.main() |