import 'package:filesize/filesize.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../storage/base/settingsProvider.dart'; import '../../widget/centeredLeading.dart'; import '../../widget/confirmDialog.dart'; import '../../widget/debug/cacheView.dart'; import '../../widget/debug/jsonViewer.dart'; class DevToolsSettingsDialog extends StatefulWidget { final SettingsProvider settings; const DevToolsSettingsDialog({required this.settings, super.key}); @override State createState() => _DevToolsSettingsDialogState(); } class _DevToolsSettingsDialogState extends State { @override Widget build(BuildContext context) { return Column( children: [ ListTile( leading: const CenteredLeading(Icon(Icons.speed_outlined)), title: const Text("Performance overlays"), trailing: const Icon(Icons.arrow_right), onTap: () { showDialog(context: context, builder: (context) => SimpleDialog( children: [ ListTile( leading: const Icon(Icons.auto_graph_outlined), title: const Text("Performance graph"), trailing: Checkbox( value: widget.settings.val().devToolsSettings.showPerformanceOverlay, onChanged: (e) => widget.settings.val(write: true).devToolsSettings.showPerformanceOverlay = e!, ), ), ListTile( leading: const Icon(Icons.screen_search_desktop_outlined), title: const Text("Indicate offscreen layers"), trailing: Checkbox( value: widget.settings.val().devToolsSettings.checkerboardOffscreenLayers, onChanged: (e) => widget.settings.val(write: true).devToolsSettings.checkerboardOffscreenLayers = e!, ), ), ListTile( leading: const Icon(Icons.imagesearch_roller_outlined), title: const Text("Indicate raster cache images"), trailing: Checkbox( value: widget.settings.val().devToolsSettings.checkerboardRasterCacheImages, onChanged: (e) => widget.settings.val(write: true).devToolsSettings.checkerboardRasterCacheImages = e!, ), ), ], )); }, ), ListTile( leading: const CenteredLeading(Icon(Icons.image_outlined)), title: const Text("Cached Thumbnails löschen"), subtitle: Text("etwa ${filesize(PaintingBinding.instance.imageCache.currentSizeBytes)}"), onTap: () { ConfirmDialog( title: "Thumbs cache löschen", content: "Alle zwischengespeicherten Bilder werden gelöscht.", confirmButton: "Unwiederruflich löschen", onConfirm: () => PaintingBinding.instance.imageCache.clear(), ).asDialog(context); }, trailing: const Icon(Icons.arrow_right), ), ListTile( leading: const CenteredLeading(Icon(Icons.settings_applications_outlined)), title: const Text("Settings-storage JSON dump"), subtitle: Text("etwa ${filesize(widget.settings.val().toJson().toString().length * 8)}\nLange tippen um zu löschen"), onTap: () { JsonViewer.asDialog(context, widget.settings.val().toJson()); }, onLongPress: () { ConfirmDialog( title: "App-Speicher löschen", content: "Alle Einstellungen gehen verloren! Accountdaten sowie App-Daten sind nicht betroffen.", confirmButton: "Unwiederruflich Löschen", onConfirm: () { Provider.of(context, listen: false).reset(); }, ).asDialog(context); }, trailing: const Icon(Icons.arrow_right), ), ListTile( leading: const CenteredLeading(Icon(Icons.data_object)), title: const Text("Cache-storage JSON dump"), subtitle: FutureBuilder( future: const CacheView().totalSize(), builder: (context, snapshot) { return Text("etwa ${snapshot.hasError ? "?" : snapshot.hasData ? filesize(snapshot.data) : "..."}\nLange tippen um zu löschen"); }, ), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) { return const CacheView(); })); }, onLongPress: () { ConfirmDialog( title: "App-Cache löschen", content: "Alle cache Einträge werden gelöscht. Der Cache wird bei Nutzung der App automatisch erneut aufgebaut", confirmButton: "Unwiederruflich löschen", onConfirm: () => const CacheView().clear().then((value) => setState((){})), ).asDialog(context); }, trailing: const Icon(Icons.arrow_right), ), ], ); } }