From fb839eb45895d16a66256fe8aab61b652affc9e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 3 Jun 2023 23:58:48 +0200 Subject: [PATCH] Made GradeAverage persistent --- lib/main.dart | 2 +- lib/storage/{settings => base}/settings.dart | 10 +++++- .../{settings => base}/settings.g.dart | 7 +++-- .../{settings => base}/settingsProvider.dart | 9 ++++-- .../gradeAverages/gradeAveragesSettings.dart | 15 +++++++++ .../gradeAveragesSettings.g.dart | 21 +++++++++++++ .../more/gradeAverages/gradeAverage.dart | 21 +++++++++++++ lib/view/settings/settings.dart | 31 +++++++++---------- lib/widget/confirmDialog.dart | 13 ++++++++ 9 files changed, 107 insertions(+), 22 deletions(-) rename lib/storage/{settings => base}/settings.dart (72%) rename lib/storage/{settings => base}/settings.g.dart (61%) rename lib/storage/{settings => base}/settingsProvider.dart (80%) create mode 100644 lib/storage/gradeAverages/gradeAveragesSettings.dart create mode 100644 lib/storage/gradeAverages/gradeAveragesSettings.g.dart diff --git a/lib/main.dart b/lib/main.dart index f914b3b..1b7a957 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -14,7 +14,7 @@ import 'model/chatList/chatProps.dart'; import 'model/files/filesProps.dart'; import 'model/message/messageProps.dart'; import 'model/timetable/timetableProps.dart'; -import 'storage/settings/settingsProvider.dart'; +import 'storage/base/settingsProvider.dart'; import 'theming/darkAppTheme.dart'; import 'theming/lightAppTheme.dart'; import 'view/login/login.dart'; diff --git a/lib/storage/settings/settings.dart b/lib/storage/base/settings.dart similarity index 72% rename from lib/storage/settings/settings.dart rename to lib/storage/base/settings.dart index 7a522ab..5366181 100644 --- a/lib/storage/settings/settings.dart +++ b/lib/storage/base/settings.dart @@ -1,6 +1,8 @@ import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; +import '../gradeAverages/gradeAveragesSettings.dart'; + part 'settings.g.dart'; @JsonSerializable(explicitToJson: true) @@ -12,7 +14,13 @@ class Settings { ThemeMode appTheme; bool devToolsEnabled; - Settings(this.appTheme, this.devToolsEnabled); + GradeAveragesSettings gradeAveragesSettings; + + Settings({ + required this.appTheme, + required this.devToolsEnabled, + required this.gradeAveragesSettings + }); static String _themeToJson(ThemeMode m) => m.name; static ThemeMode _themeFromJson(String m) => ThemeMode.values.firstWhere((element) => element.name == m); diff --git a/lib/storage/settings/settings.g.dart b/lib/storage/base/settings.g.dart similarity index 61% rename from lib/storage/settings/settings.g.dart rename to lib/storage/base/settings.g.dart index 9b01986..b71778e 100644 --- a/lib/storage/settings/settings.g.dart +++ b/lib/storage/base/settings.g.dart @@ -7,11 +7,14 @@ part of 'settings.dart'; // ************************************************************************** Settings _$SettingsFromJson(Map json) => Settings( - Settings._themeFromJson(json['appTheme'] as String), - json['devToolsEnabled'] as bool, + appTheme: Settings._themeFromJson(json['appTheme'] as String), + devToolsEnabled: json['devToolsEnabled'] as bool, + gradeAveragesSettings: GradeAveragesSettings.fromJson( + json['gradeAveragesSettings'] as Map), ); Map _$SettingsToJson(Settings instance) => { 'appTheme': Settings._themeToJson(instance.appTheme), 'devToolsEnabled': instance.devToolsEnabled, + 'gradeAveragesSettings': instance.gradeAveragesSettings.toJson(), }; diff --git a/lib/storage/settings/settingsProvider.dart b/lib/storage/base/settingsProvider.dart similarity index 80% rename from lib/storage/settings/settingsProvider.dart rename to lib/storage/base/settingsProvider.dart index 32ed2a1..d2ac4be 100644 --- a/lib/storage/settings/settingsProvider.dart +++ b/lib/storage/base/settingsProvider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; +import 'package:marianum_mobile/storage/gradeAverages/gradeAveragesSettings.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'settings.dart'; @@ -42,8 +43,12 @@ class SettingsProvider extends ChangeNotifier { Settings _defaults() { return Settings( - ThemeMode.system, - false, + appTheme: ThemeMode.system, + devToolsEnabled: false, + gradeAveragesSettings: GradeAveragesSettings( + useGradeSystem: true, + inputs: [] + ), ); } } \ No newline at end of file diff --git a/lib/storage/gradeAverages/gradeAveragesSettings.dart b/lib/storage/gradeAverages/gradeAveragesSettings.dart new file mode 100644 index 0000000..9221949 --- /dev/null +++ b/lib/storage/gradeAverages/gradeAveragesSettings.dart @@ -0,0 +1,15 @@ + +import 'package:json_annotation/json_annotation.dart'; + +part 'gradeAveragesSettings.g.dart'; + +@JsonSerializable() +class GradeAveragesSettings { + bool useGradeSystem; + List inputs; + + GradeAveragesSettings({required this.useGradeSystem, required this.inputs}); + + factory GradeAveragesSettings.fromJson(Map json) => _$GradeAveragesSettingsFromJson(json); + Map toJson() => _$GradeAveragesSettingsToJson(this); +} \ No newline at end of file diff --git a/lib/storage/gradeAverages/gradeAveragesSettings.g.dart b/lib/storage/gradeAverages/gradeAveragesSettings.g.dart new file mode 100644 index 0000000..bc685de --- /dev/null +++ b/lib/storage/gradeAverages/gradeAveragesSettings.g.dart @@ -0,0 +1,21 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'gradeAveragesSettings.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +GradeAveragesSettings _$GradeAveragesSettingsFromJson( + Map json) => + GradeAveragesSettings( + useGradeSystem: json['useGradeSystem'] as bool, + inputs: (json['inputs'] as List).map((e) => e as int).toList(), + ); + +Map _$GradeAveragesSettingsToJson( + GradeAveragesSettings instance) => + { + 'useGradeSystem': instance.useGradeSystem, + 'inputs': instance.inputs, + }; diff --git a/lib/view/pages/more/gradeAverages/gradeAverage.dart b/lib/view/pages/more/gradeAverages/gradeAverage.dart index acae63e..aa5cd08 100644 --- a/lib/view/pages/more/gradeAverages/gradeAverage.dart +++ b/lib/view/pages/more/gradeAverages/gradeAverage.dart @@ -1,4 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:marianum_mobile/storage/base/settingsProvider.dart'; +import 'package:provider/provider.dart'; import '../../../../widget/confirmDialog.dart'; @@ -14,6 +16,12 @@ class _GradeAverageState extends State { bool gradeSystem = true; List grades = List.empty(growable: true); + late SettingsProvider settings = Provider.of(context, listen: false); + + void _persistGrades() { + settings.val(write: true).gradeAveragesSettings.inputs = grades; + } + String getGradeDisplay(int grade) { if(gradeSystem) { return "Note $grade"; @@ -22,6 +30,14 @@ class _GradeAverageState extends State { } } + @override + void initState() { + super.initState(); + + grades = settings.val().gradeAveragesSettings.inputs; + gradeSystem = settings.val().gradeAveragesSettings.useGradeSystem; + } + @override Widget build(BuildContext context) { if(grades.isNotEmpty) { @@ -66,6 +82,8 @@ class _GradeAverageState extends State { void switchSystem() => setState(() { grades.clear(); gradeSystem = e; + settings.val(write: true).gradeAveragesSettings.useGradeSystem = e; + _persistGrades(); }); if(grades.isNotEmpty) { @@ -117,6 +135,7 @@ class _GradeAverageState extends State { setState(() { if(!grades.any(isThis)) return; grades.removeAt(grades.indexWhere(isThis)); + _persistGrades(); }); }, icon: const Icon(Icons.remove), @@ -127,6 +146,7 @@ class _GradeAverageState extends State { onPressed: () { setState(() { grades.add(grade); + _persistGrades(); }); }, icon: const Icon(Icons.add), @@ -145,6 +165,7 @@ class _GradeAverageState extends State { onPressed: () { setState(() { grades.removeWhere(isThis); + _persistGrades(); }); }, ), diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index 0973c7e..3028d1f 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -3,11 +3,10 @@ import 'package:flutter/material.dart'; import 'package:package_info/package_info.dart'; import 'package:provider/provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'package:url_launcher/url_launcher.dart'; import '../../model/accountModel.dart'; +import '../../storage/base/settingsProvider.dart'; import '../../theming/appTheme.dart'; -import '../../storage/settings/settingsProvider.dart'; import '../../widget/confirmDialog.dart'; import 'debug/debugOverview.dart'; import 'debug/jsonViewer.dart'; @@ -115,7 +114,7 @@ class _SettingsState extends State { leading: const Icon(Icons.policy_outlined), title: const Text("Datenschutz"), onTap: () { - launchUrl(Uri.parse("https://mhsl.eu/datenschutz.html")); + ConfirmDialog.openBrowser(context, "https://mhsl.eu/datenschutz.html"); }, trailing: const Icon(Icons.open_in_new), ), @@ -124,7 +123,7 @@ class _SettingsState extends State { leading: const Icon(Icons.badge_outlined), title: const Text("Impressum"), onTap: () { - launchUrl(Uri.parse("https://mhsl.eu/id.html")); + ConfirmDialog.openBrowser(context, "https://mhsl.eu/id.html"); }, trailing: const Icon(Icons.open_in_new), ), @@ -133,7 +132,7 @@ class _SettingsState extends State { ListTile( leading: const Icon(Icons.developer_mode_outlined), - title: const Text("Entwicklermodus"), + title: const Text("Entwickleransicht"), trailing: Checkbox( visualDensity: const VisualDensity(horizontal: VisualDensity.minimumDensity), value: settings.val().devToolsEnabled, @@ -149,16 +148,6 @@ class _SettingsState extends State { visible: settings.val().devToolsEnabled, child: Column( children: [ - ListTile( - leading: const Icon(Icons.data_object), - title: const Text("Storage view"), - onTap: () { - Navigator.push(context, MaterialPageRoute(builder: (context) { - return const DebugOverview(); - })); - }, - trailing: const Icon(Icons.arrow_right), - ), ListTile( leading: const Icon(Icons.logo_dev_outlined), title: const Text("Logging verbosity"), @@ -170,9 +159,19 @@ class _SettingsState extends State { }, ), ), + ListTile( + leading: const Icon(Icons.data_object), + title: const Text("Cache JSON dump"), + onTap: () { + Navigator.push(context, MaterialPageRoute(builder: (context) { + return const DebugOverview(); + })); + }, + trailing: const Icon(Icons.arrow_right), + ), ListTile( leading: const Icon(Icons.settings_applications_outlined), - title: const Text("Settings JSON dump"), + title: const Text("Storage JSON dump"), onTap: () { JsonViewer.asDialog(context, settings.val().toJson()); }, diff --git a/lib/widget/confirmDialog.dart b/lib/widget/confirmDialog.dart index 6c841ac..e0144e7 100644 --- a/lib/widget/confirmDialog.dart +++ b/lib/widget/confirmDialog.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:url_launcher/url_launcher.dart'; class ConfirmDialog extends StatelessWidget { final String title; @@ -26,4 +27,16 @@ class ConfirmDialog extends StatelessWidget { ], ); } + + static void openBrowser(BuildContext context, String url) { + showDialog( + context: context, + builder: (context) => ConfirmDialog( + title: "Link öffnen", + content: "Möchtest du den folgenden Link öffnen?\n${url}", + confirmButton: "Öffnen", + onConfirm: () => launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication), + ), + ); + } }