From aefdac565068416d68e64255dbde9071d7aba9e2 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Sun, 30 Apr 2023 20:26:10 +0200 Subject: [PATCH] Added navigation rail --- lib/base.dart | 34 ++++++++++------ lib/widgets/navigation_rail.dart | 67 ++++++++++++++++++++++++++++++++ 2 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 lib/widgets/navigation_rail.dart diff --git a/lib/base.dart b/lib/base.dart index 509df8e..c4c3c68 100644 --- a/lib/base.dart +++ b/lib/base.dart @@ -12,6 +12,7 @@ import 'package:flutter/services.dart'; import 'package:adguard_home_manager/widgets/bottom_nav_bar.dart'; import 'package:adguard_home_manager/widgets/update_modal.dart'; +import 'package:adguard_home_manager/widgets/navigation_rail.dart'; import 'package:adguard_home_manager/providers/app_config_provider.dart'; import 'package:adguard_home_manager/models/github_release.dart'; @@ -110,6 +111,8 @@ class _BaseState extends State with WidgetsBindingObserver { final serversProvider = Provider.of(context); final appConfigProvider = Provider.of(context); + final width = MediaQuery.of(context).size.width; + List screens = serversProvider.selectedServer != null ? screensServerConnected : screensSelectServer; @@ -129,18 +132,27 @@ class _BaseState extends State with WidgetsBindingObserver { : Brightness.light, ), child: Scaffold( - body: PageTransitionSwitcher( - duration: const Duration(milliseconds: 200), - transitionBuilder: ( - (child, primaryAnimation, secondaryAnimation) => FadeThroughTransition( - animation: primaryAnimation, - secondaryAnimation: secondaryAnimation, - child: child, - ) - ), - child: screens[appConfigProvider.selectedScreen].body, + body: Row( + children: [ + if (width > 900) const SideNavigationRail(), + Expanded( + child: PageTransitionSwitcher( + duration: const Duration(milliseconds: 200), + transitionBuilder: ( + (child, primaryAnimation, secondaryAnimation) => FadeThroughTransition( + animation: primaryAnimation, + secondaryAnimation: secondaryAnimation, + child: child, + ) + ), + child: screens[appConfigProvider.selectedScreen].body, + ), + ), + ], ), - bottomNavigationBar: const BottomNavBar(), + bottomNavigationBar: width <= 900 + ? const BottomNavBar() + : null, ) ); } diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart new file mode 100644 index 0000000..a63b18e --- /dev/null +++ b/lib/widgets/navigation_rail.dart @@ -0,0 +1,67 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:flutter_gen/gen_l10n/app_localizations.dart'; + +import 'package:adguard_home_manager/config/app_screens.dart'; +import 'package:adguard_home_manager/models/app_screen.dart'; +import 'package:adguard_home_manager/providers/app_config_provider.dart'; +import 'package:adguard_home_manager/providers/servers_provider.dart'; + +class SideNavigationRail extends StatelessWidget { + const SideNavigationRail({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + final serversProvider = Provider.of(context); + final appConfigProvider = Provider.of(context); + + List screens = serversProvider.selectedServer != null + ? screensServerConnected + : screensSelectServer; + + String translatedName(String key) { + switch (key) { + case 'home': + return AppLocalizations.of(context)!.home; + + case 'settings': + return AppLocalizations.of(context)!.settings; + + case 'connect': + return AppLocalizations.of(context)!.connect; + + case 'clients': + return AppLocalizations.of(context)!.clients; + + case 'logs': + return AppLocalizations.of(context)!.logs; + + case 'filters': + return AppLocalizations.of(context)!.filters; + + default: + return ''; + } + } + + return NavigationRail( + selectedIndex: appConfigProvider.selectedScreen, + destinations: screens.map((screen) => NavigationRailDestination( + icon: Icon( + screen.icon, + color: screens[appConfigProvider.selectedScreen] == screen + ? Theme.of(context).colorScheme.onSecondaryContainer + : Theme.of(context).colorScheme.onSurfaceVariant, + ), + label: Text(translatedName(screen.name)) + )).toList(), + onDestinationSelected: (value) { + appConfigProvider.setSelectedScreen(value); + }, + labelType: NavigationRailLabelType.all, + useIndicator: true, + groupAlignment: 0, + backgroundColor: Theme.of(context).colorScheme.primary.withOpacity(0.05), + ); + } +} \ No newline at end of file