aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/dynamicqmetaobject.cpp
diff options
context:
space:
mode:
authorrenatofilho <renato.filho@openbossa.org>2010-10-21 13:15:04 -0300
committerrenatofilho <renato.filho@openbossa.org>2010-10-21 15:20:36 -0300
commit26750d345c61148d45b500e891b970b8e4e79661 (patch)
treed7af8dcd0cbe1819ca16f88a4a55b97b037df16d /libpyside/dynamicqmetaobject.cpp
parent4f1a11b61f1488921eb2d5de339d92afec8fbc9f (diff)
Implemented support to notify argument on Properties.
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org> Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'libpyside/dynamicqmetaobject.cpp')
-rw-r--r--libpyside/dynamicqmetaobject.cpp79
1 files changed, 51 insertions, 28 deletions
diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp
index ea6566563..88497843a 100644
--- a/libpyside/dynamicqmetaobject.cpp
+++ b/libpyside/dynamicqmetaobject.cpp
@@ -73,13 +73,13 @@ enum PropertyFlags {
class DynamicQMetaObject::DynamicQMetaObjectPrivate
{
public:
- QLinkedList<MethodData> m_signals;
- QLinkedList<MethodData> m_slots;
- QLinkedList<PropertyData> m_properties;
+ QList<MethodData> m_signals;
+ QList<MethodData> m_slots;
+ QList<PropertyData> m_properties;
QByteArray m_className;
void updateMetaObject(QMetaObject* metaObj);
- void writeMethodsData(QLinkedList<MethodData>& methods, unsigned int** data, QList<QByteArray>* strings, int* prtIndex, int maxCount, int nullIndex, int flags);
+ void writeMethodsData(QList<MethodData>& methods, unsigned int** data, QList<QByteArray>* strings, int* prtIndex, int maxCount, int nullIndex, int flags);
};
static int registerString(const QByteArray& s, QList<QByteArray>* strings)
@@ -196,6 +196,9 @@ uint PropertyData::flags() const
if (qpropertyIsFinal(m_data))
flags |= Final;
+ if (m_notifyId)
+ flags |= Notify;
+
return flags;
}
@@ -246,12 +249,12 @@ bool MethodData::isValid() const
}
PropertyData::PropertyData()
- : m_data(0)
+ : m_notifyId(0), m_data(0)
{
}
-PropertyData::PropertyData(const char* name, PyObject* data)
- : m_name(name), m_data(data)
+PropertyData::PropertyData(const char* name, uint notifyId, PySideQProperty* data)
+ : m_name(name), m_notifyId(notifyId), m_data(data)
{
}
@@ -271,6 +274,11 @@ QByteArray PropertyData::name() const
return m_name;
}
+uint PropertyData::notifyId() const
+{
+ return m_notifyId;
+}
+
bool PropertyData::operator==(const PropertyData& other) const
{
return m_data == other.m_data;
@@ -301,15 +309,15 @@ DynamicQMetaObject::~DynamicQMetaObject()
void DynamicQMetaObject::addSignal(const char* signal, const char* type)
{
- QLinkedList<MethodData>::iterator i = qFind(m_d->m_signals.begin(), m_d->m_signals.end(), signal);
- if (i != m_d->m_signals.end())
+ int index = m_d->m_signals.indexOf(signal);
+ if (index != -1)
return;
//search for a empty space
MethodData blank;
- i = qFind(m_d->m_signals.begin(), m_d->m_signals.end(), blank);
- if (i != m_d->m_signals.end()) {
- *i = MethodData(signal, type);
+ index = m_d->m_signals.indexOf(blank);
+ if (index != -1) {
+ m_d->m_signals[index] = MethodData(signal, type);
m_d->updateMetaObject(this);
return;
}
@@ -326,8 +334,8 @@ void DynamicQMetaObject::addSignal(const char* signal, const char* type)
void DynamicQMetaObject::addSlot(const char* slot, const char* type)
{
- QLinkedList<MethodData>::iterator i = qFind(m_d->m_slots.begin(), m_d->m_slots.end(), slot);
- if (i != m_d->m_slots.end())
+ int index = m_d->m_slots.indexOf(slot);
+ if (index != -1)
return;
int maxSlots = maxSlotsCount(m_d->m_className);
@@ -338,11 +346,12 @@ void DynamicQMetaObject::addSlot(const char* slot, const char* type)
//search for a empty space
MethodData blank;
- i = qFind(m_d->m_slots.begin(), m_d->m_slots.end(), blank);
- if (i != m_d->m_slots.end())
- *i = MethodData(slot, type);
- else
+ index = m_d->m_slots.indexOf(blank);
+ if (index != -1) {
+ m_d->m_slots[index] = MethodData(slot, type);
+ } else {
m_d->m_slots << MethodData(slot, type);
+ }
m_d->updateMetaObject(this);
}
@@ -358,19 +367,28 @@ void DynamicQMetaObject::removeSlot(uint index)
}
}
-void DynamicQMetaObject::addProperty(const char* property, PyObject* data)
+void DynamicQMetaObject::addProperty(const char* propertyName, PyObject* data)
{
- QLinkedList<PropertyData>::iterator i = qFind(m_d->m_properties.begin(), m_d->m_properties.end(), property);
- if (i != m_d->m_properties.end())
+ int index = m_d->m_properties.indexOf(propertyName);
+ if (index != -1)
return;
+ // retrieve notifyId
+ PySideQProperty* property = reinterpret_cast<PySideQProperty*>(data);
+ const char* signalNotify = qpropertyGetNotify(property);
+ uint notifyId = 0;
+ if (signalNotify) {
+ QByteArray signalSignature(signalNotify);
+ notifyId = m_d->m_signals.indexOf(signalNotify) + 1;
+ }
+
//search for a empty space
PropertyData blank;
- i = qFind(m_d->m_properties.begin(), m_d->m_properties.end(), blank);
- if (i != m_d->m_properties.end()) {
- *i = PropertyData(property, data);
+ index = m_d->m_properties.indexOf(blank);
+ if (index != -1) {
+ m_d->m_properties[index] = PropertyData(propertyName, notifyId, property);
} else {
- m_d->m_properties << PropertyData(property, data);
+ m_d->m_properties << PropertyData(propertyName, notifyId, property);
}
m_d->updateMetaObject(this);
}
@@ -438,7 +456,7 @@ void DynamicQMetaObject::removeSignal(uint index)
}
}
-void DynamicQMetaObject::DynamicQMetaObjectPrivate::writeMethodsData(QLinkedList<MethodData>& methods,
+void DynamicQMetaObject::DynamicQMetaObjectPrivate::writeMethodsData(QList<MethodData>& methods,
unsigned int** data,
QList<QByteArray>* strings,
int* prtIndex,
@@ -448,7 +466,7 @@ void DynamicQMetaObject::DynamicQMetaObjectPrivate::writeMethodsData(QLinkedList
{
int index = *prtIndex;
- QLinkedList<MethodData>::iterator iMethod = methods.begin();
+ QList<MethodData>::iterator iMethod = methods.begin();
for(int i=0; i < maxCount; i++) {
QByteArray mType;
if (iMethod != methods.end() && ((*iMethod).signature().size() > 0) ) {
@@ -504,7 +522,7 @@ void DynamicQMetaObject::DynamicQMetaObjectPrivate::updateMetaObject(QMetaObject
// header size + 5 indexes per method + an ending zero
delete[] metaObj->d.data;
unsigned int* data;
- data = new unsigned int[HEADER_LENGHT + n_methods*5 + n_properties*3 + 1];
+ data = new unsigned int[HEADER_LENGHT + n_methods*5 + n_properties*4 + 1];
std::memcpy(data, header, sizeof(header));
QList<QByteArray> strings;
@@ -532,6 +550,11 @@ void DynamicQMetaObject::DynamicQMetaObjectPrivate::updateMetaObject(QMetaObject
data[index++] = pp.flags();
}
+ //write properties notify
+ foreach(PropertyData pp, m_properties) {
+ data[index++] = pp.notifyId(); //signal notify index
+ }
+
data[index++] = 0; // the end
// create the m_metadata string