From fee9386d3d351d17ddb64414a4c252d463d3ec4b Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 16 Apr 2021 13:00:14 +0900 Subject: [PATCH] viewer: hide overlay when pressing play --- .../viewer/entry_horizontal_pager.dart | 6 --- lib/widgets/viewer/entry_vertical_pager.dart | 5 +- lib/widgets/viewer/entry_viewer_stack.dart | 49 +++++++++++-------- lib/widgets/viewer/info/info_page.dart | 2 +- .../viewer/info/metadata/xmp_namespaces.dart | 31 ------------ .../viewer/info/metadata/xmp_ns/google.dart | 1 + .../viewer/info/metadata/xmp_ns/xmp.dart | 1 + lib/widgets/viewer/info/notifications.dart | 35 ++++++++++++- lib/widgets/viewer/overlay/notifications.dart | 3 ++ lib/widgets/viewer/overlay/video.dart | 5 ++ .../viewer/visual/entry_page_view.dart | 13 +++-- 11 files changed, 80 insertions(+), 71 deletions(-) create mode 100644 lib/widgets/viewer/overlay/notifications.dart diff --git a/lib/widgets/viewer/entry_horizontal_pager.dart b/lib/widgets/viewer/entry_horizontal_pager.dart index 9721d84be..f688df0c2 100644 --- a/lib/widgets/viewer/entry_horizontal_pager.dart +++ b/lib/widgets/viewer/entry_horizontal_pager.dart @@ -14,7 +14,6 @@ class MultiEntryScroller extends StatefulWidget { final CollectionLens collection; final PageController pageController; final ValueChanged onPageChanged; - final VoidCallback onTap; final List> videoControllers; final List> multiPageControllers; final void Function(String uri) onViewDisposed; @@ -23,7 +22,6 @@ class MultiEntryScroller extends StatefulWidget { this.collection, this.pageController, this.onPageChanged, - this.onTap, this.videoControllers, this.multiPageControllers, this.onViewDisposed, @@ -89,7 +87,6 @@ class _MultiEntryScrollerState extends State with AutomaticK mainEntry: entry, page: page, viewportSize: mqSize, - onTap: widget.onTap == null ? null : (_) => widget.onTap(), videoControllers: widget.videoControllers, onDisposed: () => widget.onViewDisposed?.call(entry.uri), ); @@ -107,13 +104,11 @@ class _MultiEntryScrollerState extends State with AutomaticK class SingleEntryScroller extends StatefulWidget { final AvesEntry entry; - final VoidCallback onTap; final List> videoControllers; final List> multiPageControllers; const SingleEntryScroller({ this.entry, - this.onTap, this.videoControllers, this.multiPageControllers, }); @@ -163,7 +158,6 @@ class _SingleEntryScrollerState extends State with Automati mainEntry: entry, page: page, viewportSize: mqSize, - onTap: widget.onTap == null ? null : (_) => widget.onTap(), videoControllers: widget.videoControllers, ); }, diff --git a/lib/widgets/viewer/entry_vertical_pager.dart b/lib/widgets/viewer/entry_vertical_pager.dart index e2ed06d2e..1732bbe2a 100644 --- a/lib/widgets/viewer/entry_vertical_pager.dart +++ b/lib/widgets/viewer/entry_vertical_pager.dart @@ -20,7 +20,7 @@ class ViewerVerticalPageView extends StatefulWidget { final List> multiPageControllers; final PageController horizontalPager, verticalPager; final void Function(int page) onVerticalPageChanged, onHorizontalPageChanged; - final VoidCallback onImageTap, onImagePageRequested; + final VoidCallback onImagePageRequested; final void Function(String uri) onViewDisposed; const ViewerVerticalPageView({ @@ -32,7 +32,6 @@ class ViewerVerticalPageView extends StatefulWidget { @required this.horizontalPager, @required this.onVerticalPageChanged, @required this.onHorizontalPageChanged, - this.onImageTap, @required this.onImagePageRequested, @required this.onViewDisposed, }); @@ -92,7 +91,6 @@ class _ViewerVerticalPageViewState extends State { ? MultiEntryScroller( collection: collection, pageController: widget.horizontalPager, - onTap: widget.onImageTap, onPageChanged: widget.onHorizontalPageChanged, videoControllers: widget.videoControllers, multiPageControllers: widget.multiPageControllers, @@ -100,7 +98,6 @@ class _ViewerVerticalPageViewState extends State { ) : SingleEntryScroller( entry: entry, - onTap: widget.onImageTap, videoControllers: widget.videoControllers, multiPageControllers: widget.multiPageControllers, ), diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index b1a50090b..c8aa61092 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -19,6 +19,7 @@ import 'package:aves/widgets/viewer/hero.dart'; import 'package:aves/widgets/viewer/info/notifications.dart'; import 'package:aves/widgets/viewer/multipage.dart'; import 'package:aves/widgets/viewer/overlay/bottom.dart'; +import 'package:aves/widgets/viewer/overlay/notifications.dart'; import 'package:aves/widgets/viewer/overlay/panorama.dart'; import 'package:aves/widgets/viewer/overlay/top.dart'; import 'package:aves/widgets/viewer/overlay/video.dart'; @@ -175,7 +176,7 @@ class _EntryViewerStackState extends State with SingleTickerPr value: _heroInfoNotifier, child: NotificationListener( onNotification: (notification) { - if (notification is FilterNotification) { + if (notification is FilterSelectedNotification) { _goToCollection(notification.filter); } else if (notification is ViewStateNotification) { _updateViewState(notification.uri, notification.viewState); @@ -184,25 +185,33 @@ class _EntryViewerStackState extends State with SingleTickerPr } return false; }, - child: Stack( - children: [ - ViewerVerticalPageView( - collection: collection, - entryNotifier: _entryNotifier, - videoControllers: _videoControllers, - multiPageControllers: _multiPageControllers, - verticalPager: _verticalPager, - horizontalPager: _horizontalPager, - onVerticalPageChanged: _onVerticalPageChanged, - onHorizontalPageChanged: _onHorizontalPageChanged, - onImageTap: () => _overlayVisible.value = !_overlayVisible.value, - onImagePageRequested: () => _goToVerticalPage(imagePage), - onViewDisposed: (uri) => _updateViewState(uri, null), - ), - _buildTopOverlay(), - _buildBottomOverlay(), - BottomGestureAreaProtector(), - ], + child: NotificationListener( + onNotification: (notification) { + if (notification is ToggleOverlayNotification) { + _overlayVisible.value = !_overlayVisible.value; + return true; + } + return false; + }, + child: Stack( + children: [ + ViewerVerticalPageView( + collection: collection, + entryNotifier: _entryNotifier, + videoControllers: _videoControllers, + multiPageControllers: _multiPageControllers, + verticalPager: _verticalPager, + horizontalPager: _horizontalPager, + onVerticalPageChanged: _onVerticalPageChanged, + onHorizontalPageChanged: _onHorizontalPageChanged, + onImagePageRequested: () => _goToVerticalPage(imagePage), + onViewDisposed: (uri) => _updateViewState(uri, null), + ), + _buildTopOverlay(), + _buildBottomOverlay(), + BottomGestureAreaProtector(), + ], + ), ), ), ), diff --git a/lib/widgets/viewer/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart index 2724f3d14..741679d17 100644 --- a/lib/widgets/viewer/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -222,6 +222,6 @@ class _InfoPageContentState extends State<_InfoPageContent> { void _goToCollection(CollectionFilter filter) { if (collection == null) return; - FilterNotification(filter).dispatch(context); + FilterSelectedNotification(filter).dispatch(context); } } diff --git a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart index d7f1cb1a6..7ee8a308f 100644 --- a/lib/widgets/viewer/info/metadata/xmp_namespaces.dart +++ b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart @@ -116,34 +116,3 @@ class XmpProp { @override String toString() => '$runtimeType#${shortHash(this)}{path=$path, value=$value}'; } - -enum EmbeddedDataSource { videoCover, xmp } - -class OpenEmbeddedDataNotification extends Notification { - final EmbeddedDataSource source; - final String propPath; - final String mimeType; - - const OpenEmbeddedDataNotification._private({ - @required this.source, - this.propPath, - this.mimeType, - }); - - factory OpenEmbeddedDataNotification.videoCover() => OpenEmbeddedDataNotification._private( - source: EmbeddedDataSource.videoCover, - ); - - factory OpenEmbeddedDataNotification.xmp({ - @required String propPath, - @required String mimeType, - }) => - OpenEmbeddedDataNotification._private( - source: EmbeddedDataSource.xmp, - propPath: propPath, - mimeType: mimeType, - ); - - @override - String toString() => '$runtimeType#${shortHash(this)}{source=$source, propPath=$propPath, mimeType=$mimeType}'; -} diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart index 331ad11ae..1e7e82808 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/google.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart @@ -1,6 +1,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/notifications.dart'; import 'package:tuple/tuple.dart'; abstract class XmpGoogleNamespace extends XmpNamespace { diff --git a/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart index 1db5e44ea..ce6459333 100644 --- a/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart @@ -3,6 +3,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/viewer/info/common.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; import 'package:aves/widgets/viewer/info/metadata/xmp_structs.dart'; +import 'package:aves/widgets/viewer/info/notifications.dart'; import 'package:flutter/material.dart'; class XmpBasicNamespace extends XmpNamespace { diff --git a/lib/widgets/viewer/info/notifications.dart b/lib/widgets/viewer/info/notifications.dart index ed2da66ce..fffebe903 100644 --- a/lib/widgets/viewer/info/notifications.dart +++ b/lib/widgets/viewer/info/notifications.dart @@ -5,10 +5,10 @@ import 'package:flutter/material.dart'; class BackUpNotification extends Notification {} -class FilterNotification extends Notification { +class FilterSelectedNotification extends Notification { final CollectionFilter filter; - const FilterNotification(this.filter); + const FilterSelectedNotification(this.filter); } class EntryDeletedNotification extends Notification { @@ -27,3 +27,34 @@ class OpenTempEntryNotification extends Notification { @override String toString() => '$runtimeType#${shortHash(this)}{entry=$entry}'; } + +enum EmbeddedDataSource { videoCover, xmp } + +class OpenEmbeddedDataNotification extends Notification { + final EmbeddedDataSource source; + final String propPath; + final String mimeType; + + const OpenEmbeddedDataNotification._private({ + @required this.source, + this.propPath, + this.mimeType, + }); + + factory OpenEmbeddedDataNotification.videoCover() => OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.videoCover, + ); + + factory OpenEmbeddedDataNotification.xmp({ + @required String propPath, + @required String mimeType, + }) => + OpenEmbeddedDataNotification._private( + source: EmbeddedDataSource.xmp, + propPath: propPath, + mimeType: mimeType, + ); + + @override + String toString() => '$runtimeType#${shortHash(this)}{source=$source, propPath=$propPath, mimeType=$mimeType}'; +} diff --git a/lib/widgets/viewer/overlay/notifications.dart b/lib/widgets/viewer/overlay/notifications.dart new file mode 100644 index 000000000..0d9f733e7 --- /dev/null +++ b/lib/widgets/viewer/overlay/notifications.dart @@ -0,0 +1,3 @@ +import 'package:flutter/material.dart'; + +class ToggleOverlayNotification extends Notification {} diff --git a/lib/widgets/viewer/overlay/video.dart b/lib/widgets/viewer/overlay/video.dart index aeafd7123..6ab8cd8a9 100644 --- a/lib/widgets/viewer/overlay/video.dart +++ b/lib/widgets/viewer/overlay/video.dart @@ -10,6 +10,7 @@ import 'package:aves/widgets/common/fx/blurred.dart'; import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/common/video/controller.dart'; import 'package:aves/widgets/viewer/overlay/common.dart'; +import 'package:aves/widgets/viewer/overlay/notifications.dart'; import 'package:flutter/material.dart'; class VideoControlOverlay extends StatefulWidget { @@ -209,6 +210,10 @@ class _VideoControlOverlayState extends State with SingleTi } else { await controller.setDataSource(entry.uri); } + + // hide overlay + await Future.delayed(Durations.iconAnimation); + ToggleOverlayNotification().dispatch(context); } void _updatePlayPauseIcon() { diff --git a/lib/widgets/viewer/visual/entry_page_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart index d439106c5..854b01390 100644 --- a/lib/widgets/viewer/visual/entry_page_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -14,6 +14,7 @@ import 'package:aves/widgets/common/magnifier/scale/scale_level.dart'; import 'package:aves/widgets/common/magnifier/scale/state.dart'; import 'package:aves/widgets/common/video/controller.dart'; import 'package:aves/widgets/viewer/hero.dart'; +import 'package:aves/widgets/viewer/overlay/notifications.dart'; import 'package:aves/widgets/viewer/visual/error.dart'; import 'package:aves/widgets/viewer/visual/raster.dart'; import 'package:aves/widgets/viewer/visual/state.dart'; @@ -30,7 +31,6 @@ class EntryPageView extends StatefulWidget { final AvesEntry entry; final SinglePageInfo page; final Size viewportSize; - final MagnifierTapCallback onTap; final List> videoControllers; final VoidCallback onDisposed; @@ -41,7 +41,6 @@ class EntryPageView extends StatefulWidget { this.mainEntry, this.page, this.viewportSize, - @required this.onTap, @required this.videoControllers, this.onDisposed, }) : entry = mainEntry.getPageEntry(page) ?? mainEntry, @@ -62,8 +61,6 @@ class _EntryPageViewState extends State { Size get viewportSize => widget.viewportSize; - MagnifierTapCallback get onTap => widget.onTap; - static const initialScale = ScaleLevel(ref: ScaleReference.contained); static const minScale = ScaleLevel(ref: ScaleReference.contained); static const maxScale = ScaleLevel(factor: 2.0); @@ -138,7 +135,7 @@ class _EntryPageViewState extends State { } child ??= ErrorView( entry: entry, - onTap: onTap == null ? null : () => onTap(null), + onTap: _onTap, ); return child; }, @@ -162,7 +159,7 @@ class _EntryPageViewState extends State { viewStateNotifier: _viewStateNotifier, errorBuilder: (context, error, stackTrace) => ErrorView( entry: entry, - onTap: () => onTap?.call(null), + onTap: _onTap, ), ), ); @@ -221,11 +218,13 @@ class _EntryPageViewState extends State { initialScale: initialScale, scaleStateCycle: scaleStateCycle, applyScale: applyScale, - onTap: onTap == null ? null : (c, d, s, childPosition) => onTap(childPosition), + onTap: (c, d, s, o) => _onTap(), child: child, ); } + void _onTap() => ToggleOverlayNotification().dispatch(context); + void _onViewStateChanged(MagnifierState v) { final current = _viewStateNotifier.value; final viewState = ViewState(v.position, v.scale, current.viewportSize);