aboutsummaryrefslogtreecommitdiffstats
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
parent1613ca708021f927524c484d2a03791ed82aa39b (diff)
Implement signal->signal connection.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
-rw-r--r--PySide/QtCore/typesystem_core.xml8
-rw-r--r--libpyside/signalmanager.cpp43
-rw-r--r--libpyside/signalsignalconnection.cpp10
-rw-r--r--libpyside/signalsignalconnection.h4
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;
};
}