mirror of
https://github.com/rive-app/rive-cpp.git
synced 2026-01-18 13:11:19 +01:00
feature: allow listeners to listen to any type of view model change (#11313) 4b7a5a8032
Co-authored-by: hernan <hernan@rive.app>
This commit is contained in:
@@ -1 +1 @@
|
||||
08c2e47d441a48c32ee10595e16ec5bf139cd367
|
||||
4b7a5a803270e54086a17aede011a677999f1843
|
||||
|
||||
@@ -1024,11 +1024,11 @@ public:
|
||||
}
|
||||
void addDirt(ComponentDirt value, bool recurse)
|
||||
{
|
||||
if (m_viewModelInstanceValue &&
|
||||
m_viewModelInstanceValue->is<ViewModelInstanceTrigger>())
|
||||
if (m_viewModelInstanceValue)
|
||||
{
|
||||
if (m_viewModelInstanceValue->as<ViewModelInstanceTrigger>()
|
||||
->propertyValue() != 0)
|
||||
if (!m_viewModelInstanceValue->is<ViewModelInstanceTrigger>() ||
|
||||
m_viewModelInstanceValue->as<ViewModelInstanceTrigger>()
|
||||
->propertyValue() != 0)
|
||||
{
|
||||
m_stateMachineInstance->reportListenerViewModel(this);
|
||||
}
|
||||
@@ -1628,6 +1628,7 @@ void StateMachineInstance::applyEvents()
|
||||
m_reportedListenerViewModels.size() > 0) &&
|
||||
currentIteration++ < maxIterations)
|
||||
{
|
||||
updateDataBinds(false);
|
||||
m_reportingEvents = m_reportedEvents;
|
||||
m_reportingListenerViewModels = m_reportedListenerViewModels;
|
||||
m_reportedEvents.clear();
|
||||
|
||||
BIN
tests/unit_tests/assets/listener_view_model.riv
Normal file
BIN
tests/unit_tests/assets/listener_view_model.riv
Normal file
Binary file not shown.
@@ -2001,3 +2001,42 @@ TEST_CASE("Relative data binding", "[silver]")
|
||||
|
||||
CHECK(silver.matches("relative_data_binding"));
|
||||
}
|
||||
|
||||
TEST_CASE("Listen to view model value changes in state machines", "[silver]")
|
||||
{
|
||||
SerializingFactory silver;
|
||||
auto file = ReadRiveFile("assets/listener_view_model.riv", &silver);
|
||||
|
||||
auto artboard = file->artboardDefault();
|
||||
silver.frameSize(artboard->width(), artboard->height());
|
||||
|
||||
auto stateMachine = artboard->stateMachineAt(0);
|
||||
int viewModelId = artboard.get()->viewModelId();
|
||||
|
||||
auto vmi = viewModelId == -1
|
||||
? file->createViewModelInstance(artboard.get())
|
||||
: file->createViewModelInstance(viewModelId, 0);
|
||||
auto colorProp = vmi->propertyValue("col")->as<ViewModelInstanceColor>();
|
||||
auto triggerProp =
|
||||
vmi->propertyValue("tri")->as<ViewModelInstanceTrigger>();
|
||||
auto numProp = vmi->propertyValue("num1")->as<ViewModelInstanceNumber>();
|
||||
|
||||
stateMachine->bindViewModelInstance(vmi);
|
||||
auto renderer = silver.makeRenderer();
|
||||
stateMachine->advanceAndApply(0.0f);
|
||||
artboard->draw(renderer.get());
|
||||
silver.addFrame();
|
||||
colorProp->propertyValue(rive::colorARGB(100, 0, 10, 15));
|
||||
stateMachine->advanceAndApply(0.016f);
|
||||
artboard->draw(renderer.get());
|
||||
silver.addFrame();
|
||||
triggerProp->trigger();
|
||||
stateMachine->advanceAndApply(0.016f);
|
||||
artboard->draw(renderer.get());
|
||||
silver.addFrame();
|
||||
numProp->propertyValue(55);
|
||||
stateMachine->advanceAndApply(0.016f);
|
||||
artboard->draw(renderer.get());
|
||||
|
||||
CHECK(silver.matches("listener_view_model"));
|
||||
}
|
||||
BIN
tests/unit_tests/silvers/listener_view_model.sriv
Normal file
BIN
tests/unit_tests/silvers/listener_view_model.sriv
Normal file
Binary file not shown.
Reference in New Issue
Block a user