File 0003-Allow-calling-signals-from-Python.patch of Package python3-pyotherside

From dab1576bb10e567f7daf6b66a0c3187775cf9b61 Mon Sep 17 00:00:00 2001
From: Thomas Perl <m@thp.io>
Date: Sun, 27 Jan 2019 12:31:01 +0100
Subject: [PATCH] Allow calling signals from Python (Fixes #98)

---
 src/qpython_priv.cpp                 | 14 +++++++++++++
 tests/test_call_signal/TestModule.py |  5 +++++
 tests/test_call_signal/test.qml      | 31 ++++++++++++++++++++++++++++
 3 files changed, 50 insertions(+)
 create mode 100644 tests/test_call_signal/TestModule.py
 create mode 100644 tests/test_call_signal/test.qml

diff --git a/src/qpython_priv.cpp b/src/qpython_priv.cpp
index 7cee0e1..e5d96f1 100644
--- a/src/qpython_priv.cpp
+++ b/src/qpython_priv.cpp
@@ -390,6 +390,20 @@ pyotherside_QObjectMethod_call(PyObject *callable_object, PyObject *args, PyObje
         QMetaMethod method = metaObject->method(i);
 
         if (method.name() == ref->method()) {
+            if (method.methodType() == QMetaMethod::Signal) {
+                // Signals can't be called directly, we just return true or
+                // false depending on whether method.invoke() worked or not
+                bool result = method.invoke(o, Qt::AutoConnection,
+                        genericArguments.value(0),
+                        genericArguments.value(1), genericArguments.value(2),
+                        genericArguments.value(3), genericArguments.value(4),
+                        genericArguments.value(5), genericArguments.value(6),
+                        genericArguments.value(7), genericArguments.value(8),
+                        genericArguments.value(9));
+
+                return convertQVariantToPyObject(result);
+            }
+
             QVariant result;
             if (method.invoke(o, Qt::DirectConnection,
                     Q_RETURN_ARG(QVariant, result), genericArguments.value(0),
diff --git a/tests/test_call_signal/TestModule.py b/tests/test_call_signal/TestModule.py
new file mode 100644
index 0000000..b55e899
--- /dev/null
+++ b/tests/test_call_signal/TestModule.py
@@ -0,0 +1,5 @@
+import pyotherside
+
+def makeCalls(obj):
+    print(f'result of callFunction: {obj.callFunction()}')
+    print(f'result of callSignal: {obj.callSignal()}')
diff --git a/tests/test_call_signal/test.qml b/tests/test_call_signal/test.qml
new file mode 100644
index 0000000..deb8e40
--- /dev/null
+++ b/tests/test_call_signal/test.qml
@@ -0,0 +1,31 @@
+import QtQuick 2.9
+import io.thp.pyotherside 1.5
+
+Item {
+id: obj
+
+    signal callSignal()
+
+    function callFunction() {
+        print('Function Called')
+        return 'hoho'
+    }
+
+    function signalConnection(){
+    	print('Signal Called')
+    }
+
+    Component.onCompleted: {
+        obj.callSignal.connect(signalConnection)
+    }
+
+    Python {
+        Component.onCompleted: {
+            addImportPath(Qt.resolvedUrl('.'));
+
+            importModule('TestModule', function(){
+                call('TestModule.makeCalls', [obj])
+            })
+        }
+    }
+}
openSUSE Build Service is sponsored by