fix(runtime): store relinked view model instance on nested artboard (#11931) 76c7232fa1 Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head index 1d2e4af..dd38bb4 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -19486d13d0cfb9f7d1866a1371f71f1ec4e77dfe +76c7232fa1bd2fc719cf1bb240f373bb2693fae7
diff --git a/src/nested_artboard.cpp b/src/nested_artboard.cpp index f801028..df32fad 100644 --- a/src/nested_artboard.cpp +++ b/src/nested_artboard.cpp
@@ -446,6 +446,7 @@ void NestedArtboard::relinkDataContext(rcp<ViewModelInstance> viewModelInstance) { + m_viewModelInstance = viewModelInstance; auto instance = artboardInstance(0); if (instance && !instance->isStateful()) {
diff --git a/tests/unit_tests/assets/databind_external_artboard_child.riv b/tests/unit_tests/assets/databind_external_artboard_child.riv new file mode 100644 index 0000000..bbe4689 --- /dev/null +++ b/tests/unit_tests/assets/databind_external_artboard_child.riv Binary files differ
diff --git a/tests/unit_tests/assets/databind_external_artboard_main.riv b/tests/unit_tests/assets/databind_external_artboard_main.riv new file mode 100644 index 0000000..afd24e4 --- /dev/null +++ b/tests/unit_tests/assets/databind_external_artboard_main.riv Binary files differ
diff --git a/tests/unit_tests/runtime/data_binding_artboards_test.cpp b/tests/unit_tests/runtime/data_binding_artboards_test.cpp index 10f0c04..2655f2d 100644 --- a/tests/unit_tests/runtime/data_binding_artboards_test.cpp +++ b/tests/unit_tests/runtime/data_binding_artboards_test.cpp
@@ -18,6 +18,7 @@ #include <rive/viewmodel/viewmodel_instance_viewmodel.hpp> #include <rive/viewmodel/viewmodel_instance_trigger.hpp> #include "rive/animation/state_machine_instance.hpp" +#include "rive/viewmodel/runtime/viewmodel_runtime.hpp" #include "rive/nested_artboard.hpp" #include "rive_file_reader.hpp" #include "utils/serializing_factory.hpp" @@ -315,4 +316,43 @@ stateMachine->advanceAndApply(0.1f); artboard->draw(renderer.get()); CHECK(silver.matches("data_bind_artboard_input")); +} + +TEST_CASE("Data bind external artboard with no initial source artboard", + "[silver]") +{ + SerializingFactory silver; + auto file = + ReadRiveFile("assets/databind_external_artboard_main.riv", &silver); + auto file2 = + ReadRiveFile("assets/databind_external_artboard_child.riv", &silver); + + auto artboard = file->artboardDefault(); + REQUIRE(artboard != nullptr); + + silver.frameSize(artboard->width(), artboard->height()); + + auto stateMachine = artboard->stateMachineAt(0); + auto renderer = silver.makeRenderer(); + stateMachine->advanceAndApply(0.0f); + artboard->draw(renderer.get()); + silver.addFrame(); + + auto vmi = file->createViewModelInstance(artboard.get()); + stateMachine->bindViewModelInstance(vmi); + auto artboardProp = + vmi->propertyValue("ab")->as<ViewModelInstanceArtboard>(); + auto insertedArtboard = file2->bindableArtboardNamed("ExternalChild"); + artboardProp->asset(insertedArtboard); + + auto mainVM = file2->viewModelByName("Child"); + auto mainVMI = mainVM->createInstanceFromName("Instance"); + auto newCircleProp = mainVMI->propertyString("label"); + vmi->replaceViewModelByName("child", mainVMI->instance()); + newCircleProp->value("updated label"); + + stateMachine->advanceAndApply(0.016f); + artboard->draw(renderer.get()); + + CHECK(silver.matches("databind_external_artboard_main")); } \ No newline at end of file
diff --git a/tests/unit_tests/silvers/databind_external_artboard_main.sriv b/tests/unit_tests/silvers/databind_external_artboard_main.sriv new file mode 100644 index 0000000..900b3d8 --- /dev/null +++ b/tests/unit_tests/silvers/databind_external_artboard_main.sriv Binary files differ