diff --git a/lib/model/settings/screen_on.dart b/lib/model/settings/screen_on.dart index c07924d73..dfb11e633 100644 --- a/lib/model/settings/screen_on.dart +++ b/lib/model/settings/screen_on.dart @@ -1,13 +1,13 @@ import 'package:screen/screen.dart'; -enum KeepScreenOn { never, fullscreenOnly, always } +enum KeepScreenOn { never, viewerOnly, always } extension ExtraKeepScreenOn on KeepScreenOn { String get name { switch (this) { case KeepScreenOn.never: return 'Never'; - case KeepScreenOn.fullscreenOnly: + case KeepScreenOn.viewerOnly: return 'Viewer page only'; case KeepScreenOn.always: return 'Always'; diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 7e39a0ca8..5ccc1f7ea 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -3,7 +3,7 @@ import 'package:aves/model/settings/coordinate_format.dart'; import 'package:aves/model/settings/entry_background.dart'; import 'package:aves/model/settings/home_page.dart'; import 'package:aves/model/settings/screen_on.dart'; -import 'package:aves/widgets/fullscreen/info/location_section.dart'; +import 'package:aves/widgets/viewer/info/location_section.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; @@ -99,7 +99,7 @@ class Settings extends ChangeNotifier { set mustBackTwiceToExit(bool newValue) => setAndNotify(mustBackTwiceToExitKey, newValue); - KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, KeepScreenOn.fullscreenOnly, KeepScreenOn.values); + KeepScreenOn get keepScreenOn => getEnumOrDefault(keepScreenOnKey, KeepScreenOn.viewerOnly, KeepScreenOn.values); set keepScreenOn(KeepScreenOn newValue) { setAndNotify(keepScreenOnKey, newValue.toString()); diff --git a/lib/widgets/collection/grid/list_sliver.dart b/lib/widgets/collection/grid/list_sliver.dart index 9d3189382..46c83d3ee 100644 --- a/lib/widgets/collection/grid/list_sliver.dart +++ b/lib/widgets/collection/grid/list_sliver.dart @@ -7,7 +7,7 @@ import 'package:aves/widgets/collection/grid/list_section_layout.dart'; import 'package:aves/widgets/collection/thumbnail/decorated.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/scaling.dart'; -import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -57,7 +57,7 @@ class GridThumbnail extends StatelessWidget { onTap: () { if (AvesApp.mode == AppMode.main) { if (collection.isBrowsing) { - _goToFullscreen(context); + _goToViewer(context); } else if (collection.isSelecting) { collection.toggleSelection(entry); } @@ -77,12 +77,12 @@ class GridThumbnail extends StatelessWidget { ); } - void _goToFullscreen(BuildContext context) { + void _goToViewer(BuildContext context) { Navigator.push( context, TransparentMaterialPageRoute( - settings: RouteSettings(name: MultiFullscreenPage.routeName), - pageBuilder: (c, a, sa) => MultiFullscreenPage( + settings: RouteSettings(name: MultiEntryViewerPage.routeName), + pageBuilder: (c, a, sa) => MultiEntryViewerPage( collection: collection, initialEntry: entry, ), diff --git a/lib/widgets/common/magnifier/core/core.dart b/lib/widgets/common/magnifier/core/core.dart index 441fe2c99..047a1a6eb 100644 --- a/lib/widgets/common/magnifier/core/core.dart +++ b/lib/widgets/common/magnifier/core/core.dart @@ -35,11 +35,11 @@ class MagnifierCore extends StatefulWidget { @override State createState() { - return MagnifierCoreState(); + return _MagnifierCoreState(); } } -class MagnifierCoreState extends State with TickerProviderStateMixin, MagnifierControllerDelegate, CornerHitDetector { +class _MagnifierCoreState extends State with TickerProviderStateMixin, MagnifierControllerDelegate, CornerHitDetector { Offset _startFocalPoint, _lastViewportFocalPosition; double _startScale, _quickScaleLastY, _quickScaleLastDistance; bool _doubleTap, _quickScaleMoved; diff --git a/lib/widgets/common/magnifier/magnifier.dart b/lib/widgets/common/magnifier/magnifier.dart index a4ee16699..e73bebbde 100644 --- a/lib/widgets/common/magnifier/magnifier.dart +++ b/lib/widgets/common/magnifier/magnifier.dart @@ -106,7 +106,7 @@ class _MagnifierState extends State { widget.maxScale ?? ScaleLevel(factor: double.infinity), widget.initialScale ?? ScaleLevel(ref: ScaleReference.contained), constraints.biggest, - widget.childSize?.isEmpty == true ? constraints.biggest: widget.childSize, + widget.childSize?.isEmpty == true ? constraints.biggest : widget.childSize, )); return MagnifierCore( diff --git a/lib/widgets/debug/android_dirs.dart b/lib/widgets/debug/android_dirs.dart index 9f2f02129..3731170fe 100644 --- a/lib/widgets/debug/android_dirs.dart +++ b/lib/widgets/debug/android_dirs.dart @@ -2,7 +2,7 @@ import 'dart:collection'; import 'package:aves/services/android_debug_service.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class DebugAndroidDirSection extends StatefulWidget { diff --git a/lib/widgets/debug/android_env.dart b/lib/widgets/debug/android_env.dart index b831572b0..0600393dd 100644 --- a/lib/widgets/debug/android_env.dart +++ b/lib/widgets/debug/android_env.dart @@ -2,7 +2,7 @@ import 'dart:collection'; import 'package:aves/services/android_debug_service.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class DebugAndroidEnvironmentSection extends StatefulWidget { diff --git a/lib/widgets/debug/app_debug_page.dart b/lib/widgets/debug/app_debug_page.dart index dd4fe617e..09626c721 100644 --- a/lib/widgets/debug/app_debug_page.dart +++ b/lib/widgets/debug/app_debug_page.dart @@ -10,7 +10,7 @@ import 'package:aves/widgets/debug/firebase.dart'; import 'package:aves/widgets/debug/overlay.dart'; import 'package:aves/widgets/debug/settings.dart'; import 'package:aves/widgets/debug/storage.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -22,10 +22,10 @@ class AppDebugPage extends StatefulWidget { const AppDebugPage({this.source}); @override - State createState() => AppDebugPageState(); + State createState() => _AppDebugPageState(); } -class AppDebugPageState extends State { +class _AppDebugPageState extends State { List get entries => widget.source.rawEntries; static OverlayEntry _taskQueueOverlayEntry; diff --git a/lib/widgets/debug/firebase.dart b/lib/widgets/debug/firebase.dart index 9551cbfe1..c1069f07e 100644 --- a/lib/widgets/debug/firebase.dart +++ b/lib/widgets/debug/firebase.dart @@ -1,5 +1,5 @@ import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:firebase_core/firebase_core.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; diff --git a/lib/widgets/debug/settings.dart b/lib/widgets/debug/settings.dart index d3a1a7ce4..c6ff629c0 100644 --- a/lib/widgets/debug/settings.dart +++ b/lib/widgets/debug/settings.dart @@ -4,7 +4,7 @@ import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; import 'package:aves/widgets/filter_grids/countries_page.dart'; import 'package:aves/widgets/filter_grids/tags_page.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; diff --git a/lib/widgets/debug/storage.dart b/lib/widgets/debug/storage.dart index 2c22b29f9..d684157bd 100644 --- a/lib/widgets/debug/storage.dart +++ b/lib/widgets/debug/storage.dart @@ -2,7 +2,7 @@ import 'package:aves/services/android_file_service.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class DebugStorageSection extends StatefulWidget { diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index d2d19c90d..e7ba1d8ef 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -12,7 +12,7 @@ import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/filter_grids/albums_page.dart'; -import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; import 'package:aves/widgets/search/search_delegate.dart'; import 'package:aves/widgets/search/search_page.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; @@ -121,8 +121,8 @@ class _HomePageState extends State { Route _getRedirectRoute() { if (AvesApp.mode == AppMode.view) { return DirectMaterialPageRoute( - settings: RouteSettings(name: SingleFullscreenPage.routeName), - builder: (_) => SingleFullscreenPage(entry: _viewerEntry), + settings: RouteSettings(name: SingleEntryViewerPage.routeName), + builder: (_) => SingleEntryViewerPage(entry: _viewerEntry), ); } diff --git a/lib/widgets/fullscreen/debug/db.dart b/lib/widgets/viewer/debug/db.dart similarity index 98% rename from lib/widgets/fullscreen/debug/db.dart rename to lib/widgets/viewer/debug/db.dart index 745368d1d..641ee2709 100644 --- a/lib/widgets/fullscreen/debug/db.dart +++ b/lib/widgets/viewer/debug/db.dart @@ -1,7 +1,7 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/image_metadata.dart'; import 'package:aves/model/metadata_db.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class DbTab extends StatefulWidget { diff --git a/lib/widgets/fullscreen/debug/metadata.dart b/lib/widgets/viewer/debug/metadata.dart similarity index 98% rename from lib/widgets/fullscreen/debug/metadata.dart rename to lib/widgets/viewer/debug/metadata.dart index fe655bdff..075cde487 100644 --- a/lib/widgets/fullscreen/debug/metadata.dart +++ b/lib/widgets/viewer/debug/metadata.dart @@ -6,7 +6,7 @@ import 'package:aves/ref/mime_types.dart'; import 'package:aves/services/android_debug_service.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class MetadataTab extends StatefulWidget { diff --git a/lib/widgets/fullscreen/fullscreen_debug_page.dart b/lib/widgets/viewer/debug_page.dart similarity index 93% rename from lib/widgets/fullscreen/fullscreen_debug_page.dart rename to lib/widgets/viewer/debug_page.dart index 8371b67e3..21b2aa728 100644 --- a/lib/widgets/fullscreen/fullscreen_debug_page.dart +++ b/lib/widgets/viewer/debug_page.dart @@ -3,19 +3,19 @@ import 'package:aves/image_providers/uri_picture_provider.dart'; import 'package:aves/main.dart'; import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/widgets/fullscreen/debug/db.dart'; -import 'package:aves/widgets/fullscreen/debug/metadata.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/debug/db.dart'; +import 'package:aves/widgets/viewer/debug/metadata.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:tuple/tuple.dart'; -class FullscreenDebugPage extends StatelessWidget { - static const routeName = '/fullscreen/debug'; +class ViewerDebugPage extends StatelessWidget { + static const routeName = '/viewer/debug'; final ImageEntry entry; - const FullscreenDebugPage({@required this.entry}); + const ViewerDebugPage({@required this.entry}); @override Widget build(BuildContext context) { diff --git a/lib/widgets/fullscreen/entry_action_delegate.dart b/lib/widgets/viewer/entry_action_delegate.dart similarity index 94% rename from lib/widgets/fullscreen/entry_action_delegate.dart rename to lib/widgets/viewer/entry_action_delegate.dart index 75b818390..1b95e87bd 100644 --- a/lib/widgets/fullscreen/entry_action_delegate.dart +++ b/lib/widgets/viewer/entry_action_delegate.dart @@ -9,9 +9,9 @@ import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/permission_aware.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/rename_entry_dialog.dart'; -import 'package:aves/widgets/fullscreen/fullscreen_debug_page.dart'; -import 'package:aves/widgets/fullscreen/printing.dart'; -import 'package:aves/widgets/fullscreen/source_viewer_page.dart'; +import 'package:aves/widgets/viewer/debug_page.dart'; +import 'package:aves/widgets/viewer/printer.dart'; +import 'package:aves/widgets/viewer/source_viewer_page.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:flutter/services.dart'; @@ -168,8 +168,8 @@ class EntryActionDelegate with FeedbackMixin, PermissionAwareMixin { Navigator.push( context, MaterialPageRoute( - settings: RouteSettings(name: FullscreenDebugPage.routeName), - builder: (context) => FullscreenDebugPage(entry: entry), + settings: RouteSettings(name: ViewerDebugPage.routeName), + builder: (context) => ViewerDebugPage(entry: entry), ), ); } diff --git a/lib/widgets/fullscreen/image_page.dart b/lib/widgets/viewer/entry_scroller.dart similarity index 84% rename from lib/widgets/fullscreen/image_page.dart rename to lib/widgets/viewer/entry_scroller.dart index 80c195355..58b799a9d 100644 --- a/lib/widgets/fullscreen/image_page.dart +++ b/lib/widgets/viewer/entry_scroller.dart @@ -3,13 +3,13 @@ import 'package:aves/model/multipage.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/common/magnifier/pan/gesture_detector_scope.dart'; import 'package:aves/widgets/common/magnifier/pan/scroll_physics.dart'; -import 'package:aves/widgets/fullscreen/image_view.dart'; -import 'package:aves/widgets/fullscreen/multipage_controller.dart'; +import 'package:aves/widgets/viewer/multipage.dart'; +import 'package:aves/widgets/viewer/visual/entry_page_view.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; import 'package:tuple/tuple.dart'; -class MultiImagePage extends StatefulWidget { +class MultiEntryScroller extends StatefulWidget { final CollectionLens collection; final PageController pageController; final ValueChanged onPageChanged; @@ -18,7 +18,7 @@ class MultiImagePage extends StatefulWidget { final List> multiPageControllers; final void Function(String uri) onViewDisposed; - const MultiImagePage({ + const MultiEntryScroller({ this.collection, this.pageController, this.onPageChanged, @@ -29,10 +29,10 @@ class MultiImagePage extends StatefulWidget { }); @override - State createState() => MultiImagePageState(); + State createState() => _MultiEntryScrollerState(); } -class MultiImagePageState extends State with AutomaticKeepAliveClientMixin { +class _MultiEntryScrollerState extends State with AutomaticKeepAliveClientMixin { List get entries => widget.collection.sortedEntries; @override @@ -79,8 +79,8 @@ class MultiImagePageState extends State with AutomaticKeepAliveC ); } - ImageView _buildViewer(ImageEntry entry, {MultiPageInfo multiPageInfo, int page = 0}) { - return ImageView( + EntryPageView _buildViewer(ImageEntry entry, {MultiPageInfo multiPageInfo, int page = 0}) { + return EntryPageView( key: Key('imageview'), entry: entry, multiPageInfo: multiPageInfo, @@ -100,13 +100,13 @@ class MultiImagePageState extends State with AutomaticKeepAliveC bool get wantKeepAlive => true; } -class SingleImagePage extends StatefulWidget { +class SingleEntryScroller extends StatefulWidget { final ImageEntry entry; final VoidCallback onTap; final List> videoControllers; final List> multiPageControllers; - const SingleImagePage({ + const SingleEntryScroller({ this.entry, this.onTap, this.videoControllers, @@ -114,10 +114,10 @@ class SingleImagePage extends StatefulWidget { }); @override - State createState() => SingleImagePageState(); + State createState() => _SingleEntryScrollerState(); } -class SingleImagePageState extends State with AutomaticKeepAliveClientMixin { +class _SingleEntryScrollerState extends State with AutomaticKeepAliveClientMixin { ImageEntry get entry => widget.entry; @override @@ -150,8 +150,8 @@ class SingleImagePageState extends State with AutomaticKeepAliv ); } - ImageView _buildViewer({MultiPageInfo multiPageInfo, int page = 0}) { - return ImageView( + EntryPageView _buildViewer({MultiPageInfo multiPageInfo, int page = 0}) { + return EntryPageView( entry: entry, multiPageInfo: multiPageInfo, page: page, diff --git a/lib/widgets/fullscreen/fullscreen_page.dart b/lib/widgets/viewer/entry_viewer_page.dart similarity index 74% rename from lib/widgets/fullscreen/fullscreen_page.dart rename to lib/widgets/viewer/entry_viewer_page.dart index 37abf6a17..65d35279b 100644 --- a/lib/widgets/fullscreen/fullscreen_page.dart +++ b/lib/widgets/viewer/entry_viewer_page.dart @@ -1,16 +1,16 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; -import 'package:aves/widgets/fullscreen/fullscreen_body.dart'; +import 'package:aves/widgets/viewer/entry_viewer_stack.dart'; import 'package:flutter/material.dart'; -class MultiFullscreenPage extends AnimatedWidget { - static const routeName = '/fullscreen'; +class MultiEntryViewerPage extends AnimatedWidget { + static const routeName = '/viewer'; final CollectionLens collection; final ImageEntry initialEntry; - const MultiFullscreenPage({ + const MultiEntryViewerPage({ Key key, this.collection, this.initialEntry, @@ -20,7 +20,7 @@ class MultiFullscreenPage extends AnimatedWidget { Widget build(BuildContext context) { return MediaQueryDataProvider( child: Scaffold( - body: FullscreenBody( + body: EntryViewerStack( collection: collection, initialEntry: initialEntry, ), @@ -31,12 +31,12 @@ class MultiFullscreenPage extends AnimatedWidget { } } -class SingleFullscreenPage extends StatelessWidget { - static const routeName = '/fullscreen'; +class SingleEntryViewerPage extends StatelessWidget { + static const routeName = '/viewer'; final ImageEntry entry; - const SingleFullscreenPage({ + const SingleEntryViewerPage({ Key key, this.entry, }) : super(key: key); @@ -45,7 +45,7 @@ class SingleFullscreenPage extends StatelessWidget { Widget build(BuildContext context) { return MediaQueryDataProvider( child: Scaffold( - body: FullscreenBody( + body: EntryViewerStack( initialEntry: entry, ), backgroundColor: Navigator.canPop(context) ? Colors.transparent : Colors.black, diff --git a/lib/widgets/fullscreen/fullscreen_body.dart b/lib/widgets/viewer/entry_viewer_stack.dart similarity index 91% rename from lib/widgets/fullscreen/fullscreen_body.dart rename to lib/widgets/viewer/entry_viewer_stack.dart index d2e5a23ac..44256cea4 100644 --- a/lib/widgets/fullscreen/fullscreen_body.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -9,16 +9,16 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/utils/change_notifier.dart'; import 'package:aves/widgets/collection/collection_page.dart'; import 'package:aves/widgets/common/magnifier/pan/scroll_physics.dart'; -import 'package:aves/widgets/fullscreen/entry_action_delegate.dart'; -import 'package:aves/widgets/fullscreen/image_page.dart'; -import 'package:aves/widgets/fullscreen/image_view.dart'; -import 'package:aves/widgets/fullscreen/info/info_page.dart'; -import 'package:aves/widgets/fullscreen/info/notifications.dart'; -import 'package:aves/widgets/fullscreen/multipage_controller.dart'; -import 'package:aves/widgets/fullscreen/overlay/bottom.dart'; -import 'package:aves/widgets/fullscreen/overlay/panorama.dart'; -import 'package:aves/widgets/fullscreen/overlay/top.dart'; -import 'package:aves/widgets/fullscreen/overlay/video.dart'; +import 'package:aves/widgets/viewer/entry_action_delegate.dart'; +import 'package:aves/widgets/viewer/entry_scroller.dart'; +import 'package:aves/widgets/viewer/info/info_page.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/panorama.dart'; +import 'package:aves/widgets/viewer/overlay/top.dart'; +import 'package:aves/widgets/viewer/overlay/video.dart'; +import 'package:aves/widgets/viewer/visual/state.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; @@ -28,21 +28,21 @@ import 'package:provider/provider.dart'; import 'package:screen/screen.dart'; import 'package:tuple/tuple.dart'; -class FullscreenBody extends StatefulWidget { +class EntryViewerStack extends StatefulWidget { final CollectionLens collection; final ImageEntry initialEntry; - const FullscreenBody({ + const EntryViewerStack({ Key key, this.collection, this.initialEntry, }) : super(key: key); @override - FullscreenBodyState createState() => FullscreenBodyState(); + _EntryViewerStackState createState() => _EntryViewerStackState(); } -class FullscreenBodyState extends State with SingleTickerProviderStateMixin, WidgetsBindingObserver { +class _EntryViewerStackState extends State with SingleTickerProviderStateMixin, WidgetsBindingObserver { final ValueNotifier _entryNotifier = ValueNotifier(null); int _currentHorizontalPage; ValueNotifier _currentVerticalPage; @@ -106,13 +106,13 @@ class FullscreenBodyState extends State with SingleTickerProvide _registerWidget(widget); WidgetsBinding.instance.addObserver(this); WidgetsBinding.instance.addPostFrameCallback((_) => _initOverlay()); - if (settings.keepScreenOn == KeepScreenOn.fullscreenOnly) { + if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { Screen.keepOn(true); } } @override - void didUpdateWidget(covariant FullscreenBody oldWidget) { + void didUpdateWidget(covariant EntryViewerStack oldWidget) { super.didUpdateWidget(oldWidget); _unregisterWidget(oldWidget); _registerWidget(widget); @@ -132,11 +132,11 @@ class FullscreenBodyState extends State with SingleTickerProvide super.dispose(); } - void _registerWidget(FullscreenBody widget) { + void _registerWidget(EntryViewerStack widget) { widget.collection?.addListener(_onCollectionChange); } - void _unregisterWidget(FullscreenBody widget) { + void _unregisterWidget(EntryViewerStack widget) { widget.collection?.removeListener(_onCollectionChange); } @@ -170,7 +170,7 @@ class FullscreenBodyState extends State with SingleTickerProvide }, child: Stack( children: [ - FullscreenVerticalPageView( + ViewerVerticalPageView( collection: collection, entryNotifier: _entryNotifier, videoControllers: _videoControllers, @@ -205,7 +205,7 @@ class FullscreenBodyState extends State with SingleTickerProvide final multiPageController = _getMultiPageController(entry); final viewStateNotifier = _viewStateNotifiers.firstWhere((kv) => kv.item1 == entry.uri, orElse: () => null)?.item2; - return FullscreenTopOverlay( + return ViewerTopOverlay( entry: entry, scale: _topOverlayScale, canToggleFavourite: hasCollection, @@ -264,7 +264,7 @@ class FullscreenBodyState extends State with SingleTickerProvide ), SlideTransition( position: _bottomOverlayOffset, - child: FullscreenBottomOverlay( + child: ViewerBottomOverlay( entries: entries, index: _currentHorizontalPage, showPosition: hasCollection, @@ -372,11 +372,11 @@ class FullscreenBodyState extends State with SingleTickerProvide void _onLeave() { if (Navigator.canPop(context)) { _showSystemUI(); - if (settings.keepScreenOn == KeepScreenOn.fullscreenOnly) { + if (settings.keepScreenOn == KeepScreenOn.viewerOnly) { Screen.keepOn(false); } } else { - // exit app when trying to pop a fullscreen page that is a viewer for a single entry + // exit app when trying to pop a viewer page for a single entry SystemNavigator.pop(); } } @@ -472,7 +472,7 @@ class FullscreenBodyState extends State with SingleTickerProvide void _pauseVideoControllers() => _videoControllers.forEach((e) => e.item2.pause()); } -class FullscreenVerticalPageView extends StatefulWidget { +class ViewerVerticalPageView extends StatefulWidget { final CollectionLens collection; final ValueNotifier entryNotifier; final List> videoControllers; @@ -482,7 +482,7 @@ class FullscreenVerticalPageView extends StatefulWidget { final VoidCallback onImageTap, onImagePageRequested; final void Function(String uri) onViewDisposed; - const FullscreenVerticalPageView({ + const ViewerVerticalPageView({ @required this.collection, @required this.entryNotifier, @required this.videoControllers, @@ -497,10 +497,10 @@ class FullscreenVerticalPageView extends StatefulWidget { }); @override - _FullscreenVerticalPageViewState createState() => _FullscreenVerticalPageViewState(); + _ViewerVerticalPageViewState createState() => _ViewerVerticalPageViewState(); } -class _FullscreenVerticalPageViewState extends State { +class _ViewerVerticalPageViewState extends State { final ValueNotifier _backgroundColorNotifier = ValueNotifier(Colors.black); final ValueNotifier _infoPageVisibleNotifier = ValueNotifier(false); ImageEntry _oldEntry; @@ -518,7 +518,7 @@ class _FullscreenVerticalPageViewState extends State } @override - void didUpdateWidget(covariant FullscreenVerticalPageView oldWidget) { + void didUpdateWidget(covariant ViewerVerticalPageView oldWidget) { super.didUpdateWidget(oldWidget); _unregisterWidget(oldWidget); _registerWidget(widget); @@ -530,13 +530,13 @@ class _FullscreenVerticalPageViewState extends State super.dispose(); } - void _registerWidget(FullscreenVerticalPageView widget) { + void _registerWidget(ViewerVerticalPageView widget) { widget.verticalPager.addListener(_onVerticalPageControllerChanged); widget.entryNotifier.addListener(_onEntryChanged); if (_oldEntry != entry) _onEntryChanged(); } - void _unregisterWidget(FullscreenVerticalPageView widget) { + void _unregisterWidget(ViewerVerticalPageView widget) { widget.verticalPager.removeListener(_onVerticalPageControllerChanged); widget.entryNotifier.removeListener(_onEntryChanged); _oldEntry?.imageChangeNotifier?.removeListener(_onImageChanged); @@ -545,10 +545,10 @@ class _FullscreenVerticalPageViewState extends State @override Widget build(BuildContext context) { final pages = [ - // fake page for opacity transition between collection and fullscreen views + // fake page for opacity transition between collection and viewer SizedBox(), hasCollection - ? MultiImagePage( + ? MultiEntryScroller( collection: collection, pageController: widget.horizontalPager, onTap: widget.onImageTap, @@ -557,7 +557,7 @@ class _FullscreenVerticalPageViewState extends State multiPageControllers: widget.multiPageControllers, onViewDisposed: widget.onViewDisposed, ) - : SingleImagePage( + : SingleEntryScroller( entry: entry, onTap: widget.onImageTap, videoControllers: widget.videoControllers, diff --git a/lib/widgets/fullscreen/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart similarity index 98% rename from lib/widgets/fullscreen/info/basic_section.dart rename to lib/widgets/viewer/info/basic_section.dart index 8f4847a2a..bab656c2b 100644 --- a/lib/widgets/fullscreen/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -9,7 +9,7 @@ import 'package:aves/ref/mime_types.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/utils/file_utils.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; diff --git a/lib/widgets/fullscreen/info/common.dart b/lib/widgets/viewer/info/common.dart similarity index 100% rename from lib/widgets/fullscreen/info/common.dart rename to lib/widgets/viewer/info/common.dart diff --git a/lib/widgets/fullscreen/info/info_app_bar.dart b/lib/widgets/viewer/info/info_app_bar.dart similarity index 90% rename from lib/widgets/fullscreen/info/info_app_bar.dart rename to lib/widgets/viewer/info/info_app_bar.dart index a993b40cb..df0eee399 100644 --- a/lib/widgets/fullscreen/info/info_app_bar.dart +++ b/lib/widgets/viewer/info/info_app_bar.dart @@ -1,8 +1,8 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/app_bar_title.dart'; -import 'package:aves/widgets/fullscreen/info/info_search.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_section.dart'; +import 'package:aves/widgets/viewer/info/info_search.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; import 'package:flutter/material.dart'; class InfoAppBar extends StatelessWidget { diff --git a/lib/widgets/fullscreen/info/info_page.dart b/lib/widgets/viewer/info/info_page.dart similarity index 93% rename from lib/widgets/fullscreen/info/info_page.dart rename to lib/widgets/viewer/info/info_page.dart index f8d9fdf38..df918e2a4 100644 --- a/lib/widgets/fullscreen/info/info_page.dart +++ b/lib/widgets/viewer/info/info_page.dart @@ -3,11 +3,11 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; -import 'package:aves/widgets/fullscreen/info/basic_section.dart'; -import 'package:aves/widgets/fullscreen/info/info_app_bar.dart'; -import 'package:aves/widgets/fullscreen/info/location_section.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_section.dart'; -import 'package:aves/widgets/fullscreen/info/notifications.dart'; +import 'package:aves/widgets/viewer/info/basic_section.dart'; +import 'package:aves/widgets/viewer/info/info_app_bar.dart'; +import 'package:aves/widgets/viewer/info/location_section.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; +import 'package:aves/widgets/viewer/info/notifications.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; @@ -25,10 +25,10 @@ class InfoPage extends StatefulWidget { }) : super(key: key); @override - State createState() => InfoPageState(); + State createState() => _InfoPageState(); } -class InfoPageState extends State { +class _InfoPageState extends State { final ScrollController _scrollController = ScrollController(); bool _scrollStartFromTop = false; diff --git a/lib/widgets/fullscreen/info/info_search.dart b/lib/widgets/viewer/info/info_search.dart similarity index 95% rename from lib/widgets/fullscreen/info/info_search.dart rename to lib/widgets/viewer/info/info_search.dart index d28c49a6a..0e12b4276 100644 --- a/lib/widgets/fullscreen/info/info_search.dart +++ b/lib/widgets/viewer/info/info_search.dart @@ -1,8 +1,8 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_dir_tile.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_section.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/info/location_section.dart b/lib/widgets/viewer/info/location_section.dart similarity index 95% rename from lib/widgets/fullscreen/info/location_section.dart rename to lib/widgets/viewer/info/location_section.dart index 5e97e5cb4..3341d3d54 100644 --- a/lib/widgets/fullscreen/info/location_section.dart +++ b/lib/widgets/viewer/info/location_section.dart @@ -6,11 +6,11 @@ import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; -import 'package:aves/widgets/fullscreen/info/maps/common.dart'; -import 'package:aves/widgets/fullscreen/info/maps/google_map.dart'; -import 'package:aves/widgets/fullscreen/info/maps/leaflet_map.dart'; -import 'package:aves/widgets/fullscreen/info/maps/marker.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/maps/common.dart'; +import 'package:aves/widgets/viewer/info/maps/google_map.dart'; +import 'package:aves/widgets/viewer/info/maps/leaflet_map.dart'; +import 'package:aves/widgets/viewer/info/maps/marker.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; diff --git a/lib/widgets/fullscreen/info/maps/common.dart b/lib/widgets/viewer/info/maps/common.dart similarity index 97% rename from lib/widgets/fullscreen/info/maps/common.dart rename to lib/widgets/viewer/info/maps/common.dart index 452d6ef00..fb8fc89c1 100644 --- a/lib/widgets/fullscreen/info/maps/common.dart +++ b/lib/widgets/viewer/info/maps/common.dart @@ -6,8 +6,8 @@ import 'package:aves/widgets/common/fx/blurred.dart'; import 'package:aves/widgets/common/fx/borders.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; import 'package:aves/widgets/dialogs/aves_selection_dialog.dart'; -import 'package:aves/widgets/fullscreen/info/location_section.dart'; -import 'package:aves/widgets/fullscreen/overlay/common.dart'; +import 'package:aves/widgets/viewer/info/location_section.dart'; +import 'package:aves/widgets/viewer/overlay/common.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; diff --git a/lib/widgets/fullscreen/info/maps/google_map.dart b/lib/widgets/viewer/info/maps/google_map.dart similarity index 91% rename from lib/widgets/fullscreen/info/maps/google_map.dart rename to lib/widgets/viewer/info/maps/google_map.dart index 748d96db0..0c6e05bd7 100644 --- a/lib/widgets/fullscreen/info/maps/google_map.dart +++ b/lib/widgets/viewer/info/maps/google_map.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'dart:typed_data'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/widgets/fullscreen/info/location_section.dart'; -import 'package:aves/widgets/fullscreen/info/maps/common.dart'; -import 'package:aves/widgets/fullscreen/info/maps/marker.dart'; +import 'package:aves/widgets/viewer/info/location_section.dart'; +import 'package:aves/widgets/viewer/info/maps/common.dart'; +import 'package:aves/widgets/viewer/info/maps/marker.dart'; import 'package:flutter/material.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:tuple/tuple.dart'; @@ -27,10 +27,10 @@ class EntryGoogleMap extends StatefulWidget { super(key: key); @override - State createState() => EntryGoogleMapState(); + State createState() => _EntryGoogleMapState(); } -class EntryGoogleMapState extends State with AutomaticKeepAliveClientMixin { +class _EntryGoogleMapState extends State with AutomaticKeepAliveClientMixin { GoogleMapController _controller; Completer _markerLoaderCompleter; diff --git a/lib/widgets/fullscreen/info/maps/leaflet_map.dart b/lib/widgets/viewer/info/maps/leaflet_map.dart similarity index 94% rename from lib/widgets/fullscreen/info/maps/leaflet_map.dart rename to lib/widgets/viewer/info/maps/leaflet_map.dart index 3f1d56cfd..02f53dbd8 100644 --- a/lib/widgets/fullscreen/info/maps/leaflet_map.dart +++ b/lib/widgets/viewer/info/maps/leaflet_map.dart @@ -1,6 +1,6 @@ import 'package:aves/model/settings/settings.dart'; -import 'package:aves/widgets/fullscreen/info/maps/common.dart'; -import 'package:aves/widgets/fullscreen/info/maps/scale_layer.dart'; +import 'package:aves/widgets/viewer/info/maps/common.dart'; +import 'package:aves/widgets/viewer/info/maps/scale_layer.dart'; import 'package:flutter/material.dart'; import 'package:flutter_map/flutter_map.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; @@ -28,10 +28,10 @@ class EntryLeafletMap extends StatefulWidget { }) : super(key: key); @override - State createState() => EntryLeafletMapState(); + State createState() => _EntryLeafletMapState(); } -class EntryLeafletMapState extends State with AutomaticKeepAliveClientMixin, TickerProviderStateMixin { +class _EntryLeafletMapState extends State with AutomaticKeepAliveClientMixin, TickerProviderStateMixin { final MapController _mapController = MapController(); @override diff --git a/lib/widgets/fullscreen/info/maps/marker.dart b/lib/widgets/viewer/info/maps/marker.dart similarity index 100% rename from lib/widgets/fullscreen/info/maps/marker.dart rename to lib/widgets/viewer/info/maps/marker.dart diff --git a/lib/widgets/fullscreen/info/maps/scale_layer.dart b/lib/widgets/viewer/info/maps/scale_layer.dart similarity index 100% rename from lib/widgets/fullscreen/info/maps/scale_layer.dart rename to lib/widgets/viewer/info/maps/scale_layer.dart diff --git a/lib/widgets/fullscreen/info/maps/scalebar_utils.dart b/lib/widgets/viewer/info/maps/scalebar_utils.dart similarity index 100% rename from lib/widgets/fullscreen/info/maps/scalebar_utils.dart rename to lib/widgets/viewer/info/maps/scalebar_utils.dart diff --git a/lib/widgets/fullscreen/info/metadata/metadata_dir_tile.dart b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart similarity index 91% rename from lib/widgets/fullscreen/info/metadata/metadata_dir_tile.dart rename to lib/widgets/viewer/info/metadata/metadata_dir_tile.dart index af980220f..0ea17ab08 100644 --- a/lib/widgets/fullscreen/info/metadata/metadata_dir_tile.dart +++ b/lib/widgets/viewer/info/metadata/metadata_dir_tile.dart @@ -7,11 +7,11 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/utils/color_utils.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_section.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_thumbnail.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_tile.dart'; -import 'package:aves/widgets/fullscreen/source_viewer_page.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_section.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_thumbnail.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_tile.dart'; +import 'package:aves/widgets/viewer/source_viewer_page.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/info/metadata/metadata_section.dart b/lib/widgets/viewer/info/metadata/metadata_section.dart similarity index 98% rename from lib/widgets/fullscreen/info/metadata/metadata_section.dart rename to lib/widgets/viewer/info/metadata/metadata_section.dart index 9a2290b4d..6cba39d94 100644 --- a/lib/widgets/fullscreen/info/metadata/metadata_section.dart +++ b/lib/widgets/viewer/info/metadata/metadata_section.dart @@ -5,8 +5,8 @@ import 'package:aves/services/metadata_service.dart'; import 'package:aves/services/svg_metadata_service.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/metadata_dir_tile.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/metadata/metadata_dir_tile.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/info/metadata/metadata_thumbnail.dart b/lib/widgets/viewer/info/metadata/metadata_thumbnail.dart similarity index 100% rename from lib/widgets/fullscreen/info/metadata/metadata_thumbnail.dart rename to lib/widgets/viewer/info/metadata/metadata_thumbnail.dart diff --git a/lib/widgets/fullscreen/info/metadata/xmp_namespaces.dart b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart similarity index 98% rename from lib/widgets/fullscreen/info/metadata/xmp_namespaces.dart rename to lib/widgets/viewer/info/metadata/xmp_namespaces.dart index 459676466..fd8f4f4c9 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_namespaces.dart +++ b/lib/widgets/viewer/info/metadata/xmp_namespaces.dart @@ -3,7 +3,7 @@ import 'package:aves/ref/xmp.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/utils/string_utils.dart'; import 'package:aves/widgets/common/identity/highlight_title.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/info/metadata/xmp_ns/exif.dart b/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart similarity index 97% rename from lib/widgets/fullscreen/info/metadata/xmp_ns/exif.dart rename to lib/widgets/viewer/info/metadata/xmp_ns/exif.dart index 168401ce5..76ac8c865 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_ns/exif.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/exif.dart @@ -1,5 +1,5 @@ import 'package:aves/ref/exif.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; // cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/exif.md class XmpExifNamespace extends XmpNamespace { diff --git a/lib/widgets/fullscreen/info/metadata/xmp_ns/google.dart b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart similarity index 93% rename from lib/widgets/fullscreen/info/metadata/xmp_ns/google.dart rename to lib/widgets/viewer/info/metadata/xmp_ns/google.dart index ee9154591..cccb66342 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_ns/google.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/google.dart @@ -1,5 +1,5 @@ -import 'package:aves/widgets/fullscreen/info/common.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; import 'package:tuple/tuple.dart'; abstract class XmpGoogleNamespace extends XmpNamespace { diff --git a/lib/widgets/fullscreen/info/metadata/xmp_ns/iptc.dart b/lib/widgets/viewer/info/metadata/xmp_ns/iptc.dart similarity index 82% rename from lib/widgets/fullscreen/info/metadata/xmp_ns/iptc.dart rename to lib/widgets/viewer/info/metadata/xmp_ns/iptc.dart index 5876ce30c..7ccd3feaf 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_ns/iptc.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/iptc.dart @@ -1,5 +1,5 @@ -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_structs.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_structs.dart'; import 'package:flutter/material.dart'; class XmpIptcCoreNamespace extends XmpNamespace { diff --git a/lib/widgets/fullscreen/info/metadata/xmp_ns/photoshop.dart b/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart similarity index 93% rename from lib/widgets/fullscreen/info/metadata/xmp_ns/photoshop.dart rename to lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart index b8241caa9..0b0399bab 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_ns/photoshop.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/photoshop.dart @@ -1,6 +1,6 @@ // cf photoshop:ColorMode // cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/photoshop.md -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; class XmpPhotoshopNamespace extends XmpNamespace { static const ns = 'photoshop'; diff --git a/lib/widgets/fullscreen/info/metadata/xmp_ns/tiff.dart b/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart similarity index 92% rename from lib/widgets/fullscreen/info/metadata/xmp_ns/tiff.dart rename to lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart index 6083d5a39..fbf712f6e 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_ns/tiff.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/tiff.dart @@ -1,5 +1,5 @@ import 'package:aves/ref/exif.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; // cf https://github.com/adobe/xmp-docs/blob/master/XMPNamespaces/tiff.md class XmpTiffNamespace extends XmpNamespace { diff --git a/lib/widgets/fullscreen/info/metadata/xmp_ns/xmp.dart b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart similarity index 94% rename from lib/widgets/fullscreen/info/metadata/xmp_ns/xmp.dart rename to lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart index 2c73826c6..70a57de2c 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_ns/xmp.dart +++ b/lib/widgets/viewer/info/metadata/xmp_ns/xmp.dart @@ -1,7 +1,7 @@ import 'package:aves/ref/mime_types.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_structs.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:flutter/material.dart'; class XmpBasicNamespace extends XmpNamespace { diff --git a/lib/widgets/fullscreen/info/metadata/xmp_structs.dart b/lib/widgets/viewer/info/metadata/xmp_structs.dart similarity index 98% rename from lib/widgets/fullscreen/info/metadata/xmp_structs.dart rename to lib/widgets/viewer/info/metadata/xmp_structs.dart index efb9aceba..8bd946184 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_structs.dart +++ b/lib/widgets/viewer/info/metadata/xmp_structs.dart @@ -5,7 +5,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/basic/multi_cross_fader.dart'; import 'package:aves/widgets/common/identity/highlight_title.dart'; -import 'package:aves/widgets/fullscreen/info/common.dart'; +import 'package:aves/widgets/viewer/info/common.dart'; import 'package:flutter/material.dart'; class XmpStructArrayCard extends StatefulWidget { diff --git a/lib/widgets/fullscreen/info/metadata/xmp_tile.dart b/lib/widgets/viewer/info/metadata/xmp_tile.dart similarity index 85% rename from lib/widgets/fullscreen/info/metadata/xmp_tile.dart rename to lib/widgets/viewer/info/metadata/xmp_tile.dart index b0f8f0bf5..cbd1c5c1a 100644 --- a/lib/widgets/fullscreen/info/metadata/xmp_tile.dart +++ b/lib/widgets/viewer/info/metadata/xmp_tile.dart @@ -9,14 +9,14 @@ import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/behaviour/routes.dart'; import 'package:aves/widgets/common/identity/aves_expansion_tile.dart'; import 'package:aves/widgets/dialogs/aves_dialog.dart'; -import 'package:aves/widgets/fullscreen/fullscreen_page.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_namespaces.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_ns/exif.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_ns/google.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_ns/iptc.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_ns/photoshop.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_ns/tiff.dart'; -import 'package:aves/widgets/fullscreen/info/metadata/xmp_ns/xmp.dart'; +import 'package:aves/widgets/viewer/entry_viewer_page.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_namespaces.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/exif.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/google.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/iptc.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/photoshop.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/tiff.dart'; +import 'package:aves/widgets/viewer/info/metadata/xmp_ns/xmp.dart'; import 'package:collection/collection.dart'; import 'package:flutter/material.dart'; import 'package:pedantic/pedantic.dart'; @@ -127,8 +127,8 @@ class _XmpDirTileState extends State with FeedbackMixin { unawaited(Navigator.push( context, TransparentMaterialPageRoute( - settings: RouteSettings(name: SingleFullscreenPage.routeName), - pageBuilder: (c, a, sa) => SingleFullscreenPage(entry: embedEntry), + settings: RouteSettings(name: SingleEntryViewerPage.routeName), + pageBuilder: (c, a, sa) => SingleEntryViewerPage(entry: embedEntry), ), )); } diff --git a/lib/widgets/fullscreen/info/notifications.dart b/lib/widgets/viewer/info/notifications.dart similarity index 100% rename from lib/widgets/fullscreen/info/notifications.dart rename to lib/widgets/viewer/info/notifications.dart diff --git a/lib/widgets/fullscreen/multipage_controller.dart b/lib/widgets/viewer/multipage.dart similarity index 100% rename from lib/widgets/fullscreen/multipage_controller.dart rename to lib/widgets/viewer/multipage.dart diff --git a/lib/widgets/fullscreen/overlay/bottom.dart b/lib/widgets/viewer/overlay/bottom.dart similarity index 96% rename from lib/widgets/fullscreen/overlay/bottom.dart rename to lib/widgets/viewer/overlay/bottom.dart index 9e495c756..62daeddd7 100644 --- a/lib/widgets/fullscreen/overlay/bottom.dart +++ b/lib/widgets/viewer/overlay/bottom.dart @@ -10,23 +10,23 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/utils/constants.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; -import 'package:aves/widgets/fullscreen/multipage_controller.dart'; -import 'package:aves/widgets/fullscreen/overlay/common.dart'; -import 'package:aves/widgets/fullscreen/overlay/multipage.dart'; +import 'package:aves/widgets/viewer/multipage.dart'; +import 'package:aves/widgets/viewer/overlay/common.dart'; +import 'package:aves/widgets/viewer/overlay/multipage.dart'; import 'package:decorated_icon/decorated_icon.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; -class FullscreenBottomOverlay extends StatefulWidget { +class ViewerBottomOverlay extends StatefulWidget { final List entries; final int index; final bool showPosition; final EdgeInsets viewInsets, viewPadding; final MultiPageController multiPageController; - const FullscreenBottomOverlay({ + const ViewerBottomOverlay({ Key key, @required this.entries, @required this.index, @@ -37,10 +37,10 @@ class FullscreenBottomOverlay extends StatefulWidget { }) : super(key: key); @override - State createState() => _FullscreenBottomOverlayState(); + State createState() => _ViewerBottomOverlayState(); } -class _FullscreenBottomOverlayState extends State { +class _ViewerBottomOverlayState extends State { Future _detailLoader; ImageEntry _lastEntry; OverlayMetadata _lastDetails; @@ -58,7 +58,7 @@ class _FullscreenBottomOverlayState extends State { } @override - void didUpdateWidget(covariant FullscreenBottomOverlay oldWidget) { + void didUpdateWidget(covariant ViewerBottomOverlay oldWidget) { super.didUpdateWidget(oldWidget); if (entry != _lastEntry) { _initDetailLoader(); diff --git a/lib/widgets/fullscreen/overlay/common.dart b/lib/widgets/viewer/overlay/common.dart similarity index 100% rename from lib/widgets/fullscreen/overlay/common.dart rename to lib/widgets/viewer/overlay/common.dart diff --git a/lib/widgets/fullscreen/overlay/minimap.dart b/lib/widgets/viewer/overlay/minimap.dart similarity index 97% rename from lib/widgets/fullscreen/overlay/minimap.dart rename to lib/widgets/viewer/overlay/minimap.dart index 75f9edae2..ce9c6b101 100644 --- a/lib/widgets/fullscreen/overlay/minimap.dart +++ b/lib/widgets/viewer/overlay/minimap.dart @@ -2,8 +2,8 @@ import 'dart:math'; import 'package:aves/model/image_entry.dart'; import 'package:aves/model/multipage.dart'; -import 'package:aves/widgets/fullscreen/image_view.dart'; -import 'package:aves/widgets/fullscreen/multipage_controller.dart'; +import 'package:aves/widgets/viewer/multipage.dart'; +import 'package:aves/widgets/viewer/visual/state.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/overlay/multipage.dart b/lib/widgets/viewer/overlay/multipage.dart similarity index 98% rename from lib/widgets/fullscreen/overlay/multipage.dart rename to lib/widgets/viewer/overlay/multipage.dart index cf451e1d1..2f62d1bc1 100644 --- a/lib/widgets/fullscreen/overlay/multipage.dart +++ b/lib/widgets/viewer/overlay/multipage.dart @@ -4,7 +4,7 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/collection/thumbnail/raster.dart'; -import 'package:aves/widgets/fullscreen/multipage_controller.dart'; +import 'package:aves/widgets/viewer/multipage.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; diff --git a/lib/widgets/fullscreen/overlay/panorama.dart b/lib/widgets/viewer/overlay/panorama.dart similarity index 86% rename from lib/widgets/fullscreen/overlay/panorama.dart rename to lib/widgets/viewer/overlay/panorama.dart index 386752e5f..7c1d47936 100644 --- a/lib/widgets/fullscreen/overlay/panorama.dart +++ b/lib/widgets/viewer/overlay/panorama.dart @@ -1,6 +1,6 @@ import 'package:aves/model/image_entry.dart'; -import 'package:aves/widgets/fullscreen/overlay/common.dart'; -import 'package:aves/widgets/fullscreen/panorama_page.dart'; +import 'package:aves/widgets/viewer/overlay/common.dart'; +import 'package:aves/widgets/viewer/panorama_page.dart'; import 'package:flutter/material.dart'; class PanoramaOverlay extends StatelessWidget { diff --git a/lib/widgets/fullscreen/overlay/top.dart b/lib/widgets/viewer/overlay/top.dart similarity index 97% rename from lib/widgets/fullscreen/overlay/top.dart rename to lib/widgets/viewer/overlay/top.dart index cc494e5ad..a3effb3cd 100644 --- a/lib/widgets/fullscreen/overlay/top.dart +++ b/lib/widgets/viewer/overlay/top.dart @@ -8,17 +8,17 @@ import 'package:aves/theme/durations.dart'; import 'package:aves/theme/icons.dart'; import 'package:aves/widgets/common/basic/menu_row.dart'; import 'package:aves/widgets/common/fx/sweeper.dart'; -import 'package:aves/widgets/fullscreen/image_view.dart'; -import 'package:aves/widgets/fullscreen/multipage_controller.dart'; -import 'package:aves/widgets/fullscreen/overlay/common.dart'; -import 'package:aves/widgets/fullscreen/overlay/minimap.dart'; +import 'package:aves/widgets/viewer/multipage.dart'; +import 'package:aves/widgets/viewer/overlay/common.dart'; +import 'package:aves/widgets/viewer/overlay/minimap.dart'; +import 'package:aves/widgets/viewer/visual/state.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/scheduler.dart'; import 'package:provider/provider.dart'; import 'package:tuple/tuple.dart'; -class FullscreenTopOverlay extends StatelessWidget { +class ViewerTopOverlay extends StatelessWidget { final ImageEntry entry; final Animation scale; final EdgeInsets viewInsets, viewPadding; @@ -33,7 +33,7 @@ class FullscreenTopOverlay extends StatelessWidget { static const int portraitActionCount = 2; - const FullscreenTopOverlay({ + const ViewerTopOverlay({ Key key, @required this.entry, @required this.scale, diff --git a/lib/widgets/fullscreen/overlay/video.dart b/lib/widgets/viewer/overlay/video.dart similarity index 97% rename from lib/widgets/fullscreen/overlay/video.dart rename to lib/widgets/viewer/overlay/video.dart index cf049f65d..eee35e659 100644 --- a/lib/widgets/fullscreen/overlay/video.dart +++ b/lib/widgets/viewer/overlay/video.dart @@ -7,7 +7,7 @@ import 'package:aves/theme/icons.dart'; import 'package:aves/utils/time_utils.dart'; import 'package:aves/widgets/common/fx/blurred.dart'; import 'package:aves/widgets/common/fx/borders.dart'; -import 'package:aves/widgets/fullscreen/overlay/common.dart'; +import 'package:aves/widgets/viewer/overlay/common.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; @@ -24,10 +24,10 @@ class VideoControlOverlay extends StatefulWidget { }) : super(key: key); @override - State createState() => VideoControlOverlayState(); + State createState() => _VideoControlOverlayState(); } -class VideoControlOverlayState extends State with SingleTickerProviderStateMixin { +class _VideoControlOverlayState extends State with SingleTickerProviderStateMixin { final GlobalKey _progressBarKey = GlobalKey(); bool _playingOnDragStart = false; AnimationController _playPauseAnimation; diff --git a/lib/widgets/fullscreen/panorama_page.dart b/lib/widgets/viewer/panorama_page.dart similarity index 94% rename from lib/widgets/fullscreen/panorama_page.dart rename to lib/widgets/viewer/panorama_page.dart index e9a2ad2ab..b5a2d410a 100644 --- a/lib/widgets/fullscreen/panorama_page.dart +++ b/lib/widgets/viewer/panorama_page.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:panorama/panorama.dart'; class PanoramaPage extends StatelessWidget { - static const routeName = '/fullscreen/panorama'; + static const routeName = '/viewer/panorama'; final ImageEntry entry; diff --git a/lib/widgets/fullscreen/printing.dart b/lib/widgets/viewer/printer.dart similarity index 100% rename from lib/widgets/fullscreen/printing.dart rename to lib/widgets/viewer/printer.dart diff --git a/lib/widgets/fullscreen/source_viewer_page.dart b/lib/widgets/viewer/source_viewer_page.dart similarity index 97% rename from lib/widgets/fullscreen/source_viewer_page.dart rename to lib/widgets/viewer/source_viewer_page.dart index 08d91b8a1..75bd97973 100644 --- a/lib/widgets/fullscreen/source_viewer_page.dart +++ b/lib/widgets/viewer/source_viewer_page.dart @@ -3,7 +3,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_highlight/themes/darcula.dart'; class SourceViewerPage extends StatefulWidget { - static const routeName = '/fullscreen/source'; + static const routeName = '/viewer/source'; final Future Function() loader; diff --git a/lib/widgets/fullscreen/image_view.dart b/lib/widgets/viewer/visual/entry_page_view.dart similarity index 65% rename from lib/widgets/fullscreen/image_view.dart rename to lib/widgets/viewer/visual/entry_page_view.dart index 6641a8f8a..ae4638de8 100644 --- a/lib/widgets/fullscreen/image_view.dart +++ b/lib/widgets/viewer/visual/entry_page_view.dart @@ -5,24 +5,24 @@ import 'package:aves/model/image_entry.dart'; import 'package:aves/model/multipage.dart'; import 'package:aves/model/settings/entry_background.dart'; import 'package:aves/model/settings/settings.dart'; -import 'package:aves/theme/icons.dart'; -import 'package:aves/widgets/collection/empty.dart'; -import 'package:aves/widgets/common/fx/checkered_decoration.dart'; import 'package:aves/widgets/common/magnifier/controller/controller.dart'; import 'package:aves/widgets/common/magnifier/controller/state.dart'; import 'package:aves/widgets/common/magnifier/magnifier.dart'; import 'package:aves/widgets/common/magnifier/scale/scale_boundaries.dart'; import 'package:aves/widgets/common/magnifier/scale/scale_level.dart'; import 'package:aves/widgets/common/magnifier/scale/state.dart'; -import 'package:aves/widgets/fullscreen/tiled_view.dart'; -import 'package:aves/widgets/fullscreen/video_view.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'; +import 'package:aves/widgets/viewer/visual/vector.dart'; +import 'package:aves/widgets/viewer/visual/video.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_ijkplayer/flutter_ijkplayer.dart'; import 'package:flutter_svg/flutter_svg.dart'; import 'package:tuple/tuple.dart'; -class ImageView extends StatefulWidget { +class EntryPageView extends StatefulWidget { final ImageEntry entry; final MultiPageInfo multiPageInfo; final int page; @@ -32,8 +32,11 @@ class ImageView extends StatefulWidget { final VoidCallback onDisposed; static const decorationCheckSize = 20.0; + static const initialScale = ScaleLevel(ref: ScaleReference.contained); + static const minScale = ScaleLevel(ref: ScaleReference.contained); + static const maxScale = ScaleLevel(factor: 2.0); - const ImageView({ + const EntryPageView({ Key key, @required this.entry, this.multiPageInfo, @@ -45,18 +48,14 @@ class ImageView extends StatefulWidget { }) : super(key: key); @override - _ImageViewState createState() => _ImageViewState(); + _EntryPageViewState createState() => _EntryPageViewState(); } -class _ImageViewState extends State { +class _EntryPageViewState extends State { final MagnifierController _magnifierController = MagnifierController(); final ValueNotifier _viewStateNotifier = ValueNotifier(ViewState.zero); final List _subscriptions = []; - static const initialScale = ScaleLevel(ref: ScaleReference.contained); - static const minScale = ScaleLevel(ref: ScaleReference.contained); - static const maxScale = ScaleLevel(factor: 2.0); - ImageEntry get entry => widget.entry; MultiPageInfo get multiPageInfo => widget.multiPageInfo; @@ -95,7 +94,7 @@ class _ImageViewState extends State { } else if (entry.canDecode) { child = _buildRasterView(); } - child ??= ErrorChild(onTap: () => onTap?.call(null)); + child ??= ErrorView(onTap: () => onTap?.call(null)); // no hero for videos, as a typical video first frame is different from its thumbnail return widget.heroTag != null && !entry.isVideo @@ -116,13 +115,13 @@ class _ImageViewState extends State { multiPageInfo: multiPageInfo, page: page, viewStateNotifier: _viewStateNotifier, - errorBuilder: (context, error, stackTrace) => ErrorChild(onTap: () => onTap?.call(null)), + errorBuilder: (context, error, stackTrace) => ErrorView(onTap: () => onTap?.call(null)), ), childSize: pageDisplaySize, controller: _magnifierController, - maxScale: maxScale, - minScale: minScale, - initialScale: initialScale, + maxScale: EntryPageView.maxScale, + minScale: EntryPageView.minScale, + initialScale: EntryPageView.initialScale, onTap: (c, d, s, childPosition) => onTap?.call(childPosition), applyScale: false, ); @@ -142,43 +141,16 @@ class _ImageViewState extends State { ), childSize: pageDisplaySize, controller: _magnifierController, - minScale: minScale, - initialScale: initialScale, + minScale: EntryPageView.minScale, + initialScale: EntryPageView.initialScale, scaleStateCycle: _vectorScaleStateCycle, onTap: (c, d, s, childPosition) => onTap?.call(childPosition), ); if (background == EntryBackground.checkered) { - child = ValueListenableBuilder( - valueListenable: _viewStateNotifier, - builder: (context, viewState, child) { - final viewportSize = viewState.viewportSize; - if (viewportSize == null) return child; - - final side = viewportSize.shortestSide; - final checkSize = side / ((side / ImageView.decorationCheckSize).round()); - - final viewSize = pageDisplaySize * viewState.scale; - final decorationSize = applyBoxFit(BoxFit.none, viewSize, viewportSize).source; - final offset = ((decorationSize - viewportSize) as Offset) / 2; - - return Stack( - alignment: Alignment.center, - children: [ - Positioned( - width: decorationSize.width, - height: decorationSize.height, - child: DecoratedBox( - decoration: CheckeredDecoration( - checkSize: checkSize, - offset: offset, - ), - ), - ), - child, - ], - ); - }, + child = VectorViewCheckeredBackground( + displaySize: pageDisplaySize, + viewStateNotifier: _viewStateNotifier, child: child, ); } @@ -196,9 +168,9 @@ class _ImageViewState extends State { : SizedBox(), childSize: pageDisplaySize, controller: _magnifierController, - maxScale: maxScale, - minScale: minScale, - initialScale: initialScale, + maxScale: EntryPageView.maxScale, + minScale: EntryPageView.minScale, + initialScale: EntryPageView.initialScale, onTap: (c, d, s, childPosition) => onTap?.call(childPosition), ); } @@ -227,50 +199,4 @@ class _ImageViewState extends State { } } -class ViewState { - final Offset position; - final double scale; - final Size viewportSize; - - static const ViewState zero = ViewState(Offset.zero, 0, null); - - const ViewState(this.position, this.scale, this.viewportSize); - - @override - String toString() => '$runtimeType#${shortHash(this)}{position=$position, scale=$scale, viewportSize=$viewportSize}'; -} - -class ViewStateNotification extends Notification { - final String uri; - final ViewState viewState; - - const ViewStateNotification(this.uri, this.viewState); - - @override - String toString() => '$runtimeType#${shortHash(this)}{uri=$uri, viewState=$viewState}'; -} - -class ErrorChild extends StatelessWidget { - final VoidCallback onTap; - - const ErrorChild({@required this.onTap}); - - @override - Widget build(BuildContext context) { - return GestureDetector( - onTap: () => onTap?.call(), - // use a `Container` with a dummy color to make it expand - // so that we can also detect taps around the title `Text` - child: Container( - color: Colors.transparent, - child: EmptyContent( - icon: AIcons.error, - text: 'Oops!', - alignment: Alignment.center, - ), - ), - ); - } -} - typedef MagnifierTapCallback = void Function(Offset childPosition); diff --git a/lib/widgets/viewer/visual/error.dart b/lib/widgets/viewer/visual/error.dart new file mode 100644 index 000000000..fbee7fb3b --- /dev/null +++ b/lib/widgets/viewer/visual/error.dart @@ -0,0 +1,27 @@ +import 'package:aves/theme/icons.dart'; +import 'package:aves/widgets/collection/empty.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class ErrorView extends StatelessWidget { + final VoidCallback onTap; + + const ErrorView({@required this.onTap}); + + @override + Widget build(BuildContext context) { + return GestureDetector( + onTap: () => onTap?.call(), + // use a `Container` with a dummy color to make it expand + // so that we can also detect taps around the title `Text` + child: Container( + color: Colors.transparent, + child: EmptyContent( + icon: AIcons.error, + text: 'Oops!', + alignment: Alignment.center, + ), + ), + ); + } +} diff --git a/lib/widgets/fullscreen/tiled_view.dart b/lib/widgets/viewer/visual/raster.dart similarity index 98% rename from lib/widgets/fullscreen/tiled_view.dart rename to lib/widgets/viewer/visual/raster.dart index 2e8f71429..986996504 100644 --- a/lib/widgets/fullscreen/tiled_view.dart +++ b/lib/widgets/viewer/visual/raster.dart @@ -9,7 +9,8 @@ import 'package:aves/model/settings/entry_background.dart'; import 'package:aves/model/settings/settings.dart'; import 'package:aves/utils/math_utils.dart'; import 'package:aves/widgets/common/fx/checkered_decoration.dart'; -import 'package:aves/widgets/fullscreen/image_view.dart'; +import 'package:aves/widgets/viewer/visual/entry_page_view.dart'; +import 'package:aves/widgets/viewer/visual/state.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:tuple/tuple.dart'; @@ -221,7 +222,7 @@ class _TiledImageViewState extends State { final background = settings.rasterBackground; if (background == EntryBackground.checkered) { final side = viewportSize.shortestSide; - final checkSize = side / ((side / ImageView.decorationCheckSize).round()); + final checkSize = side / ((side / EntryPageView.decorationCheckSize).round()); final offset = ((decorationSize - viewportSize) as Offset) / 2; decoration = CheckeredDecoration( checkSize: checkSize, diff --git a/lib/widgets/viewer/visual/state.dart b/lib/widgets/viewer/visual/state.dart new file mode 100644 index 000000000..97760372f --- /dev/null +++ b/lib/widgets/viewer/visual/state.dart @@ -0,0 +1,25 @@ +import 'package:flutter/foundation.dart'; +import 'package:flutter/widgets.dart'; + +class ViewState { + final Offset position; + final double scale; + final Size viewportSize; + + static const ViewState zero = ViewState(Offset.zero, 0, null); + + const ViewState(this.position, this.scale, this.viewportSize); + + @override + String toString() => '$runtimeType#${shortHash(this)}{position=$position, scale=$scale, viewportSize=$viewportSize}'; +} + +class ViewStateNotification extends Notification { + final String uri; + final ViewState viewState; + + const ViewStateNotification(this.uri, this.viewState); + + @override + String toString() => '$runtimeType#${shortHash(this)}{uri=$uri, viewState=$viewState}'; +} diff --git a/lib/widgets/viewer/visual/vector.dart b/lib/widgets/viewer/visual/vector.dart new file mode 100644 index 000000000..443b01602 --- /dev/null +++ b/lib/widgets/viewer/visual/vector.dart @@ -0,0 +1,53 @@ +import 'package:aves/widgets/common/fx/checkered_decoration.dart'; +import 'package:aves/widgets/viewer/visual/entry_page_view.dart'; +import 'package:aves/widgets/viewer/visual/state.dart'; +import 'package:flutter/foundation.dart'; +import 'package:flutter/material.dart'; + +class VectorViewCheckeredBackground extends StatelessWidget { + final Size displaySize; + final ValueNotifier viewStateNotifier; + final Widget child; + + const VectorViewCheckeredBackground({ + @required this.displaySize, + @required this.viewStateNotifier, + @required this.child, + }); + + @override + Widget build(BuildContext context) { + return ValueListenableBuilder( + valueListenable: viewStateNotifier, + builder: (context, viewState, child) { + final viewportSize = viewState.viewportSize; + if (viewportSize == null) return child; + + final side = viewportSize.shortestSide; + final checkSize = side / ((side / EntryPageView.decorationCheckSize).round()); + + final viewSize = displaySize * viewState.scale; + final decorationSize = applyBoxFit(BoxFit.none, viewSize, viewportSize).source; + final offset = ((decorationSize - viewportSize) as Offset) / 2; + + return Stack( + alignment: Alignment.center, + children: [ + Positioned( + width: decorationSize.width, + height: decorationSize.height, + child: DecoratedBox( + decoration: CheckeredDecoration( + checkSize: checkSize, + offset: offset, + ), + ), + ), + child, + ], + ); + }, + child: child, + ); + } +} diff --git a/lib/widgets/fullscreen/video_view.dart b/lib/widgets/viewer/visual/video.dart similarity index 96% rename from lib/widgets/fullscreen/video_view.dart rename to lib/widgets/viewer/visual/video.dart index f45bda841..51c257072 100644 --- a/lib/widgets/fullscreen/video_view.dart +++ b/lib/widgets/viewer/visual/video.dart @@ -17,10 +17,10 @@ class AvesVideo extends StatefulWidget { }) : super(key: key); @override - State createState() => AvesVideoState(); + State createState() => _AvesVideoState(); } -class AvesVideoState extends State { +class _AvesVideoState extends State { final List _subscriptions = []; ImageEntry get entry => widget.entry; diff --git a/test/utils/string_utils_test.dart b/test/utils/string_utils_test.dart index 1b903eccf..8b5d1a3da 100644 --- a/test/utils/string_utils_test.dart +++ b/test/utils/string_utils_test.dart @@ -1,5 +1,5 @@ -import 'package:test/test.dart'; import 'package:aves/utils/string_utils.dart'; +import 'package:test/test.dart'; void main() { test('Sentence case', () { diff --git a/test/utils/time_utils_test.dart b/test/utils/time_utils_test.dart index e5f171b23..bf911d522 100644 --- a/test/utils/time_utils_test.dart +++ b/test/utils/time_utils_test.dart @@ -1,5 +1,5 @@ -import 'package:test/test.dart'; import 'package:aves/utils/time_utils.dart'; +import 'package:test/test.dart'; void main() { test('Comparison extension functions', () { diff --git a/test_driver/app_test.dart b/test_driver/app_test.dart index d549c6e54..999f2c77b 100644 --- a/test_driver/app_test.dart +++ b/test_driver/app_test.dart @@ -36,7 +36,7 @@ void main() { groupCollection(); selectFirstAlbum(); searchAlbum(); - showFullscreen(); + showViewer(); toggleOverlay(); zoom(); showInfoMetadata(); @@ -145,8 +145,8 @@ void searchAlbum() { }); } -void showFullscreen() { - test('[collection] show fullscreen', () async { +void showViewer() { + test('[collection] show viewer', () async { await driver.tap(find.byType('DecoratedThumbnail')); await driver.waitUntilNoTransientCallbacks(); await Future.delayed(Duration(seconds: 2)); @@ -154,7 +154,7 @@ void showFullscreen() { } void toggleOverlay() { - test('[fullscreen] toggle overlay', () async { + test('[viewer] toggle overlay', () async { final imageView = find.byValueKey('imageview'); print('* hide overlay'); @@ -168,7 +168,7 @@ void toggleOverlay() { } void zoom() { - test('[fullscreen] zoom cycle', () async { + test('[viewer] zoom cycle', () async { final imageView = find.byValueKey('imageview'); await driver.doubleTap(imageView); @@ -183,7 +183,7 @@ void zoom() { } void showInfoMetadata() { - test('[fullscreen] show info', () async { + test('[viewer] show info', () async { final verticalPageView = find.byValueKey('vertical-pageview'); print('* scroll down to info'); @@ -214,7 +214,7 @@ void showInfoMetadata() { } void scrollOffImage() { - test('[fullscreen] scroll off', () async { + test('[viewer] scroll off', () async { await driver.scroll(find.byValueKey('imageview'), 0, 800, Duration(milliseconds: 600)); await Future.delayed(Duration(seconds: 1)); });