Move settings around part 1

This commit is contained in:
stopflock
2025-09-29 23:21:25 -05:00
parent e71adab87e
commit 82501a3131
8 changed files with 162 additions and 19 deletions
+7 -1
View File
@@ -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 #{}",
+7 -1
View File
@@ -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 #{}",
+7 -1
View File
@@ -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 #{}",
+6
View File
@@ -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: '/',
);
+30
View File
@@ -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(),
],
),
),
);
}
}
+30
View File
@@ -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(),
],
),
),
);
}
}
+30
View File
@@ -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(),
],
),
),
);
}
}
+45 -16
View File
@@ -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,
);
}
}