diff --git a/lib/src/core/core.dart b/lib/src/core/core.dart index afc3610..330f3b6 100644 --- a/lib/src/core/core.dart +++ b/lib/src/core/core.dart @@ -1,7 +1,6 @@ import 'dart:collection'; import 'package:rive/src/rive_core/runtime/exceptions/rive_format_error_exception.dart'; - export 'package:rive/src/animation_list.dart'; export 'package:rive/src/state_machine_components.dart'; export 'package:rive/src/state_transition_conditions.dart'; @@ -61,7 +60,40 @@ abstract class CoreContext { // ignore: one_member_abstracts abstract class ImportStackObject { - bool resolve(); + final _resolveBefore = {}; + bool _resolved = false; + + bool initStack(ImportStack stack) { + var type = resolvesBefore; + if (type == -1) { + return true; + } + var importer = stack.latest(type); + if (importer == null) { + return false; + } + importer._resolveBefore.add(this); + return true; + } + + int get resolvesBefore => -1; + + bool _internalResolve() { + if (_resolved) { + return true; + } + _resolved = true; + if (_resolveBefore.isNotEmpty) { + for (final before in _resolveBefore) { + if (!before._internalResolve()) { + return false; + } + } + } + return resolve(); + } + + bool resolve() => true; } /// Stack to help the RiveFile locate latest ImportStackObject created of a @@ -89,11 +121,11 @@ class ImportStack { bool makeLatest(int coreType, ImportStackObject? importObject) { var latest = _latests[coreType]; if (latest != null) { - if (!latest.resolve()) { + if (!latest._internalResolve()) { return false; } } - if (importObject != null) { + if (importObject != null && importObject.initStack(this)) { _latests[coreType] = importObject; } else { _latests.remove(coreType); @@ -103,7 +135,7 @@ class ImportStack { bool resolve() { for (final object in _latests.values) { - if (!object.resolve()) { + if (!object._internalResolve()) { return false; } } diff --git a/lib/src/core/importers/artboard_import_stack_object.dart b/lib/src/core/importers/artboard_import_stack_object.dart new file mode 100644 index 0000000..3011e68 --- /dev/null +++ b/lib/src/core/importers/artboard_import_stack_object.dart @@ -0,0 +1,8 @@ +import 'package:rive/src/core/core.dart'; +import 'package:rive/src/rive_core/artboard.dart'; + +/// An importer that will always resolve with the artboard importer. +abstract class ArtboardImportStackObject extends ImportStackObject { + @override + int get resolvesBefore => ArtboardBase.typeKey; +} diff --git a/lib/src/core/importers/keyed_object_importer.dart b/lib/src/core/importers/keyed_object_importer.dart index 67d990c..a931f7f 100644 --- a/lib/src/core/importers/keyed_object_importer.dart +++ b/lib/src/core/importers/keyed_object_importer.dart @@ -1,8 +1,8 @@ -import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; import 'package:rive/src/rive_core/animation/keyed_property.dart'; -class KeyedObjectImporter extends ImportStackObject { +class KeyedObjectImporter extends ArtboardImportStackObject { final KeyedObject keyedObject; KeyedObjectImporter(this.keyedObject); @@ -11,7 +11,4 @@ class KeyedObjectImporter extends ImportStackObject { keyedObject.context.addObject(property); keyedObject.internalAddKeyedProperty(property); } - - @override - bool resolve() => true; } diff --git a/lib/src/core/importers/keyed_property_importer.dart b/lib/src/core/importers/keyed_property_importer.dart index 1d9d7c2..595aee1 100644 --- a/lib/src/core/importers/keyed_property_importer.dart +++ b/lib/src/core/importers/keyed_property_importer.dart @@ -1,9 +1,9 @@ -import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; import 'package:rive/src/rive_core/animation/keyed_property.dart'; import 'package:rive/src/rive_core/animation/keyframe.dart'; import 'package:rive/src/rive_core/animation/linear_animation.dart'; -class KeyedPropertyImporter extends ImportStackObject { +class KeyedPropertyImporter extends ArtboardImportStackObject { final KeyedProperty keyedProperty; final LinearAnimation animation; @@ -14,7 +14,4 @@ class KeyedPropertyImporter extends ImportStackObject { keyedProperty.internalAddKeyFrame(keyFrame); keyFrame.computeSeconds(animation); } - - @override - bool resolve() => true; } diff --git a/lib/src/core/importers/layer_state_importer.dart b/lib/src/core/importers/layer_state_importer.dart index 5ca93d2..e06088c 100644 --- a/lib/src/core/importers/layer_state_importer.dart +++ b/lib/src/core/importers/layer_state_importer.dart @@ -1,8 +1,8 @@ -import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; import 'package:rive/src/rive_core/animation/layer_state.dart'; import 'package:rive/src/rive_core/animation/state_transition.dart'; -class LayerStateImporter extends ImportStackObject { +class LayerStateImporter extends ArtboardImportStackObject { final LayerState state; LayerStateImporter(this.state); @@ -10,7 +10,4 @@ class LayerStateImporter extends ImportStackObject { state.context.addObject(transition); state.internalAddTransition(transition); } - - @override - bool resolve() => true; } diff --git a/lib/src/core/importers/linear_animation_importer.dart b/lib/src/core/importers/linear_animation_importer.dart index 999b55c..1863596 100644 --- a/lib/src/core/importers/linear_animation_importer.dart +++ b/lib/src/core/importers/linear_animation_importer.dart @@ -1,25 +1,13 @@ import 'package:rive/rive.dart'; -import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; import 'package:rive/src/rive_core/animation/keyed_object.dart'; -class LinearAnimationImporter extends ImportStackObject { +class LinearAnimationImporter extends ArtboardImportStackObject { final LinearAnimation linearAnimation; - // final keyedObjects = []; - LinearAnimationImporter(this.linearAnimation); void addKeyedObject(KeyedObject object) { linearAnimation.context.addObject(object); - - // keyedObjects.add(object); linearAnimation.internalAddKeyedObject(object); } - - @override - bool resolve() { - // for (final keyedObject in keyedObjects) { - // keyedObject.objectId ??= linearAnimation.artboard.id; - // } - return true; - } } diff --git a/lib/src/core/importers/state_machine_importer.dart b/lib/src/core/importers/state_machine_importer.dart index 881a6dd..3c408a4 100644 --- a/lib/src/core/importers/state_machine_importer.dart +++ b/lib/src/core/importers/state_machine_importer.dart @@ -1,8 +1,8 @@ -import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; import 'package:rive/src/rive_core/animation/state_machine.dart'; import 'package:rive/src/rive_core/animation/state_machine_component.dart'; -class StateMachineImporter extends ImportStackObject { +class StateMachineImporter extends ArtboardImportStackObject { final StateMachine machine; StateMachineImporter(this.machine); @@ -10,7 +10,4 @@ class StateMachineImporter extends ImportStackObject { machine.context.addObject(object); object.stateMachine = machine; } - - @override - bool resolve() => true; } diff --git a/lib/src/core/importers/state_machine_layer_importer.dart b/lib/src/core/importers/state_machine_layer_importer.dart index ff358db..1c4f56f 100644 --- a/lib/src/core/importers/state_machine_layer_importer.dart +++ b/lib/src/core/importers/state_machine_layer_importer.dart @@ -1,3 +1,4 @@ +import 'package:rive/rive.dart'; import 'package:rive/src/core/core.dart'; import 'package:rive/src/rive_core/animation/animation_state.dart'; import 'package:rive/src/rive_core/animation/layer_state.dart'; @@ -17,6 +18,9 @@ class StateMachineLayerImporter extends ImportStackObject { layer.internalAddState(state); } + @override + int get resolvesBefore => StateMachineBase.typeKey; + bool _resolved = false; @override bool resolve() { @@ -36,7 +40,6 @@ class StateMachineLayerImporter extends ImportStackObject { // entire artboard imports. assert(transition.stateToId >= 0 && transition.stateToId < importedStates.length); - // transition.stateToId = importedStates[transition.stateToId].id; transition.stateTo = importedStates[transition.stateToId]; } } diff --git a/lib/src/core/importers/state_transition_importer.dart b/lib/src/core/importers/state_transition_importer.dart index 416343f..f952760 100644 --- a/lib/src/core/importers/state_transition_importer.dart +++ b/lib/src/core/importers/state_transition_importer.dart @@ -1,8 +1,9 @@ import 'package:rive/src/core/core.dart'; +import 'package:rive/src/core/importers/artboard_import_stack_object.dart'; import 'package:rive/src/rive_core/animation/state_transition.dart'; import 'package:rive/src/rive_core/animation/transition_condition.dart'; -class StateTransitionImporter extends ImportStackObject { +class StateTransitionImporter extends ArtboardImportStackObject { final StateMachineImporter stateMachineImporter; final StateTransition transition; StateTransitionImporter(this.transition, this.stateMachineImporter);