Commit 5c439f2b authored by Hixie's avatar Hixie

Unmatched heroes don't need to animate

By default now heroes won't animate if they don't find a matching hero
on the target page. You can make them animate by setting 'alwaysAnimate:
true' on the Hero constructor.
parent 33c7820d
...@@ -70,6 +70,7 @@ class _HeroManifest { ...@@ -70,6 +70,7 @@ class _HeroManifest {
} }
abstract class HeroHandle { abstract class HeroHandle {
bool get alwaysAnimate;
_HeroManifest _takeChild(Rect animationArea); _HeroManifest _takeChild(Rect animationArea);
} }
...@@ -78,7 +79,8 @@ class Hero extends StatefulComponent { ...@@ -78,7 +79,8 @@ class Hero extends StatefulComponent {
Key key, Key key,
this.tag, this.tag,
this.child, this.child,
this.turns: 1 this.turns: 1,
this.alwaysAnimate: false
}) : super(key: key) { }) : super(key: key) {
assert(tag != null); assert(tag != null);
} }
...@@ -87,6 +89,12 @@ class Hero extends StatefulComponent { ...@@ -87,6 +89,12 @@ class Hero extends StatefulComponent {
final Widget child; final Widget child;
final int turns; final int turns;
/// If true, the hero will always animate, even if it has no matching hero to
/// animate to or from. (This only applies if the hero is relevant; if there
/// are multiple heroes with the same tag, only the one whose key matches the
/// "most valuable keys" will be used.)
final bool alwaysAnimate;
static Map<Object, HeroHandle> of(BuildContext context, Set<Key> mostValuableKeys) { static Map<Object, HeroHandle> of(BuildContext context, Set<Key> mostValuableKeys) {
mostValuableKeys ??= new Set<Key>(); mostValuableKeys ??= new Set<Key>();
assert(!mostValuableKeys.contains(null)); assert(!mostValuableKeys.contains(null));
...@@ -143,6 +151,8 @@ class HeroState extends State<Hero> implements HeroHandle { ...@@ -143,6 +151,8 @@ class HeroState extends State<Hero> implements HeroHandle {
_HeroMode _mode = _HeroMode.constructing; _HeroMode _mode = _HeroMode.constructing;
Size _size; Size _size;
bool get alwaysAnimate => config.alwaysAnimate;
_HeroManifest _takeChild(Rect animationArea) { _HeroManifest _takeChild(Rect animationArea) {
assert(_mode == _HeroMode.measured || _mode == _HeroMode.taken); assert(_mode == _HeroMode.measured || _mode == _HeroMode.taken);
final RenderBox renderObject = context.findRenderObject(); final RenderBox renderObject = context.findRenderObject();
...@@ -235,6 +245,8 @@ class _HeroQuestState implements HeroHandle { ...@@ -235,6 +245,8 @@ class _HeroQuestState implements HeroHandle {
final AnimatedRelativeRectValue currentRect; final AnimatedRelativeRectValue currentRect;
final AnimatedValue<double> currentTurns; final AnimatedValue<double> currentTurns;
bool get alwaysAnimate => true;
bool get taken => _taken; bool get taken => _taken;
bool _taken = false; bool _taken = false;
_HeroManifest _takeChild(Rect animationArea) { _HeroManifest _takeChild(Rect animationArea) {
...@@ -319,6 +331,9 @@ class HeroParty { ...@@ -319,6 +331,9 @@ class HeroParty {
final List<_HeroQuestState> _newHeroes = <_HeroQuestState>[]; final List<_HeroQuestState> _newHeroes = <_HeroQuestState>[];
for (_HeroMatch heroPair in heroes.values) { for (_HeroMatch heroPair in heroes.values) {
assert(heroPair.from != null || heroPair.to != null); assert(heroPair.from != null || heroPair.to != null);
if ((heroPair.from == null && !heroPair.to.alwaysAnimate) ||
(heroPair.to == null && !heroPair.from.alwaysAnimate))
continue;
_HeroManifest from = heroPair.from?._takeChild(animationArea); _HeroManifest from = heroPair.from?._takeChild(animationArea);
assert(heroPair.to == null || heroPair.to is HeroState); assert(heroPair.to == null || heroPair.to is HeroState);
_HeroManifest to = heroPair.to?._takeChild(animationArea); _HeroManifest to = heroPair.to?._takeChild(animationArea);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment