chore: process listeners in specified order (#11487) 3253c0beae

* chore: process listeners in specified order

* resolve sorting on export

Co-authored-by: hernan <hernan@rive.app>
This commit is contained in:
bodymovin
2026-01-18 04:23:03 +00:00
parent decf2d683d
commit 0168f7860c
4 changed files with 64 additions and 1 deletions

View File

@@ -1 +1 @@
c83919a2477577deac9afdc2f22b83b9093e4b93
3253c0beae3bdc2d68db7cf52eb4490e17276c58

Binary file not shown.

View File

@@ -527,4 +527,67 @@ TEST_CASE("Transition with list index can be compared to a number", "[silver]")
artboard->draw(renderer.get());
CHECK(silver.matches("transition_index_condition"));
}
TEST_CASE("Listeners are sorted in the right order", "[silver]")
{
SerializingFactory silver;
auto file = ReadRiveFile("assets/sorted_listeners.riv", &silver);
auto artboard = file->artboardDefault();
silver.frameSize(artboard->width(), artboard->height());
auto stateMachine = artboard->stateMachineAt(0);
auto vmi = file->createViewModelInstance(artboard.get());
stateMachine->bindViewModelInstance(vmi);
stateMachine->advanceAndApply(0.0f);
auto renderer = silver.makeRenderer();
artboard->draw(renderer.get());
// Down (Move + Down happen on the same frame, but down happens after move)
silver.addFrame();
stateMachine->pointerDown(Vec2D(250.0f, 250.0f), 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
// Click (Up + Click on same frame, but click happens after up)
silver.addFrame();
stateMachine->pointerUp(Vec2D(250.0f, 250.0f), 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
// Exit
silver.addFrame();
stateMachine->pointerMove(Vec2D(0.0f, 0.0f), 0, 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
// Drag gesture
silver.addFrame();
stateMachine->pointerDown(Vec2D(250.0f, 250.0f), 0);
stateMachine->pointerMove(Vec2D(251.0f, 251.0f), 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
// Up
silver.addFrame();
stateMachine->pointerUp(Vec2D(251.0f, 251.0f), 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
// Exit
silver.addFrame();
stateMachine->pointerMove(Vec2D(0.0f, 0.0f), 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
// (Move): Enter + Move, but move happens after enter
silver.addFrame();
stateMachine->pointerMove(Vec2D(251.0f, 251.0f), 0);
stateMachine->advanceAndApply(0.016f);
artboard->draw(renderer.get());
CHECK(silver.matches("sorted_listeners"));
}

Binary file not shown.