diff options
author | Hugo Lima <hugo.lima@openbossa.org> | 2009-12-16 21:10:15 -0200 |
---|---|---|
committer | Hugo Lima <hugo.lima@openbossa.org> | 2009-12-16 21:10:15 -0200 |
commit | 9e1a1ec8a75ba16cc9eb21ccc2aa8adf6f21de93 (patch) | |
tree | f1da461f8e1108d684c103b078670d7df145e0d4 /libpyside/signalmanager.cpp | |
parent | e791f15afcd9d0a51c745b715f0f369e209500d9 (diff) |
We have a nice Dynamic MetaObject! Yay!
Python signals and slots are like C++ signals and slots to Qt :-)
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r-- | libpyside/signalmanager.cpp | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 711465549..e9f9b7c2b 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -75,11 +75,16 @@ QStringList PySide::getArgsFromSignature(const char* signature) struct SignalManager::SignalManagerPrivate { - QHash<QObject*, ProxySlot*> m_proxies; + QHash<const QObject*, ProxySlot*> m_proxies; - ProxySlot* findProxy(QObject* signalSource) + ProxySlot* findProxy(const QObject* signalSource) const { - ProxySlot* proxy = m_proxies.value(signalSource); + return m_proxies.value(signalSource); + } + + ProxySlot* getProxy(const QObject* signalSource) + { + ProxySlot* proxy = findProxy(signalSource); if (!proxy) { proxy = new ProxySlot(signalSource); m_proxies[signalSource] = proxy; @@ -110,7 +115,9 @@ bool SignalManager::connect(QObject* source, const char* signal, PyObject* callb return false; signal++; - ProxySlot* proxy = m_d->findProxy(source); + ProxySlot* proxy = m_d->getProxy(source); + if (source->metaObject()->indexOfSignal(signal) == -1) + proxy->dynamicQMetaObject()->addSignal(signal); AbstractQObjectConnection* connection = new SignalSlotConnection(source, signal, callback, type); return proxy->connect(connection); } @@ -132,7 +139,7 @@ bool SignalManager::connect(QObject* source, const char* signal, QObject* receiv receiver, slot_index, type); } else { // We have a python slot or signal - ProxySlot* proxy = m_d->findProxy(source); + ProxySlot* proxy = m_d->getProxy(source); AbstractQObjectConnection* connection = 0; retval = proxy->connect(connection); } @@ -142,18 +149,14 @@ bool SignalManager::connect(QObject* source, const char* signal, QObject* receiv bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* args) { - if (checkSignal(signal)) + if (!checkSignal(signal)) return false; + signal++; int argsGiven = PySequence_Size(args); - //search native signal - int signalIndex = source->metaObject()->indexOfSignal(signal+1); - if (signalIndex == -1) { - // dynamic signal - qDebug() << "Dynamic signal not implemented yet!"; - } else { - // a C++ signal + int signalIndex = source->metaObject()->indexOfSignal(signal); + if (signalIndex != -1) { QStringList argTypes = getArgsFromSignature(signal); void* signalArgs[argsGiven+1]; @@ -166,7 +169,15 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar return false; } -void PySide::SignalManager::removeProxySlot(QObject* signalSource) +void PySide::SignalManager::removeProxySlot(const QObject* signalSource) { m_d->m_proxies.remove(signalSource); } + +const QMetaObject* PySide::SignalManager::getMetaObject(const QObject* object) const +{ + ProxySlot* proxy = m_d->findProxy(object); + if (proxy) + return proxy->dynamicQMetaObject()->metaObject(); + return 0; +} |