viewer: option for random transition
This commit is contained in:
parent
6968e673c7
commit
6172a601c6
4 changed files with 47 additions and 1 deletions
|
@ -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
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 }
|
||||
|
||||
|
|
Loading…
Reference in a new issue