From 8868914a764a7f175837eb0bca5b01c1dfe1f04a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Sat, 8 Feb 2025 23:21:20 +0100
Subject: [PATCH] restructured settings and devtools

---
 ...tingsDialog.dart => devToolsSettings.dart} | 20 +++---
 lib/view/settings/settings.dart               | 69 +++++++++----------
 lib/widget/debug/cacheView.dart               | 25 +------
 3 files changed, 42 insertions(+), 72 deletions(-)
 rename lib/view/settings/{devToolsSettingsDialog.dart => devToolsSettings.dart} (90%)

diff --git a/lib/view/settings/devToolsSettingsDialog.dart b/lib/view/settings/devToolsSettings.dart
similarity index 90%
rename from lib/view/settings/devToolsSettingsDialog.dart
rename to lib/view/settings/devToolsSettings.dart
index 463afa9..4dc8877 100644
--- a/lib/view/settings/devToolsSettingsDialog.dart
+++ b/lib/view/settings/devToolsSettings.dart
@@ -10,15 +10,15 @@ import '../../widget/confirmDialog.dart';
 import '../../widget/debug/cacheView.dart';
 import '../../widget/debug/jsonViewer.dart';
 
-class DevToolsSettingsDialog extends StatefulWidget {
+class DevToolsSettings extends StatefulWidget {
   final SettingsProvider settings;
-  const DevToolsSettingsDialog({required this.settings, super.key});
+  const DevToolsSettings({required this.settings, super.key});
 
   @override
-  State<DevToolsSettingsDialog> createState() => _DevToolsSettingsDialogState();
+  State<DevToolsSettings> createState() => _DevToolsSettingsState();
 }
 
-class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
+class _DevToolsSettingsState extends State<DevToolsSettings> {
   @override
   Widget build(BuildContext context) => Column(
       children: [
@@ -59,9 +59,9 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
         ),
         ListTile(
           leading: const CenteredLeading(Icon(Icons.image_outlined)),
-          title: const Text('Cached Thumbnails löschen'),
-          subtitle: Text('etwa ${filesize(PaintingBinding.instance.imageCache.currentSizeBytes)}'),
-          onTap: () {
+          title: const Text('Thumb-storage'),
+          subtitle: Text('etwa ${filesize(PaintingBinding.instance.imageCache.currentSizeBytes)}\nLange tippen um zu löschen'),
+          onLongPress: () {
             ConfirmDialog(
               title: 'Thumbs cache löschen',
               content: 'Alle zwischengespeicherten Bilder werden gelöscht.',
@@ -69,7 +69,6 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
               onConfirm: () => PaintingBinding.instance.imageCache.clear(),
             ).asDialog(context);
           },
-          trailing: const Icon(Icons.arrow_right),
         ),
         ListTile(
           leading: const CenteredLeading(Icon(Icons.settings_applications_outlined)),
@@ -80,7 +79,7 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
           },
           onLongPress: () {
             ConfirmDialog(
-              title: 'App-Speicher löschen',
+              title: 'Einstellungen löschen',
               content: 'Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.',
               confirmButton: 'Unwiederruflich Löschen',
               onConfirm: () {
@@ -112,7 +111,7 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
         ),
         ListTile(
           leading: const CenteredLeading(Icon(Icons.data_object)),
-          title: const Text('BLOC State cache'),
+          title: const Text('BLOC-storage state cache'),
           subtitle: const Text('Lange tippen um zu löschen'),
           onTap: () {
             // Navigator.push(context, MaterialPageRoute(builder: (context) => const CacheView()));
@@ -125,7 +124,6 @@ class _DevToolsSettingsDialogState extends State<DevToolsSettingsDialog> {
               onConfirm: () => HydratedBloc.storage.clear(),
             ).asDialog(context);
           },
-          trailing: const Icon(Icons.arrow_right),
         ),
       ],
     );
diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart
index 09cde2e..9784a29 100644
--- a/lib/view/settings/settings.dart
+++ b/lib/view/settings/settings.dart
@@ -16,7 +16,7 @@ import '../../widget/confirmDialog.dart';
 import '../../widget/debug/cacheView.dart';
 import '../pages/timetable/timetableNameMode.dart';
 import 'defaultSettings.dart';
-import 'devToolsSettingsDialog.dart';
+import 'devToolsSettings.dart';
 import 'privacyInfo.dart';
 
 class Settings extends StatefulWidget {
@@ -155,34 +155,6 @@ class _SettingsState extends State<Settings> {
               ),
             ),
 
-            const Divider(),
-
-            ListTile(
-              leading: const Icon(Icons.drive_folder_upload_outlined),
-              title: const Text('Ordner in Dateien nach oben sortieren'),
-              trailing: Checkbox(
-                value: settings.val().fileSettings.sortFoldersToTop,
-                onChanged: (e) {
-                  settings.val(write: true).fileSettings.sortFoldersToTop = e!;
-                },
-              ),
-            ),
-
-            const Divider(),
-
-            ListTile(
-              leading: const Icon(Icons.open_in_new_outlined),
-              title: const Text('Dateien immer mit Systemdialog öffnen'),
-              trailing: Checkbox(
-                value: settings.val().fileViewSettings.alwaysOpenExternally,
-                onChanged: (e) {
-                  settings.val(write: true).fileViewSettings.alwaysOpenExternally = e!;
-                },
-              ),
-            ),
-
-            const Divider(),
-
             ListTile(
               leading: const CenteredLeading(Icon(Icons.notifications_active_outlined)),
               title: const Text('Push-Benachrichtigungen aktivieren'),
@@ -214,6 +186,30 @@ class _SettingsState extends State<Settings> {
 
             const Divider(),
 
+            ListTile(
+              leading: const Icon(Icons.drive_folder_upload_outlined),
+              title: const Text('Ordner in Dateien nach oben sortieren'),
+              trailing: Checkbox(
+                value: settings.val().fileSettings.sortFoldersToTop,
+                onChanged: (e) {
+                  settings.val(write: true).fileSettings.sortFoldersToTop = e!;
+                },
+              ),
+            ),
+
+            ListTile(
+              leading: const Icon(Icons.open_in_new_outlined),
+              title: const Text('Dateien immer mit Systemdialog öffnen'),
+              trailing: Checkbox(
+                value: settings.val().fileViewSettings.alwaysOpenExternally,
+                onChanged: (e) {
+                  settings.val(write: true).fileViewSettings.alwaysOpenExternally = e!;
+                },
+              ),
+            ),
+
+            const Divider(),
+
             ListTile(
               leading: const Icon(Icons.live_help_outlined),
               title: const Text('Informationen und Lizenzen'),
@@ -269,14 +265,11 @@ class _SettingsState extends State<Settings> {
 
             const Divider(),
 
-            Visibility(
-              visible: !kReleaseMode,
-              child: ListTile(
-                leading: const CenteredLeading(Icon(Icons.code)),
-                title: const Text('Quellcode MarianumMobile/Client'),
-                subtitle: const Text('GNU GPL v3'),
-                onTap: () => ConfirmDialog.openBrowser(context, 'https://mhsl.eu/gitea/MarianumMobile/Client'),
-              ),
+            ListTile(
+              leading: const CenteredLeading(Icon(Icons.code)),
+              title: const Text('Quellcode MarianumMobile/Client'),
+              subtitle: const Text('GNU GPL v3'),
+              onTap: () => ConfirmDialog.openBrowser(context, 'https://mhsl.eu/gitea/MarianumMobile/Client'),
             ),
 
             ListTile(
@@ -311,7 +304,7 @@ class _SettingsState extends State<Settings> {
 
             Visibility(
               visible: settings.val().devToolsEnabled,
-              child: DevToolsSettingsDialog(settings: settings),
+              child: DevToolsSettings(settings: settings),
             ),
           ],
         ),
diff --git a/lib/widget/debug/cacheView.dart b/lib/widget/debug/cacheView.dart
index 157d498..ab66605 100644
--- a/lib/widget/debug/cacheView.dart
+++ b/lib/widget/debug/cacheView.dart
@@ -3,7 +3,6 @@ import 'dart:async';
 import 'dart:convert';
 import 'package:filesize/filesize.dart';
 import 'package:flutter/material.dart';
-import 'package:flutter/services.dart';
 import 'package:jiffy/jiffy.dart';
 import 'package:localstore/localstore.dart';
 
@@ -41,7 +40,7 @@ class _CacheViewState extends State<CacheView> {
   @override
   Widget build(BuildContext context) => Scaffold(
       appBar: AppBar(
-        title: const Text('Lokaler cache'),
+        title: const Text('Cache storage'),
       ),
       body: FutureBuilder(
         future: files,
@@ -58,27 +57,7 @@ class _CacheViewState extends State<CacheView> {
                   title: Text(filename),
                   subtitle: Text("${filesize(jsonEncode(element).length * 8)}, ${Jiffy.parseFromMillisecondsSinceEpoch(element['lastupdate']).fromNow()}"),
                   trailing: const Icon(Icons.arrow_right),
-                  onTap: () {
-                    Navigator.push(context, MaterialPageRoute(builder: (context) => JsonViewer(title: filename, data: jsonDecode(element['json'])),));
-                  },
-                  onLongPress: () {
-                    showDialog(context: context, builder: (context) => SimpleDialog(
-                        children: [
-                          const ListTile(
-                            leading: Icon(Icons.delete_forever),
-                            title: Text('Diese Datei löschen'),
-                          ),
-                          ListTile(
-                            leading: const Icon(Icons.copy),
-                            title: const Text('Dateitext kopieren'),
-                            onTap: () {
-                              Clipboard.setData(ClipboardData(text: jsonEncode(element)));
-                              Navigator.of(context).pop();
-                            },
-                          )
-                        ],
-                      ));
-                  },
+                  onTap: () => JsonViewer.asDialog(context, jsonDecode(element['json'])),
                 );
               },
             );