From a161378c7208626d7537dac52ad54f148488db13 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Elias=20M=C3=BCller?= <elias@elias-mueller.com>
Date: Mon, 29 May 2023 21:05:50 +0200
Subject: [PATCH] Added grade average calculator

---
 .../more/gradeAverages/gradeAverage.dart      | 142 ++++++++++++++++++
 lib/screen/pages/more/overhang.dart           |  12 +-
 2 files changed, 149 insertions(+), 5 deletions(-)
 create mode 100644 lib/screen/pages/more/gradeAverages/gradeAverage.dart

diff --git a/lib/screen/pages/more/gradeAverages/gradeAverage.dart b/lib/screen/pages/more/gradeAverages/gradeAverage.dart
new file mode 100644
index 0000000..05d8f00
--- /dev/null
+++ b/lib/screen/pages/more/gradeAverages/gradeAverage.dart
@@ -0,0 +1,142 @@
+import 'package:flutter/material.dart';
+
+class GradeAverage extends StatefulWidget {
+  const GradeAverage({Key? key}) : super(key: key);
+
+  @override
+  State<GradeAverage> createState() => _GradeAverageState();
+}
+
+class _GradeAverageState extends State<GradeAverage> {
+  double average = 0;
+  bool gradeSystem = true;
+  List<int> grades = List.empty(growable: true);
+
+  String getGradeDisplay(int grade) {
+    if(gradeSystem) {
+      return "Note $grade";
+    } else {
+      return "$grade Punkt${grade > 1 ? "e" : ""}";
+    }
+  }
+
+  @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: [
+          IconButton(onPressed: () {
+            showDialog(context: context, builder: (context) {
+              return AlertDialog(
+                title: const Text("Noten Zurücksetzen?"),
+                actions: [
+                  TextButton(onPressed: () {
+                    Navigator.of(context).pop();
+                  }, child: const Text("Abbrechen")),
+                  TextButton(onPressed: () {
+                    grades.clear();
+                    setState(() {});
+                    Navigator.of(context).pop();
+                  }, child: const Text("Zurücksetzen"))
+                ],
+              );
+            });
+          }, icon: const Icon(Icons.delete_forever)),
+          PopupMenuButton<bool>(
+            enableFeedback: true,
+            initialValue: gradeSystem,
+            icon: const Icon(Icons.read_more),
+            itemBuilder: (context) => [true, false].map((e) => PopupMenuItem<bool>(
+              value: e,
+              enabled: e != gradeSystem,
+              child: Row(
+                children: [
+                  Text(e ? "Notensystem" : "Punktesystem"),
+                ],
+              ),
+            )).toList(),
+
+            onSelected: (e) {
+              showDialog(context: context, builder: (context) {
+                return AlertDialog(
+                  title: const Text("Notensystem wechseln"),
+                  content: const Text("Beim wechsel des Notensystems werden alle Einträge zurückgesetzt."),
+                  actions: [
+                    TextButton(onPressed: () {
+                      Navigator.of(context).pop();
+                    }, child: const Text("Abbrechen")),
+                    TextButton(onPressed: () {
+                      setState(() {
+                        grades.clear();
+                        gradeSystem = e;
+                      });
+                      Navigator.of(context).pop();
+                    }, child: const Text("Fortfahren")),
+                  ],
+                );
+              });
+
+            },
+          ),
+        ],
+      ),
+      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),
+          Expanded(
+            child: ListView.builder(
+              itemBuilder: (context, index) {
+                var grade = gradeSystem ? index + 1 : 14 - index + 1;
+                bool isThis(int e) => e == grade;
+                return ListTile(
+                  tileColor: grade.isEven ? Colors.transparent : Colors.transparent.withAlpha(50),
+                  title: Center(
+                    child: Row(
+                      children: [
+                        IconButton(
+                          onPressed: () {
+                            setState(() {
+                              if(!grades.any(isThis)) return;
+                              grades.removeAt(grades.indexWhere(isThis));
+                            });
+                          },
+                          icon: const Icon(Icons.remove),
+                          color: Theme.of(context).colorScheme.onSurface,
+                        ),
+                        Text(getGradeDisplay(grade)),
+                        IconButton(
+                          onPressed: () {
+                            setState(() {
+                              grades.add(grade);
+                            });
+                          },
+                          icon: const Icon(Icons.add),
+                          color: Theme.of(context).colorScheme.onSurface,
+                        ),
+                      ],
+                    ),
+                  ),
+                  trailing: Text("Anzahl: ${grades.where(isThis).length}"),
+                );
+              },
+              itemCount: gradeSystem ? 6 : 15,
+            ),
+          ),
+        ],
+      ),
+    );
+  }
+}
diff --git a/lib/screen/pages/more/overhang.dart b/lib/screen/pages/more/overhang.dart
index 9652d9c..c9e7178 100644
--- a/lib/screen/pages/more/overhang.dart
+++ b/lib/screen/pages/more/overhang.dart
@@ -1,11 +1,13 @@
 
+import 'package:flutter/foundation.dart';
 import 'package:flutter/material.dart';
+import 'package:marianum_mobile/screen/pages/more/countdown/countdown.dart';
+import 'package:marianum_mobile/screen/pages/more/gradeAverages/gradeAverage.dart';
 import 'package:marianum_mobile/screen/pages/more/roomplan/roomplan.dart';
 import 'package:marianum_mobile/screen/settings/settings.dart';
 import 'package:persistent_bottom_nav_bar/persistent_tab_view.dart';
 
 import '../../../widget/ListItem.dart';
-import 'debug/ThemeColors.dart';
 import 'message/message.dart';
 
 class Overhang extends StatelessWidget {
@@ -21,12 +23,12 @@ class Overhang extends StatelessWidget {
         ],
       ),
       body: ListView(
-        children: [
+        children: const [
           ListItemNavigator(icon: Icons.newspaper, text: "Marianum Message", target: Message()),
           ListItemNavigator(icon: Icons.room, text: "Raumplan", target: Roomplan()),
-          ListItemNavigator(icon: Icons.calendar_month, text: "Schulferien", target: Roomplan()),
-          ListItemNavigator(icon: Icons.calculate, text: "Notendurschnitts rechner", target: Roomplan()),
-          ListItemNavigator(icon: Icons.color_lens_outlined, text: "Farbtest", target: ColorPreviewPage())
+          ListItemNavigator(icon: Icons.calculate, text: "Notendurschnitts rechner", target: GradeAverage()),
+          if(!kReleaseMode) ListItemNavigator(icon: Icons.calendar_month, text: "Schulferien", target: Roomplan()),
+          if(!kReleaseMode) ListItemNavigator(icon: Icons.timer, text: "Countdown", target: Countdown()),
         ],
       ),
     );