mirror of
https://github.com/qmlnet/qmlnet.git
synced 2026-05-21 06:45:32 -06:00
Fixed a case where .NET objects as params weren't working when raising signals.
This commit is contained in:
parent
9c9d1bdb2f
commit
ae9d7291e9
4 changed files with 82 additions and 17 deletions
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue