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
|
- support for animated PNG
|
||||||
- Info: added day filter with item date
|
- Info: added day filter with item date
|
||||||
- Widget: option to update image on tap
|
- Widget: option to update image on tap
|
||||||
|
- Slideshow / Screen saver: option for random transition
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:aves/widgets/viewer/controls/controller.dart';
|
import 'package:aves/widgets/viewer/controls/controller.dart';
|
||||||
import 'package:aves_model/aves_model.dart';
|
import 'package:aves_model/aves_model.dart';
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
|
|
||||||
extension ExtraViewerTransition on ViewerTransition {
|
extension ExtraViewerTransition on ViewerTransition {
|
||||||
|
@ -15,6 +18,46 @@ extension ExtraViewerTransition on ViewerTransition {
|
||||||
return PageTransitionEffects.fade(pageController, index, zoomIn: true);
|
return PageTransitionEffects.fade(pageController, index, zoomIn: true);
|
||||||
case ViewerTransition.none:
|
case ViewerTransition.none:
|
||||||
return PageTransitionEffects.none(pageController, index);
|
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;
|
return context.l10n.viewerTransitionZoomIn;
|
||||||
case ViewerTransition.none:
|
case ViewerTransition.none:
|
||||||
return context.l10n.viewerTransitionNone;
|
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 VideoResumptionMode { never, ask, always }
|
||||||
|
|
||||||
enum ViewerTransition { slide, parallax, fade, zoomIn, none }
|
enum ViewerTransition { slide, parallax, fade, zoomIn, none, random }
|
||||||
|
|
||||||
enum WidgetDisplayedItem { random, mostRecent }
|
enum WidgetDisplayedItem { random, mostRecent }
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue