mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
chore: improve mobile slideshow (#28460)
This commit is contained in:
@@ -21,6 +21,7 @@ import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart';
|
|||||||
import 'package:immich_mobile/routing/router.dart';
|
import 'package:immich_mobile/routing/router.dart';
|
||||||
import 'package:immich_mobile/widgets/common/immich_loading_indicator.dart';
|
import 'package:immich_mobile/widgets/common/immich_loading_indicator.dart';
|
||||||
import 'package:immich_mobile/widgets/photo_view/photo_view.dart';
|
import 'package:immich_mobile/widgets/photo_view/photo_view.dart';
|
||||||
|
import 'package:wakelock_plus/wakelock_plus.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class DriftSlideshowPage extends ConsumerStatefulWidget {
|
class DriftSlideshowPage extends ConsumerStatefulWidget {
|
||||||
@@ -33,7 +34,7 @@ class DriftSlideshowPage extends ConsumerStatefulWidget {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
||||||
late final SlideshowConfig _config;
|
late SlideshowConfig _config;
|
||||||
late final PageController _pageController;
|
late final PageController _pageController;
|
||||||
late final Stopwatch _stopwatch;
|
late final Stopwatch _stopwatch;
|
||||||
late Timer _timer;
|
late Timer _timer;
|
||||||
@@ -52,8 +53,10 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
|||||||
_stopwatch = Stopwatch();
|
_stopwatch = Stopwatch();
|
||||||
_createTimer();
|
_createTimer();
|
||||||
_updateNextIndex();
|
_updateNextIndex();
|
||||||
|
ref.listenManual(appConfigProvider.select((s) => s.slideshow), _onConfigChanged);
|
||||||
|
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive);
|
||||||
|
unawaited(WakelockPlus.enable());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -61,6 +64,7 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
|||||||
_timer.cancel();
|
_timer.cancel();
|
||||||
_stopwatch.stop();
|
_stopwatch.stop();
|
||||||
_pageController.dispose();
|
_pageController.dispose();
|
||||||
|
unawaited(WakelockPlus.disable());
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
@@ -98,6 +102,24 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _onConfigChanged(SlideshowConfig? previous, SlideshowConfig next) {
|
||||||
|
if (_config == next) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final durationChanged = _config.duration != next.duration;
|
||||||
|
_config = next;
|
||||||
|
_updateNextIndex();
|
||||||
|
|
||||||
|
final asset = widget.timeline.getAssetSafe(_index);
|
||||||
|
if (durationChanged && !_paused && asset?.isImage == true) {
|
||||||
|
_timer.cancel();
|
||||||
|
_createTimer();
|
||||||
|
}
|
||||||
|
|
||||||
|
setState(() {});
|
||||||
|
}
|
||||||
|
|
||||||
void _updateNextIndex() {
|
void _updateNextIndex() {
|
||||||
_nextIndex = switch (_config.direction) {
|
_nextIndex = switch (_config.direction) {
|
||||||
SlideshowDirection.forward => _index + 1,
|
SlideshowDirection.forward => _index + 1,
|
||||||
@@ -116,6 +138,10 @@ class _DriftSlideshowPageState extends ConsumerState<DriftSlideshowPage> {
|
|||||||
final wrapped = _config.direction == SlideshowDirection.forward ? 0 : widget.timeline.totalAssets - 1;
|
final wrapped = _config.direction == SlideshowDirection.forward ? 0 : widget.timeline.totalAssets - 1;
|
||||||
await widget.timeline.preloadAssets(wrapped);
|
await widget.timeline.preloadAssets(wrapped);
|
||||||
_pageController.jumpToPage(wrapped);
|
_pageController.jumpToPage(wrapped);
|
||||||
|
} else {
|
||||||
|
setState(() {
|
||||||
|
_paused = true;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user