diff options
Diffstat (limited to 'libpyside/signalmanager.cpp')
-rw-r--r-- | libpyside/signalmanager.cpp | 128 |
1 files changed, 6 insertions, 122 deletions
diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 1e5824e88..a8ee41271 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -21,6 +21,10 @@ */ #include "signalmanager.h" +#include "pysidesignal.h" +#include "pysideproperty.h" +#include "pysideproperty_p.h" +#include "pyside.h" #include <QHash> #include <QStringList> @@ -33,10 +37,6 @@ #include <basewrapper.h> #include <conversions.h> -#include "qproperty.h" -#include "qproperty_p.h" -#include "pyside.h" - #if QSLOT_CODE != 1 || QSIGNAL_CODE != 2 #error QSLOT_CODE and/or QSIGNAL_CODE changed! change the hardcoded stuff to the correct value! #endif @@ -105,124 +105,8 @@ struct Converter<PySide::PyObjectWrapper> }; - using namespace PySide; -bool PySide::isSignal(const char* signal) -{ - return (signal && signal[0] == PYSIDE_SIGNAL); -} - -bool PySide::checkSignal(const char* signal) -{ - if (!signal) - return false; - - if (signal[0] != PYSIDE_SIGNAL) { - PyErr_SetString(PyExc_TypeError, "Use the function PySide.QtCore.SIGNAL on signals"); - return false; - } - return true; -} - -static QString codeCallbackName(PyObject* callback, const QString& funcName) -{ - if (PyMethod_Check(callback)) { - PyObject *self = PyMethod_GET_SELF(callback); - PyObject *func = PyMethod_GET_FUNCTION(callback); - return funcName + QString::number(quint64(self), 16) + QString::number(quint64(func), 16); - } else - return funcName+QString::number(quint64(callback), 16); -} - -QString PySide::getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName) -{ - QString functionName; - QString signature; - QStringList args; - int numArgs = -1; - bool useSelf = false; - bool isMethod = PyMethod_Check(callback); - bool isFunction = PyFunction_Check(callback); - - if (isMethod || isFunction) { - PyObject* function = isMethod ? PyMethod_GET_FUNCTION(callback) : callback; - PyCodeObject* objCode = reinterpret_cast<PyCodeObject*>(PyFunction_GET_CODE(function)); - functionName = PyString_AS_STRING(objCode->co_name); - useSelf = isMethod; - numArgs = objCode->co_flags & CO_VARARGS ? -1 : objCode->co_argcount; - } else if (PyCFunction_Check(callback)) { - functionName = ((PyCFunctionObject*)callback)->m_ml->ml_name; - useSelf = ((PyCFunctionObject*)callback)->m_self; - int flags = ((PyCFunctionObject*)callback)->m_ml->ml_flags; - - if (receiver) { - //Search for signature on metaobject - const QMetaObject *mo = receiver->metaObject(); - for(int i=0; i < mo->methodCount(); i++) { - QMetaMethod me = mo->method(i); - if (QString(me.signature()).startsWith(functionName)) { - numArgs = me.parameterTypes().size()+1; - break; - } - } - } - - if (numArgs == -1) { - if (flags & METH_O) - numArgs = 1; - else if (flags & METH_VARARGS) - numArgs = -1; - else if (flags & METH_NOARGS) - numArgs = 0; - } - } else if (PyCallable_Check(callback)) { - functionName = "__callback"+QString::number((size_t)callback); - } - - Q_ASSERT(!functionName.isEmpty()); - - bool isShortCircuit = false; - - if (encodeName) - signature = codeCallbackName(callback, functionName); - else - signature = functionName; - - args = getArgsFromSignature(signal, &isShortCircuit); - - if (!isShortCircuit) { - signature.append('('); - if (numArgs == -1) - numArgs = std::numeric_limits<int>::max(); - while (args.count() && args.count() > numArgs - useSelf) { - args.removeLast(); - } - signature.append(args.join(",")); - signature.append(')'); - } - return signature; -} - -QStringList PySide::getArgsFromSignature(const char* signature, bool* isShortCircuit) -{ - QString qsignature(signature); - QStringList result; - QRegExp splitRegex("\\s*,\\s*"); - - if (isShortCircuit) - *isShortCircuit = !qsignature.contains('('); - if (qsignature.contains("()") || qsignature.contains("(void)")) { - return result; - } else if (qsignature.contains('(')) { - static QRegExp regex(".+\\((.*)\\)"); - //get args types - QString types = qsignature.replace(regex, "\\1"); - result = types.split(splitRegex); - } - return result; -} - struct SignalManager::SignalManagerPrivate { GlobalReceiver m_globalReceiver; @@ -335,14 +219,14 @@ static bool emitNormalSignal(QObject* source, int signalIndex, const char* signa bool SignalManager::emitSignal(QObject* source, const char* signal, PyObject* args) { - if (!checkSignal(signal)) + if (!Signal::checkQtSignal(signal)) return false; signal++; int signalIndex = source->metaObject()->indexOfSignal(signal); if (signalIndex != -1) { bool isShortCircuit; - QStringList argTypes = getArgsFromSignature(signal, &isShortCircuit); + QStringList argTypes = Signal::getArgsFromSignature(signal, &isShortCircuit); if (isShortCircuit) return emitShortCircuitSignal(source, signalIndex, args); |