From ae9d7291e9bbd4ed17d93c22d06e152f7cf7e09a Mon Sep 17 00:00:00 2001 From: Paul Knopf Date: Sun, 9 Sep 2018 10:34:19 -0400 Subject: [PATCH] Fixed a case where .NET objects as params weren't working when raising signals. --- src/native/QmlNet/QmlNet/qml/NetValue.cpp | 2 +- src/native/QmlNet/QmlNet/qml/NetVariant.cpp | 32 ++++++----- src/native/QmlNet/QmlNet/qml/NetVariant.h | 3 +- src/net/Qml.Net.Tests/Qml/SignalTests.cs | 62 +++++++++++++++++++++ 4 files changed, 82 insertions(+), 17 deletions(-) diff --git a/src/native/QmlNet/QmlNet/qml/NetValue.cpp b/src/native/QmlNet/QmlNet/qml/NetValue.cpp index eb02b0cf..06007b23 100644 --- a/src/native/QmlNet/QmlNet/qml/NetValue.cpp +++ b/src/native/QmlNet/QmlNet/qml/NetValue.cpp @@ -50,7 +50,7 @@ bool NetValue::activateSignal(QString signalName, QSharedPointer voidArgs.push_back(nullptr); // For the return type, which is nothing for signals. if(arguments != nullptr) { for(int x = 0 ; x < arguments->count(); x++) { - QSharedPointer variant = QSharedPointer(new QVariant(arguments->get(x)->getVariant())); + QSharedPointer variant = QSharedPointer(new QVariant(arguments->get(x)->toQVariant())); variantArgs.append(variant); voidArgs.push_back(static_cast(variant.data())); } diff --git a/src/native/QmlNet/QmlNet/qml/NetVariant.cpp b/src/native/QmlNet/QmlNet/qml/NetVariant.cpp index 7d72d169..d9fa1750 100644 --- a/src/native/QmlNet/QmlNet/qml/NetVariant.cpp +++ b/src/native/QmlNet/QmlNet/qml/NetVariant.cpp @@ -197,18 +197,6 @@ QSharedPointer NetVariant::getJsValue() return variant.value().jsValue; } -QVariant NetVariant::getVariant() -{ - return variant; -} - -void NetVariant::setVariant(QVariant v) -{ - clear(); - variant = v; -} - - void NetVariant::clear() { clearNetReference(); @@ -238,7 +226,7 @@ QSharedPointer NetVariant::fromQJSValue(const QJSValue& qJsValue) else { result = QSharedPointer(new NetVariant()); QVariant variant = qJsValue.toVariant(); - result->setVariant(variant); + result->variant = variant; } return result; } @@ -254,11 +242,27 @@ QJSValue NetVariant::toQJSValue(QJSEngine* jsEngine) return getJsValue()->getJsValue(); } default: { - return jsEngine->toScriptValue(getVariant()); + return jsEngine->toScriptValue(toQVariant()); } } } +QVariant NetVariant::toQVariant() +{ + QVariant result; + switch(getVariantType()) { + case NetVariantTypeEnum_JSValue: + result = getJsValue()->getJsValue().toVariant(); + break; + case NetVariantTypeEnum_Object: + result = QVariant::fromValue(NetValue::forInstance(getNetReference())); + break; + default: + result = variant; + break; + } + return result; +} void NetVariant::clearNetReference() { diff --git a/src/native/QmlNet/QmlNet/qml/NetVariant.h b/src/native/QmlNet/QmlNet/qml/NetVariant.h index ce8e7891..db51ee5d 100644 --- a/src/native/QmlNet/QmlNet/qml/NetVariant.h +++ b/src/native/QmlNet/QmlNet/qml/NetVariant.h @@ -31,11 +31,10 @@ public: QDateTime getDateTime(); void setJsValue(QSharedPointer jsValue); QSharedPointer getJsValue(); - QVariant getVariant(); - void setVariant(QVariant variant); void clear(); static QSharedPointer fromQJSValue(const QJSValue& qJsValue); QJSValue toQJSValue(QJSEngine* jsEngine); + QVariant toQVariant(); private: void clearNetReference(); QVariant variant; diff --git a/src/net/Qml.Net.Tests/Qml/SignalTests.cs b/src/net/Qml.Net.Tests/Qml/SignalTests.cs index fffac457..7dee94b8 100644 --- a/src/net/Qml.Net.Tests/Qml/SignalTests.cs +++ b/src/net/Qml.Net.Tests/Qml/SignalTests.cs @@ -72,11 +72,17 @@ namespace Qml.Net.Tests.Qml this.ActivateNotifySignal(); } } + + public virtual object GetTestObject() + { + return null; + } } [Signal("testSignal")] [Signal("testSignalWithArgs1", NetVariantType.String, NetVariantType.Int)] [Signal("testSignalWithArgs2", NetVariantType.String, NetVariantType.Int)] + [Signal("testSignalWithNetArg", NetVariantType.Object)] public class SignalObject { @@ -307,5 +313,61 @@ namespace Qml.Net.Tests.Qml message.Should().Be("from qml"); } + + [Fact] + public void Can_raise_net_signal_from_qml_with_net_object_parameter() + { + var o = new SignalObject(); + var param = new ObjectTestsQml(); + param.SomeStringProperty = Guid.NewGuid().ToString(); + ObjectTestsQml paramResult = null; + Mock.Setup(x => x.GetSignalObject()).Returns(o); + Mock.Setup(x => x.GetTestObject()).Returns(param); + o.AttachToSignal("testSignalWithNetArg", new Action((p) => + { + paramResult = p; + })); + + RunQmlTest( + "test", + @" + var instance = test.getSignalObject() + var param = test.getTestObject() + instance.testSignalWithNetArg(param) + "); + + paramResult.Should().NotBeNull(); + paramResult.SomeStringProperty.Should().NotBeNull(param.SomeStringProperty); + } + + [Fact] + public void Can_raise_net_signal_from_net_with_net_object_parameter() + { + var o = new SignalObject(); + var param = new ObjectTestsQml(); + param.SomeStringProperty = Guid.NewGuid().ToString(); + ObjectTestsQml paramResult = null; + Mock.Setup(x => x.GetSignalObject()).Returns(o); + Mock.Setup(x => x.GetTestObject()).Returns(param); + // When testMethod() is called, activate the signal (from .NET) + Mock.Setup(x => x.TestMethod()).Callback(() => + { + o.ActivateSignal("testSignalWithNetArg", param); + }); + o.AttachToSignal("testSignalWithNetArg", new Action((p) => + { + paramResult = p; + })); + + RunQmlTest( + "test", + @" + var instance = test.getSignalObject() + test.testMethod() + "); + + paramResult.Should().NotBeNull(); + paramResult.SomeStringProperty.Should().NotBeNull(param.SomeStringProperty); + } } } \ No newline at end of file