viewer: option for random transition

This commit is contained in:
Thibault Deckers 2023-05-15 20:07:32 +02:00
parent 6968e673c7
commit 6172a601c6
4 changed files with 47 additions and 1 deletions

View file

@ -10,6 +10,7 @@ All notable changes to this project will be documented in this file.
- support for animated PNG
- Info: added day filter with item date
- Widget: option to update image on tap
- Slideshow / Screen saver: option for random transition
### Changed

View file

@ -1,5 +1,8 @@
import 'dart:math';
import 'package:aves/widgets/viewer/controls/controller.dart';
import 'package:aves_model/aves_model.dart';
import 'package:collection/collection.dart';
import 'package:flutter/widgets.dart';
extension ExtraViewerTransition on ViewerTransition {
@ -15,6 +18,46 @@ extension ExtraViewerTransition on ViewerTransition {
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;
}
}

View file

@ -251,6 +251,8 @@ extension ExtraViewerTransitionView on ViewerTransition {
return context.l10n.viewerTransitionZoomIn;
case ViewerTransition.none:
return context.l10n.viewerTransitionNone;
case ViewerTransition.random:
return context.l10n.widgetDisplayedItemRandom;
}
}
}

View file

@ -40,7 +40,7 @@ enum VideoLoopMode { never, shortOnly, always }
enum VideoResumptionMode { never, ask, always }
enum ViewerTransition { slide, parallax, fade, zoomIn, none }
enum ViewerTransition { slide, parallax, fade, zoomIn, none, random }
enum WidgetDisplayedItem { random, mostRecent }