Implement signal->signal connection.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
This commit is contained in:
parent
1613ca7080
commit
3b422b2d97
4 changed files with 51 additions and 16 deletions
|
|
@ -1314,6 +1314,14 @@
|
||||||
%PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().connect(%CPPSELF, %1, %PYARG_2, %3));
|
%PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().connect(%CPPSELF, %1, %PYARG_2, %3));
|
||||||
</inject-code>
|
</inject-code>
|
||||||
</add-function>
|
</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">
|
<add-function signature="emit(const char*, PySequence*)" return-type="bool">
|
||||||
<inject-code class="target" position="beginning">
|
<inject-code class="target" position="beginning">
|
||||||
%PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().emitSignal(%CPPSELF, %1, %PYARG_2));
|
%PYARG_0 = %CONVERTTOPYTHON[bool](PySide::SignalManager::instance().emitSignal(%CPPSELF, %1, %PYARG_2));
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@
|
||||||
#define PYSIDE_SIGNAL '2'
|
#define PYSIDE_SIGNAL '2'
|
||||||
#include "typeresolver.h"
|
#include "typeresolver.h"
|
||||||
#include "signalslotconnection.h"
|
#include "signalslotconnection.h"
|
||||||
|
#include "signalsignalconnection.h"
|
||||||
|
|
||||||
using namespace PySide;
|
using namespace PySide;
|
||||||
|
|
||||||
|
|
@ -126,25 +127,40 @@ bool SignalManager::connect(QObject* source, const char* signal, QObject* receiv
|
||||||
{
|
{
|
||||||
if (!checkSignal(signal))
|
if (!checkSignal(signal))
|
||||||
return false;
|
return false;
|
||||||
|
signal++;
|
||||||
|
|
||||||
if (!QMetaObject::checkConnectArgs(signal, slot))
|
if (!QMetaObject::checkConnectArgs(signal, slot))
|
||||||
return false;
|
return false;
|
||||||
int signal_index = source->metaObject()->indexOfSignal(signal);
|
|
||||||
int slot_index = receiver->metaObject()->indexOfSlot(slot);
|
|
||||||
|
|
||||||
bool retval;
|
// Check if is a dynamic signal
|
||||||
if (signal_index != -1 && slot_index != -1) {
|
ProxySlot* proxy = m_d->getProxy(source);
|
||||||
// C++ -> C++ connection
|
int signalIndex = source->metaObject()->indexOfSignal(signal);
|
||||||
retval = QMetaObject::connect(source, signal_index,
|
if (signalIndex == -1) {
|
||||||
receiver, slot_index, type);
|
proxy->dynamicQMetaObject()->addSignal(signal);
|
||||||
} else {
|
signalIndex = source->metaObject()->indexOfSignal(signal);
|
||||||
// We have a python slot or signal
|
|
||||||
ProxySlot* proxy = m_d->getProxy(source);
|
|
||||||
AbstractQObjectConnection* connection = 0;
|
|
||||||
retval = proxy->connect(connection);
|
|
||||||
}
|
}
|
||||||
return retval;
|
|
||||||
|
|
||||||
|
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 {
|
||||||
|
// Signal -> Slot connection
|
||||||
|
slotIndex = receiver->metaObject()->indexOfSlot(slot);
|
||||||
|
if (slotIndex == -1)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return QMetaObject::connect(source, signalIndex, receiver, slotIndex, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* args)
|
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;
|
signalArgs[0] = 0;
|
||||||
for (int i = 0; i < argsGiven; ++i)
|
for (int i = 0; i < argsGiven; ++i)
|
||||||
signalArgs[i+1] = TypeResolver::get(argTypes[i])->toCpp(PySequence_GetItem(args, i));
|
signalArgs[i+1] = TypeResolver::get(argTypes[i])->toCpp(PySequence_GetItem(args, i));
|
||||||
|
|
||||||
QMetaObject::activate(source, signalIndex, signalArgs);
|
QMetaObject::activate(source, signalIndex, signalArgs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -33,11 +33,19 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "signalsignalconnection.h"
|
#include "signalsignalconnection.h"
|
||||||
|
#include <QDebug>
|
||||||
|
#include "signalmanager.h"
|
||||||
|
|
||||||
using namespace PySide;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,11 @@ namespace PySide
|
||||||
class SignalSignalConnection : public AbstractQObjectConnection
|
class SignalSignalConnection : public AbstractQObjectConnection
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
SignalSignalConnection(QObject* source, const char* signal, QObject* receiver, const char* otherSignal, Qt::ConnectionType connectionType);
|
||||||
virtual void trigger(PyObject* args);
|
virtual void trigger(PyObject* args);
|
||||||
|
private:
|
||||||
|
QObject* m_receiver;
|
||||||
|
QByteArray m_signal;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue