63 lines
2.3 KiB
Dart
63 lines
2.3 KiB
Dart
import 'dart:math';
|
|
|
|
import 'package:aves/widgets/viewer/controls/transitions.dart';
|
|
import 'package:aves_model/aves_model.dart';
|
|
import 'package:collection/collection.dart';
|
|
import 'package:flutter/widgets.dart';
|
|
|
|
extension ExtraViewerTransition on ViewerTransition {
|
|
TransitionBuilder builder(PageController pageController, int index) {
|
|
switch (this) {
|
|
case ViewerTransition.slide:
|
|
return PageTransitionEffects.slide(pageController, index, parallax: false);
|
|
case ViewerTransition.parallax:
|
|
return PageTransitionEffects.slide(pageController, index, parallax: true);
|
|
case ViewerTransition.fade:
|
|
return PageTransitionEffects.fade(pageController, index, zoomIn: false);
|
|
case ViewerTransition.zoomIn:
|
|
return PageTransitionEffects.fade(pageController, index, zoomIn: true);
|
|
case ViewerTransition.none:
|
|
return PageTransitionEffects.none(pageController, index);
|
|
case ViewerTransition.random:
|
|
return _ViewerTransitionRandomizer.getBuilder(pageController, index);
|
|
}
|
|
}
|
|
}
|
|
|
|
class _ViewerTransitionRandomizer {
|
|
static const options = [
|
|
ViewerTransition.slide,
|
|
ViewerTransition.parallax,
|
|
ViewerTransition.fade,
|
|
ViewerTransition.zoomIn,
|
|
];
|
|
|
|
static final List<(int, ViewerTransition)> _indexedTransitions = [];
|
|
|
|
static TransitionBuilder getBuilder(
|
|
PageController pageController,
|
|
int index,
|
|
) =>
|
|
(context, child) {
|
|
final negative = pageController.hasClients && pageController.position.haveDimensions && (pageController.page! - index).isNegative;
|
|
final transition = _getTransition(negative ? index - 1 : index);
|
|
final builder = transition.builder(pageController, index);
|
|
return builder(context, child);
|
|
};
|
|
|
|
static ViewerTransition _getTransition(int transitionIndex) {
|
|
var indexedTransition = _indexedTransitions.firstWhereOrNull((v) => v.$1 == transitionIndex);
|
|
if (indexedTransition != null) {
|
|
_indexedTransitions.remove(indexedTransition);
|
|
} else {
|
|
indexedTransition = (transitionIndex, options[Random().nextInt(options.length)]);
|
|
}
|
|
_indexedTransitions.insert(0, indexedTransition);
|
|
while (_indexedTransitions.length > 3) {
|
|
_indexedTransitions.removeLast();
|
|
}
|
|
|
|
final (_, transition) = indexedTransition;
|
|
return transition;
|
|
}
|
|
}
|