aves/lib/model/settings/enums/viewer_transition.dart
2023-12-29 23:57:58 +01:00

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;
}
}