diff options
author | renatofilho <renato.filho@openbossa.org> | 2010-10-29 18:53:42 -0300 |
---|---|---|
committer | renatofilho <renato.filho@openbossa.org> | 2010-11-03 10:29:31 -0300 |
commit | 4cd7a240d8db7de44b471a8ef0ed2f956addb743 (patch) | |
tree | 511ef8e13a689e73b788d6a1afc72578ccdbf9db /libpyside | |
parent | c7945787c556d2e3e40a1b9ef93147c640ee8ff6 (diff) |
Renamed qsignal, qslot, qproperty files to pyside*.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Lauro Neto <lauro.neto@openbossa.org>
Diffstat (limited to 'libpyside')
-rw-r--r-- | libpyside/CMakeLists.txt | 10 | ||||
-rw-r--r-- | libpyside/dynamicqmetaobject.cpp | 10 | ||||
-rw-r--r-- | libpyside/pyside.cpp | 14 | ||||
-rw-r--r-- | libpyside/pysideproperty.cpp (renamed from libpyside/qproperty.cpp) | 13 | ||||
-rw-r--r-- | libpyside/pysideproperty.h (renamed from libpyside/qproperty.h) | 0 | ||||
-rw-r--r-- | libpyside/pysideproperty_p.h (renamed from libpyside/qproperty_p.h) | 0 | ||||
-rw-r--r-- | libpyside/pysidesignal.cpp (renamed from libpyside/qsignal.cpp) | 125 | ||||
-rw-r--r-- | libpyside/pysidesignal.h (renamed from libpyside/qsignal.h) | 37 | ||||
-rw-r--r-- | libpyside/pysidesignal_p.h (renamed from libpyside/qsignal_p.h) | 2 | ||||
-rw-r--r-- | libpyside/pysideslot.cpp (renamed from libpyside/qslot.cpp) | 5 | ||||
-rw-r--r-- | libpyside/pysideslot_p.h (renamed from libpyside/qslot_p.h) | 0 | ||||
-rw-r--r-- | libpyside/signalmanager.cpp | 128 | ||||
-rw-r--r-- | libpyside/signalmanager.h | 7 |
13 files changed, 191 insertions, 160 deletions
diff --git a/libpyside/CMakeLists.txt b/libpyside/CMakeLists.txt index aec0894e6..939bcc45e 100644 --- a/libpyside/CMakeLists.txt +++ b/libpyside/CMakeLists.txt @@ -4,9 +4,9 @@ set(libpyside_SRC dynamicqmetaobject.cpp signalmanager.cpp globalreceiver.cpp -qsignal.cpp -qslot.cpp -qproperty.cpp +pysidesignal.cpp +pysideslot.cpp +pysideproperty.cpp pyside.cpp ) @@ -37,8 +37,8 @@ set(libpyside_HEADERS pysidemacros.h signalmanager.h pyside.h - qsignal.h - qproperty.h + pysidesignal.h + pysideproperty.h ) if (CMAKE_BUILD_TYPE STREQUAL "Debug") diff --git a/libpyside/dynamicqmetaobject.cpp b/libpyside/dynamicqmetaobject.cpp index 03153b320..6ec65aaa1 100644 --- a/libpyside/dynamicqmetaobject.cpp +++ b/libpyside/dynamicqmetaobject.cpp @@ -22,6 +22,11 @@ #include "dynamicqmetaobject.h" #include "dynamicqmetaobject_p.h" +#include "pysidesignal.h" +#include "pysidesignal_p.h" +#include "pysideproperty.h" +#include "pysideproperty_p.h" + #include <QByteArray> #include <QString> #include <QStringList> @@ -32,11 +37,6 @@ #include <QDebug> #include <QMetaMethod> -#include "qsignal.h" -#include "qsignal_p.h" -#include "qproperty.h" -#include "qproperty_p.h" - #define MAX_SIGNALS_COUNT 50 #define MAX_SLOTS_COUNT 50 diff --git a/libpyside/pyside.cpp b/libpyside/pyside.cpp index 086bdad2c..833ae9cef 100644 --- a/libpyside/pyside.cpp +++ b/libpyside/pyside.cpp @@ -20,8 +20,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - #include "pyside.h" +#include "signalmanager.h" +#include "pysideproperty_p.h" +#include "pysideproperty.h" +#include "pysidesignal.h" +#include "pysidesignal_p.h" +#include "pysideslot_p.h" + #include <basewrapper.h> #include <conversions.h> #include <typeresolver.h> @@ -29,12 +35,6 @@ #include <cctype> #include <QStack> #include <QCoreApplication> -#include "signalmanager.h" -#include "qproperty_p.h" -#include "qproperty.h" -#include "qsignal.h" -#include "qsignal_p.h" -#include "qslot_p.h" static QStack<PySide::CleanupFunction> cleanupFunctionList; diff --git a/libpyside/qproperty.cpp b/libpyside/pysideproperty.cpp index 098080833..51f848d67 100644 --- a/libpyside/qproperty.cpp +++ b/libpyside/pysideproperty.cpp @@ -20,15 +20,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include <shiboken.h> #include <Python.h> +#include "pysideproperty.h" +#include "pysideproperty_p.h" +#include "dynamicqmetaobject_p.h" +#include "pysidesignal.h" +#include "pysidesignal_p.h" + +#include <shiboken.h> #include <QDebug> -#include "qproperty.h" -#include "qproperty_p.h" -#include "dynamicqmetaobject_p.h" -#include "qsignal.h" -#include "qsignal_p.h" #define QPROPERTY_CLASS_NAME "Property" diff --git a/libpyside/qproperty.h b/libpyside/pysideproperty.h index f137e8076..f137e8076 100644 --- a/libpyside/qproperty.h +++ b/libpyside/pysideproperty.h diff --git a/libpyside/qproperty_p.h b/libpyside/pysideproperty_p.h index 1ba9cb2be..1ba9cb2be 100644 --- a/libpyside/qproperty_p.h +++ b/libpyside/pysideproperty_p.h diff --git a/libpyside/qsignal.cpp b/libpyside/pysidesignal.cpp index 332cc8224..41750aa37 100644 --- a/libpyside/qsignal.cpp +++ b/libpyside/pysidesignal.cpp @@ -19,17 +19,16 @@ * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include <Python.h> +#include "pysidesignal.h" +#include "pysidesignal_p.h" +#include "signalmanager.h" #include <shiboken.h> -#include <Python.h> #include <QDebug> -#include "qsignal.h" -#include "qsignal_p.h" -#include "signalmanager.h" - #define SIGNAL_CLASS_NAME "Signal" -#define QT_SIGNAL_SENTINEL "2" +#define QT_SIGNAL_SENTINEL '2' namespace PySide { namespace Signal { @@ -665,7 +664,7 @@ PyObject* buildQtCompatible(const char* signature) { char* qtSignature; qtSignature = reinterpret_cast<char*>(malloc(strlen(signature)+2)); - sprintf(qtSignature, QT_SIGNAL_SENTINEL"%s", signature); + sprintf(qtSignature, "%c%s", QT_SIGNAL_SENTINEL, signature); PyObject* ret = PyString_FromString(qtSignature); free(qtSignature); return ret; @@ -700,6 +699,118 @@ const char** getSignatures(PyObject* signal, int *size) return (const char**) self->signatures; } +QStringList 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; +} + +QString 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; +} + +bool isQtSignal(const char* signal) +{ + return (signal && signal[0] == QT_SIGNAL_SENTINEL); +} + +bool checkQtSignal(const char* signal) +{ + if (!isQtSignal(signal)) { + PyErr_SetString(PyExc_TypeError, "Use the function PySide.QtCore.SIGNAL on signals"); + return false; + } + return true; +} + +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); +} + } //namespace Signal } //namespace PySide diff --git a/libpyside/qsignal.h b/libpyside/pysidesignal.h index e32e0642b..8a590a1b7 100644 --- a/libpyside/qsignal.h +++ b/libpyside/pysidesignal.h @@ -23,9 +23,12 @@ #ifndef PYSIDE_SIGNAL_H #define PYSIDE_SIGNAL_H +#include <QObject> +#include <QString> +#include <QStringList> + #include <pysidemacros.h> #include <Python.h> -#include <QObject> namespace Shiboken { @@ -110,6 +113,38 @@ PYSIDE_API void updateSourceObject(PyObject* source); **/ PYSIDE_API void addSignalToWrapper(Shiboken::SbkBaseWrapperType* wrapperType, const char* signalName, PySideSignal* signal); +/** + * This function verify if the signature is a QtSignal base on SIGNAL flag + * @param signature The signal signature + * @return Return true if this is a Qt Signal of false if not + **/ +PYSIDE_API bool isQtSignal(const char* signature); + +/** + * This function is similar as isQtSignal but this reaise a Python error if this faisl + * @param signature The signal signature + * @return Return true if this is a Qt Signal of false if not + **/ +PYSIDE_API bool checkQtSignal(const char* signature); + +/** + * This function is used to retrieve the signature base on Signal and receiver callback + * @param signature The signal signature + * @param receiver The QObject which will receiver the signal + * @param callback Callback function which will connect with signal + * @param encodeName Used to specify if the returned signature will be encoded with Qt signal/slot style + * @return Return the callback signature + **/ +PYSIDE_API QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName); + +/** + * Function to parese the signature and return a list of argument types + * @param signature The signal signature + * @param isShortCircuit If this is a shortCircuit(python<->python) signal + * @return Return true if this is a Qt Signal of false if not + **/ +QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit = 0); + } //namespace Signal } //namespace PySide diff --git a/libpyside/qsignal_p.h b/libpyside/pysidesignal_p.h index 7f614694b..d13e47ecc 100644 --- a/libpyside/qsignal_p.h +++ b/libpyside/pysidesignal_p.h @@ -51,10 +51,12 @@ extern "C" }; //extern "C" namespace PySide { namespace Signal { + void init(PyObject* module); bool connect(PyObject* source, const char* signal, PyObject* callback); char* getTypeName(PyObject*); const char** getSignatures(PyObject* self, int *size); + QString codeCallbackName(PyObject* callback, const QString& funcName); }} //namespace PySide diff --git a/libpyside/qslot.cpp b/libpyside/pysideslot.cpp index ff63a6ca3..538a258e6 100644 --- a/libpyside/qslot.cpp +++ b/libpyside/pysideslot.cpp @@ -20,10 +20,11 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "dynamicqmetaobject_p.h" +#include "pysidesignal_p.h" + #include <shiboken.h> #include <QString> -#include "dynamicqmetaobject_p.h" -#include "qsignal_p.h" #define SLOT_DEC_NAME "Slot" diff --git a/libpyside/qslot_p.h b/libpyside/pysideslot_p.h index b02c36acf..b02c36acf 100644 --- a/libpyside/qslot_p.h +++ b/libpyside/pysideslot_p.h 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); diff --git a/libpyside/signalmanager.h b/libpyside/signalmanager.h index 2fda00833..91c86e02e 100644 --- a/libpyside/signalmanager.h +++ b/libpyside/signalmanager.h @@ -45,13 +45,9 @@ public: operator PyObject*() const; private: PyObject* m_me; + void* m_data; //future }; -PYSIDE_API bool isSignal(const char* signal); -PYSIDE_API bool checkSignal(const char* signal); -PYSIDE_API QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* callback, bool encodeName); -QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit = 0); - class PYSIDE_API SignalManager { public: @@ -76,6 +72,7 @@ public: private: struct SignalManagerPrivate; SignalManagerPrivate* m_d; + SignalManager(); ~SignalManager(); |