From b8d2ee9e0d521e7c26ae6f55e50b04c704b1b5a9 Mon Sep 17 00:00:00 2001 From: Juan Gilsanz Polo Date: Wed, 3 May 2023 16:35:53 +0200 Subject: [PATCH] Added custom menu --- lib/base.dart | 75 ++++++++++++++++--------------- lib/l10n/app_en.arb | 3 +- lib/l10n/app_es.arb | 3 +- lib/widgets/menu_bar.dart | 92 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 135 insertions(+), 38 deletions(-) create mode 100644 lib/widgets/menu_bar.dart diff --git a/lib/base.dart b/lib/base.dart index 1c5ad7d..c33fce3 100644 --- a/lib/base.dart +++ b/lib/base.dart @@ -11,6 +11,7 @@ import 'package:store_checker/store_checker.dart'; import 'package:flutter/services.dart'; import 'package:adguard_home_manager/widgets/bottom_nav_bar.dart'; +import 'package:adguard_home_manager/widgets/menu_bar.dart'; import 'package:adguard_home_manager/widgets/update_modal.dart'; import 'package:adguard_home_manager/widgets/navigation_rail.dart'; @@ -127,43 +128,45 @@ class _BaseState extends State with WidgetsBindingObserver { ? screensServerConnected : screensSelectServer; - return AnnotatedRegion( - value: SystemUiOverlayStyle( - statusBarColor: Colors.transparent, - statusBarBrightness: Theme.of(context).brightness == Brightness.light - ? Brightness.light - : Brightness.dark, - statusBarIconBrightness: Theme.of(context).brightness == Brightness.light - ? Brightness.dark - : Brightness.light, - systemNavigationBarColor: Theme.of(context).scaffoldBackgroundColor, - systemNavigationBarIconBrightness: Theme.of(context).brightness == Brightness.light - ? Brightness.dark - : Brightness.light, - ), - child: Scaffold( - 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, - ), - ), - ], + return CustomMenuBar( + child: AnnotatedRegion( + value: SystemUiOverlayStyle( + statusBarColor: Colors.transparent, + statusBarBrightness: Theme.of(context).brightness == Brightness.light + ? Brightness.light + : Brightness.dark, + statusBarIconBrightness: Theme.of(context).brightness == Brightness.light + ? Brightness.dark + : Brightness.light, + systemNavigationBarColor: Theme.of(context).scaffoldBackgroundColor, + systemNavigationBarIconBrightness: Theme.of(context).brightness == Brightness.light + ? Brightness.dark + : Brightness.light, ), - bottomNavigationBar: width <= 900 - ? const BottomNavBar() - : null, - ) + child: Scaffold( + 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: width <= 900 + ? const BottomNavBar() + : null, + ) + ), ); } } \ No newline at end of file diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index c08bb8e..3b087c6 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -611,5 +611,6 @@ "selectOptionLeftColumn": "Select an option of the left column", "selectClientLeftColumn": "Select a client of the left column", "disableList": "Disable list", - "enableList": "Enable list" + "enableList": "Enable list", + "screens": "Screens" } \ No newline at end of file diff --git a/lib/l10n/app_es.arb b/lib/l10n/app_es.arb index e4bf4b6..90c396a 100644 --- a/lib/l10n/app_es.arb +++ b/lib/l10n/app_es.arb @@ -611,5 +611,6 @@ "selectOptionLeftColumn": "Selecciona una opción de la columna de la izquierda", "selectClientLeftColumn": "Selecciona un cliente de la columna de la izquierda", "disableList": "Deshabilitar lista", - "enableList": "Habilitar lista" + "enableList": "Habilitar lista", + "screens": "Pantallas" } \ No newline at end of file diff --git a/lib/widgets/menu_bar.dart b/lib/widgets/menu_bar.dart new file mode 100644 index 0000000..0151b87 --- /dev/null +++ b/lib/widgets/menu_bar.dart @@ -0,0 +1,92 @@ +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 CustomMenuBar extends StatelessWidget { + final Widget child; + + const CustomMenuBar({ + Key? key, + required this.child + }) : 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 'connect': + return AppLocalizations.of(context)!.connect; + + case 'home': + return AppLocalizations.of(context)!.home; + + case 'settings': + return AppLocalizations.of(context)!.settings; + + case 'clients': + return AppLocalizations.of(context)!.clients; + + case 'logs': + return AppLocalizations.of(context)!.logs; + + case 'filters': + return AppLocalizations.of(context)!.filters; + + default: + return ''; + } + } + + return PlatformMenuBar( + menus: [ + PlatformMenu( + label: 'AdGuard Home Manager', + menus: [ + if ( + PlatformProvidedMenuItem.hasMenu(PlatformProvidedMenuItemType.about) + ) const PlatformMenuItemGroup( + members: [ + PlatformProvidedMenuItem( + type: PlatformProvidedMenuItemType.about, + ), + ] + ), + if ( + PlatformProvidedMenuItem.hasMenu(PlatformProvidedMenuItemType.quit) + ) const PlatformMenuItemGroup( + members: [ + PlatformProvidedMenuItem( + type: PlatformProvidedMenuItemType.quit, + ), + ] + ) + ], + ), + PlatformMenu( + label: AppLocalizations.of(context)!.screens, + menus: [ + PlatformMenuItemGroup( + members: screens.asMap().entries.map((e) => PlatformMenuItem( + label: "${appConfigProvider.selectedScreen == e.key ? '✔' : ''} ${translatedName(e.value.name)}", + onSelected: () => appConfigProvider.setSelectedScreen(e.key), + )).toList() + ), + ], + ), + ], + child: child, + ); + } +} \ No newline at end of file