aboutsummaryrefslogtreecommitdiffstats
path: root/libpyside/signalmanager.cpp
diff options
context:
space:
mode:
authorLuciano Wolf <luciano.wolf@openbossa.org>2009-12-18 11:44:09 -0300
committerHugo Lima <hugo.lima@openbossa.org>2009-12-30 14:33:05 -0200
commit3b422b2d97a13a6198c035b6624aed6514ac0aa2 (patch)
tree3ae62c3e004c762157187472596b53dbb8212ef0 /libpyside/signalmanager.cpp
parent1613ca708021f927524c484d2a03791ed82aa39b (diff)
Implement signal->signal connection.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r--libpyside/signalmanager.cpp43
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;
}