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 | |
parent | 1613ca708021f927524c484d2a03791ed82aa39b (diff) |
Implement signal->signal connection.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 8 | ||||
-rw-r--r-- | libpyside/signalmanager.cpp | 43 | ||||
-rw-r--r-- | libpyside/signalsignalconnection.cpp | 10 | ||||
-rw-r--r-- | libpyside/signalsignalconnection.h | 4 |
4 files changed, 50 insertions, 15 deletions
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 88a054537..0c3fbe0fe 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -1314,6 +1314,14 @@ %PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().connect(%CPPSELF, %1, %PYARG_2, %3)); </inject-code> </add-function> + <add-function signature="connect(const char*, const QObject*, const char *, Qt::ConnectionType)" return-type="bool"> + <modify-argument index="4"> + <replace-default-expression with="Qt::AutoConnection" /> + </modify-argument> + <inject-code class="target" position="beginning"> + %PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().connect(%CPPSELF, %1, %2, %3, %4)); + </inject-code> + </add-function> <add-function signature="emit(const char*, PySequence*)" return-type="bool"> <inject-code class="target" position="beginning"> %PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().emitSignal(%CPPSELF, %1, %PYARG_2)); 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; } diff --git a/libpyside/signalsignalconnection.cpp b/libpyside/signalsignalconnection.cpp index 2797a0778..2a03dfe3b 100644 --- a/libpyside/signalsignalconnection.cpp +++ b/libpyside/signalsignalconnection.cpp @@ -33,11 +33,19 @@ */ #include "signalsignalconnection.h" +#include <QDebug> +#include "signalmanager.h" using namespace PySide; -void SignalSignalConnection::trigger(PyObject* args) +SignalSignalConnection::SignalSignalConnection(QObject* source, const char* signal, QObject* receiver, const char* otherSignal, Qt::ConnectionType connectionType) + : AbstractQObjectConnection(source, signal, connectionType), m_receiver(receiver), m_signal(otherSignal) { + m_signal.prepend('2'); +} +void SignalSignalConnection::trigger(PyObject* args) +{ + SignalManager::instance().emitSignal(m_receiver, m_signal.constData(), args); } diff --git a/libpyside/signalsignalconnection.h b/libpyside/signalsignalconnection.h index c5896cc21..e444ed101 100644 --- a/libpyside/signalsignalconnection.h +++ b/libpyside/signalsignalconnection.h @@ -42,7 +42,11 @@ namespace PySide class SignalSignalConnection : public AbstractQObjectConnection { public: + SignalSignalConnection(QObject* source, const char* signal, QObject* receiver, const char* otherSignal, Qt::ConnectionType connectionType); virtual void trigger(PyObject* args); +private: + QObject* m_receiver; + QByteArray m_signal; }; } |