From c81c80a2720793539456223f944fbc7f3c0c91b3 Mon Sep 17 00:00:00 2001 From: Ming Ming Date: Sun, 27 Oct 2024 03:31:01 +0800 Subject: [PATCH] Move map browser entrance from tab to collections page --- app/lib/controller/pref_controller.dart | 4 + app/lib/widget/home.dart | 11 +-- app/lib/widget/home_collections.dart | 1 + .../home_collections/nav_bar_buttons.dart | 20 +++++ .../home_collections/navigation_bar.dart | 3 + app/lib/widget/map_browser.dart | 76 +++++++++---------- app/lib/widget/my_app.dart | 2 + .../settings/collections_nav_bar/buttons.dart | 23 ++++++ .../settings/collections_nav_bar/view.dart | 9 +++ 9 files changed, 101 insertions(+), 48 deletions(-) diff --git a/app/lib/controller/pref_controller.dart b/app/lib/controller/pref_controller.dart index 5eca835b..a807f949 100644 --- a/app/lib/controller/pref_controller.dart +++ b/app/lib/controller/pref_controller.dart @@ -583,6 +583,10 @@ const _viewerBottomAppBarButtonsDefault = [ ViewerAppBarButtonType.delete, ]; const _homeCollectionsNavBarButtonsDefault = [ + PrefHomeCollectionsNavButton( + type: HomeCollectionsNavBarButtonType.map, + isMinimized: false, + ), PrefHomeCollectionsNavButton( type: HomeCollectionsNavBarButtonType.sharing, isMinimized: false, diff --git a/app/lib/widget/home.dart b/app/lib/widget/home.dart index ca54b503..8f12daaa 100644 --- a/app/lib/widget/home.dart +++ b/app/lib/widget/home.dart @@ -22,7 +22,6 @@ import 'package:nc_photos/use_case/import_potential_shared_album.dart'; import 'package:nc_photos/widget/home_collections.dart'; import 'package:nc_photos/widget/home_photos2.dart'; import 'package:nc_photos/widget/home_search.dart'; -import 'package:nc_photos/widget/map_browser.dart'; import 'package:np_codegen/np_codegen.dart'; import 'package:np_common/or_null.dart'; @@ -121,11 +120,6 @@ class _HomeState extends State with TickerProviderStateMixin { selectedIcon: const Icon(Icons.grid_view_sharp), label: L10n.global().collectionsTooltip, ), - NavigationDestination( - icon: const Icon(Icons.map_outlined), - selectedIcon: const Icon(Icons.map), - label: L10n.global().homeTabMapBrowser, - ), ], selectedIndex: _nextPage, onDestinationSelected: _onTapNavItem, @@ -137,7 +131,7 @@ class _HomeState extends State with TickerProviderStateMixin { return PageView.builder( controller: _pageController, physics: const NeverScrollableScrollPhysics(), - itemCount: 4, + itemCount: 3, itemBuilder: (context, index) => SlideTransition( position: Tween( begin: const Offset(0, .05), @@ -164,9 +158,6 @@ class _HomeState extends State with TickerProviderStateMixin { case 2: return const HomeCollections(); - case 3: - return const MapBrowser(); - default: throw ArgumentError("Invalid page index: $index"); } diff --git a/app/lib/widget/home_collections.dart b/app/lib/widget/home_collections.dart index 0cb3727a..5e8ee58a 100644 --- a/app/lib/widget/home_collections.dart +++ b/app/lib/widget/home_collections.dart @@ -37,6 +37,7 @@ import 'package:nc_photos/widget/enhanced_photo_browser.dart'; import 'package:nc_photos/widget/fade_out_list.dart'; import 'package:nc_photos/widget/handler/double_tap_exit_handler.dart'; import 'package:nc_photos/widget/home_app_bar.dart'; +import 'package:nc_photos/widget/map_browser.dart'; import 'package:nc_photos/widget/navigation_bar_blur_filter.dart'; import 'package:nc_photos/widget/new_collection_dialog.dart'; import 'package:nc_photos/widget/page_visibility_mixin.dart'; diff --git a/app/lib/widget/home_collections/nav_bar_buttons.dart b/app/lib/widget/home_collections/nav_bar_buttons.dart index fb6ee7cb..7a27b939 100644 --- a/app/lib/widget/home_collections/nav_bar_buttons.dart +++ b/app/lib/widget/home_collections/nav_bar_buttons.dart @@ -242,3 +242,23 @@ class _NavBarTrashButton extends StatelessWidget { final bool isMinimized; } + +class _NavBarMapButton extends StatelessWidget { + const _NavBarMapButton({ + required this.isMinimized, + }); + + @override + Widget build(BuildContext context) { + return _NavBarButton( + icon: const Icon(Icons.map_outlined), + label: L10n.global().homeTabMapBrowser, + isMinimized: isMinimized, + onPressed: () { + Navigator.of(context).pushNamed(MapBrowser.routeName); + }, + ); + } + + final bool isMinimized; +} diff --git a/app/lib/widget/home_collections/navigation_bar.dart b/app/lib/widget/home_collections/navigation_bar.dart index 3dee99cd..71df8e72 100644 --- a/app/lib/widget/home_collections/navigation_bar.dart +++ b/app/lib/widget/home_collections/navigation_bar.dart @@ -6,6 +6,7 @@ enum HomeCollectionsNavBarButtonType { edited, archive, trash, + map, ; static HomeCollectionsNavBarButtonType fromValue(int value) => @@ -76,6 +77,8 @@ class _NavigationBarState extends State<_NavigationBar> { return _NavBarArchiveButton(isMinimized: btn.isMinimized); case HomeCollectionsNavBarButtonType.trash: return _NavBarTrashButton(isMinimized: btn.isMinimized); + case HomeCollectionsNavBarButtonType.map: + return _NavBarMapButton(isMinimized: btn.isMinimized); } } diff --git a/app/lib/widget/map_browser.dart b/app/lib/widget/map_browser.dart index e74fb272..ece39aad 100644 --- a/app/lib/widget/map_browser.dart +++ b/app/lib/widget/map_browser.dart @@ -27,10 +27,8 @@ import 'package:nc_photos/np_api_util.dart'; import 'package:nc_photos/snack_bar_manager.dart'; import 'package:nc_photos/stream_extension.dart'; import 'package:nc_photos/stream_util.dart'; -import 'package:nc_photos/theme/dimension.dart'; import 'package:nc_photos/widget/collection_browser.dart'; import 'package:nc_photos/widget/measure.dart'; -import 'package:nc_photos/widget/navigation_bar_blur_filter.dart'; import 'package:nc_photos/widget/network_thumbnail.dart'; import 'package:np_codegen/np_codegen.dart'; import 'package:np_common/object_util.dart'; @@ -46,6 +44,12 @@ part 'map_browser/type.dart'; part 'map_browser/view.dart'; class MapBrowser extends StatelessWidget { + static const routeName = "/map-browser"; + + static Route buildRoute() => MaterialPageRoute( + builder: (_) => const MapBrowser(), + ); + const MapBrowser({super.key}); @override @@ -77,47 +81,43 @@ class _WrappedMapBrowser extends StatelessWidget { }, ), ], - child: Stack( - children: [ - const _MapView(), - Positioned.directional( - textDirection: Directionality.of(context), - top: MediaQuery.of(context).padding.top + 8, - end: 8, - child: const _DateRangeToggle(), - ), - _BlocSelector( - selector: (state) => state.isShowDataRangeControlPanel, - builder: (context, isShowAnyPanel) => Positioned.fill( - child: isShowAnyPanel - ? GestureDetector( - onTap: () { - context.addEvent(const _CloseControlPanel()); - }, - ) - : const SizedBox.shrink(), + child: Scaffold( + body: Stack( + children: [ + const _MapView(), + Positioned.directional( + textDirection: Directionality.of(context), + top: MediaQuery.of(context).padding.top + 8, + end: 8, + child: const _DateRangeToggle(), ), - ), - Positioned( - left: 8, - right: 8, - top: MediaQuery.of(context).padding.top + 8, - child: _BlocSelector( + _BlocSelector( selector: (state) => state.isShowDataRangeControlPanel, - builder: (context, isShowDataRangeControlPanel) => - _PanelContainer( - isShow: isShowDataRangeControlPanel, - child: const _DateRangeControlPanel(), + builder: (context, isShowAnyPanel) => Positioned.fill( + child: isShowAnyPanel + ? GestureDetector( + onTap: () { + context.addEvent(const _CloseControlPanel()); + }, + ) + : const SizedBox.shrink(), ), ), - ), - Align( - alignment: Alignment.bottomCenter, - child: NavigationBarBlurFilter( - height: AppDimension.of(context).homeBottomAppBarHeight, + Positioned( + left: 8, + right: 8, + top: MediaQuery.of(context).padding.top + 8, + child: _BlocSelector( + selector: (state) => state.isShowDataRangeControlPanel, + builder: (context, isShowDataRangeControlPanel) => + _PanelContainer( + isShow: isShowDataRangeControlPanel, + child: const _DateRangeControlPanel(), + ), + ), ), - ), - ], + ], + ), ), ); } diff --git a/app/lib/widget/my_app.dart b/app/lib/widget/my_app.dart index d60b39dd..2aab863a 100644 --- a/app/lib/widget/my_app.dart +++ b/app/lib/widget/my_app.dart @@ -36,6 +36,7 @@ import 'package:nc_photos/widget/home.dart'; import 'package:nc_photos/widget/image_editor.dart'; import 'package:nc_photos/widget/image_enhancer.dart'; import 'package:nc_photos/widget/local_file_viewer.dart'; +import 'package:nc_photos/widget/map_browser.dart'; import 'package:nc_photos/widget/people_browser.dart'; import 'package:nc_photos/widget/places_browser.dart'; import 'package:nc_photos/widget/result_viewer.dart'; @@ -215,6 +216,7 @@ class _WrappedAppState extends State<_WrappedApp> PlacesBrowser.routeName: PlacesBrowser.buildRoute, ArchiveBrowser.routeName: ArchiveBrowser.buildRoute, TrustedCertManager.routeName: TrustedCertManager.buildRoute, + MapBrowser.routeName: MapBrowser.buildRoute, }; Route? _onGenerateRoute(RouteSettings settings) { diff --git a/app/lib/widget/settings/collections_nav_bar/buttons.dart b/app/lib/widget/settings/collections_nav_bar/buttons.dart index fa73b040..6ce52459 100644 --- a/app/lib/widget/settings/collections_nav_bar/buttons.dart +++ b/app/lib/widget/settings/collections_nav_bar/buttons.dart @@ -123,3 +123,26 @@ class _TrashButton extends StatelessWidget { final bool isMinimized; final VoidCallback? onPressed; } + +class _MapButton extends StatelessWidget { + const _MapButton({ + required this.isMinimized, + this.onPressed, + }); + + @override + Widget build(BuildContext context) { + return HomeCollectionsNavBarButton( + icon: const Icon(Icons.map_outlined), + label: L10n.global().homeTabMapBrowser, + isMinimized: isMinimized, + isUseTooltipWhenMinimized: false, + onPressed: () { + onPressed?.call(); + }, + ); + } + + final bool isMinimized; + final VoidCallback? onPressed; +} diff --git a/app/lib/widget/settings/collections_nav_bar/view.dart b/app/lib/widget/settings/collections_nav_bar/view.dart index cb26e583..9041f883 100644 --- a/app/lib/widget/settings/collections_nav_bar/view.dart +++ b/app/lib/widget/settings/collections_nav_bar/view.dart @@ -137,6 +137,13 @@ class _DemoButtonDelegate extends StatelessWidget { context.addEvent(_ToggleMinimized(type)); }, ); + case HomeCollectionsNavBarButtonType.map: + return _MapButton( + isMinimized: isMinimized, + onPressed: () { + context.addEvent(_ToggleMinimized(type)); + }, + ); } } @@ -209,6 +216,8 @@ class _CandidateButtonDelegate extends StatelessWidget { return const _ArchiveButton(isMinimized: false); case HomeCollectionsNavBarButtonType.trash: return const _TrashButton(isMinimized: false); + case HomeCollectionsNavBarButtonType.map: + return const _MapButton(isMinimized: false); } }