From 82501a3131c3938d9d0b41a31125317761a789d0 Mon Sep 17 00:00:00 2001 From: stopflock Date: Mon, 29 Sep 2025 23:21:25 -0500 Subject: [PATCH] Move settings around part 1 --- lib/localizations/en.json | 8 ++- lib/localizations/es.json | 8 ++- lib/localizations/fr.json | 8 ++- lib/main.dart | 6 +++ lib/screens/advanced_settings_screen.dart | 30 +++++++++++ lib/screens/offline_settings_screen.dart | 30 +++++++++++ lib/screens/profiles_settings_screen.dart | 30 +++++++++++ lib/screens/settings_screen.dart | 61 +++++++++++++++++------ 8 files changed, 162 insertions(+), 19 deletions(-) create mode 100644 lib/screens/advanced_settings_screen.dart create mode 100644 lib/screens/offline_settings_screen.dart create mode 100644 lib/screens/profiles_settings_screen.dart diff --git a/lib/localizations/en.json b/lib/localizations/en.json index 4414d3e..e36c5d6 100644 --- a/lib/localizations/en.json +++ b/lib/localizations/en.json @@ -36,7 +36,13 @@ "offlineModeSubtitle": "Disable all network requests except for local/offline areas.", "offlineModeWarningTitle": "Active Downloads", "offlineModeWarningMessage": "Enabling offline mode will cancel any active area downloads. Do you want to continue?", - "enableOfflineMode": "Enable Offline Mode" + "enableOfflineMode": "Enable Offline Mode", + "profiles": "Profiles", + "profilesSubtitle": "Manage node and operator profiles", + "offlineSettings": "Offline Settings", + "offlineSettingsSubtitle": "Manage offline mode and downloaded areas", + "advancedSettings": "Advanced Settings", + "advancedSettingsSubtitle": "Performance and tile provider settings" }, "node": { "title": "Node #{}", diff --git a/lib/localizations/es.json b/lib/localizations/es.json index 44bf449..1b52824 100644 --- a/lib/localizations/es.json +++ b/lib/localizations/es.json @@ -36,7 +36,13 @@ "offlineModeSubtitle": "Deshabilitar todas las solicitudes de red excepto para áreas locales/sin conexión.", "offlineModeWarningTitle": "Descargas Activas", "offlineModeWarningMessage": "Habilitar el modo sin conexión cancelará cualquier descarga de área activa. ¿Desea continuar?", - "enableOfflineMode": "Habilitar Modo Sin Conexión" + "enableOfflineMode": "Habilitar Modo Sin Conexión", + "profiles": "Perfiles", + "profilesSubtitle": "Gestionar perfiles de nodos y operadores", + "offlineSettings": "Configuración Sin Conexión", + "offlineSettingsSubtitle": "Gestionar modo sin conexión y áreas descargadas", + "advancedSettings": "Configuración Avanzada", + "advancedSettingsSubtitle": "Configuración de rendimiento y proveedores de teselas" }, "node": { "title": "Nodo #{}", diff --git a/lib/localizations/fr.json b/lib/localizations/fr.json index 49cb1bd..c34b846 100644 --- a/lib/localizations/fr.json +++ b/lib/localizations/fr.json @@ -36,7 +36,13 @@ "offlineModeSubtitle": "Désactiver toutes les requêtes réseau sauf pour les zones locales/hors ligne.", "offlineModeWarningTitle": "Téléchargements Actifs", "offlineModeWarningMessage": "L'activation du mode hors ligne annulera tous les téléchargements de zone actifs. Voulez-vous continuer?", - "enableOfflineMode": "Activer le Mode Hors Ligne" + "enableOfflineMode": "Activer le Mode Hors Ligne", + "profiles": "Profils", + "profilesSubtitle": "Gérer les profils de nœuds et d'opérateurs", + "offlineSettings": "Paramètres Hors Ligne", + "offlineSettingsSubtitle": "Gérer le mode hors ligne et les zones téléchargées", + "advancedSettings": "Paramètres Avancés", + "advancedSettingsSubtitle": "Paramètres de performance et de fournisseurs de tuiles" }, "node": { "title": "Nœud #{}", diff --git a/lib/main.dart b/lib/main.dart index 54a3a33..2bdbf0a 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -4,6 +4,9 @@ import 'package:provider/provider.dart'; import 'app_state.dart'; import 'screens/home_screen.dart'; import 'screens/settings_screen.dart'; +import 'screens/profiles_settings_screen.dart'; +import 'screens/offline_settings_screen.dart'; +import 'screens/advanced_settings_screen.dart'; import 'services/localization_service.dart'; @@ -58,6 +61,9 @@ class DeFlockApp extends StatelessWidget { routes: { '/': (context) => const HomeScreen(), '/settings': (context) => const SettingsScreen(), + '/settings/profiles': (context) => const ProfilesSettingsScreen(), + '/settings/offline': (context) => const OfflineSettingsScreen(), + '/settings/advanced': (context) => const AdvancedSettingsScreen(), }, initialRoute: '/', ); diff --git a/lib/screens/advanced_settings_screen.dart b/lib/screens/advanced_settings_screen.dart new file mode 100644 index 0000000..e1e50a1 --- /dev/null +++ b/lib/screens/advanced_settings_screen.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'settings_screen_sections/max_nodes_section.dart'; +import 'settings_screen_sections/tile_provider_section.dart'; +import '../services/localization_service.dart'; + +class AdvancedSettingsScreen extends StatelessWidget { + const AdvancedSettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + final locService = LocalizationService.instance; + + return AnimatedBuilder( + animation: LocalizationService.instance, + builder: (context, child) => Scaffold( + appBar: AppBar( + title: Text(locService.t('settings.advancedSettings')), + ), + body: ListView( + padding: const EdgeInsets.all(16), + children: const [ + MaxNodesSection(), + Divider(), + TileProviderSection(), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/offline_settings_screen.dart b/lib/screens/offline_settings_screen.dart new file mode 100644 index 0000000..1cd4d23 --- /dev/null +++ b/lib/screens/offline_settings_screen.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'settings_screen_sections/offline_mode_section.dart'; +import 'settings_screen_sections/offline_areas_section.dart'; +import '../services/localization_service.dart'; + +class OfflineSettingsScreen extends StatelessWidget { + const OfflineSettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + final locService = LocalizationService.instance; + + return AnimatedBuilder( + animation: LocalizationService.instance, + builder: (context, child) => Scaffold( + appBar: AppBar( + title: Text(locService.t('settings.offlineSettings')), + ), + body: ListView( + padding: const EdgeInsets.all(16), + children: const [ + OfflineModeSection(), + Divider(), + OfflineAreasSection(), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/profiles_settings_screen.dart b/lib/screens/profiles_settings_screen.dart new file mode 100644 index 0000000..559d338 --- /dev/null +++ b/lib/screens/profiles_settings_screen.dart @@ -0,0 +1,30 @@ +import 'package:flutter/material.dart'; +import 'settings_screen_sections/profile_list_section.dart'; +import 'settings_screen_sections/operator_profile_list_section.dart'; +import '../services/localization_service.dart'; + +class ProfilesSettingsScreen extends StatelessWidget { + const ProfilesSettingsScreen({super.key}); + + @override + Widget build(BuildContext context) { + final locService = LocalizationService.instance; + + return AnimatedBuilder( + animation: LocalizationService.instance, + builder: (context, child) => Scaffold( + appBar: AppBar( + title: Text(locService.t('settings.profiles')), + ), + body: ListView( + padding: const EdgeInsets.all(16), + children: const [ + ProfileListSection(), + Divider(), + OperatorProfileListSection(), + ], + ), + ), + ); + } +} \ No newline at end of file diff --git a/lib/screens/settings_screen.dart b/lib/screens/settings_screen.dart index 28fc96e..b59f3f5 100644 --- a/lib/screens/settings_screen.dart +++ b/lib/screens/settings_screen.dart @@ -1,15 +1,9 @@ import 'package:flutter/material.dart'; import 'settings_screen_sections/auth_section.dart'; import 'settings_screen_sections/upload_mode_section.dart'; -import 'settings_screen_sections/profile_list_section.dart'; -import 'settings_screen_sections/operator_profile_list_section.dart'; import 'settings_screen_sections/queue_section.dart'; -import 'settings_screen_sections/offline_areas_section.dart'; -import 'settings_screen_sections/offline_mode_section.dart'; import 'settings_screen_sections/about_section.dart'; -import 'settings_screen_sections/max_nodes_section.dart'; import 'settings_screen_sections/proximity_alerts_section.dart'; -import 'settings_screen_sections/tile_provider_section.dart'; import 'settings_screen_sections/language_section.dart'; import '../services/localization_service.dart'; import '../dev_config.dart'; @@ -19,10 +13,12 @@ class SettingsScreen extends StatelessWidget { @override Widget build(BuildContext context) { + final locService = LocalizationService.instance; + return AnimatedBuilder( animation: LocalizationService.instance, builder: (context, child) => Scaffold( - appBar: AppBar(title: Text(LocalizationService.instance.t('settings.title'))), + appBar: AppBar(title: Text(locService.t('settings.title'))), body: ListView( padding: const EdgeInsets.all(16), children: [ @@ -35,20 +31,37 @@ class SettingsScreen extends StatelessWidget { const Divider(), const QueueSection(), const Divider(), - const ProfileListSection(), - const Divider(), - const OperatorProfileListSection(), - const Divider(), - const MaxNodesSection(), - const Divider(), const ProximityAlertsSection(), const Divider(), - const TileProviderSection(), + + // Navigation to sub-pages + _buildNavigationTile( + context, + icon: Icons.account_tree, + title: locService.t('settings.profiles'), + subtitle: locService.t('settings.profilesSubtitle'), + onTap: () => Navigator.pushNamed(context, '/settings/profiles'), + ), const Divider(), - const OfflineModeSection(), + + _buildNavigationTile( + context, + icon: Icons.cloud_off, + title: locService.t('settings.offlineSettings'), + subtitle: locService.t('settings.offlineSettingsSubtitle'), + onTap: () => Navigator.pushNamed(context, '/settings/offline'), + ), const Divider(), - const OfflineAreasSection(), + + _buildNavigationTile( + context, + icon: Icons.tune, + title: locService.t('settings.advancedSettings'), + subtitle: locService.t('settings.advancedSettingsSubtitle'), + onTap: () => Navigator.pushNamed(context, '/settings/advanced'), + ), const Divider(), + const LanguageSection(), const Divider(), const AboutSection(), @@ -57,4 +70,20 @@ class SettingsScreen extends StatelessWidget { ), ); } + + Widget _buildNavigationTile( + BuildContext context, { + required IconData icon, + required String title, + required String subtitle, + required VoidCallback onTap, + }) { + return ListTile( + leading: Icon(icon), + title: Text(title), + subtitle: Text(subtitle), + trailing: const Icon(Icons.arrow_forward_ios, size: 16), + onTap: onTap, + ); + } }