| #include <sstream> | |
| #include <iomanip> | |
| #include <array> | |
| #include "rive/viewmodel/viewmodel_instance_artboard.hpp" | |
| #include "rive/component_dirt.hpp" | |
| #include "rive/refcnt.hpp" | |
| using namespace rive; | |
| void ViewModelInstanceArtboard::propertyValueChanged() | |
| { | |
| m_bindableArtboard = nullptr; | |
| addDirt(ComponentDirt::Bindings); | |
| #ifdef WITH_RIVE_TOOLS | |
| if (m_changedCallback != nullptr) | |
| { | |
| m_changedCallback(this, propertyValue()); | |
| } | |
| #endif | |
| onValueChanged(); | |
| } | |
| void ViewModelInstanceArtboard::asset(rcp<BindableArtboard> value) | |
| { | |
| // Scripts may reassign the same value every frame, and each notification | |
| // rebuilds whatever mounts it. | |
| if (propertyValue() == -1 && value == m_bindableArtboard && | |
| !m_boundViewModelInstanceChanged) | |
| { | |
| return; | |
| } | |
| m_boundViewModelInstanceChanged = false; | |
| { | |
| // Moving to the sentinel drops the stored bindable and notifies | |
| // before the new one is stored, so delegates wait for the single | |
| // notification below. A fresh property, or one already holding a | |
| // bindable, is at the sentinel already and relies on that | |
| // notification alone. | |
| SuppressDelegation suppress(this); | |
| propertyValue(-1); | |
| } | |
| m_bindableArtboard = value; | |
| addDirt(ComponentDirt::Bindings); | |
| onValueChanged(); | |
| } | |
| void ViewModelInstanceArtboard::applyValue(DataValueInteger* dataValue) | |
| { | |
| propertyValue(dataValue->value()); | |
| } | |
| void ViewModelInstanceArtboard::boundViewModelInstance( | |
| rcp<ViewModelInstance> value) | |
| { | |
| if (value != m_boundViewModelInstance) | |
| { | |
| m_boundViewModelInstance = value; | |
| m_boundViewModelInstanceChanged = true; | |
| } | |
| } |