From 4985f114a30d5ce0de2a5402d3f2be3d97a93dc4 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Tue, 29 Nov 2011 17:20:00 -0300 Subject: [PATCH 01/52] Fix BUG #1069 - "QtCore.QDataStream silently fails on writing Python string" Signed-off-by: Paulo Alcantara Reviewer: Willer Moreira Marcelo Lira --- PySide/QtCore/typesystem_core.xml | 46 ++++++++++++++----------------- tests/QtCore/CMakeLists.txt | 1 + tests/QtCore/bug_1069.py | 22 +++++++++++++++ 3 files changed, 44 insertions(+), 25 deletions(-) create mode 100644 tests/QtCore/bug_1069.py diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 8c843e2..5af8fe5 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -2666,55 +2666,51 @@ + + + + + - - *(%CPPSELF) << %1; + + - - %RETURN_TYPE val; - *(%CPPSELF) >> val; - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](val); + + - - *(%CPPSELF) << %1; + + - - %RETURN_TYPE val; - *(%CPPSELF) >> val; - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](val); + + - - *(%CPPSELF) << %1; + + - - %RETURN_TYPE val; - *(%CPPSELF) >> val; - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](val); + + - - *(%CPPSELF) << %1; + + - - %RETURN_TYPE val; - *(%CPPSELF) >> val; - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](val); + + - diff --git a/tests/QtCore/CMakeLists.txt b/tests/QtCore/CMakeLists.txt index ca73706..388d38c 100644 --- a/tests/QtCore/CMakeLists.txt +++ b/tests/QtCore/CMakeLists.txt @@ -25,6 +25,7 @@ PYSIDE_TEST(bug_987.py) PYSIDE_TEST(bug_994.py) PYSIDE_TEST(bug_1019.py) PYSIDE_TEST(bug_1031.py) +PYSIDE_TEST(bug_1069.py) PYSIDE_TEST(blocking_signals_test.py) PYSIDE_TEST(classinfo_test.py) PYSIDE_TEST(child_event_test.py) diff --git a/tests/QtCore/bug_1069.py b/tests/QtCore/bug_1069.py new file mode 100644 index 0000000..7033e18 --- /dev/null +++ b/tests/QtCore/bug_1069.py @@ -0,0 +1,22 @@ +''' unit test for BUG #1069 ''' + +from PySide import QtCore +import unittest + +class QDataStreamOpOverloadTestCase(unittest.TestCase): + def setUp(self): + self.ba = QtCore.QByteArray() + self.stream = QtCore.QDataStream(self.ba, QtCore.QIODevice.WriteOnly) + + def testIt(self): + self.stream << "hello" + ok = False + for c in self.ba: + if c != b'\x00': + ok = True + break + + self.assertEqual(ok, True) + +if __name__ == "__main__": + unittest.main() From e2524f6abb6c00695edce5be26a7d6fc7b71c5fe Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Thu, 1 Dec 2011 13:32:18 -0300 Subject: [PATCH 02/52] Fix BUG #1034 - "Error compiling PySide with Python 3.2.2 32bit on Windows" Signed-off-by: Paulo Alcantara Reviewer: Marcelo Lira Luciano Wolf --- PySide/QtCore/glue/hwnd_conversions.h | 22 ++++++++++++++++++++++ PySide/QtGui/glue/wid_conversions.h | 26 +++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/PySide/QtCore/glue/hwnd_conversions.h b/PySide/QtCore/glue/hwnd_conversions.h index 65b95e2..6dbaa8f 100644 --- a/PySide/QtCore/glue/hwnd_conversions.h +++ b/PySide/QtCore/glue/hwnd_conversions.h @@ -9,7 +9,14 @@ struct Converter static bool isConvertible(PyObject* pyobj) { + if (pyobj == Py_None) + return true; + +#ifdef IS_PY3K + return PyCapsule_CheckExact(pyobj); +#else return PyCObject_Check(pyobj); +#endif } static inline PyObject* toPython(void* cppobj) @@ -21,12 +28,27 @@ struct Converter static PyObject* toPython(HWND cppobj) { + if (!cppobj) + Py_RETURN_NONE; + +#ifdef IS_PY3K + return PyCapsule_New(cppobj, 0, 0); +#else return PyCObject_FromVoidPtr(cppobj, 0); +#endif } static HWND toCpp(PyObject* pyobj) { + if (pyobj == Py_None) + return 0; + +#ifdef IS_PY3K + return (HWND)PyCapsule_GetPointer(pyobj, 0); +#else return (HWND)PyCObject_AsVoidPtr(pyobj); +#endif } }; + } diff --git a/PySide/QtGui/glue/wid_conversions.h b/PySide/QtGui/glue/wid_conversions.h index 1abb5f2..183e682 100644 --- a/PySide/QtGui/glue/wid_conversions.h +++ b/PySide/QtGui/glue/wid_conversions.h @@ -1,4 +1,5 @@ #ifndef Q_WS_WIN + namespace Shiboken { template <> struct Converter @@ -10,7 +11,14 @@ struct Converter static bool isConvertible(PyObject* pyobj) { + if (pyobj == Py_None) + return true; + +#ifdef IS_PY3K + return PyCapsule_CheckExact(pyobj); +#else return PyCObject_Check(pyobj); +#endif } static inline PyObject* toPython(void* cppobj) @@ -22,13 +30,29 @@ struct Converter static PyObject* toPython(WId cppobj) { + if (!cppobj) + Py_RETURN_NONE; + +#ifdef IS_PY3K + return PyCapsule_New(cppobj, 0, 0); +#else return PyCObject_FromVoidPtr(cppobj, 0); +#endif } static WId toCpp(PyObject* pyobj) { - return (WId) PyCObject_AsVoidPtr(pyobj); + if (pyobj == Py_None) + return 0; + +#ifdef IS_PY3K + return (WId)PyCapsule_GetPointer(pyobj, 0); +#else + return (WId)PyCObject_AsVoidPtr(pyobj); +#endif } }; + } + #endif From 2f70b1047116fa262b30562f325dfaefff3daa0d Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Mon, 5 Dec 2011 15:10:48 -0300 Subject: [PATCH 03/52] Fix BUG #1077 - "Application exit crash when call QSyntaxHighlighter.document()" Signed-off-by: Paulo Alcantara Reviewer: Marcelo Lira Hugo Parente Lima --- PySide/QtGui/typesystem_gui_common.xml | 5 +++++ tests/QtGui/CMakeLists.txt | 1 + tests/QtGui/bug_1077.py | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 tests/QtGui/bug_1077.py diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index 4b0785b..755f4a9 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -2685,6 +2685,11 @@ + + + + + diff --git a/tests/QtGui/CMakeLists.txt b/tests/QtGui/CMakeLists.txt index acb9a67..1d95576 100644 --- a/tests/QtGui/CMakeLists.txt +++ b/tests/QtGui/CMakeLists.txt @@ -80,6 +80,7 @@ PYSIDE_TEST(bug_998.py) PYSIDE_TEST(bug_1002.py) PYSIDE_TEST(bug_1006.py) PYSIDE_TEST(bug_1048.py) +PYSIDE_TEST(bug_1077.py) PYSIDE_TEST(customproxywidget_test.py) PYSIDE_TEST(deepcopy_test.py) PYSIDE_TEST(event_filter_test.py) diff --git a/tests/QtGui/bug_1077.py b/tests/QtGui/bug_1077.py new file mode 100644 index 0000000..231ce1e --- /dev/null +++ b/tests/QtGui/bug_1077.py @@ -0,0 +1,17 @@ +''' unit test for BUG #1077 ''' + +from PySide import QtCore, QtGui +import time + +class Highlighter(QtGui.QSyntaxHighlighter): + def __init__(self, parent, mode): + QtGui.QSyntaxHighlighter.__init__(self, parent) + self.tstamp = time.time() + +if __name__ == "__main__": + app = QtGui.QApplication([]) + python = QtGui.QTextEdit() + python.setWindowTitle("python") + hl = Highlighter(python.document(), "python") + python.show() + text = hl.document() From e3814f27dd3975b5be5a2f328353fe7d144ce23b Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Tue, 6 Dec 2011 19:53:07 -0200 Subject: [PATCH 04/52] Replace private.py file by an inject code. --- PySide/CMakeLists.txt | 5 +---- PySide/QtCore/typesystem_core.xml | 11 +++++++++++ PySide/__init__.py.in | 6 ------ PySide/private.py | 4 ---- 4 files changed, 12 insertions(+), 14 deletions(-) delete mode 100644 PySide/private.py diff --git a/PySide/CMakeLists.txt b/PySide/CMakeLists.txt index 62c8068..d8371c0 100644 --- a/PySide/CMakeLists.txt +++ b/PySide/CMakeLists.txt @@ -9,9 +9,6 @@ configure_file("${CMAKE_CURRENT_SOURCE_DIR}/global.h.in" configure_file("${CMAKE_CURRENT_SOURCE_DIR}/__init__.py.in" "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" @ONLY) -execute_process(COMMAND ${CMAKE_COMMAND} -E copy_if_different "${CMAKE_CURRENT_SOURCE_DIR}/private.py" - "${CMAKE_BINARY_DIR}/PySide/private.py") - HAS_QT_MODULE(QT_QTCORE_FOUND QtCore) HAS_QT_MODULE(QT_QTGUI_FOUND QtGui) HAS_QT_MODULE(QT_QTNETWORK_FOUND QtNetwork) @@ -34,7 +31,7 @@ HAS_QT_MODULE(QT_PHONON_FOUND phonon) HAS_QT_MODULE(QT_QTDECLARATIVE_FOUND QtDeclarative) # install -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" "${CMAKE_CURRENT_BINARY_DIR}/private.py" +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/__init__.py" DESTINATION "${SITE_PACKAGE}/${BINDING_NAME}${pyside_SUFFIX}") install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/typesystem_templates.xml DESTINATION share/PySide${pyside_SUFFIX}/typesystems) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 5af8fe5..9ac07f6 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -401,6 +401,17 @@ + + { // Avoid name clash + Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit")); + Shiboken::AutoDecRef regFunc(PyObject_GetAttrString(atexit, "register")); + Shiboken::AutoDecRef shutDownFunc(PyObject_GetAttrString(module, "__moduleShutdown")); + Shiboken::AutoDecRef args(PyTuple_New(1)); + PyTuple_SET_ITEM(args, 0, shutDownFunc); + Shiboken::AutoDecRef retval(PyObject_Call(regFunc, args, 0)); + Q_ASSERT(!retval.isNull()); + } + diff --git a/PySide/__init__.py.in b/PySide/__init__.py.in index 9536718..da6cd69 100644 --- a/PySide/__init__.py.in +++ b/PySide/__init__.py.in @@ -1,9 +1,3 @@ -import sys - __all__ = ['QtCore', 'QtGui', 'QtNetwork', 'QtOpenGL', 'QtSql', 'QtSvg', 'QtTest', 'QtWebKit', 'QtScript'] - -if sys.version_info[0] < 3: - import private - __version__ = "@BINDING_API_VERSION_FULL@" __version_info__ = (@BINDING_API_MAJOR_VERSION@, @BINDING_API_MINOR_VERSION@, @BINDING_API_MICRO_VERSION@, "@BINDING_API_RELEASE_LEVEL@", @BINDING_API_SERIAL@) diff --git a/PySide/private.py b/PySide/private.py deleted file mode 100644 index 0fe1c13..0000000 --- a/PySide/private.py +++ /dev/null @@ -1,4 +0,0 @@ -import atexit -from QtCore import __moduleShutdown - -atexit.register(__moduleShutdown) From 93bb5d777e6db0ba8d2b216832bf4211476c581e Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Fri, 9 Dec 2011 11:21:38 -0200 Subject: [PATCH 05/52] Fix bug 1083 - "winId returns a PyCObject making it impossible to compare two winIds" --- PySide/QtGui/glue/wid_conversions.h | 25 +++---------------------- PySide/QtGui/typesystem_gui_common.xml | 2 +- 2 files changed, 4 insertions(+), 23 deletions(-) diff --git a/PySide/QtGui/glue/wid_conversions.h b/PySide/QtGui/glue/wid_conversions.h index 183e682..68d7528 100644 --- a/PySide/QtGui/glue/wid_conversions.h +++ b/PySide/QtGui/glue/wid_conversions.h @@ -11,14 +11,7 @@ struct Converter static bool isConvertible(PyObject* pyobj) { - if (pyobj == Py_None) - return true; - -#ifdef IS_PY3K - return PyCapsule_CheckExact(pyobj); -#else - return PyCObject_Check(pyobj); -#endif + return pyobj == Py_None || PyNumber_Check(pyobj); } static inline PyObject* toPython(void* cppobj) @@ -30,26 +23,14 @@ struct Converter static PyObject* toPython(WId cppobj) { - if (!cppobj) - Py_RETURN_NONE; - -#ifdef IS_PY3K - return PyCapsule_New(cppobj, 0, 0); -#else - return PyCObject_FromVoidPtr(cppobj, 0); -#endif + return PyLong_FromVoidPtr((void*)cppobj); } static WId toCpp(PyObject* pyobj) { if (pyobj == Py_None) return 0; - -#ifdef IS_PY3K - return (WId)PyCapsule_GetPointer(pyobj, 0); -#else - return (WId)PyCObject_AsVoidPtr(pyobj); -#endif + return (WId)PyLong_AsVoidPtr(pyobj); } }; diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index 755f4a9..e4a6f44 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -4245,7 +4245,7 @@ If a widget is non-native (alien) and winId() is invoked on it, that widget will be provided a native handle. - On X11 the type returned is long, on other platforms it's a PyCObject. + On X11 the type returned is long, on other platforms it's void pointer casted to a Python long long. This value may change at run-time. An event with type PySide.QtCore.QEvent.WinIdChange will be sent to the widget following a change in window system identifier. From 508e59c0910752d6d745a659e792ce91401875b7 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Thu, 8 Dec 2011 16:11:31 +0000 Subject: [PATCH 06/52] Fix BUG #1063 Signed-off-by: Paulo Alcantara Reviewed-by: Willer Moreira Reviewed-by: Luciano Wolf --- PySide/QtCore/typesystem_core.xml | 1 + tests/QtCore/CMakeLists.txt | 1 + tests/QtCore/bug_1063.py | 29 +++++++++++++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 tests/QtCore/bug_1063.py diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 9ac07f6..a1a3068 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -2904,6 +2904,7 @@ + diff --git a/tests/QtCore/CMakeLists.txt b/tests/QtCore/CMakeLists.txt index 388d38c..9e49b76 100644 --- a/tests/QtCore/CMakeLists.txt +++ b/tests/QtCore/CMakeLists.txt @@ -25,6 +25,7 @@ PYSIDE_TEST(bug_987.py) PYSIDE_TEST(bug_994.py) PYSIDE_TEST(bug_1019.py) PYSIDE_TEST(bug_1031.py) +PYSIDE_TEST(bug_1063.py) PYSIDE_TEST(bug_1069.py) PYSIDE_TEST(blocking_signals_test.py) PYSIDE_TEST(classinfo_test.py) diff --git a/tests/QtCore/bug_1063.py b/tests/QtCore/bug_1063.py new file mode 100644 index 0000000..3de10d2 --- /dev/null +++ b/tests/QtCore/bug_1063.py @@ -0,0 +1,29 @@ +''' unit test for BUG #1063 ''' + +import unittest +import tempfile +from PySide import QtCore +import os + +class QTextStreamTestCase(unittest.TestCase): + def setUp(self): + self.temp_file = tempfile.NamedTemporaryFile(delete=False) + self.temp_file.close() + self.f = QtCore.QFile(self.temp_file.name) + self.f.open(QtCore.QIODevice.WriteOnly) + self.strings = (u'foo', u'bar') + self.stream = QtCore.QTextStream(self.f) + + def testIt(self): + for s in self.strings: + self.stream << s + + self.f.close() + + # make sure we didn't get an empty file + self.assertNotEqual(QtCore.QFile(self.temp_file.name).size(), 0L) + + os.unlink(self.temp_file.name) + +if __name__ == "__main__": + unittest.main() From 66f4ccbe5d1c08886948a67a2dde54e24d81469f Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Thu, 8 Dec 2011 17:41:27 +0000 Subject: [PATCH 07/52] pysidesignal: trivial fixes Fix typos and coding style Signed-off-by: Paulo Alcantara Reviewed-by: Luciano Wolf Reviewed-by: Hugo Parente Lima --- libpyside/pysidesignal.cpp | 120 +++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 59 deletions(-) diff --git a/libpyside/pysidesignal.cpp b/libpyside/pysidesignal.cpp index 53c5814..1f6db25 100644 --- a/libpyside/pysidesignal.cpp +++ b/libpyside/pysidesignal.cpp @@ -19,6 +19,7 @@ * 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 #include "pysidesignal.h" #include "pysidesignal_p.h" @@ -31,12 +32,12 @@ #define SIGNAL_INSTANCE_NAME "SignalInstance" #define QT_SIGNAL_SENTINEL '2' - -namespace PySide { namespace Signal { +namespace PySide { +namespace Signal { //aux static char* buildSignature(const char*, const char*); static void appendSignature(PySideSignal*, char*); - static void instanceInitialize(PySideSignalInstance*, PyObject*, PySideSignal*, PyObject *, int); + static void instanceInitialize(PySideSignalInstance*, PyObject*, PySideSignal*, PyObject*, int); static char* parseSignature(PyObject*); static PyObject* buildQtCompatible(const char*); } @@ -45,14 +46,14 @@ namespace PySide { namespace Signal { extern "C" { -//Signal methods +// Signal methods static int signalTpInit(PyObject*, PyObject*, PyObject*); static void signalFree(void*); static void signalInstanceFree(void*); static PyObject* signalGetItem(PyObject* self, PyObject* key); static PyObject* signalToString(PyObject* self); -//Signal Instance methods +// Signal Instance methods static PyObject* signalInstanceConnect(PyObject*, PyObject*, PyObject*); static PyObject* signalInstanceDisconnect(PyObject*, PyObject*); static PyObject* signalInstanceEmit(PyObject*, PyObject*); @@ -221,8 +222,8 @@ PyTypeObject PySideSignalInstanceType = { int signalTpInit(PyObject* self, PyObject* args, PyObject* kwds) { - static PyObject *emptyTuple = 0; - static const char *kwlist[] = {"name", 0}; + static PyObject* emptyTuple = 0; + static const char* kwlist[] = {"name", 0}; char* argName = 0; if (emptyTuple == 0) @@ -233,13 +234,13 @@ int signalTpInit(PyObject* self, PyObject* args, PyObject* kwds) return 0; bool tupledArgs = false; - PySideSignal *data = reinterpret_cast(self); + PySideSignal* data = reinterpret_cast(self); if (argName) { data->signalName = strdup(argName); } - for(Py_ssize_t i = 0, i_max = PyTuple_Size(args); i < i_max; i++) { - PyObject *arg = PyTuple_GET_ITEM(args, i); + for (Py_ssize_t i = 0, i_max = PyTuple_Size(args); i < i_max; i++) { + PyObject* arg = PyTuple_GET_ITEM(args, i); if (PySequence_Check(arg) && !Shiboken::String::check(arg)) { tupledArgs = true; PySide::Signal::appendSignature(data, PySide::Signal::parseSignature(arg)); @@ -252,12 +253,12 @@ int signalTpInit(PyObject* self, PyObject* args, PyObject* kwds) return 1; } -void signalFree(void *self) +void signalFree(void* self) { - PyObject *pySelf = reinterpret_cast(self); - PySideSignal *data = reinterpret_cast(self); + PyObject* pySelf = reinterpret_cast(self); + PySideSignal* data = reinterpret_cast(self); - for(int i = 0, i_max = data->signaturesSize; i < i_max; i++) { + for (int i = 0, i_max = data->signaturesSize; i < i_max; i++) { if (data->signatures[i]) free(data->signatures[i]); } @@ -319,26 +320,26 @@ void signalInstanceFree(void* self) PyObject* signalInstanceConnect(PyObject* self, PyObject* args, PyObject* kwds) { - PyObject *slot = 0; - PyObject *type = 0; - static const char *kwlist[] = {"slot", "type", 0}; + PyObject* slot = 0; + PyObject* type = 0; + static const char* kwlist[] = {"slot", "type", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:"SIGNAL_INSTANCE_NAME, (char**) kwlist, &slot, &type)) return 0; - PySideSignalInstance *source = reinterpret_cast(self); + PySideSignalInstance* source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); bool match = false; if (slot->ob_type == &PySideSignalInstanceType) { - PySideSignalInstance *sourceWalk = source; - PySideSignalInstance *targetWalk; + PySideSignalInstance* sourceWalk = source; + PySideSignalInstance* targetWalk; //find best match - while(sourceWalk && !match) { + while (sourceWalk && !match) { targetWalk = reinterpret_cast(slot); - while(targetWalk && !match) { + while (targetWalk && !match) { if (QMetaObject::checkConnectArgs(sourceWalk->d->signature, targetWalk->d->signature)) { PyList_Append(pyArgs, sourceWalk->d->source); Shiboken::AutoDecRef sourceSignature(PySide::Signal::buildQtCompatible(sourceWalk->d->signature)); @@ -377,19 +378,19 @@ PyObject* signalInstanceConnect(PyObject* self, PyObject* args, PyObject* kwds) Py_XDECREF(result); } if (!PyErr_Occurred()) - PyErr_Format(PyExc_RuntimeError, "Fail to connect signal %s.", source->d->signature); + PyErr_Format(PyExc_RuntimeError, "Failed to connect signal %s.", source->d->signature); return 0; } PyObject* signalInstanceEmit(PyObject* self, PyObject* args) { - PySideSignalInstance *source = reinterpret_cast(self); + PySideSignalInstance* source = reinterpret_cast(self); Shiboken::AutoDecRef pyArgs(PyList_New(0)); Shiboken::AutoDecRef sourceSignature(PySide::Signal::buildQtCompatible(source->d->signature)); PyList_Append(pyArgs, sourceSignature); - for(Py_ssize_t i = 0, max = PyTuple_Size(args); i < max; i++) + for (Py_ssize_t i = 0, max = PyTuple_Size(args); i < max; i++) PyList_Append(pyArgs, PyTuple_GetItem(args, i)); Shiboken::AutoDecRef pyMethod(PyObject_GetAttrString(source->d->source, "emit")); @@ -406,15 +407,16 @@ PyObject* signalInstanceGetItem(PyObject* self, PyObject* key) free(sigKey); const char* sigName = data->d->signalName; - while(data) { + while (data) { if (strcmp(data->d->signature, sig) == 0) { free(sig); - PyObject *result = reinterpret_cast(data); + PyObject* result = reinterpret_cast(data); Py_INCREF(result); return result; } data = reinterpret_cast(data->d->next); } + PyErr_Format(PyExc_IndexError, "Signature %s not found for signal: %s", sig, sigName); free(sig); return 0; @@ -433,7 +435,7 @@ PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args) bool match = false; if (slot->ob_type == &PySideSignalInstanceType) { - PySideSignalInstance *target = reinterpret_cast(slot); + PySideSignalInstance* target = reinterpret_cast(slot); if (QMetaObject::checkConnectArgs(source->d->signature, target->d->signature)) { PyList_Append(pyArgs, source->d->source); Shiboken::AutoDecRef source_signature(PySide::Signal::buildQtCompatible(source->d->signature)); @@ -467,7 +469,7 @@ PyObject* signalInstanceDisconnect(PyObject* self, PyObject* args) Py_DECREF(result); } - PyErr_Format(PyExc_RuntimeError, "Fail to disconnect signal %s.", source->d->signature); + PyErr_Format(PyExc_RuntimeError, "Failed to disconnect signal %s.", source->d->signature); return 0; } @@ -503,7 +505,6 @@ PyObject* signalInstanceCall(PyObject* self, PyObject* args, PyObject* kw) return PyCFunction_Call(homonymousMethod, args, kw); } - static PyObject* metaSignalCheck(PyObject* klass, PyObject* args) { if (PyType_IsSubtype(args->ob_type, &PySideSignalInstanceType)) @@ -514,7 +515,8 @@ static PyObject* metaSignalCheck(PyObject* klass, PyObject* args) } // extern "C" -namespace PySide { namespace Signal { +namespace PySide { +namespace Signal { void init(PyObject* module) { @@ -542,7 +544,7 @@ bool checkType(PyObject* pyObj) void updateSourceObject(PyObject* source) { - PyTypeObject * objType = reinterpret_cast(PyObject_Type(source)); + PyTypeObject* objType = reinterpret_cast(PyObject_Type(source)); Py_ssize_t pos = 0; PyObject* value; @@ -562,13 +564,13 @@ void updateSourceObject(PyObject* source) char* getTypeName(PyObject* type) { if (PyType_Check(type)) { - char *typeName = NULL; + char* typeName = NULL; if (PyType_IsSubtype(reinterpret_cast(type), reinterpret_cast(&SbkObject_Type))) { SbkObjectType* objType = reinterpret_cast(type); typeName = strdup(Shiboken::ObjectType::getOriginalName(objType)); } else { // Translate python types to Qt names - PyTypeObject *objType = reinterpret_cast(type); + PyTypeObject* objType = reinterpret_cast(type); if (Shiboken::String::checkType(objType)) typeName = strdup("QString"); else if (objType == &PyInt_Type) @@ -593,7 +595,7 @@ char* getTypeName(PyObject* type) return 0; } -char* buildSignature(const char *name, const char *signature) +char* buildSignature(const char* name, const char* signature) { QByteArray signal(name); signal += '('; @@ -602,13 +604,13 @@ char* buildSignature(const char *name, const char *signature) return strdup(QMetaObject::normalizedSignature(signal)); } -char* parseSignature(PyObject *args) +char* parseSignature(PyObject* args) { - char *signature = 0; + char* signature = 0; if (args && (Shiboken::String::check(args) || !PySequence_Check(args))) return getTypeName(args); - for(Py_ssize_t i = 0, i_max = PySequence_Size(args); i < i_max; i++) { + for (Py_ssize_t i = 0, i_max = PySequence_Size(args); i < i_max; i++) { Shiboken::AutoDecRef arg(PySequence_ITEM(args, i)); char* typeName = getTypeName(arg); if (typeName) { @@ -630,14 +632,14 @@ void appendSignature(PySideSignal* self, char* signature) self->signaturesSize++; if (self->signaturesSize > 1) { - self->signatures = (char**) realloc(self->signatures, sizeof(char**) * self->signaturesSize); + self->signatures = (char**)realloc(self->signatures, sizeof(char**) * self->signaturesSize); } else { - self->signatures = (char**) malloc(sizeof(char**)); + self->signatures = (char**)malloc(sizeof(char**)); } - self->signatures[self->signaturesSize-1] = signature; + self->signatures[self->signaturesSize - 1] = signature; } -PySideSignalInstance* initialize(PySideSignal* self, PyObject* name, PyObject *object) +PySideSignalInstance* initialize(PySideSignal* self, PyObject* name, PyObject* object) { PySideSignalInstance* instance = PyObject_New(PySideSignalInstance, &PySideSignalInstanceType); instanceInitialize(instance, name, self, object, 0); @@ -681,7 +683,7 @@ bool connect(PyObject* source, const char* signal, PyObject* callback) Shiboken::AutoDecRef pyArgs(PyTuple_Pack(3, source, pySignature.object(), callback)); PyObject* result = PyObject_CallObject(pyMethod, pyArgs); if (result == Py_False) { - PyErr_Format(PyExc_RuntimeError, "Fail to connect signal %s, to python callable object.", signal); + PyErr_Format(PyExc_RuntimeError, "Failed to connect signal %s, to python callable object.", signal); Py_DECREF(result); result = 0; } @@ -690,10 +692,10 @@ bool connect(PyObject* source, const char* signal, PyObject* callback) PySideSignalInstance* newObjectFromMethod(PyObject* source, const QList& methodList) { - PySideSignalInstance *root = 0; - PySideSignalInstance *previous = 0; + PySideSignalInstance* root = 0; + PySideSignalInstance* previous = 0; foreach(QMetaMethod m, methodList) { - PySideSignalInstance *item = PyObject_New(PySideSignalInstance, &PySideSignalInstanceType); + PySideSignalInstance* item = PyObject_New(PySideSignalInstance, &PySideSignalInstanceType); if (!root) root = item; @@ -728,7 +730,7 @@ PySideSignal* newObject(const char* name, ...) va_start(listSignatures, name); sig = va_arg(listSignatures, char*); - while(sig != NULL) { + while (sig != NULL) { if (strcmp(sig, "void") == 0) appendSignature(self, strdup("")); else @@ -783,7 +785,7 @@ void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject) { typedef QHash > SignalSigMap; SignalSigMap signalsFound; - for(int i = metaObject->methodOffset(), max = metaObject->methodCount(); i < max; ++i) { + for (int i = metaObject->methodOffset(), max = metaObject->methodCount(); i < max; ++i) { QMetaMethod method = metaObject->method(i); if (method.methodType() == QMetaMethod::Signal) { @@ -809,12 +811,12 @@ void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject) SignalSigMap::mapped_type::const_iterator endJ = it.value().end(); for (; j != endJ; ++j) appendSignature(self, strdup(j->constData())); + _addSignalToWrapper(pyObj, it.key(), self); Py_DECREF((PyObject*) self); } } - PyObject* buildQtCompatible(const char* signature) { QByteArray ba; @@ -838,10 +840,9 @@ const char* getSignature(PySideSignalInstance* signal) return signal->d->signature; } - -const char** getSignatures(PyObject* signal, int *size) +const char** getSignatures(PyObject* signal, int* size) { - PySideSignal *self = reinterpret_cast(signal); + PySideSignal* self = reinterpret_cast(signal); *size = self->signaturesSize; return (const char**) self->signatures; } @@ -888,10 +889,10 @@ QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* ca if (receiver) { //Search for signature on metaobject - const QMetaObject *mo = receiver->metaObject(); + const QMetaObject* mo = receiver->metaObject(); QByteArray prefix(functionName); prefix += '('; - for(int i=0; i < mo->methodCount(); i++) { + for (int i = 0; i < mo->methodCount(); i++) { QMetaMethod me = mo->method(i); if ((strncmp(me.signature(), prefix, prefix.size()) == 0) && QMetaObject::checkConnectArgs(signal, me.signature())) { @@ -908,7 +909,7 @@ QString getCallbackSignature(const char* signal, QObject* receiver, PyObject* ca numArgs = 0; } } else if (PyCallable_Check(callback)) { - functionName = "__callback"+QByteArray::number((qlonglong)callback); + functionName = "__callback" + QByteArray::number((qlonglong)callback); } Q_ASSERT(!functionName.isEmpty()); @@ -949,14 +950,15 @@ bool checkQtSignal(const char* signal) return true; } -QString codeCallbackName(PyObject* callback, const QString& funcName) +QString codeCallbackName(PyObject* callback, const QString& funcName) { if (PyMethod_Check(callback)) { - PyObject *self = PyMethod_GET_SELF(callback); - PyObject *func = PyMethod_GET_FUNCTION(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 + } else { return funcName + QString::number(quint64(callback), 16); + } } } //namespace Signal From 48669462d03e2646c659271686cf054777fcbb66 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Thu, 8 Dec 2011 18:33:54 +0000 Subject: [PATCH 08/52] pysidesignal: don't use C's cast Signed-off-by: Paulo Alcantara Reviewed-by: Luciano Wolf Reviewed-by: Hugo Parente Lima --- libpyside/pysidesignal.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libpyside/pysidesignal.cpp b/libpyside/pysidesignal.cpp index 1f6db25..71d8c49 100644 --- a/libpyside/pysidesignal.cpp +++ b/libpyside/pysidesignal.cpp @@ -230,7 +230,7 @@ int signalTpInit(PyObject* self, PyObject* args, PyObject* kwds) emptyTuple = PyTuple_New(0); if (!PyArg_ParseTupleAndKeywords(emptyTuple, kwds, - "|s:QtCore."SIGNAL_CLASS_NAME, (char**) kwlist, &argName)) + "|s:QtCore."SIGNAL_CLASS_NAME, const_cast(kwlist), &argName)) return 0; bool tupledArgs = false; @@ -325,7 +325,7 @@ PyObject* signalInstanceConnect(PyObject* self, PyObject* args, PyObject* kwds) static const char* kwlist[] = {"slot", "type", 0}; if (!PyArg_ParseTupleAndKeywords(args, kwds, - "O|O:"SIGNAL_INSTANCE_NAME, (char**) kwlist, &slot, &type)) + "O|O:"SIGNAL_INSTANCE_NAME, const_cast(kwlist), &slot, &type)) return 0; PySideSignalInstance* source = reinterpret_cast(self); @@ -632,9 +632,9 @@ void appendSignature(PySideSignal* self, char* signature) self->signaturesSize++; if (self->signaturesSize > 1) { - self->signatures = (char**)realloc(self->signatures, sizeof(char**) * self->signaturesSize); + self->signatures = reinterpret_cast(realloc(self->signatures, sizeof(char**) * self->signaturesSize)); } else { - self->signatures = (char**)malloc(sizeof(char**)); + self->signatures = reinterpret_cast(malloc(sizeof(char**))); } self->signatures[self->signaturesSize - 1] = signature; } @@ -844,7 +844,7 @@ const char** getSignatures(PyObject* signal, int* size) { PySideSignal* self = reinterpret_cast(signal); *size = self->signaturesSize; - return (const char**) self->signatures; + return const_cast(self->signatures); } QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit) From 720a6f4cadae3e0267749391648ace6ad3357125 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Fri, 9 Dec 2011 15:02:46 -0200 Subject: [PATCH 09/52] Don't double decref variable causing an assertion error on debug builds. Reviewer: Marcelo Lira --- PySide/QtCore/typesystem_core.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index a1a3068..d6f01dd 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -405,7 +405,7 @@ { // Avoid name clash Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit")); Shiboken::AutoDecRef regFunc(PyObject_GetAttrString(atexit, "register")); - Shiboken::AutoDecRef shutDownFunc(PyObject_GetAttrString(module, "__moduleShutdown")); + PyObject* shutDownFunc = PyObject_GetAttrString(module, "__moduleShutdown"); Shiboken::AutoDecRef args(PyTuple_New(1)); PyTuple_SET_ITEM(args, 0, shutDownFunc); Shiboken::AutoDecRef retval(PyObject_Call(regFunc, args, 0)); From 41f1c3037231330b48a60f9d3bec62265bcd436b Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 9 Dec 2011 16:02:47 -0300 Subject: [PATCH 10/52] Makes test for QtCore's bug #1063 compliant with Python 3. --- tests/QtCore/bug_1063.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/QtCore/bug_1063.py b/tests/QtCore/bug_1063.py index 3de10d2..fe78730 100644 --- a/tests/QtCore/bug_1063.py +++ b/tests/QtCore/bug_1063.py @@ -4,6 +4,7 @@ import unittest import tempfile from PySide import QtCore import os +import py3kcompat as py3k class QTextStreamTestCase(unittest.TestCase): def setUp(self): @@ -11,7 +12,7 @@ class QTextStreamTestCase(unittest.TestCase): self.temp_file.close() self.f = QtCore.QFile(self.temp_file.name) self.f.open(QtCore.QIODevice.WriteOnly) - self.strings = (u'foo', u'bar') + self.strings = (py3k.unicode_('foo'), py3k.unicode_('bar')) self.stream = QtCore.QTextStream(self.f) def testIt(self): @@ -21,7 +22,7 @@ class QTextStreamTestCase(unittest.TestCase): self.f.close() # make sure we didn't get an empty file - self.assertNotEqual(QtCore.QFile(self.temp_file.name).size(), 0L) + self.assertNotEqual(QtCore.QFile(self.temp_file.name).size(), 0) os.unlink(self.temp_file.name) From ad8992e9e06735265745decebbf6f2406d37e74d Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Fri, 9 Dec 2011 17:27:46 +0000 Subject: [PATCH 11/52] pysidesignal: more trivial fixes Fix typos and coding style. Signed-off-by: Paulo Alcantara Reviewed-by: Marcelo Lira --- libpyside/pysidesignal.h | 43 +++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/libpyside/pysidesignal.h b/libpyside/pysidesignal.h index 314949f..293e7a1 100644 --- a/libpyside/pysidesignal.h +++ b/libpyside/pysidesignal.h @@ -36,7 +36,7 @@ extern "C" extern PYSIDE_API PyTypeObject PySideSignalType; extern PYSIDE_API PyTypeObject PySideSignalInstanceType; - //Internal object + // Internal object struct PYSIDE_API PySideSignal; struct PySideSignalInstancePrivate; @@ -45,14 +45,15 @@ extern "C" PyObject_HEAD PySideSignalInstancePrivate* d; }; -}; //extern "C" +}; // extern "C" -namespace PySide { namespace Signal { +namespace PySide { +namespace Signal { PYSIDE_API bool checkType(PyObject* type); /** - * This function creates a Signal object which stay attached to QObject class + * This function creates a Signal object which stays attached to QObject class * * @param name of the Signal to be registered on meta object * @param signatures a list of signatures supported by this signal, ended with a NULL pointer @@ -67,7 +68,7 @@ PYSIDE_DEPRECATED(PYSIDE_API PySideSignal* newObject(const char* name, ...)); PYSIDE_API void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObject); /** - * This function creates a Signal object which stay attached to QObject class based on a list of QMetaMethod + * This function creates a Signal object which stays attached to QObject class based on a list of QMetaMethods * * @param source of the Signal to be registered on meta object * @param methods a list of QMetaMethod wich contains the supported signature @@ -76,20 +77,20 @@ PYSIDE_API void registerSignals(SbkObjectType* pyObj, const QMetaObject* metaObj PYSIDE_API PySideSignalInstance* newObjectFromMethod(PyObject* source, const QList& methods); /** - * This function initializes the Signal object creating a PySideSignalInstance + * This function initializes the Signal object by creating a PySideSignalInstance * * @param self a Signal object used as base to PySideSignalInstance * @param name the name to be used on PySideSignalInstance * @param object the PyObject where the signal will be attached * @return Return a new reference to PySideSignalInstance **/ -PYSIDE_API PySideSignalInstance* initialize(PySideSignal* signal, PyObject* name, PyObject *object); +PYSIDE_API PySideSignalInstance* initialize(PySideSignal* signal, PyObject* name, PyObject* object); /** - * This function is used to retrieve the object in which the sigal is attached + * This function is used to retrieve the object in which the signal is attached * * @param self The Signal object - * @return Return the internal reference to parent object of the signal + * @return Return the internal reference to the parent object of the signal **/ PYSIDE_API PyObject* getObject(PySideSignalInstance* signal); @@ -115,39 +116,41 @@ PYSIDE_API void updateSourceObject(PyObject* source); PYSIDE_DEPRECATED(PYSIDE_API void addSignalToWrapper(SbkObjectType* wrapperType, const char* signalName, PySideSignal* signal)); /** - * This function verify if the signature is a QtSignal base on SIGNAL flag + * This function verifies 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 + * @return Return true if this is a Qt Signal, otherwise return false **/ PYSIDE_API bool isQtSignal(const char* signature); /** - * This function is similar as isQtSignal but this reaise a Python error if this faisl + * This function is similar to isQtSignal, however if it fails, it'll raise a Python error instead. + * * @param signature The signal signature - * @return Return true if this is a Qt Signal of false if not + * @return Return true if this is a Qt Signal, otherwise return false **/ 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 receiver The QObject which will receive the signal + * @param callback Callback function which will connect to the 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 + * This function parses the signature and then returns 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 - * @todo replace return type to QList + * @return Return true if this is a Qt Signal, otherwise return false + * @todo replace return type by QList **/ QStringList getArgsFromSignature(const char* signature, bool* isShortCircuit = 0); -} //namespace Signal -} //namespace PySide +} // namespace Signal +} // namespace PySide #endif From 8c1fbc37515715936a90c858352fb9c3d301b1f8 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Thu, 4 Aug 2011 19:46:25 -0300 Subject: [PATCH 12/52] Signature of various added and modified functions modified to use non-const references. The API Extractor signature normalizer removes const& from argument types, but it leaves non-const references unchanged. --- PySide/QtGui/typesystem_gui_common.xml | 18 +++++++++--------- PySide/QtOpenGL/typesystem_opengl.xml | 12 ++++-------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index e4a6f44..ac28898 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -225,7 +225,7 @@ - + QTransform _result; if (QTransform::quadToQuad(%1, %2, _result)) { @@ -236,7 +236,7 @@ } - + QTransform _result; if (QTransform::quadToSquare(%1, _result)) { @@ -248,7 +248,7 @@ - + QTransform _result; if (QTransform::squareToQuad(%1, _result)) { @@ -1008,14 +1008,14 @@ - + - + @@ -2371,7 +2371,7 @@ - + @@ -2384,7 +2384,7 @@ - + @@ -2487,7 +2487,7 @@ - + QPixmap p; if (%CPPSELF.%FUNCTION_NAME(%1, &p)) { @@ -2522,7 +2522,7 @@ - + diff --git a/PySide/QtOpenGL/typesystem_opengl.xml b/PySide/QtOpenGL/typesystem_opengl.xml index 0a1579c..043b2f5 100644 --- a/PySide/QtOpenGL/typesystem_opengl.xml +++ b/PySide/QtOpenGL/typesystem_opengl.xml @@ -657,15 +657,13 @@ - + - int size = %2; - if (size < 0) - size = %1.size(); + int size = (%2 < 0) ? %1.size() : %2; %CPPSELF.allocate((const void*) %1.data(), size); @@ -703,15 +701,13 @@ - + - int size = %3; - if (size < 0) - size = %2.size(); + int size = (%3 < 0) ? %2.size() : %3; %CPPSELF.write(%1, (const void*) %2.data(), size); From 815fae961ff866d3c8e31d7c3401c535085a19f2 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Sun, 17 Jul 2011 23:26:02 -0300 Subject: [PATCH 13/52] Turned QStyleOptionViewItem into value type, for it has a public copy constructor. It is passed around by value in many places, like the return value of QAbstractItemView::viewOptions(). I did the same to the variations: QStyleOptionViewItemV2, QStyleOptionViewItemV3, etc. --- PySide/QtGui/typesystem_gui_common.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index ac28898..a8746ee 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -396,22 +396,22 @@ - + - - + + - - + + - - + + - + From 1105a5be3a2dc947c1a3106fa5a308090a0a3aec Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Mon, 25 Jul 2011 13:39:28 -0300 Subject: [PATCH 14/52] Added default constructor to QTextStreamManipulator. --- PySide/QtCore/typesystem_core.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index d6f01dd..501b7ee 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -2880,7 +2880,7 @@ - + From 64bec138e1f23659a5004b25b8e15d666e576f85 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Thu, 4 Aug 2011 14:18:41 -0300 Subject: [PATCH 15/52] Added new style conversions for QDate, QTime and QDateTime objects. --- PySide/QtCore/typesystem_core.xml | 81 +++++++++++++++++++++++++++++-- 1 file changed, 77 insertions(+), 4 deletions(-) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 501b7ee..9e75f96 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -599,7 +599,31 @@ - + + + + + + + + + + %out = %OUTTYPE(); + + + int day = PyDateTime_GET_DAY(%in); + int month = PyDateTime_GET_MONTH(%in); + int year = PyDateTime_GET_YEAR(%in); + %out = %OUTTYPE(year, month, day); + + + @@ -663,7 +687,28 @@ - + + + + + + + + + %out = %OUTTYPE(); + + + int day = PyDateTime_GET_DAY(%in); + int month = PyDateTime_GET_MONTH(%in); + int year = PyDateTime_GET_YEAR(%in); + int hour = PyDateTime_DATE_GET_HOUR(%in); + int min = PyDateTime_DATE_GET_MINUTE(%in); + int sec = PyDateTime_DATE_GET_SECOND(%in); + int usec = PyDateTime_DATE_GET_MICROSECOND(%in); + %out = %OUTTYPE(QDate(year, month, day), QTime(hour, min, sec, usec/1000)); + + + @@ -1000,7 +1045,26 @@ - + + + + + + + + + %out = %OUTTYPE(); + + + int hour = PyDateTime_TIME_GET_HOUR(%in); + int min = PyDateTime_TIME_GET_MINUTE(%in); + int sec = PyDateTime_TIME_GET_SECOND(%in); + int usec = PyDateTime_TIME_GET_MICROSECOND(%in); + %out = %OUTTYPE(hour, min, sec, usec/1000); + + + + @@ -1675,7 +1739,16 @@ - + + + + %out = %OUTTYPE(); + + + %out = %OUTTYPE(PyString_AS_STRING(%in), PyString_GET_SIZE(%in)); + + + From ae0f62ed80506e744e7c7b9df69cbc0430ed920b Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 12 Aug 2011 17:52:04 -0300 Subject: [PATCH 16/52] New converters for primitive types. --- PySide/QtCore/qvariant_conversions.h | 2 +- PySide/QtCore/qvariant_type_conversions.h | 2 + PySide/QtCore/typesystem_core.xml | 386 ++++++++++++++++++++-- PySide/QtCore/typesystem_core_win.xml | 12 +- PySide/QtGui/typesystem_gui_win.xml | 11 +- 5 files changed, 380 insertions(+), 33 deletions(-) diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index 8465c28..eda2acc 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -98,7 +98,7 @@ struct Converter } } - //sequence and dictornay + // Sequence and dictionary if (PyDict_Check(pyObj)) { QVariant ret = convertToVariantMap(pyObj); if (ret.isValid()) diff --git a/PySide/QtCore/qvariant_type_conversions.h b/PySide/QtCore/qvariant_type_conversions.h index 0381e78..9fad1f1 100644 --- a/PySide/QtCore/qvariant_type_conversions.h +++ b/PySide/QtCore/qvariant_type_conversions.h @@ -21,6 +21,8 @@ struct Converter if (Shiboken::String::checkType(reinterpret_cast(pyObj))) typeName = "QString"; + + else if (pyObj == reinterpret_cast(&PyFloat_Type)) typeName = "double"; // float is a UserType in QVariant. else if (pyObj == reinterpret_cast(&PyLong_Type)) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 9e75f96..b7d9ae6 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -157,35 +157,363 @@ - + + + return PyBool_FromLong((bool)%in); + + + + %out = %OUTTYPE(%in == Py_True); + + + - - + + + + const int N = %in.length(); + wchar_t* str = new wchar_t[N]; + %in.toWCharArray(str); + PyObject* %out = PyUnicode_FromWideChar(str, N); + delete[] str; + return %out; + + + + Py_UNICODE* unicode = PyUnicode_AS_UNICODE(%in); + #if defined(Py_UNICODE_WIDE) + // cast as Py_UNICODE can be a different type + %out = QString::fromUcs4((const uint*)unicode); + #else + %out = QString::fromUtf16(unicode, PyUnicode_GET_SIZE(%in)); + #endif + + + const char* str = %CONVERTTOCPP[const char*](%in); + %out = %OUTTYPE(str); + + + %out = %OUTTYPE(); + + + + + + + + const int N = %in.toString().length(); + wchar_t* str = new wchar_t[N]; + %in.toString().toWCharArray(str); + PyObject* %out = PyUnicode_FromWideChar(str, N); + delete[] str; + return %out; + + + + %out = %OUTTYPE(); + + + + + + + + wchar_t c = (wchar_t)%in.unicode(); + return PyUnicode_FromWideChar(&c, 1); + + + + char c = %CONVERTTOCPP[char](%in); + %out = %OUTTYPE(c); + + + int i = %CONVERTTOCPP[int](%in); + %out = %OUTTYPE(i); + + + %out = %OUTTYPE(); + + + + + + + + + + if (!%in.isValid()) + Py_RETURN_NONE; + if (qstrcmp(%in.typeName(), "QVariantList") == 0) + return %CONVERTTOPYTHON[QList<QVariant>](%in.value<QVariantList>()); + if (qstrcmp(%in.typeName(), "QStringList") == 0) + return %CONVERTTOPYTHON[QList<QString>](%in.value<QStringList>()); + if (qstrcmp(%in.typeName(), "QVariantMap") == 0) + return %CONVERTTOPYTHON[QMap<QString, QVariant>](%in.value<QVariantMap>()); + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(%in.typeName()); + if (tr) + return tr->toPython(const_cast<void*>(%in.data())); + // TODO-CONVERTERS: SET ERROR + return 0; + + + + %out = %OUTTYPE(%in == Py_True); + + + %out = %OUTTYPE(); + + + QString in = %CONVERTTOCPP[QString](%in); + %out = %OUTTYPE(in); + + + QByteArray in = %CONVERTTOCPP[QByteArray](%in); + %out = %OUTTYPE(in); + + + double in = %CONVERTTOCPP[double](%in); + %out = %OUTTYPE(in); + + + int in = %CONVERTTOCPP[int](%in); + %out = %OUTTYPE(in); + + + qlonglong in = %CONVERTTOCPP[qlonglong](%in); + %out = %OUTTYPE(in); + + + int in = %CONVERTTOCPP[int](%in); + %out = %OUTTYPE(in); + + + // a class supported by QVariant? + int typeCode; + const char* typeName = QVariant_resolveMetaType(%in->ob_type, &typeCode); + if (typeCode && typeName) { + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(typeName); + QVariant var(typeCode, (void*)0); + void* args[] = { var.data() }; + tr->toCpp(%in, args); + %out = var; + } + + + QVariant ret = QVariant_convertToVariantMap(%in); + if (ret.isValid()) + %out = ret; + %out = QVariant::fromValue<PySide::PyObjectWrapper>(%in); + + + %out = QVariant_convertToVariantList(%in); + + + // Is a shiboken type not known by Qt + %out = QVariant::fromValue<PySide::PyObjectWrapper>(%in); + + + + + + static const char* QVariant_resolveMetaType(PyTypeObject* type, int* typeId) + { + if (PyObject_TypeCheck(type, &SbkObjectType_Type)) { + SbkObjectType* sbkType = (SbkObjectType*)type; + const char* typeName = Shiboken::ObjectType::getOriginalName(sbkType); + if (!typeName) + return 0; + bool valueType = '*' != typeName[qstrlen(typeName) - 1]; + // Do not convert user type of value + if (valueType &∓ Shiboken::ObjectType::isUserType(type)) + return 0; + int obTypeId = QMetaType::type(typeName); + if (obTypeId) { + *typeId = obTypeId; + return typeName; + } + // Do not resolve types to value type + if (valueType) + return 0; + // find in base types + if (type->tp_base) { + return QVariant_resolveMetaType(type->tp_base, typeId); + } else if (type->tp_bases) { + for(int i = 0; i < PyTuple_GET_SIZE(type->tp_bases); ++i) { + const char* derivedName = QVariant_resolveMetaType((PyTypeObject*)PyTuple_GET_ITEM(type->tp_bases, i), typeId); + if (derivedName) + return derivedName; + } + } + } + *typeId = 0; + return 0; + } + static QVariant QVariant_convertToValueList(PyObject* list) + { + if (PySequence_Size(list) < 1) + return QVariant(); + Shiboken::AutoDecRef element(PySequence_GetItem(list, 0)); + int typeId; + const char* typeName = QVariant_resolveMetaType(element.cast<PyTypeObject*>(), &typeId); + if (typeName) { + QByteArray listTypeName("QList<"); + listTypeName += typeName; + listTypeName += '>'; + typeId = QMetaType::type(listTypeName); + if (typeId > 0) { + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(listTypeName); + if (!tr) { + qWarning() << "TypeResolver for :" << listTypeName << "not registered."; + } else { + QVariant var(typeId, (void*)0); + void* args[] = { var.data(), 0 }; + tr->toCpp(list, args); + return var; + } + } + } + return QVariant(); + } + static bool QVariant_isStringList(PyObject *list) + { + bool allString = true; + Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); + Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); + for(int i = 0; i < size; ++i) { + PyObject* item = PySequence_Fast_GET_ITEM(fast.object(), i); + if (!%CHECKTYPE[QString](item)) { + allString = false; + break; + } + } + return allString; + } + static QVariant QVariant_convertToVariantMap(PyObject* map) + { + Py_ssize_t pos = 0; + Shiboken::AutoDecRef keys(PyDict_Keys(map)); + if (!QVariant_isStringList(keys)) + return QVariant(); + PyObject* key; + PyObject* value; + QMap<QString,QVariant> ret; + while (PyDict_Next(map, &pos, &key, &value)) { + QString cppKey = %CONVERTTOCPP[QString](key); + QVariant cppValue = %CONVERTTOCPP[QVariant](value); + ret.insert(cppKey, cppValue); + } + return QVariant(ret); + } + static QVariant QVariant_convertToVariantList(PyObject* list) + { + bool allString = QVariant_isStringList(list); + if (allString) { + QStringList lst = %CONVERTTOCPP[QList<QString>](list); + return QVariant(lst); + } else { + QVariant valueList = QVariant_convertToValueList(list); + if (valueList.isValid()) + return valueList; + QList<QVariant> lst; + Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); + Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); + for (int i = 0; i < size; ++i) { + PyObject* pyItem = PySequence_Fast_GET_ITEM(fast.object(), i); + QVariant item = %CONVERTTOCPP[QVariant](pyItem); + lst.append(item); + } + return QVariant(lst); + } + Q_ASSERT(false); + } + + + + + + const char* typeName = QVariant::typeToName(%in); + PyObject* %out; + if (!typeName) { + %out = Py_None; + } else { + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(typeName); + %out = tr ? (PyObject*)tr->pythonType() : Py_None; + } + Py_INCREF(%out); + return %out; + + + + %out = QVariant::Invalid; + + + const char* typeName; + if (%in == (PyObject*)&PyString_Type || %in == (PyObject*)&PyUnicode_Type) + typeName = "QString"; + else if (%in == (PyObject*)&PyFloat_Type) + typeName = "double"; // float is a UserType in QVariant. + else if (%in == (PyObject*)&PyLong_Type) + typeName = "int"; // long is a UserType in QVariant. + else if (%in->ob_type == &SbkObjectType_Type) + typeName = Shiboken::ObjectType::getOriginalName((SbkObjectType*)%in); + else + typeName = ((PyTypeObject*)%in)->tp_name; + %out = QVariant::nameToType(typeName); + + + %out = QVariant::nameToType(PyString_AS_STRING(%in)); + + + %out = QVariant::nameToType(PyString_AsString(%in)); + + + %out = QVariant::nameToType("QVariantMap"); + + + const char* typeName; + if (QVariantType_isStringList(%in)) + typeName = "QStringList"; + else + typeName = "QVariantList"; + %out = QVariant::nameToType(typeName); + + + + + + + + + static bool QVariantType_isStringList(PyObject* list) + { + bool allString = true; + Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); + Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); + for(int i=0; i < size; i++) { + PyObject* item = PySequence_Fast_GET_ITEM(fast.object(), i); + if (!%CHECKTYPE[QString](item)) { + allString = false; + break; + } + } + return allString; + } + static bool QVariantType_checkAllStringKeys(PyObject* dict) + { + Shiboken::AutoDecRef keys(PyDict_Keys(dict)); + return QVariantType_isStringList(keys); + } + + - - - - - - - - - - - - - - - - @@ -613,10 +941,10 @@ - + %out = %OUTTYPE(); - + int day = PyDateTime_GET_DAY(%in); int month = PyDateTime_GET_MONTH(%in); int year = PyDateTime_GET_YEAR(%in); @@ -628,7 +956,7 @@ - + @@ -637,7 +965,7 @@ - + @@ -694,10 +1022,10 @@ - + %out = %OUTTYPE(); - + int day = PyDateTime_GET_DAY(%in); int month = PyDateTime_GET_MONTH(%in); int year = PyDateTime_GET_YEAR(%in); @@ -1052,10 +1380,10 @@ - + %out = %OUTTYPE(); - + int hour = PyDateTime_TIME_GET_HOUR(%in); int min = PyDateTime_TIME_GET_MINUTE(%in); int sec = PyDateTime_TIME_GET_SECOND(%in); @@ -1741,10 +2069,10 @@ - + %out = %OUTTYPE(); - + %out = %OUTTYPE(PyString_AS_STRING(%in), PyString_GET_SIZE(%in)); diff --git a/PySide/QtCore/typesystem_core_win.xml b/PySide/QtCore/typesystem_core_win.xml index 8832b25..ca59c89 100644 --- a/PySide/QtCore/typesystem_core_win.xml +++ b/PySide/QtCore/typesystem_core_win.xml @@ -20,7 +20,16 @@ --> - + + + return PyCObject_FromVoidPtr(%in, 0); + + + + %out = (%OUTTYPE*)PyCObject_AsVoidPtr(%in); + + + @@ -32,4 +41,3 @@ - diff --git a/PySide/QtGui/typesystem_gui_win.xml b/PySide/QtGui/typesystem_gui_win.xml index 1249296..a0cfe84 100644 --- a/PySide/QtGui/typesystem_gui_win.xml +++ b/PySide/QtGui/typesystem_gui_win.xml @@ -21,7 +21,16 @@ - + + + return PyCObject_FromVoidPtr(%in, 0); + + + + %out = (%OUTTYPE)PyCObject_AsVoidPtr(%in); + + + From 3ee5bec24438deb08a45a62559e35528f0f4105c Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 31 Aug 2011 14:49:57 -0300 Subject: [PATCH 17/52] New containers for container types. --- PySide/QtCore/typesystem_core.xml | 230 ++++++++++++++++++++++++++---- 1 file changed, 206 insertions(+), 24 deletions(-) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index b7d9ae6..7ba6ea4 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -173,7 +173,6 @@ - const int N = %in.length(); wchar_t* str = new wchar_t[N]; @@ -202,6 +201,7 @@ + @@ -248,12 +248,18 @@ if (!%in.isValid()) Py_RETURN_NONE; - if (qstrcmp(%in.typeName(), "QVariantList") == 0) - return %CONVERTTOPYTHON[QList<QVariant>](%in.value<QVariantList>()); - if (qstrcmp(%in.typeName(), "QStringList") == 0) - return %CONVERTTOPYTHON[QList<QString>](%in.value<QStringList>()); - if (qstrcmp(%in.typeName(), "QVariantMap") == 0) - return %CONVERTTOPYTHON[QMap<QString, QVariant>](%in.value<QVariantMap>()); + if (qstrcmp(%in.typeName(), "QVariantList") == 0) { + QList<QVariant> var = %in.value<QVariantList>(); + return %CONVERTTOPYTHON[QList<QVariant>](var); + } + if (qstrcmp(%in.typeName(), "QStringList") == 0) { + QStringList var = %in.value<QStringList>(); + return %CONVERTTOPYTHON[QList<QString>](var); + } + if (qstrcmp(%in.typeName(), "QVariantMap") == 0) { + QMap<QString, QVariant> var = %in.value<QVariantMap>(); + return %CONVERTTOPYTHON[QMap<QString, QVariant>](var); + } Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(%in.typeName()); if (tr) return tr->toPython(const_cast<void*>(%in.data())); @@ -413,8 +419,8 @@ { bool allString = QVariant_isStringList(list); if (allString) { - QStringList lst = %CONVERTTOCPP[QList<QString>](list); - return QVariant(lst); + QList<QString > lst = %CONVERTTOCPP[QList<QString>](list); + return QVariant(QStringList(lst)); } else { QVariant valueList = QVariant_convertToValueList(list); if (valueList.isValid()) @@ -510,50 +516,206 @@ } + + + - + + + + + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + - + + + + + + + + + + + - + - + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + - - + + + + + + + + + + - + + + + + + + + + + + - + + + PyObject* %out = PyTuple_New(2); + PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first)); + PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second)); + return %out; + + + + %out.first = %CONVERTTOCPP[%OUTTYPE_0](PySequence_Fast_GET_ITEM(%in, 0)); + %out.second = %CONVERTTOCPP[%OUTTYPE_1](PySequence_Fast_GET_ITEM(%in, 1)); + + + @@ -2436,6 +2598,9 @@ + + + %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite); @@ -2640,6 +2805,10 @@ + + + + @@ -2648,7 +2817,7 @@ - + @@ -2799,6 +2968,9 @@ + + + %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite); @@ -3290,9 +3462,10 @@ - - + + + @@ -3324,6 +3497,15 @@ + + + + + QString& res = *%0; + %PYARG_0 = %CONVERTTOPYTHON[QString](res); + + + From ba062e1b89ddee4bb1a4ed28225b2da98d1004b5 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 16 Sep 2011 19:52:40 -0300 Subject: [PATCH 18/52] Updated various function removals and modifications. --- PySide/QtCore/typesystem_core.xml | 3 +- PySide/QtGui/typesystem_gui_common.xml | 45 ++++++++++++++++++++++++-- PySide/typesystem_templates.xml | 7 ++++ 3 files changed, 51 insertions(+), 4 deletions(-) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 7ba6ea4..f1af0a5 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -2806,7 +2806,6 @@ - @@ -3549,7 +3548,7 @@ - + diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index a8746ee..baf4110 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -688,7 +688,7 @@ - + // %FUNCTION_NAME() @@ -711,7 +711,7 @@ - + @@ -1068,11 +1068,17 @@ %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine()); + + + %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1), %CPPSELF.bytesPerLine(), Shiboken::Buffer::ReadWrite); + + + diff --git a/PySide/typesystem_templates.xml b/PySide/typesystem_templates.xml index c985fb2..afad4bc 100644 --- a/PySide/typesystem_templates.xml +++ b/PySide/typesystem_templates.xml @@ -72,6 +72,13 @@ %END_ALLOW_THREADS %PYARG_0 = Shiboken::makeTuple(retval_, ok_); + - + + + From b643a3f8abe68c82b304df4a6644666dc735941c Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 21 Oct 2011 17:36:06 -0300 Subject: [PATCH 22/52] Modified PySideQFlags based on Hugo's design. --- libpyside/pysideqflags.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libpyside/pysideqflags.cpp b/libpyside/pysideqflags.cpp index 8e962da..4fe24b8 100644 --- a/libpyside/pysideqflags.cpp +++ b/libpyside/pysideqflags.cpp @@ -33,6 +33,7 @@ extern "C" { struct PySideQFlagsType { PyHeapTypeObject super; + SbkConverter** converterPtr; SbkConverter* converter; }; @@ -127,6 +128,9 @@ namespace QFlags type->tp_as_number = numberMethods; type->tp_richcompare = &PySideQFlagsRichCompare; + PySideQFlagsType* flagsType = reinterpret_cast(type); + flagsType->converterPtr = &flagsType->converter; + if (PyType_Ready(type) < 0) return 0; @@ -146,4 +150,3 @@ namespace QFlags } } } - From 80c02f16e591d7ebce3a3ea0a5e36e92bd65ba3d Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 21 Oct 2011 17:43:31 -0300 Subject: [PATCH 23/52] Fixes the test for a QFlag value returned in a QVariant. --- tests/QtCore/qflags_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/QtCore/qflags_test.py b/tests/QtCore/qflags_test.py index 78ed49b..9d2f4b1 100644 --- a/tests/QtCore/qflags_test.py +++ b/tests/QtCore/qflags_test.py @@ -76,7 +76,7 @@ class QFlagsOnQVariant(unittest.TestCase): def testQFlagsOnQVariant(self): o = QObject() o.setProperty("foo", QIODevice.ReadOnly | QIODevice.WriteOnly) - self.assertEqual(type(o.property("foo")), int) + self.assertEqual(type(o.property("foo")), QIODevice.OpenMode) class QFlagsWrongType(unittest.TestCase): def testWrongType(self): From 16f4378fed98a1bd1ef0dd6c4616aa4ce8fa016e Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Mon, 24 Oct 2011 16:47:19 -0300 Subject: [PATCH 24/52] Fixes type converter for Win32's HWND. --- PySide/QtCore/typesystem_core_win.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/PySide/QtCore/typesystem_core_win.xml b/PySide/QtCore/typesystem_core_win.xml index ca59c89..9982282 100644 --- a/PySide/QtCore/typesystem_core_win.xml +++ b/PySide/QtCore/typesystem_core_win.xml @@ -26,7 +26,7 @@ - %out = (%OUTTYPE*)PyCObject_AsVoidPtr(%in); + %out = *((%OUTTYPE*)PyCObject_AsVoidPtr(%in)); From 770c8bda73f045ee2bd6261c0eca0c64cd12d2db Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 30 Nov 2011 16:00:57 -0300 Subject: [PATCH 25/52] Fixed custom code for QScriptValueIterator.__next__ function. It must not use the convenience method Shiboken::makeTuple, for it makes use of the old template based converters. --- PySide/QtScript/typesystem_script.xml | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/PySide/QtScript/typesystem_script.xml b/PySide/QtScript/typesystem_script.xml index af2f198..d787b22 100644 --- a/PySide/QtScript/typesystem_script.xml +++ b/PySide/QtScript/typesystem_script.xml @@ -98,12 +98,16 @@ - if (%CPPSELF.hasNext()) { - %CPPSELF.next(); - %PYARG_0 = Shiboken::makeTuple(%CPPSELF.name(), %CPPSELF.value().toVariant()); - } else { - PyErr_SetNone(PyExc_StopIteration); - } + if (%CPPSELF.hasNext()) { + %CPPSELF.next(); + QString name = %CPPSELF.name(); + QVariant value = %CPPSELF.value().toVariant(); + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[QString](name)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QVariant](value)); + } else { + PyErr_SetNone(PyExc_StopIteration); + } From 30118e265dbcc536d8ed783ec3f10d56d9cb47c1 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 30 Nov 2011 16:02:59 -0300 Subject: [PATCH 26/52] Fixed code for setting QtCore.__version_info__ to not use Shiboken::makeTuple. --- PySide/QtCore/glue/qt_version.cpp | 5 ----- PySide/QtCore/typesystem_core.xml | 10 +++++++++- 2 files changed, 9 insertions(+), 6 deletions(-) delete mode 100644 PySide/QtCore/glue/qt_version.cpp diff --git a/PySide/QtCore/glue/qt_version.cpp b/PySide/QtCore/glue/qt_version.cpp deleted file mode 100644 index 66f8c00..0000000 --- a/PySide/QtCore/glue/qt_version.cpp +++ /dev/null @@ -1,5 +0,0 @@ -QList version = QByteArray(qVersion()).split('.'); -PyObject *pyQtVersion = Shiboken::makeTuple(version[0].toInt(), version[1].toInt(), version[2].toInt()); - -PyModule_AddStringConstant(module, "__version__", qVersion()); -PyModule_AddObject(module, "__version_info__", pyQtVersion); diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 53002d0..73f37f6 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -891,7 +891,15 @@ qAddPostRoutine(PySide::globalPostRoutineCallback); - + + QList<QByteArray> version = QByteArray(qVersion()).split('.'); + PyObject* pyQtVersion = PyTuple_New(3); + for (int i = 0; i < 3; ++i) + PyTuple_SET_ITEM(pyQtVersion, i, PyInt_FromLong(version[i].toInt())); + PyModule_AddObject(module, "__version_info__", pyQtVersion); + PyModule_AddStringConstant(module, "__version__", qVersion()); + + { // Avoid name clash Shiboken::AutoDecRef atexit(Shiboken::Module::import("atexit")); From 7b04273736e46ace2d22b568fa7ed4d23944b067 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 30 Nov 2011 17:47:35 -0300 Subject: [PATCH 27/52] Fixed code for QUdpSocket.readDatagram method to remove usage of Shiboken::makeTuple. --- .../glue/qudpsocket_read_datagram_glue.cpp | 6 ------ PySide/QtNetwork/typesystem_network.xml | 14 +++++++++++++- 2 files changed, 13 insertions(+), 7 deletions(-) delete mode 100644 PySide/QtNetwork/glue/qudpsocket_read_datagram_glue.cpp diff --git a/PySide/QtNetwork/glue/qudpsocket_read_datagram_glue.cpp b/PySide/QtNetwork/glue/qudpsocket_read_datagram_glue.cpp deleted file mode 100644 index bffc042..0000000 --- a/PySide/QtNetwork/glue/qudpsocket_read_datagram_glue.cpp +++ /dev/null @@ -1,6 +0,0 @@ - Shiboken::AutoArrayPointer data(%ARGUMENT_NAMES); - QHostAddress ha; - quint16 port; - - %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(data, %ARGUMENT_NAMES, &ha, &port); - %PYARG_0 = Shiboken::makeTuple(QByteArray(data, retval), ha, port); diff --git a/PySide/QtNetwork/typesystem_network.xml b/PySide/QtNetwork/typesystem_network.xml index 250129b..87cb7d9 100644 --- a/PySide/QtNetwork/typesystem_network.xml +++ b/PySide/QtNetwork/typesystem_network.xml @@ -136,7 +136,19 @@ - + + Shiboken::AutoArrayPointer<char> data(%ARGUMENT_NAMES); + QHostAddress ha; + quint16 port; + %BEGIN_ALLOW_THREADS + %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(data, %ARGUMENT_NAMES, &ha, &port); + %END_ALLOW_THREADS + QByteArray ba(data, retval); + PyObject* %PYARG_0 = PyTuple_New(3); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[QByteArray](ba)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QHostAddress](ha)); + PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[quint16](port)); + From 792504f978441d0a7708ebdaabc4b4baf24fdff4 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Thu, 1 Dec 2011 17:32:48 -0300 Subject: [PATCH 28/52] Removed the remaining occurrences of Shiboken::makeTuple. --- PySide/QtCore/typesystem_core.xml | 60 +++++--- .../QtDeclarative/pysideqmlregistertype.cpp | 18 ++- .../QtDeclarative/typesystem_declarative.xml | 4 +- PySide/QtGui/typesystem_gui_common.xml | 66 +++++--- PySide/QtNetwork/typesystem_network.xml | 2 +- PySide/QtOpenGL/typesystem_opengl.xml | 4 +- PySide/QtXml/typesystem_xml.xml | 45 +++--- PySide/typesystem_templates.xml | 144 ++++++++++-------- 8 files changed, 208 insertions(+), 135 deletions(-) diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 73f37f6..59325b0 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -937,7 +937,9 @@ static void msgHandlerCallback(QtMsgType type, const char* msg) { Shiboken::GilState state; - Shiboken::AutoDecRef arglist(Shiboken::makeTuple(type, msg)); + Shiboken::AutoDecRef arglist(PyTuple_New(2)); + PyTuple_SET_ITEM(arglist, 0, %CONVERTTOPYTHON[QtMsgType](type)); + PyTuple_SET_ITEM(arglist, 1, %CONVERTTOPYTHON[const char*](msg)); Shiboken::AutoDecRef ret(PyObject_CallObject(qtmsghandler, arglist)); } static void QtCoreModuleExit() @@ -1047,9 +1049,11 @@ - QPointF p; - %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &p); - %PYARG_0 = Shiboken::makeTuple(retval, p); + QPointF p; + %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(%ARGUMENT_NAMES, &p); + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QPointF](p)); @@ -1165,8 +1169,13 @@ int year, month, day; + %BEGIN_ALLOW_THREADS %CPPSELF.%FUNCTION_NAME(&year, &month, &day); - %PYARG_0 = Shiboken::makeTuple(year, month, day); + %END_ALLOW_THREADS + %PYARG_0 = PyTuple_New(3); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[int](year)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[int](month)); + PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[int](day)); @@ -1178,8 +1187,12 @@ int yearNumber; + %BEGIN_ALLOW_THREADS int week = %CPPSELF.%FUNCTION_NAME(&yearNumber); - %PYARG_0 = Shiboken::makeTuple(week, yearNumber); + %END_ALLOW_THREADS + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[int](week)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[int](yearNumber)); @@ -1357,6 +1370,7 @@ } }; + @@ -1374,9 +1388,9 @@ - int a, b, c, d; - %CPPSELF.%FUNCTION_NAME(&a, &b, &c, &d); - %PYARG_0 = Shiboken::makeTuple(a, b, c, d); + + + @@ -1396,9 +1410,9 @@ - int a, b, c, d; - %CPPSELF.%FUNCTION_NAME(&a, &b, &c, &d); - %PYARG_0 = Shiboken::makeTuple(a, b, c, d); + + + @@ -1441,9 +1455,9 @@ - qreal a, b, c, d; - %CPPSELF.%FUNCTION_NAME(&a, &b, &c, &d); - %PYARG_0 = Shiboken::makeTuple(a, b, c, d); + + + @@ -1463,9 +1477,9 @@ - qreal a, b, c, d; - %CPPSELF.%FUNCTION_NAME(&a, &b, &c, &d); - %PYARG_0 = Shiboken::makeTuple(a, b, c, d); + + + @@ -3055,7 +3069,9 @@ qint64 pid; %RETURN_TYPE retval = %TYPE::%FUNCTION_NAME(%1, %2, %3, &pid); - %PYARG_0 = Shiboken::makeTuple(retval, pid); + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[qint64](pid)); @@ -3163,8 +3179,10 @@ - %PYARG_0 = Shiboken::makeTuple(%0, *result_out); - delete result_out; + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[long](*result_out)); + delete result_out; diff --git a/PySide/QtDeclarative/pysideqmlregistertype.cpp b/PySide/QtDeclarative/pysideqmlregistertype.cpp index 7dfd7a6..6c59516 100644 --- a/PySide/QtDeclarative/pysideqmlregistertype.cpp +++ b/PySide/QtDeclarative/pysideqmlregistertype.cpp @@ -258,7 +258,10 @@ PyTypeObject PropertyListType = { void propListAppender(QDeclarativeListProperty* propList, QDeclarativeItem* item) { Shiboken::GilState state; - Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object, item)); + + Shiboken::AutoDecRef args(PyTuple_New(2)); + PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); + PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtDeclarativeTypes[SBK_QDECLARATIVEITEM_IDX], item)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->append, args)); @@ -271,7 +274,9 @@ void propListAppender(QDeclarativeListProperty* propList, QDec int propListCount(QDeclarativeListProperty* propList) { Shiboken::GilState state; - Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object)); + + Shiboken::AutoDecRef args(PyTuple_New(1)); + PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->count, args)); @@ -289,7 +294,10 @@ int propListCount(QDeclarativeListProperty* propList) QDeclarativeItem* propListAt(QDeclarativeListProperty* propList, int index) { Shiboken::GilState state; - Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object, index)); + + Shiboken::AutoDecRef args(PyTuple_New(2)); + PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); + PyTuple_SET_ITEM(args, 1, Shiboken::Conversions::copyToPython(Shiboken::Conversions::PrimitiveTypeConverter(), &index)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->at, args)); @@ -306,7 +314,9 @@ QDeclarativeItem* propListAt(QDeclarativeListProperty* propLis void propListClear(QDeclarativeListProperty* propList) { Shiboken::GilState state; - Shiboken::AutoDecRef args(Shiboken::makeTuple(propList->object)); + + Shiboken::AutoDecRef args(PyTuple_New(1)); + PyTuple_SET_ITEM(args, 0, Shiboken::Conversions::pointerToPython((SbkObjectType*)SbkPySide_QtCoreTypes[SBK_QOBJECT_IDX], propList->object)); DeclarativeListProperty* data = reinterpret_cast(propList->data); Shiboken::AutoDecRef retVal(PyObject_CallObject(data->clear, args)); diff --git a/PySide/QtDeclarative/typesystem_declarative.xml b/PySide/QtDeclarative/typesystem_declarative.xml index 58bce2a..91c2e48 100644 --- a/PySide/QtDeclarative/typesystem_declarative.xml +++ b/PySide/QtDeclarative/typesystem_declarative.xml @@ -104,7 +104,9 @@ %BEGIN_ALLOW_THREADS %RETURN_TYPE ok_ = %CPPSELF.%FUNCTION_NAME(%1, %2, &errorString); %END_ALLOW_THREADS - %PYARG_0 = Shiboken::makeTuple(ok_, errorString); + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](ok_)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QString](errorString)); diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index 4ebccf6..6922bcf 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -448,10 +448,12 @@ - %BEGIN_ALLOW_THREADS - %RETURN_TYPE %0 = %CPPSELF->::%TYPE::%FUNCTION_NAME(&%1, %2); - %END_ALLOW_THREADS - %PYARG_0 = Shiboken::makeTuple(%0, %1); + %BEGIN_ALLOW_THREADS + %RETURN_TYPE %0 = %CPPSELF->::%TYPE::%FUNCTION_NAME(&%1, %2); + %END_ALLOW_THREADS + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG1_TYPE](%1)); @@ -911,9 +913,11 @@ @@ -1296,7 +1300,9 @@ - + + + @@ -1321,7 +1327,9 @@ - + + + @@ -1775,9 +1783,11 @@ - QGraphicsItem *item_ = NULL; - %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&item_); - %PYARG_0 = Shiboken::makeTuple(retval_, item_); + QGraphicsItem *item_ = NULL; + %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(&item_); + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval_)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QGraphicsItem*](item_)); @@ -3362,9 +3372,13 @@ - int a, b, c, d; - %CPPSELF.%FUNCTION_NAME(%1, &a, &b, &c, &d); - %PYARG_0 = Shiboken::makeTuple(a, b, c, d); + int a, b, c, d; + %CPPSELF.%FUNCTION_NAME(%1, &a, &b, &c, &d); + %PYARG_0 = PyTuple_New(4); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[int](a)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[int](b)); + PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[int](c)); + PyTuple_SET_ITEM(%PYARG_0, 3, %CONVERTTOPYTHON[int](d)); @@ -4860,8 +4874,12 @@ - %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2); - %PYARG_0 = Shiboken::makeTuple(retval_, %1); + %BEGIN_ALLOW_THREADS + %RETURN_TYPE retval_ = %CPPSELF.%FUNCTION_NAME(%1, %2); + %END_ALLOW_THREADS + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](retval_)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[%ARG1_TYPE](%1)); @@ -5678,12 +5696,14 @@ diff --git a/PySide/QtNetwork/typesystem_network.xml b/PySide/QtNetwork/typesystem_network.xml index 87cb7d9..a8327cd 100644 --- a/PySide/QtNetwork/typesystem_network.xml +++ b/PySide/QtNetwork/typesystem_network.xml @@ -144,7 +144,7 @@ %RETURN_TYPE retval = %CPPSELF.%FUNCTION_NAME(data, %ARGUMENT_NAMES, &ha, &port); %END_ALLOW_THREADS QByteArray ba(data, retval); - PyObject* %PYARG_0 = PyTuple_New(3); + %PYARG_0 = PyTuple_New(3); PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[QByteArray](ba)); PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QHostAddress](ha)); PyTuple_SET_ITEM(%PYARG_0, 2, %CONVERTTOPYTHON[quint16](port)); diff --git a/PySide/QtOpenGL/typesystem_opengl.xml b/PySide/QtOpenGL/typesystem_opengl.xml index 808ed22..4c2604a 100644 --- a/PySide/QtOpenGL/typesystem_opengl.xml +++ b/PySide/QtOpenGL/typesystem_opengl.xml @@ -701,7 +701,9 @@ QByteArray ret; if (result) ret.append((const char*)data, %3); - %PYARG_0 = Shiboken::makeTuple(result, ret); + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[bool](result)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QByteArray](ret)); delete[] data; diff --git a/PySide/QtXml/typesystem_xml.xml b/PySide/QtXml/typesystem_xml.xml index 1bf07de..19b1520 100644 --- a/PySide/QtXml/typesystem_xml.xml +++ b/PySide/QtXml/typesystem_xml.xml @@ -33,14 +33,17 @@ @@ -269,13 +272,13 @@ - QXmlInputSource* _qxmlinputsource_arg_ = 0; - - %BEGIN_ALLOW_THREADS - %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, %2, _qxmlinputsource_arg_); - %END_ALLOW_THREADS - - %PYARG_0 = Shiboken::makeTuple(%0, _qxmlinputsource_arg_); + QXmlInputSource* _qxmlinputsource_arg_ = 0; + %BEGIN_ALLOW_THREADS + %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, %2, _qxmlinputsource_arg_); + %END_ALLOW_THREADS + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QXmlInputSource*](_qxmlinputsource_arg_)); @@ -296,11 +299,13 @@ - QXmlInputSource* _qxmlinputsource_arg_ = 0; - %BEGIN_ALLOW_THREADS - %RETURN_TYPE %0 = %CPPSELF.%TYPE::%FUNCTION_NAME(%1, %2, _qxmlinputsource_arg_); - %END_ALLOW_THREADS - %PYARG_0 = Shiboken::makeTuple(%0, _qxmlinputsource_arg_); + QXmlInputSource* _qxmlinputsource_arg_ = 0; + %BEGIN_ALLOW_THREADS + %RETURN_TYPE %0 = %CPPSELF.%TYPE::%FUNCTION_NAME(%1, %2, _qxmlinputsource_arg_); + %END_ALLOW_THREADS + %PYARG_0 = PyTuple_New(2); + PyTuple_SET_ITEM(%PYARG_0, 0, %CONVERTTOPYTHON[%RETURN_TYPE](%0)); + PyTuple_SET_ITEM(%PYARG_0, 1, %CONVERTTOPYTHON[QXmlInputSource*](_qxmlinputsource_arg_)); diff --git a/PySide/typesystem_templates.xml b/PySide/typesystem_templates.xml index bf7abd1..47615ad 100644 --- a/PySide/typesystem_templates.xml +++ b/PySide/typesystem_templates.xml @@ -30,75 +30,80 @@ + + - - - - + + + + + + + + @@ -2357,9 +2364,7 @@ - - - + @@ -2453,9 +2458,7 @@ - - - + @@ -3136,10 +3139,7 @@ - - - - + @@ -3239,9 +3239,7 @@ - - - + @@ -3251,9 +3249,7 @@ - - - + @@ -3297,9 +3293,7 @@ - - - + @@ -4027,9 +4021,10 @@ - + + @@ -5687,9 +5682,7 @@ - - - + diff --git a/PySide/QtGui/typesystem_gui_win.xml b/PySide/QtGui/typesystem_gui_win.xml index 93d422a..387964d 100644 --- a/PySide/QtGui/typesystem_gui_win.xml +++ b/PySide/QtGui/typesystem_gui_win.xml @@ -20,7 +20,7 @@ --> - + #ifdef IS_PY3K return PyCapsule_New(%in, 0, 0); diff --git a/PySide/QtUiTools/glue/uitools_loadui.h b/PySide/QtUiTools/glue/uitools_loadui.cpp similarity index 84% rename from PySide/QtUiTools/glue/uitools_loadui.h rename to PySide/QtUiTools/glue/uitools_loadui.cpp index 654ba0a..829adf7 100644 --- a/PySide/QtUiTools/glue/uitools_loadui.h +++ b/PySide/QtUiTools/glue/uitools_loadui.cpp @@ -17,7 +17,7 @@ static void createChildrenNameAttributes(PyObject* root, QObject* object) if (!name.isEmpty() && !name.startsWith("_") && !name.startsWith("qt_")) { bool hasAttr = PyObject_HasAttrString(root, name.constData()); if (!hasAttr) { - Shiboken::AutoDecRef pyChild(Shiboken::Converter::toPython(child)); + Shiboken::AutoDecRef pyChild(%CONVERTTOPYTHON[QObject*](child)); PyObject_SetAttrString(root, name.constData(), pyChild); } createChildrenNameAttributes(root, child); @@ -31,14 +31,12 @@ static PyObject* QUiLoadedLoadUiFromDevice(QUiLoader* self, QIODevice* dev, QWid QWidget* wdg = self->load(dev, parent); if (wdg) { - PyObject* pyWdg = Shiboken::Converter::toPython(wdg); - + PyObject* pyWdg = %CONVERTTOPYTHON[QWidget*](wdg); createChildrenNameAttributes(pyWdg, wdg); if (parent) { - Shiboken::AutoDecRef pyParent(Shiboken::Converter::toPython(parent)); + Shiboken::AutoDecRef pyParent(%CONVERTTOPYTHON[QWidget*](parent)); Shiboken::Object::setParent(pyParent, pyWdg); } - return pyWdg; } diff --git a/PySide/QtUiTools/typesystem_uitools.xml b/PySide/QtUiTools/typesystem_uitools.xml index d7e405b..c86ae44 100644 --- a/PySide/QtUiTools/typesystem_uitools.xml +++ b/PySide/QtUiTools/typesystem_uitools.xml @@ -26,6 +26,7 @@ + Q_IMPORT_PLUGIN(uiplugin); @@ -94,9 +95,6 @@ - - - @@ -112,9 +110,6 @@ - - - diff --git a/PySide/QtWebKit/typesystem_webkit.xml b/PySide/QtWebKit/typesystem_webkit.xml index ac57dd1..86b8431 100644 --- a/PySide/QtWebKit/typesystem_webkit.xml +++ b/PySide/QtWebKit/typesystem_webkit.xml @@ -98,11 +98,11 @@ // Cast the parameters according to the extension type if (extension == QWebPage::ChooseMultipleFilesExtension) { const ChooseMultipleFilesExtension$TYPE_SUFFIX* _in = reinterpret_cast<const ChooseMultipleFilesExtension$TYPE_SUFFIX*>(%in); - %out = %CONVERTTOPYTHON[const ChooseMultipleFilesExtension$TYPE_SUFFIX*](_in); + %out = %CONVERTTOPYTHON[const QWebPage::ChooseMultipleFilesExtension$TYPE_SUFFIX*](_in); #if QT_VERSION >= 0x040600 } else if (extension == QWebPage::ErrorPageExtension) { const ErrorPageExtension$TYPE_SUFFIX* _in = reinterpret_cast<const ErrorPageExtension$TYPE_SUFFIX*>(%in); - %out = %CONVERTTOPYTHON[const ErrorPageExtension$TYPE_SUFFIX*](_in); + %out = %CONVERTTOPYTHON[const QWebPage::ErrorPageExtension$TYPE_SUFFIX*](_in); #endif } From 2a634aea05487732fe06c2935dc2893f75af79ed Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Mon, 12 Dec 2011 17:46:37 -0300 Subject: [PATCH 38/52] Updated the custom widget plugin to use the new converters. --- plugins/CMakeLists.txt | 2 +- plugins/customwidget.cpp | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index b17dbc2..a65a421 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -5,7 +5,7 @@ set(ui_plugin_src customwidget.cpp ) -set (ui_plugin_moc +set(ui_plugin_moc customwidget.h customwidgets.h ) diff --git a/plugins/customwidget.cpp b/plugins/customwidget.cpp index fb849f2..d573ef4 100644 --- a/plugins/customwidget.cpp +++ b/plugins/customwidget.cpp @@ -95,11 +95,12 @@ QWidget* PyCustomWidget::createWidget(QWidget* parent) bool unkowParent = false; if (parent) { pyParent = reinterpret_cast(Shiboken::BindingManager::instance().retrieveWrapper(parent)); - if (!pyParent) { - pyParent = Shiboken::Converter::toPython(parent); - unkowParent = true; - } else { + if (pyParent) { Py_INCREF(pyParent); + } else { + static Shiboken::Conversions::SpecificConverter converter("QWidget*"); + pyParent = converter.toPython(&parent); + unkowParent = true; } } else { Py_INCREF(Py_None); @@ -129,4 +130,3 @@ void PyCustomWidget::initialize(QDesignerFormEditorInterface* core) { m_data->initialized = true; } - From e76b2b76f51ab643d6e97842ac3d3adc50b6a851 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Mon, 12 Dec 2011 20:02:38 -0300 Subject: [PATCH 39/52] Added type system entries to the primitive types used by QtOpenGL. --- PySide/QtOpenGL/typesystem_opengl.xml | 39 ++++++++++++++++++--------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/PySide/QtOpenGL/typesystem_opengl.xml b/PySide/QtOpenGL/typesystem_opengl.xml index 4c2604a..60a2d18 100644 --- a/PySide/QtOpenGL/typesystem_opengl.xml +++ b/PySide/QtOpenGL/typesystem_opengl.xml @@ -21,6 +21,21 @@ + + + + + + + + + + + + + + + @@ -191,7 +206,7 @@ - + @@ -207,7 +222,7 @@ - + @@ -415,7 +430,7 @@ - + @@ -431,7 +446,7 @@ - + @@ -640,19 +655,19 @@ - - - - + + + + - - - - + + + + From c78b4686a1f98273cf4e730efae32fa7f93ebebd Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Mon, 12 Dec 2011 19:10:07 -0200 Subject: [PATCH 40/52] Add GC support to PySide Property type. This fixes GC errors when running PySide on a Python debug env. Reviewer: Marcelo Lira --- libpyside/pysideproperty.cpp | 68 ++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 22 deletions(-) diff --git a/libpyside/pysideproperty.cpp b/libpyside/pysideproperty.cpp index e5ae5d5..1e1cf29 100644 --- a/libpyside/pysideproperty.cpp +++ b/libpyside/pysideproperty.cpp @@ -38,12 +38,14 @@ extern "C" static PyObject* qpropertyTpNew(PyTypeObject* subtype, PyObject* args, PyObject* kwds); static int qpropertyTpInit(PyObject*, PyObject*, PyObject*); -static void qpropertyFree(void*); +static void qpropertyDeAlloc(PyObject* self); //methods static PyObject* qPropertyCall(PyObject*, PyObject*, PyObject*); static PyObject* qPropertySetter(PyObject*, PyObject*); static PyObject* qPropertyGetter(PyObject*, PyObject*); +static int qpropertyTraverse(PyObject* self, visitproc visit, void* arg); +static int qpropertyClear(PyObject* self); static PyMethodDef PySidePropertyMethods[] = { {"setter", (PyCFunction)qPropertySetter, METH_O}, @@ -58,7 +60,7 @@ PyTypeObject PySidePropertyType = { QPROPERTY_CLASS_NAME, /*tp_name*/ sizeof(PySideProperty), /*tp_basicsize*/ 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ + qpropertyDeAlloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -73,10 +75,10 @@ PyTypeObject PySidePropertyType = { 0, /*tp_getattro*/ 0, /*tp_setattro*/ 0, /*tp_as_buffer*/ - Py_TPFLAGS_DEFAULT, /*tp_flags*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/ 0, /*tp_doc */ - 0, /*tp_traverse */ - 0, /*tp_clear */ + qpropertyTraverse, /*tp_traverse */ + qpropertyClear, /*tp_clear */ 0, /*tp_richcompare */ 0, /*tp_weaklistoffset */ 0, /*tp_iter */ @@ -92,7 +94,7 @@ PyTypeObject PySidePropertyType = { qpropertyTpInit, /*tp_init */ 0, /*tp_alloc */ qpropertyTpNew, /*tp_new */ - qpropertyFree, /*tp_free */ + 0, /*tp_free */ 0, /*tp_is_gc */ 0, /*tp_bases */ 0, /*tp_mro */ @@ -208,23 +210,10 @@ int qpropertyTpInit(PyObject* self, PyObject* args, PyObject* kwds) } } -void qpropertyFree(void *self) +void qpropertyDeAlloc(PyObject* self) { - PyObject *pySelf = reinterpret_cast(self); - PySideProperty *data = reinterpret_cast(self); - PySidePropertyPrivate* pData = data->d; - - Py_XDECREF(pData->fget); - Py_XDECREF(pData->fset); - Py_XDECREF(pData->freset); - Py_XDECREF(pData->fdel); - Py_XDECREF(pData->notify); - - free(pData->typeName); - free(pData->doc); - free(pData->notifySignature); - delete data->d; - pySelf->ob_type->tp_base->tp_free(self); + qpropertyClear(self); + Py_TYPE(self)->tp_free(self); } PyObject* qPropertyCall(PyObject* self, PyObject* args, PyObject* kw) @@ -279,6 +268,41 @@ PyObject* qPropertyGetter(PyObject* self, PyObject* callback) } } +static int qpropertyTraverse(PyObject* self, visitproc visit, void* arg) +{ + PySidePropertyPrivate* data = reinterpret_cast(self)->d; + if (!data) + return 0; + + Py_VISIT(data->fget); + Py_VISIT(data->fset); + Py_VISIT(data->freset); + Py_VISIT(data->fdel); + Py_VISIT(data->notify); + return 0; +} + +static int qpropertyClear(PyObject* self) +{ + PySidePropertyPrivate* data = reinterpret_cast(self)->d; + if (!data) + return 0; + + Py_CLEAR(data->fget); + Py_CLEAR(data->fset); + Py_CLEAR(data->freset); + Py_CLEAR(data->fdel); + Py_CLEAR(data->notify); + + + free(data->typeName); + free(data->doc); + free(data->notifySignature); + delete data; + reinterpret_cast(self)->d = 0; + return 0; +} + } // extern "C" namespace { From 7b8d2925dd61e2cb1edc78bd10cdda2e8ef19bf2 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Tue, 13 Dec 2011 16:58:30 -0200 Subject: [PATCH 41/52] Small code style changes. --- libpyside/pysideqflags.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/libpyside/pysideqflags.cpp b/libpyside/pysideqflags.cpp index 4fe24b8..39f8b04 100644 --- a/libpyside/pysideqflags.cpp +++ b/libpyside/pysideqflags.cpp @@ -39,7 +39,7 @@ extern "C" { #define PYSIDE_QFLAGS(X) reinterpret_cast(X) - PyObject* PySideQFlagsNew(PyTypeObject *type, PyObject *args, PyObject *kwds) + PyObject* PySideQFlagsNew(PyTypeObject* type, PyObject* args, PyObject* kwds) { long val = 0; if (PyTuple_GET_SIZE(args)) { @@ -61,13 +61,11 @@ extern "C" { static long getNumberValue(PyObject* v) { - PyObject* number = PyNumber_Long(v); - long result = PyLong_AsLong(number); - Py_XDECREF(number); - return result; + Shiboken::AutoDecRef number(PyNumber_Long(v)); + return PyLong_AsLong(number); } - PyObject* PySideQFlagsRichCompare(PyObject *self, PyObject *other, int op) + PyObject* PySideQFlagsRichCompare(PyObject* self, PyObject* other, int op) { int result = 0; if (!PyNumber_Check(other)) { From 65d8f9fcef98f8a80015cc5e0b7526224332e7ec Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Wed, 14 Dec 2011 14:14:18 -0300 Subject: [PATCH 42/52] Fixes the QSettings related QVariant's save/load bug. --- libpyside/signalmanager.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/libpyside/signalmanager.cpp b/libpyside/signalmanager.cpp index 4bcfae5..81ce14d 100644 --- a/libpyside/signalmanager.cpp +++ b/libpyside/signalmanager.cpp @@ -250,6 +250,8 @@ SignalManager::SignalManager() : m_d(new SignalManagerPrivate) // Register PyObject type to use in queued signal and slot connections qRegisterMetaType(PYTHON_TYPE); qRegisterMetaTypeStreamOperators(PYTHON_TYPE); + qRegisterMetaTypeStreamOperators("PyObjectWrapper"); + qRegisterMetaTypeStreamOperators("PySide::PyObjectWrapper"); SbkConverter* converter = Shiboken::Conversions::createConverter(&PyBaseObject_Type, 0); Shiboken::Conversions::setCppPointerToPythonFunction(converter, PyObject_PTR_CppToPython_PyObject); From 8ddbd3167bba33820b19de36c2dbac83e9e8f55d Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Thu, 15 Dec 2011 14:47:39 -0300 Subject: [PATCH 43/52] The temporary file used in the test for bug #829 must not be deleted by the test. This fixes the test in win32 platforms. --- tests/QtCore/bug_829.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tests/QtCore/bug_829.py b/tests/QtCore/bug_829.py index da527ad..945d8df 100644 --- a/tests/QtCore/bug_829.py +++ b/tests/QtCore/bug_829.py @@ -3,12 +3,11 @@ import unittest from PySide.QtCore import QSettings -from helper import adjust_filename import tempfile class QVariantConversions(unittest.TestCase): def testDictionary(self): - confFile = tempfile.NamedTemporaryFile() + confFile = tempfile.NamedTemporaryFile(delete=False) s = QSettings(confFile.name, QSettings.IniFormat) # Save value s.setValue('x', {1: 'a'}) From 481ba5aa3ef94b417211fd25f07f30575b5afa68 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Fri, 16 Dec 2011 18:10:45 -0300 Subject: [PATCH 44/52] Fix BUG #1084 - "Crash (segfault) when writing unicode string on socket" See http://bugs.pyside.org/show_bug.cgi?id=1084. Signed-off-by: Paulo Alcantara Reviewed-by: Trust me --- PySide/QtCore/typesystem_core_common.xml | 21 ++++++++------------- tests/QtNetwork/CMakeLists.txt | 1 + tests/QtNetwork/bug_1084.py | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 13 deletions(-) create mode 100644 tests/QtNetwork/bug_1084.py diff --git a/PySide/QtCore/typesystem_core_common.xml b/PySide/QtCore/typesystem_core_common.xml index aa39e95..a2e1deb 100644 --- a/PySide/QtCore/typesystem_core_common.xml +++ b/PySide/QtCore/typesystem_core_common.xml @@ -2666,20 +2666,15 @@ - + - + - + - - - - %RETURN_TYPE %0 = %CPPSELF.%FUNCTION_NAME(%1, Shiboken::String::len(%PYARG_1)); - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%0); - - - + + + @@ -2688,7 +2683,7 @@ - + QByteArray ba; ba.resize(%2); @@ -2712,7 +2707,7 @@ - + QByteArray ba; ba.resize(%2); diff --git a/tests/QtNetwork/CMakeLists.txt b/tests/QtNetwork/CMakeLists.txt index 3077155..7476f91 100644 --- a/tests/QtNetwork/CMakeLists.txt +++ b/tests/QtNetwork/CMakeLists.txt @@ -1,4 +1,5 @@ PYSIDE_TEST(bug_446.py) +PYSIDE_TEST(bug_1084.py) PYSIDE_TEST(basic_auth_test.py) PYSIDE_TEST(accessManager_test.py) PYSIDE_TEST(http_test.py) diff --git a/tests/QtNetwork/bug_1084.py b/tests/QtNetwork/bug_1084.py new file mode 100644 index 0000000..9d8471c --- /dev/null +++ b/tests/QtNetwork/bug_1084.py @@ -0,0 +1,16 @@ +''' unit test for BUG #1084 ''' + +import unittest +from PySide import QtNetwork +import py3kcompat as py3k + +class QTcpSocketTestCase(unittest.TestCase): + def setUp(self): + self.sock = QtNetwork.QTcpSocket() + self.sock.connectToHost('127.0.0.1', 25) + + def testIt(self): + self.sock.write(py3k.unicode_('quit')) + +if __name__ == "__main__": + unittest.main() From b2b14fe9b70cb233b003425328ef1f4d8749c744 Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Wed, 21 Dec 2011 14:57:32 -0300 Subject: [PATCH 45/52] Fix BUG #1091 - "PixmapFragment and drawPixmapFragments are not bound" See http://bugs.pyside.org/show_bug.cgi?id=1091. Also minor coding style fixes in QtGui's typesystem. Signed-off-by: Paulo Alcantara Reviewed-by: Marcelo Lira --- PySide/QtGui/CMakeLists.txt | 10 +- PySide/QtGui/typesystem_gui_common.xml | 149 +++++++++++++------------ tests/QtGui/CMakeLists.txt | 3 + tests/QtGui/bug_1091.py | 12 ++ 4 files changed, 100 insertions(+), 74 deletions(-) create mode 100644 tests/QtGui/bug_1091.py diff --git a/PySide/QtGui/CMakeLists.txt b/PySide/QtGui/CMakeLists.txt index 6023a32..7625634 100644 --- a/PySide/QtGui/CMakeLists.txt +++ b/PySide/QtGui/CMakeLists.txt @@ -15,7 +15,6 @@ if(ENABLE_X11) endif() endif() - if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 6) set(QtGui_46_SRC "") else() @@ -60,6 +59,14 @@ else() ) endif () +if (${QT_VERSION_MAJOR} EQUAL 4 AND ${QT_VERSION_MINOR} LESS 7) + set(QtGui_47_SRC "") +else() + set(QtGui_47_SRC + ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qpainter_pixmapfragment_wrapper.cpp + ) +endif() + set(QtGui_OPTIONAL_SRC ) set(QtGui_DROPPED_ENTRIES ) check_qt_class(QtGui QAbstractPageSetupDialog QtGui_OPTIONAL_SRC QtGui_DROPPED_ENTRIES) @@ -398,6 +405,7 @@ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtGui/qworkspace_wrapper.cpp ${SPECIFIC_OS_FILES} ${QPYTEXTOBJECT_MOC} ${QtGui_46_SRC} +${QtGui_47_SRC} ${QtGui_OPTIONAL_SRC} ) diff --git a/PySide/QtGui/typesystem_gui_common.xml b/PySide/QtGui/typesystem_gui_common.xml index e9058b5..552636a 100644 --- a/PySide/QtGui/typesystem_gui_common.xml +++ b/PySide/QtGui/typesystem_gui_common.xml @@ -3470,7 +3470,7 @@ - + @@ -3479,7 +3479,7 @@ - + @@ -3488,7 +3488,7 @@ - + @@ -3497,7 +3497,7 @@ - + @@ -3506,7 +3506,7 @@ - + @@ -3604,24 +3604,24 @@ - + - + - + - + @@ -3632,38 +3632,38 @@ - + - + - + - + - + - + - + @@ -3759,7 +3759,7 @@ - + @@ -3821,17 +3821,17 @@ - + - + - + @@ -3868,17 +3868,17 @@ - + - + - + @@ -3893,17 +3893,17 @@ - + - + - + @@ -3913,12 +3913,12 @@ - + - + @@ -3994,12 +3994,12 @@ - + - + @@ -4247,7 +4247,7 @@ - + @@ -4529,7 +4529,7 @@ - + @@ -4540,7 +4540,7 @@ - + @@ -4555,7 +4555,7 @@ - + @@ -4731,29 +4731,29 @@ - + - + - + - + - + // Clear parent from the old child QStandardItem* _i = %CPPSELF->item(%1, %2); @@ -4766,7 +4766,7 @@ - + // Clear parent from the old child QStandardItem* _i = %CPPSELF->item(%1); @@ -4779,13 +4779,13 @@ - + - + // Clear parent from the old child QStandardItem* _i = %CPPSELF->verticalHeaderItem(%1); @@ -4817,19 +4817,19 @@ - + - + - + @@ -5086,18 +5086,18 @@ - + - + - + @@ -5200,13 +5200,13 @@ - + - + @@ -5258,12 +5258,12 @@ Shiboken::AutoDecRef result(PyObject_CallMethod(%PYARG_0, "connect", "OsO", %PYARG_0, SIGNAL(triggered()), %PYARG_2)); - + - + @@ -5425,9 +5425,12 @@ + + + - + - + - + - - - - - - + + + + + + - + - + - + %BEGIN_ALLOW_THREADS @@ -5475,7 +5478,7 @@ %END_ALLOW_THREADS - + %BEGIN_ALLOW_THREADS @@ -5483,13 +5486,13 @@ %END_ALLOW_THREADS - + - + @@ -5503,32 +5506,32 @@ - + - + - + - + - + - + diff --git a/tests/QtGui/CMakeLists.txt b/tests/QtGui/CMakeLists.txt index 1d95576..9bac913 100644 --- a/tests/QtGui/CMakeLists.txt +++ b/tests/QtGui/CMakeLists.txt @@ -164,6 +164,9 @@ PYSIDE_TEST(virtual_protected_inheritance_test.py) PYSIDE_TEST(virtual_pure_override_test.py) PYSIDE_TEST(wrong_return_test.py) +if (${QTVERSION} VERSION_GREATER 4.6.9) + PYSIDE_TEST(bug_1091.py) +endif() if(Q_WS_X11) PYSIDE_TEST(x11_symbols_test.py) diff --git a/tests/QtGui/bug_1091.py b/tests/QtGui/bug_1091.py new file mode 100644 index 0000000..b58d26f --- /dev/null +++ b/tests/QtGui/bug_1091.py @@ -0,0 +1,12 @@ +''' unit test for BUG #1091 ''' + +import unittest +from PySide import QtGui + +class QPainterTestCase(unittest.TestCase): + def testIt(self): + self.assertTrue("PixmapFragment" in dir(QtGui.QPainter)) + self.assertTrue("drawPixmapFragments" in dir(QtGui.QPainter)) + +if __name__ == "__main__": + unittest.main() From 98be0df6a55b45538d107421fd557fb77f8ab92b Mon Sep 17 00:00:00 2001 From: Paulo Alcantara Date: Wed, 21 Dec 2011 18:51:34 -0300 Subject: [PATCH 46/52] Fix BUG #1060 - "Subclassing of QUiLoader leads to "Internal C++ object already deleted" exception" See http://bugs.pyside.org/show_bug.cgi?id=1060. Signed-off-by: Paulo Alcantara Reviewed-by: Marcelo Lira --- PySide/QtUiTools/typesystem_uitools.xml | 11 ++++++----- tests/QtUiTools/CMakeLists.txt | 1 + tests/QtUiTools/bug_1060.py | 18 ++++++++++++++++++ tests/QtUiTools/bug_1060.ui | 19 +++++++++++++++++++ 4 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 tests/QtUiTools/bug_1060.py create mode 100644 tests/QtUiTools/bug_1060.ui diff --git a/PySide/QtUiTools/typesystem_uitools.xml b/PySide/QtUiTools/typesystem_uitools.xml index c86ae44..08e98bd 100644 --- a/PySide/QtUiTools/typesystem_uitools.xml +++ b/PySide/QtUiTools/typesystem_uitools.xml @@ -70,27 +70,28 @@ %CPPSELF.addPluginPath(""); // force reload widgets - + - + - + - + - + + diff --git a/tests/QtUiTools/CMakeLists.txt b/tests/QtUiTools/CMakeLists.txt index eecf3df..68ed7f1 100644 --- a/tests/QtUiTools/CMakeLists.txt +++ b/tests/QtUiTools/CMakeLists.txt @@ -8,5 +8,6 @@ PYSIDE_TEST(bug_909.py) PYSIDE_TEST(bug_913.py) PYSIDE_TEST(bug_958.py) PYSIDE_TEST(bug_965.py) +PYSIDE_TEST(bug_1060.py) PYSIDE_TEST(uiloader_test.py) PYSIDE_TEST(ui_test.py) diff --git a/tests/QtUiTools/bug_1060.py b/tests/QtUiTools/bug_1060.py new file mode 100644 index 0000000..8b51501 --- /dev/null +++ b/tests/QtUiTools/bug_1060.py @@ -0,0 +1,18 @@ +''' unit test for BUG #1060 ''' + +from PySide.QtGui import QApplication +from PySide.QtUiTools import QUiLoader +from helper import adjust_filename + +class MyQUiLoader(QUiLoader): + def __init__(self): + super(MyQUiLoader, self).__init__() + + def createWidget(self, *args): + return super(MyQUiLoader, self).createWidget(*args) + +if __name__ == "__main__": + app = QApplication([]) + + ui = MyQUiLoader().load(adjust_filename("bug_1060.ui", __file__)) + ui.show() diff --git a/tests/QtUiTools/bug_1060.ui b/tests/QtUiTools/bug_1060.ui new file mode 100644 index 0000000..f4044a8 --- /dev/null +++ b/tests/QtUiTools/bug_1060.ui @@ -0,0 +1,19 @@ + + + Dialog + + + + 0 + 0 + 100 + 100 + + + + Dialog + + + + + From a8a07b77f8a781764eef62eb05bfeac864368cad Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Thu, 22 Dec 2011 21:49:08 -0300 Subject: [PATCH 47/52] Declares Python types using the new "" tag. Reviewed by Hugo Parente Reviewed by Paulo Alcantara --- PySide/QtCore/typesystem_core_common.xml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/PySide/QtCore/typesystem_core_common.xml b/PySide/QtCore/typesystem_core_common.xml index a2e1deb..8955612 100644 --- a/PySide/QtCore/typesystem_core_common.xml +++ b/PySide/QtCore/typesystem_core_common.xml @@ -21,6 +21,16 @@ + + + + + + + + + + From afc9a7e10b8fd1816b99628de5be3e84032fca03 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 30 Dec 2011 15:30:29 -0300 Subject: [PATCH 48/52] Version bump to 1.1.0. --- CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 03f9db8..0151eea 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,8 @@ project(pysidebindings) cmake_minimum_required(VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Macros/ ${CMAKE_MODULE_PATH}) -find_package(GeneratorRunner 0.6.15 REQUIRED) -find_package(Shiboken 1.0.10 REQUIRED) +find_package(GeneratorRunner 0.6.16 REQUIRED) +find_package(Shiboken 1.1.0 REQUIRED) find_package(Qt4 4.5.0 REQUIRED) find_file(GL_H "gl.h" PATH_SUFFIXES "GL") include(FindQt4Extra) @@ -62,8 +62,8 @@ endif() set(BINDING_NAME PySide) set(BINDING_API_MAJOR_VERSION "1") -set(BINDING_API_MINOR_VERSION "0") -set(BINDING_API_MICRO_VERSION "9") +set(BINDING_API_MINOR_VERSION "1") +set(BINDING_API_MICRO_VERSION "0") set(BINDING_API_RELEASE_LEVEL "final") # alpha, beta, rc, or final set(BINDING_API_SERIAL 1) # leave as 0 when release level is final set(BINDING_API_VERSION "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}" CACHE STRING "PySide version" FORCE) From d30a8672c3db038886273d194f5bcdcb19cc29bd Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 30 Dec 2011 15:31:11 -0300 Subject: [PATCH 49/52] Version bump to 1.1.1. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 0151eea..696b4e3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,7 +63,7 @@ endif() set(BINDING_NAME PySide) set(BINDING_API_MAJOR_VERSION "1") set(BINDING_API_MINOR_VERSION "1") -set(BINDING_API_MICRO_VERSION "0") +set(BINDING_API_MICRO_VERSION "1") set(BINDING_API_RELEASE_LEVEL "final") # alpha, beta, rc, or final set(BINDING_API_SERIAL 1) # leave as 0 when release level is final set(BINDING_API_VERSION "${BINDING_API_MAJOR_VERSION}.${BINDING_API_MINOR_VERSION}.${BINDING_API_MICRO_VERSION}" CACHE STRING "PySide version" FORCE) From db6f1e3306e626b871d6ed1a971638d106648b51 Mon Sep 17 00:00:00 2001 From: Hugo Parente Lima Date: Tue, 13 Mar 2012 14:26:42 -0300 Subject: [PATCH 50/52] Fix PySide compilation. Change-Id: Ie7a30961232526af59cbc21dbf1b58ab9a4e3e7b Reviewed-by: Hugo Parente Lima --- CMakeLists.txt | 3 +-- cmake/Macros/PySideModules.cmake | 2 +- doc/CMakeLists.txt | 2 +- tests/pysidetest/CMakeLists.txt | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 696b4e3..a7ffbd5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,8 +5,7 @@ project(pysidebindings) cmake_minimum_required(VERSION 2.6) set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Macros/ ${CMAKE_MODULE_PATH}) -find_package(GeneratorRunner 0.6.16 REQUIRED) -find_package(Shiboken 1.1.0 REQUIRED) +find_package(Shiboken 1.1.1 REQUIRED) find_package(Qt4 4.5.0 REQUIRED) find_file(GL_H "gl.h" PATH_SUFFIXES "GL") include(FindQt4Extra) diff --git a/cmake/Macros/PySideModules.cmake b/cmake/Macros/PySideModules.cmake index 9eabd56..4877b12 100644 --- a/cmake/Macros/PySideModules.cmake +++ b/cmake/Macros/PySideModules.cmake @@ -20,7 +20,7 @@ macro(create_pyside_module module_name module_include_dir module_libraries modul endif() add_custom_command(OUTPUT ${${module_sources}} - COMMAND ${GENERATORRUNNER_BINARY} ${GENERATOR_EXTRA_FLAGS} + COMMAND ${SHIBOKEN_BINARY} ${GENERATOR_EXTRA_FLAGS} ${pyside_BINARY_DIR}/pyside_global.h --include-paths=${pyside_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR} --typesystem-paths=${pyside_SOURCE_DIR}${PATH_SEP}${${module_typesystem_path}} diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt index 61eeb09..967c289 100644 --- a/doc/CMakeLists.txt +++ b/doc/CMakeLists.txt @@ -23,7 +23,7 @@ configure_file("conf.py.in" "rst/conf.py" @ONLY) configure_file(typesystem_doc.xml.in typesystem_doc.xml @ONLY) add_custom_target("docrsts" - COMMAND ${GENERATORRUNNER_BINARY} --generator-set=qtdoc + COMMAND ${SHIBOKEN_BINARY} --generator-set=qtdoc ${pyside_BINARY_DIR}/pyside_global.h --include-paths="${QT_INCLUDE_DIR}${PATH_SEP}${pyside_SOURCE_DIR}" --api-version=${SUPPORTED_QT_VERSION} diff --git a/tests/pysidetest/CMakeLists.txt b/tests/pysidetest/CMakeLists.txt index 01d61f7..78c6f95 100644 --- a/tests/pysidetest/CMakeLists.txt +++ b/tests/pysidetest/CMakeLists.txt @@ -34,7 +34,7 @@ ${CMAKE_CURRENT_BINARY_DIR}/testbinding/testbinding_module_wrapper.cpp ) add_custom_command(OUTPUT ${testbinding_SRC} -COMMAND ${GENERATORRUNNER_BINARY} ${GENERATOR_EXTRA_FLAGS} +COMMAND ${SHIBOKEN_BINARY} ${GENERATOR_EXTRA_FLAGS} ${CMAKE_CURRENT_SOURCE_DIR}/pysidetest_global.h --include-paths=${pyside_BINARY_DIR}${PATH_SEP}${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${QT_INCLUDE_DIR}${PATH_SEP}${QT_QTCORE_INCLUDE_DIR}${PATH_SEP}${QT_QTGUI_INCLUDE_DIR} --typesystem-paths=${CMAKE_CURRENT_SOURCE_DIR}${PATH_SEP}${pyside_SOURCE_DIR}${PATH_SEP}${QtCore_SOURCE_DIR}${PATH_SEP}${QtCore_BINARY_DIR}${PATH_SEP}${QtGui_SOURCE_DIR}${PATH_SEP}${QtGui_BINARY_DIR} From fe8dc36f90fe64590f7f13843a076f8d2d61f378 Mon Sep 17 00:00:00 2001 From: Juhapekka Piiroinen Date: Tue, 6 Mar 2012 13:57:16 +0200 Subject: [PATCH 51/52] Fix bug PYSIDE-6 This should resolve the issue in PYSIDE-6 "Fix phonon VideoCaptureDevice detection to properly use phonon_ namespace". Changed if check in PySideModules.cmake. Change-Id: Ie30d6858a0fc6073560ec4cd09508504cbeb667d Reviewed-by: Hugo Parente Lima --- cmake/Macros/PySideModules.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/Macros/PySideModules.cmake b/cmake/Macros/PySideModules.cmake index 4877b12..2fe6cd1 100644 --- a/cmake/Macros/PySideModules.cmake +++ b/cmake/Macros/PySideModules.cmake @@ -71,7 +71,7 @@ macro(check_qt_class module class optional_source_files dropped_entries) endif () string(TOLOWER ${class} _class) string(TOUPPER ${module} _module) - if (${namespace}) + if (_namespace) set(_cppfile ${CMAKE_CURRENT_BINARY_DIR}/PySide/${module}/${_namespace}_${_class}_wrapper.cpp) else () set(_cppfile ${CMAKE_CURRENT_BINARY_DIR}/PySide/${module}/${_class}_wrapper.cpp) From f011ce2cb9e2b93a748874de007232ec88cc8ac1 Mon Sep 17 00:00:00 2001 From: Juhapekka Piiroinen Date: Mon, 5 Mar 2012 07:59:41 +0200 Subject: [PATCH 52/52] Bug fix for PYSIDE-7 This should resolve the issue in PYSIDE-7 "QDateTime does not support the 6-argument format". Added function signature for 6-argument version and a testcase. Change-Id: I617eefab6a41939c37e2f1bf800857bc2d74b6ee Reviewed-by: Hugo Parente Lima --- PySide/QtCore/typesystem_core_common.xml | 7 +++++++ tests/QtCore/python_conversion.py | 17 +++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/PySide/QtCore/typesystem_core_common.xml b/PySide/QtCore/typesystem_core_common.xml index 8955612..2e83131 100644 --- a/PySide/QtCore/typesystem_core_common.xml +++ b/PySide/QtCore/typesystem_core_common.xml @@ -1257,6 +1257,13 @@ %0 = new %TYPE(date, time, Qt::TimeSpec(%8)); + + + QDate date(%1, %2, %3); + QTime time(%4, %5, %6); + %0 = new %TYPE(date, time); + + diff --git a/tests/QtCore/python_conversion.py b/tests/QtCore/python_conversion.py index 2472dee..84845c0 100644 --- a/tests/QtCore/python_conversion.py +++ b/tests/QtCore/python_conversion.py @@ -43,5 +43,22 @@ class TestDateTimeConversions (unittest.TestCase): self.assertEqual(dateTime, other.toPython()) + def testQDateTime6arg(self): + dateTime = datetime.datetime(2010, 4, 23, 11, 14, 7) + other = QDateTime(dateTime) + + otherDate = other.date() + self.assertEqual(dateTime.year, otherDate.year()) + self.assertEqual(dateTime.month, otherDate.month()) + self.assertEqual(dateTime.day, otherDate.day()) + + otherTime = other.time() + self.assertEqual(dateTime.hour, otherTime.hour()) + self.assertEqual(dateTime.minute, otherTime.minute()) + self.assertEqual(dateTime.second, otherTime.second()) + self.assertEqual(dateTime.microsecond/1000, otherTime.msec()) + + self.assertEqual(dateTime, other.toPython()) + if __name__ == '__main__': unittest.main()