diff --git a/assets/translations/en-US.json b/assets/translations/en-US.json index 4b7e2f3..5b002eb 100644 --- a/assets/translations/en-US.json +++ b/assets/translations/en-US.json @@ -887,5 +887,7 @@ "postTotalCount": { "one": "Total {} post", "other": "Total {} posts" - } + }, + "settingsHideBottomNav": "Hide Bottom Navigation", + "settingsHideBottomNavDescription": "Hide the bottom navigation bar, and show the navigation buttons in the drawer." } diff --git a/assets/translations/zh-CN.json b/assets/translations/zh-CN.json index 5e89eaf..ab5209a 100644 --- a/assets/translations/zh-CN.json +++ b/assets/translations/zh-CN.json @@ -885,5 +885,7 @@ "postTotalCount": { "zero": "没有帖子", "one": "共 {} 条帖子" - } + }, + "settingsHideBottomNav": "隐藏底部导航栏", + "settingsHideBottomNavDescription": "隐藏底部导航栏,在侧边栏抽屉显示导航按钮。" } diff --git a/assets/translations/zh-HK.json b/assets/translations/zh-HK.json index 187984d..f070db4 100644 --- a/assets/translations/zh-HK.json +++ b/assets/translations/zh-HK.json @@ -879,5 +879,13 @@ "appInitUserDirectory": "正在初始化用户目錄", "appInitRealm": "正在初始化領域信息", "appInitChat": "正在初始化聊天", - "appInitDone": "完成" + "appInitDone": "完成", + "community": "社區", + "realmCommunity": "{}的社區", + "postTotalCount": { + "zero": "沒有帖子", + "one": "共 {} 條帖子" + }, + "settingsHideBottomNav": "隱藏底部導航欄", + "settingsHideBottomNavDescription": "隱藏底部導航欄,在側邊欄抽屜顯示導航按鈕。" } diff --git a/assets/translations/zh-TW.json b/assets/translations/zh-TW.json index 71ae5c4..c5753be 100644 --- a/assets/translations/zh-TW.json +++ b/assets/translations/zh-TW.json @@ -879,5 +879,13 @@ "appInitUserDirectory": "正在初始化用戶目錄", "appInitRealm": "正在初始化領域信息", "appInitChat": "正在初始化聊天", - "appInitDone": "完成" + "appInitDone": "完成", + "community": "社區", + "realmCommunity": "{}的社區", + "postTotalCount": { + "zero": "沒有帖子", + "one": "共 {} 條帖子" + }, + "settingsHideBottomNav": "隱藏底部導航欄", + "settingsHideBottomNavDescription": "隱藏底部導航欄,在側邊欄抽屜顯示導航按鈕。" } diff --git a/lib/providers/config.dart b/lib/providers/config.dart index 374dcfb..52bdcb9 100644 --- a/lib/providers/config.dart +++ b/lib/providers/config.dart @@ -21,6 +21,7 @@ const kAppRealmCompactView = 'app_realm_compact_view'; const kAppCustomFonts = 'app_custom_fonts'; const kAppMixedFeed = 'app_mixed_feed'; const kAppAutoTranslate = 'app_auto_translate'; +const kAppHideBottomNav = 'app_hide_bottom_nav'; const Map kImageQualityLevel = { 'settingsImageQualityLowest': FilterQuality.none, @@ -91,6 +92,15 @@ class ConfigProvider extends ChangeNotifier { return prefs.getBool(kAppAutoTranslate) ?? false; } + bool get hideBottomNav { + return prefs.getBool(kAppHideBottomNav) ?? false; + } + + set hideBottomNav(bool value) { + prefs.setBool(kAppHideBottomNav, value); + notifyListeners(); + } + set autoTranslate(bool value) { prefs.setBool(kAppAutoTranslate, value); notifyListeners(); diff --git a/lib/providers/navigation.dart b/lib/providers/navigation.dart index 9871d6f..4a9fb6b 100644 --- a/lib/providers/navigation.dart +++ b/lib/providers/navigation.dart @@ -25,13 +25,10 @@ class NavigationProvider extends ChangeNotifier { int? get currentIndex => _currentIndex; - static const List kShowBottomNavScreen = [ - 'home', - 'explore', - 'account', - 'album', - 'chat', - ]; + List get showBottomNavScreen => destinations + .where((ele) => ele.isPinned) + .map((ele) => ele.screen) + .toList(); static const List kAllDestination = [ AppNavDestination( diff --git a/lib/screens/settings.dart b/lib/screens/settings.dart index ac2533c..94ac244 100644 --- a/lib/screens/settings.dart +++ b/lib/screens/settings.dart @@ -336,6 +336,19 @@ class _SettingsScreenState extends State { setState(() {}); }, ), + CheckboxListTile( + secondary: const Icon(Symbols.hide), + title: Text('settingsHideBottomNav').tr(), + subtitle: Text('settingsHideBottomNavDescription').tr(), + contentPadding: const EdgeInsets.only(left: 24, right: 17), + value: _prefs.getBool(kAppHideBottomNav) ?? false, + onChanged: (value) { + _prefs.setBool(kAppHideBottomNav, value ?? false); + final cfg = context.read(); + cfg.calcDrawerSize(context); + setState(() {}); + }, + ), ListTile( leading: const Icon(Symbols.font_download), title: Text('settingsCustomFonts').tr(), diff --git a/lib/widgets/navigation/app_bottom_navigation.dart b/lib/widgets/navigation/app_bottom_navigation.dart index 1a40060..cea41e1 100644 --- a/lib/widgets/navigation/app_bottom_navigation.dart +++ b/lib/widgets/navigation/app_bottom_navigation.dart @@ -37,17 +37,15 @@ class _AppBottomNavigationBarState extends State { ...nav.destinations.where((ele) => ele.isPinned), ]; - return BottomNavigationBar( - currentIndex: nav.getIndexInRange(0, nav.pinnedDestinationCount), - type: BottomNavigationBarType.fixed, - showUnselectedLabels: false, - items: destinations.map((ele) { - return BottomNavigationBarItem( + return NavigationBar( + selectedIndex: nav.getIndexInRange(0, nav.pinnedDestinationCount), + destinations: destinations.map((ele) { + return NavigationDestination( icon: ele.icon, label: ele.label.tr(), ); }).toList(), - onTap: (idx) { + onDestinationSelected: (idx) { nav.setIndex(idx); GoRouter.of(context).goNamed(destinations[idx].screen); }, diff --git a/lib/widgets/navigation/app_drawer_navigation.dart b/lib/widgets/navigation/app_drawer_navigation.dart index 3cb4beb..6977b7e 100644 --- a/lib/widgets/navigation/app_drawer_navigation.dart +++ b/lib/widgets/navigation/app_drawer_navigation.dart @@ -78,27 +78,29 @@ class _AppNavigationDrawerState extends State { Expanded( child: _DrawerContentList(), ), - Row( - spacing: 8, - children: nav.destinations.where((ele) => ele.isPinned).map( - (ele) { - return Expanded( - child: Tooltip( - message: ele.label.tr(), - child: IconButton.filledTonal( - icon: ele.icon, - color: - Theme.of(context).colorScheme.onPrimaryContainer, - onPressed: () { - GoRouter.of(context).goNamed(ele.screen); - Scaffold.of(context).closeDrawer(); - }, + if (cfg.hideBottomNav) + Row( + spacing: 8, + children: nav.destinations.where((ele) => ele.isPinned).map( + (ele) { + return Expanded( + child: Tooltip( + message: ele.label.tr(), + child: IconButton.filledTonal( + icon: ele.icon, + color: Theme.of(context) + .colorScheme + .onPrimaryContainer, + onPressed: () { + GoRouter.of(context).goNamed(ele.screen); + Scaffold.of(context).closeDrawer(); + }, + ), ), - ), - ); - }, - ).toList(), - ).padding(horizontal: 16), + ); + }, + ).toList(), + ).padding(horizontal: 16), Align( alignment: Alignment.bottomCenter, child: ListTile( diff --git a/lib/widgets/navigation/app_scaffold.dart b/lib/widgets/navigation/app_scaffold.dart index 00adf33..7208f62 100644 --- a/lib/widgets/navigation/app_scaffold.dart +++ b/lib/widgets/navigation/app_scaffold.dart @@ -12,6 +12,7 @@ import 'package:surface/providers/config.dart'; import 'package:surface/providers/navigation.dart'; import 'package:surface/widgets/connection_indicator.dart'; import 'package:surface/widgets/navigation/app_background.dart'; +import 'package:surface/widgets/navigation/app_bottom_navigation.dart'; import 'package:surface/widgets/navigation/app_drawer_navigation.dart'; import 'package:surface/widgets/navigation/app_rail_navigation.dart'; import 'package:surface/widgets/notify_indicator.dart'; @@ -106,6 +107,7 @@ class AppRootScaffold extends StatelessWidget { @override Widget build(BuildContext context) { final cfg = context.watch(); + final nav = context.watch(); final devicePixelRatio = MediaQuery.of(context).devicePixelRatio; final isCollapseDrawer = cfg.drawerIsCollapsed; @@ -117,6 +119,11 @@ class AppRootScaffold extends StatelessWidget { .last .route .name; + final isShowBottomNavigation = cfg.hideBottomNav + ? false + : nav.showBottomNavScreen.contains(routeName) + ? ResponsiveBreakpoints.of(context).smallerOrEqualTo(MOBILE) + : false; final isPopable = !NavigationProvider.kAllDestination .map((ele) => ele.screen) .contains(routeName); @@ -227,6 +234,8 @@ class AppRootScaffold extends StatelessWidget { ), drawer: !isExpandedDrawer ? AppNavigationDrawer() : null, drawerEdgeDragWidth: isPopable ? 0 : null, + bottomNavigationBar: + isShowBottomNavigation ? AppBottomNavigationBar() : null, ); } }