import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../../../storage/base/settingsProvider.dart'; import '../../../../widget/confirmDialog.dart'; class GradeAverage extends StatefulWidget { const GradeAverage({super.key}); @override State createState() => _GradeAverageState(); } class _GradeAverageState extends State { double average = 0; 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"; } else { return "$grade Punkt${grade > 1 ? "e" : ""}"; } } void switchSystem(bool e) => setState(() { grades.clear(); gradeSystem = e; settings.val(write: true).gradeAveragesSettings.useGradeSystem = e; _persistGrades(); }); @override void initState() { super.initState(); grades = settings.val().gradeAveragesSettings.inputs; gradeSystem = settings.val().gradeAveragesSettings.useGradeSystem; WidgetsBinding.instance.addPostFrameCallback((timeStamp) { if(!settings.val().gradeAveragesSettings.askedForPreferredGradeSystem) { settings.val(write: true).gradeAveragesSettings.askedForPreferredGradeSystem = true; showDialog(context: context, builder: (context) => AlertDialog( title: const Text("Notensystem"), content: const Text("Wähle dein bevorzugtes Schulnotensystem"), actions: [ TextButton( onPressed: () { switchSystem(true); Navigator.of(context).pop(); }, child: const Text("Realschule"), ), TextButton( onPressed: () { switchSystem(false); Navigator.of(context).pop(); }, child: const Text("Oberstufe"), ), ], )); } }); } @override Widget build(BuildContext context) { if(grades.isNotEmpty) { average = grades.reduce((a, b) => a + b) / grades.length; } else { average = 0; } return Scaffold( appBar: AppBar( title: const Text("Notendurschnittsrechner"), actions: [ Visibility( visible: grades.isNotEmpty, child: IconButton(onPressed: () { showDialog( context: context, builder: (context) => ConfirmDialog( title: "Zurücksetzen?", content: "Alle Einträge werden entfernt.", confirmButton: "Zurücksetzen", onConfirm: () { grades.clear(); setState(() {}); }, ), ); }, icon: const Icon(Icons.delete_forever)), ), PopupMenuButton( initialValue: gradeSystem, icon: const Icon(Icons.more_horiz), itemBuilder: (context) => [true, false].map((e) => PopupMenuItem( value: e, child: Row( children: [ Icon(e ? Icons.calculate_outlined : Icons.school_outlined, color: Theme.of(context).colorScheme.onSurface), const SizedBox(width: 15), Text(e ? "Notensystem" : "Punktesystem"), ], ), )).toList(), onSelected: (e) { if(grades.isNotEmpty) { showDialog( context: context, builder: (context) => ConfirmDialog( title: "Notensystem wechseln", content: "Beim wechsel des Notensystems werden alle Einträge zurückgesetzt.", confirmButton: "Fortfahren", onConfirm: () => switchSystem(e), ), ); } else { switchSystem(e); } }, ), ], ), body: Column( crossAxisAlignment: CrossAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center, children: [ const SizedBox(height: 30), Text(average.toStringAsFixed(2), style: const TextStyle(fontSize: 30, fontWeight: FontWeight.bold)), const SizedBox(height: 10), const Divider(), const SizedBox(height: 10), Text(gradeSystem ? "Wähle unten die Anzahl deiner jewiligen Noten aus" : "Wähle unten die Anzahl deiner jeweiligen Punkte aus"), const SizedBox(height: 10), Expanded( child: ListView.builder( itemBuilder: (context, index) { var grade = gradeSystem ? index + 1 : 15 - index; bool isThis(int e) => e == grade; return Material( child: ListTile( tileColor: grade.isEven ? Colors.transparent : Colors.transparent.withAlpha(50), title: Center( child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Text(getGradeDisplay(grade)), const SizedBox(width: 30), IconButton( onPressed: () { setState(() { if(!grades.any(isThis)) return; grades.removeAt(grades.indexWhere(isThis)); _persistGrades(); }); }, icon: const Icon(Icons.remove), color: Theme.of(context).colorScheme.onSurface, ), Text("${grades.where(isThis).length}", style: const TextStyle(fontSize: 15, fontWeight: FontWeight.bold)), IconButton( onPressed: () { setState(() { grades.add(grade); _persistGrades(); }); }, icon: const Icon(Icons.add), color: Theme.of(context).colorScheme.onSurface, ), ], ), ), trailing: Visibility( maintainState: true, maintainAnimation: true, maintainSize: true, visible: grades.any(isThis), child: IconButton( icon: const Icon(Icons.delete), onPressed: () { setState(() { grades.removeWhere(isThis); _persistGrades(); }); }, ), ), ), ); }, itemCount: gradeSystem ? 6 : 16, ), ), ], ), ); } }