change how viewmodel instances target their viewmodel we don't call onAddedDirty to viewmodel instances because they don't belong to an artboard. So this PR changes how they target their viewmodel reference. Diffs= aa390d5dc change how viewmodel instances target their viewmodel (#7468) Co-authored-by: hernan <hernan@rive.app>
diff --git a/.rive_head b/.rive_head index 85b696c..6183a82 100644 --- a/.rive_head +++ b/.rive_head
@@ -1 +1 @@ -e66e242c649e3e61f12a3adbd824bcd9a7525a53 +aa390d5dc521f5e99605bf84cab8853e5bd44910
diff --git a/include/rive/viewmodel/viewmodel_instance.hpp b/include/rive/viewmodel/viewmodel_instance.hpp index 3115dc4..f5ecd5a 100644 --- a/include/rive/viewmodel/viewmodel_instance.hpp +++ b/include/rive/viewmodel/viewmodel_instance.hpp
@@ -19,13 +19,12 @@ ViewModelInstanceValue* propertyValue(const std::string& name); std::vector<ViewModelInstanceValue*> propertyValues(); void viewModel(ViewModel* value); - ViewModel* viewModel(); + ViewModel* viewModel() const; void onComponentDirty(Component* component); void setAsRoot(); void setRoot(ViewModelInstance* value); Core* clone() const override; StatusCode import(ImportStack& importStack) override; - StatusCode onAddedDirty(CoreContext* context) override; }; } // namespace rive
diff --git a/src/viewmodel/viewmodel.cpp b/src/viewmodel/viewmodel.cpp index 7e764b9..3d9ecfa 100644 --- a/src/viewmodel/viewmodel.cpp +++ b/src/viewmodel/viewmodel.cpp
@@ -32,7 +32,11 @@ return nullptr; } -void ViewModel::addInstance(ViewModelInstance* value) { m_Instances.push_back(value); } +void ViewModel::addInstance(ViewModelInstance* value) +{ + m_Instances.push_back(value); + value->viewModel(this); +} ViewModelInstance* ViewModel::defaultInstance() { return m_Instances[defaultInstanceId()]; }
diff --git a/src/viewmodel/viewmodel_instance.cpp b/src/viewmodel/viewmodel_instance.cpp index bac6882..f3e741d 100644 --- a/src/viewmodel/viewmodel_instance.cpp +++ b/src/viewmodel/viewmodel_instance.cpp
@@ -15,22 +15,6 @@ m_PropertyValues.push_back(value); } -StatusCode ViewModelInstance::onAddedDirty(CoreContext* context) -{ - StatusCode result = Super::onAddedDirty(context); - if (result != StatusCode::Ok) - { - return result; - } - auto coreObject = context->resolve(viewModelId()); - if (coreObject != nullptr && coreObject->is<ViewModel>()) - { - m_ViewModel = static_cast<ViewModel*>(coreObject); - } - - return StatusCode::Ok; -} - ViewModelInstanceValue* ViewModelInstance::propertyValue(const uint32_t id) { for (auto value : m_PropertyValues) @@ -61,7 +45,7 @@ void ViewModelInstance::viewModel(ViewModel* value) { m_ViewModel = value; } -ViewModel* ViewModelInstance::viewModel() { return m_ViewModel; } +ViewModel* ViewModelInstance::viewModel() const { return m_ViewModel; } void ViewModelInstance::onComponentDirty(Component* component) {} @@ -89,6 +73,7 @@ auto clonedValue = propertyValue->clone()->as<ViewModelInstanceValue>(); cloned->addValue(clonedValue); } + cloned->viewModel(viewModel()); return cloned; }