From 3410e410d2ec9ae63158a8def46da8b89ce6f800 Mon Sep 17 00:00:00 2001 From: Kima Date: Tue, 21 Nov 2023 21:47:09 +0100 Subject: [PATCH] fully finished total grade calculator --- .../lib/ui/widgets/grade/grade_tile.dart | 15 +- .../lib/pages/grades/grades_page.dart | 136 +++++++++++------- 2 files changed, 98 insertions(+), 53 deletions(-) diff --git a/filcnaplo/lib/ui/widgets/grade/grade_tile.dart b/filcnaplo/lib/ui/widgets/grade/grade_tile.dart index a2778e5..a42a404 100644 --- a/filcnaplo/lib/ui/widgets/grade/grade_tile.dart +++ b/filcnaplo/lib/ui/widgets/grade/grade_tile.dart @@ -10,14 +10,20 @@ import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:provider/provider.dart'; class GradeTile extends StatelessWidget { - const GradeTile(this.grade, - {Key? key, this.onTap, this.padding, this.censored = false}) - : super(key: key); + const GradeTile( + this.grade, { + Key? key, + this.onTap, + this.padding, + this.censored = false, + this.viewOverride = false, + }) : super(key: key); final Grade grade; final void Function()? onTap; final EdgeInsetsGeometry? padding; final bool censored; + final bool viewOverride; @override Widget build(BuildContext context) { @@ -26,7 +32,8 @@ class GradeTile extends StatelessWidget { bool isTitleItalic = false; bool isSubtitleItalic = false; EdgeInsets leadingPadding = EdgeInsets.zero; - bool isSubjectView = SubjectGradesContainer.of(context) != null; + bool isSubjectView = + SubjectGradesContainer.of(context) != null || viewOverride; String subjectName = grade.subject.renamedTo ?? grade.subject.name.capital(); String modeDescription = grade.mode.description.capital(); diff --git a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart index 6398f68..2220a5c 100755 --- a/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart +++ b/filcnaplo_mobile_ui/lib/pages/grades/grades_page.dart @@ -2,6 +2,7 @@ import 'dart:math'; import 'package:auto_size_text/auto_size_text.dart'; import 'package:filcnaplo/api/providers/update_provider.dart'; +import 'package:filcnaplo/ui/widgets/grade/grade_tile.dart'; // import 'package:filcnaplo_kreta_api/client/api.dart'; // import 'package:filcnaplo_kreta_api/client/client.dart'; import 'package:filcnaplo_kreta_api/providers/grade_provider.dart'; @@ -88,50 +89,86 @@ class _GradesPageState extends State { Map subjectAvgs = {}; - tiles.addAll(subjects.map((subject) { - List subjectGrades = getSubjectGrades(subject); + if (!gradeCalcMode) { + tiles.addAll(subjects.map((subject) { + List subjectGrades = getSubjectGrades(subject); - double avg = AverageHelper.averageEvals(subjectGrades); - double averageBefore = 0.0; + double avg = AverageHelper.averageEvals(subjectGrades); + double averageBefore = 0.0; - if (avgDropValue != 0) { - List gradesBefore = - getSubjectGrades(subject, days: avgDropValue); - averageBefore = - avgDropValue == 0 ? 0.0 : AverageHelper.averageEvals(gradesBefore); + if (avgDropValue != 0) { + List gradesBefore = + getSubjectGrades(subject, days: avgDropValue); + averageBefore = avgDropValue == 0 + ? 0.0 + : AverageHelper.averageEvals(gradesBefore); + } + var nullavg = GroupAverage(average: 0.0, subject: subject, uid: "0"); + double groupAverage = gradeProvider.groupAverages + .firstWhere((e) => e.subject == subject, orElse: () => nullavg) + .average; + + if (avg != 0) subjectAvgs[subject] = avg; + + return GradeSubjectTile( + subject, + averageBefore: averageBefore, + average: avg, + groupAverage: avgDropValue == 0 ? groupAverage : 0.0, + onTap: () { + GradeSubjectView(subject, groupAverage: groupAverage) + .push(context, root: true); + }, + ); + })); + } else { + tiles.clear(); + + List ghostGrades = calculatorProvider.ghosts; + ghostGrades.sort((a, b) => -a.date.compareTo(b.date)); + + List _gradeTiles = []; + for (Grade grade in ghostGrades) { + _gradeTiles.add(GradeTile( + grade, + viewOverride: true, + )); } - var nullavg = GroupAverage(average: 0.0, subject: subject, uid: "0"); - double groupAverage = gradeProvider.groupAverages - .firstWhere((e) => e.subject == subject, orElse: () => nullavg) - .average; - if (avg != 0) subjectAvgs[subject] = avg; - - return GradeSubjectTile( - subject, - averageBefore: averageBefore, - average: avg, - groupAverage: avgDropValue == 0 ? groupAverage : 0.0, - onTap: () { - GradeSubjectView(subject, groupAverage: groupAverage) - .push(context, root: true); - }, + tiles.add( + _gradeTiles.isNotEmpty + ? Panel( + key: ValueKey(gradeCalcMode), + title: Text( + "Ghost Grades".i18n, + ), + child: Column( + children: _gradeTiles, + ), + ) + : const SizedBox(), ); - })); + } - if (tiles.isNotEmpty) { + if (tiles.isNotEmpty || gradeCalcMode) { tiles.insert(0, yearlyGraph); tiles.insert(1, gradesCount); - tiles.insert(2, FailWarning(subjectAvgs: subjectAvgs)); - tiles.insert( + if (!gradeCalcMode) { + tiles.insert(2, FailWarning(subjectAvgs: subjectAvgs)); + tiles.insert( 3, PanelTitle( - title: Text(avgDropValue == 0 - ? "Subjects".i18n - : "Subjects_changes".i18n))); - tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 12.0))); - tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0))); - tiles.add(const Padding(padding: EdgeInsets.only(bottom: 24.0))); + title: Text( + avgDropValue == 0 ? "Subjects".i18n : "Subjects_changes".i18n, + )), + ); + + tiles.insert(4, const PanelHeader(padding: EdgeInsets.only(top: 12.0))); + tiles.add(const PanelFooter(padding: EdgeInsets.only(bottom: 12.0))); + } + tiles.add(Padding( + padding: EdgeInsets.only(bottom: !gradeCalcMode ? 24.0 : 250.0), + )); } else { tiles.insert( 0, @@ -165,7 +202,7 @@ class _GradesPageState extends State { gradeProvider.groupAverages.length : 0.0; - if (subjectAvg > 0) { + if (subjectAvg > 0 && !gradeCalcMode) { tiles.add(Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -243,7 +280,7 @@ class _GradesPageState extends State { ? gradeProvider.grades .where((e) => e.type == GradeType.midYear) .toList() - : calculatorProvider.grades.toList()); + : calculatorProvider.grades); final prevStudentAvg = AverageHelper.averageEvals(gradeProvider.grades .where((e) => e.type == GradeType.midYear) @@ -323,21 +360,22 @@ class _GradesPageState extends State { snap: false, surfaceTintColor: Theme.of(context).scaffoldBackgroundColor, actions: [ - Padding( - padding: const EdgeInsets.symmetric( - horizontal: 5.0, vertical: 0.0), - child: IconButton( - splashRadius: 24.0, - onPressed: () { - // SoonAlert.show(context: context); - gradeCalcTotal(context); - }, - icon: Icon( - FeatherIcons.plus, - color: AppColors.of(context).text, + if (!gradeCalcMode) + Padding( + padding: const EdgeInsets.symmetric( + horizontal: 5.0, vertical: 0.0), + child: IconButton( + splashRadius: 24.0, + onPressed: () { + // SoonAlert.show(context: context); + gradeCalcTotal(context); + }, + icon: Icon( + FeatherIcons.plus, + color: AppColors.of(context).text, + ), ), ), - ), // profile Icon Padding(