diff options
author | Luciano Wolf <luciano.wolf@openbossa.org> | 2009-12-18 11:44:09 -0300 |
---|---|---|
committer | Hugo Lima <hugo.lima@openbossa.org> | 2009-12-30 14:33:05 -0200 |
commit | 3b422b2d97a13a6198c035b6624aed6514ac0aa2 (patch) | |
tree | 3ae62c3e004c762157187472596b53dbb8212ef0 /libpyside/signalmanager.cpp | |
parent | 1613ca708021f927524c484d2a03791ed82aa39b (diff) |
Implement signal->signal connection.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r-- | libpyside/signalmanager.cpp | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index f6624dc8d..464e49410 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -45,6 +45,7 @@ #define PYSIDE_SIGNAL '2' #include "typeresolver.h" #include "signalslotconnection.h" +#include "signalsignalconnection.h" using namespace PySide; @@ -126,25 +127,40 @@ bool SignalManager::connect(QObject* source, const char* signal, QObject* receiv { if (!checkSignal(signal)) return false; + signal++; if (!QMetaObject::checkConnectArgs(signal, slot)) return false; - int signal_index = source->metaObject()->indexOfSignal(signal); - int slot_index = receiver->metaObject()->indexOfSlot(slot); - - bool retval; - if (signal_index != -1 && slot_index != -1) { - // C++ -> C++ connection - retval = QMetaObject::connect(source, signal_index, - receiver, slot_index, type); + + // Check if is a dynamic signal + ProxySlot* proxy = m_d->getProxy(source); + int signalIndex = source->metaObject()->indexOfSignal(signal); + if (signalIndex == -1) { + proxy->dynamicQMetaObject()->addSignal(signal); + signalIndex = source->metaObject()->indexOfSignal(signal); + } + + int slotIndex; + bool slotIsSignal = checkSignal(slot); + slot++; + // Signal -> Signal connection + if (slotIsSignal) { + slotIndex = receiver->metaObject()->indexOfSignal(slot); + if (slotIndex == -1) { + ProxySlot* proxy = m_d->getProxy(receiver); + proxy->dynamicQMetaObject()->addSignal(slot); + slotIndex = receiver->metaObject()->indexOfSignal(slot); + } + AbstractQObjectConnection* connection = new SignalSignalConnection(source, signal, receiver, slot, type); + proxy->connect(connection); } else { - // We have a python slot or signal - ProxySlot* proxy = m_d->getProxy(source); - AbstractQObjectConnection* connection = 0; - retval = proxy->connect(connection); + // Signal -> Slot connection + slotIndex = receiver->metaObject()->indexOfSlot(slot); + if (slotIndex == -1) + return false; } - return retval; + return QMetaObject::connect(source, signalIndex, receiver, slotIndex, type); } bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* args) @@ -162,7 +178,6 @@ bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* ar signalArgs[0] = 0; for (int i = 0; i < argsGiven; ++i) signalArgs[i+1] = TypeResolver::get(argTypes[i])->toCpp(PySequence_GetItem(args, i)); - QMetaObject::activate(source, signalIndex, signalArgs); return true; } |