Fixed a case where .NET objects as params weren't working when raising signals.

This commit is contained in:
Paul Knopf 2018-09-09 10:34:19 -04:00
parent 9c9d1bdb2f
commit ae9d7291e9
4 changed files with 82 additions and 17 deletions

View file

@ -50,7 +50,7 @@ bool NetValue::activateSignal(QString signalName, QSharedPointer<NetVariantList>
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<QVariant> variant = QSharedPointer<QVariant>(new QVariant(arguments->get(x)->getVariant()));
QSharedPointer<QVariant> variant = QSharedPointer<QVariant>(new QVariant(arguments->get(x)->toQVariant()));
variantArgs.append(variant);
voidArgs.push_back(static_cast<void*>(variant.data()));
}

View file

@ -197,18 +197,6 @@ QSharedPointer<NetJSValue> NetVariant::getJsValue()
return variant.value<NetJsValueQmlContainer>().jsValue;
}
QVariant NetVariant::getVariant()
{
return variant;
}
void NetVariant::setVariant(QVariant v)
{
clear();
variant = v;
}
void NetVariant::clear()
{
clearNetReference();
@ -238,7 +226,7 @@ QSharedPointer<NetVariant> NetVariant::fromQJSValue(const QJSValue& qJsValue)
else {
result = QSharedPointer<NetVariant>(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<QVariant>(getVariant());
return jsEngine->toScriptValue<QVariant>(toQVariant());
}
}
}
QVariant NetVariant::toQVariant()
{
QVariant result;
switch(getVariantType()) {
case NetVariantTypeEnum_JSValue:
result = getJsValue()->getJsValue().toVariant();
break;
case NetVariantTypeEnum_Object:
result = QVariant::fromValue<QObject*>(NetValue::forInstance(getNetReference()));
break;
default:
result = variant;
break;
}
return result;
}
void NetVariant::clearNetReference()
{

View file

@ -31,11 +31,10 @@ public:
QDateTime getDateTime();
void setJsValue(QSharedPointer<NetJSValue> jsValue);
QSharedPointer<NetJSValue> getJsValue();
QVariant getVariant();
void setVariant(QVariant variant);
void clear();
static QSharedPointer<NetVariant> fromQJSValue(const QJSValue& qJsValue);
QJSValue toQJSValue(QJSEngine* jsEngine);
QVariant toQVariant();
private:
void clearNetReference();
QVariant variant;

View file

@ -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<ObjectTestsQml>((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<ObjectTestsQml>((p) =>
{
paramResult = p;
}));
RunQmlTest(
"test",
@"
var instance = test.getSignalObject()
test.testMethod()
");
paramResult.Should().NotBeNull();
paramResult.SomeStringProperty.Should().NotBeNull(param.SomeStringProperty);
}
}
}