Rename everything filcnaplo-related to refilc

This commit is contained in:
Pearoo
2023-09-19 18:16:03 +02:00
parent 151e97b243
commit d1a9625d93
669 changed files with 39799 additions and 39481 deletions

View File

@@ -1,68 +0,0 @@
import 'package:dotted_border/dotted_border.dart';
import 'package:flutter/material.dart';
class EmptyCard extends StatefulWidget {
const EmptyCard({
Key? key,
required this.text,
}) : super(key: key);
final String text;
@override
State<EmptyCard> createState() => _EmptyCardState();
}
class _EmptyCardState extends State<EmptyCard> {
bool hold = false;
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return GestureDetector(
onLongPressDown: (_) => setState(() => hold = true),
onLongPressEnd: (_) => setState(() => hold = false),
onLongPressCancel: () => setState(() => hold = false),
child: AnimatedScale(
scale: hold ? 1.018 : 1.0,
curve: Curves.easeInOutBack,
duration: const Duration(milliseconds: 300),
child: Container(
height: 444,
padding:
const EdgeInsets.only(top: 12, bottom: 12, left: 12, right: 12),
decoration: BoxDecoration(
color: const Color(0x280008FF),
borderRadius: const BorderRadius.all(Radius.circular(5)),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.08),
offset: const Offset(0, 5),
blurRadius: 20,
spreadRadius: 10,
),
],
),
child: DottedBorder(
color: Colors.black.withOpacity(0.9),
dashPattern: const [12, 12],
padding:
const EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20),
child: Center(
child: Text(
widget.text,
style: TextStyle(
color: Colors.white.withOpacity(0.9),
),
),
),
),
),
),
);
}
}

View File

@@ -1,374 +0,0 @@
import 'package:dotted_border/dotted_border.dart';
import 'package:filcnaplo/api/providers/user_provider.dart';
import 'package:filcnaplo/helpers/average_helper.dart';
import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo/models/personality.dart';
import 'package:filcnaplo_kreta_api/models/absence.dart';
import 'package:filcnaplo_kreta_api/models/grade.dart';
import 'package:filcnaplo_kreta_api/models/lesson.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart';
import 'package:filcnaplo_kreta_api/models/week.dart';
import 'package:filcnaplo_kreta_api/providers/absence_provider.dart';
import 'package:filcnaplo_kreta_api/providers/grade_provider.dart';
import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'personality_card.i18n.dart';
class PersonalityCard extends StatefulWidget {
const PersonalityCard({
Key? key,
required this.user,
}) : super(key: key);
final UserProvider user;
@override
State<PersonalityCard> createState() => _PersonalityCardState();
}
class _PersonalityCardState extends State<PersonalityCard> {
late GradeProvider gradeProvider;
late AbsenceProvider absenceProvider;
late TimetableProvider timetableProvider;
late SettingsProvider settings;
late List<int> subjectAvgsList = [];
late Map<Subject, double> subjectAvgs = {};
late double subjectAvg;
late List<Grade> classWorkGrades;
late Map<int, int> mostCommonGrade;
late List<Absence> absences = [];
final Map<Subject, Lesson> _lessonCount = {};
late int totalDelays;
late int unexcusedAbsences;
late PersonalityType finalPersonality;
bool hold = false;
List<Grade> getSubjectGrades(Subject subject, {int days = 0}) => gradeProvider
.grades
.where((e) =>
e.subject == subject &&
e.type == GradeType.midYear &&
(days == 0 ||
e.date.isBefore(DateTime.now().subtract(Duration(days: days)))))
.toList();
@override
void initState() {
super.initState();
gradeProvider = Provider.of<GradeProvider>(context, listen: false);
absenceProvider = Provider.of<AbsenceProvider>(context, listen: false);
timetableProvider = Provider.of<TimetableProvider>(context, listen: false);
settings = Provider.of<SettingsProvider>(context, listen: false);
WidgetsBinding.instance.addPostFrameCallback((timeStamp) async {
for (final lesson in timetableProvider.getWeek(Week.current()) ?? []) {
if (!lesson.isEmpty &&
lesson.subject.id != '' &&
lesson.lessonYearIndex != null) {
_lessonCount.update(
lesson.subject,
(value) {
if (lesson.lessonYearIndex! > value.lessonYearIndex!) {
return lesson;
} else {
return value;
}
},
ifAbsent: () => lesson,
);
}
}
setState(() {});
});
}
void getGrades() {
List<Subject> subjects = gradeProvider.grades
.map((e) => e.subject)
.toSet()
.toList()
..sort((a, b) => a.name.compareTo(b.name));
for (Subject subject in subjects) {
List<Grade> subjectGrades = getSubjectGrades(subject);
double avg = AverageHelper.averageEvals(subjectGrades);
if (avg != 0) subjectAvgs[subject] = avg;
subjectAvgsList.add(avg.round());
}
subjectAvg = subjectAvgs.isNotEmpty
? subjectAvgs.values.fold(0.0, (double a, double b) => a + b) /
subjectAvgs.length
: 0.0;
classWorkGrades =
gradeProvider.grades.where((a) => a.value.weight <= 75).toList();
}
void getMostCommonGrade() {
Map<int, int> counts = {};
subjectAvgsList.map((e) {
if (counts.containsKey(e)) {
counts.update(e, (value) => value++);
} else {
counts[e] = 1;
}
});
var maxValue = 0;
var maxKey = 0;
counts.forEach((k, v) {
if (v > maxValue) {
maxValue = v;
maxKey = k;
}
});
mostCommonGrade = {maxKey: maxValue};
}
void getAbsences() {
absences = absenceProvider.absences.where((a) => a.delay == 0).toList();
unexcusedAbsences = absences
.where((a) => a.state == Justification.unexcused && a.delay == 0)
.length;
}
void getAndSortDelays() {
Iterable<int> unexcusedDelays = absences
.where((a) => a.state == Justification.unexcused && a.delay > 0)
.map((e) => e.delay);
totalDelays = unexcusedDelays.isNotEmpty
? unexcusedDelays.reduce((a, b) => a + b)
: 0;
}
void doEverything() {
getGrades();
getMostCommonGrade();
getAbsences();
getAndSortDelays();
}
void getPersonality() {
if (settings.goodStudent) {
finalPersonality = PersonalityType.cheater;
} else if (subjectAvg > 4.7) {
finalPersonality = PersonalityType.geek;
} else if (mostCommonGrade.keys.toList()[0] == 1 &&
mostCommonGrade.values.toList()[0] > 1) {
finalPersonality = PersonalityType.fallible;
} else if (absences.length <= 12) {
finalPersonality = PersonalityType.healthy;
} else if (unexcusedAbsences >= 8) {
finalPersonality = PersonalityType.quitter;
} else if (totalDelays > 50) {
finalPersonality = PersonalityType.late;
} else if (absences.length >= 120) {
finalPersonality = PersonalityType.sick;
} else if (mostCommonGrade.keys.toList()[0] == 2) {
finalPersonality = PersonalityType.acceptable;
} else if (mostCommonGrade.keys.toList()[0] == 3) {
finalPersonality = PersonalityType.average;
} else if (classWorkGrades.length >= 5) {
finalPersonality = PersonalityType.diligent;
} else {
finalPersonality = PersonalityType.npc;
}
}
Widget cardInnerBuilder() {
Map<PersonalityType, Map<String, String>> personality = {
PersonalityType.geek: {
'emoji': '🤓',
'title': 't_geek',
'description': 'd_geek',
'subtitle': 's_geek',
'subvalue': subjectAvg.toStringAsFixed(2),
},
PersonalityType.sick: {
'emoji': '🤒',
'title': 't_sick',
'description': 'd_sick',
'subtitle': 's_sick',
'subvalue': absences.length.toString(),
},
PersonalityType.late: {
'emoji': '',
'title': 't_late',
'description': 'd_late',
'subtitle': 's_late',
'subvalue': totalDelays.toString(),
},
PersonalityType.quitter: {
'emoji': '',
'title': 't_quitter',
'description': 'd_quitter',
'subtitle': 's_quitter',
'subvalue': unexcusedAbsences.toString(),
},
PersonalityType.healthy: {
'emoji': '😷',
'title': 't_healthy',
'description': 'd_healthy',
'subtitle': 's_healthy',
'subvalue': absences.length.toString(),
},
PersonalityType.acceptable: {
'emoji': '🤏',
'title': 't_acceptable',
'description': 'd_acceptable',
'subtitle': 's_acceptable',
'subvalue': mostCommonGrade.values.toList()[0].toString(),
},
PersonalityType.fallible: {
'emoji': '📉',
'title': 't_fallible',
'description': 'd_fallible',
'subtitle': 's_fallible',
'subvalue': mostCommonGrade.values.toList()[0].toString(),
},
PersonalityType.average: {
'emoji': '👌',
'title': 't_average',
'description': 'd_average',
'subtitle': 's_average',
'subvalue': mostCommonGrade.values.toList()[0].toString(),
},
PersonalityType.diligent: {
'emoji': '💫',
'title': 't_diligent',
'description': 'd_diligent',
'subtitle': 's_diligent',
'subvalue': classWorkGrades.length.toString(),
},
PersonalityType.cheater: {
'emoji': '‍🧑‍💻',
'title': 't_cheater',
'description': 'd_cheater',
'subtitle': 's_cheater',
'subvalue': '0',
},
PersonalityType.npc: {
'emoji': '⛰️',
'title': 't_npc',
'description': 'd_npc',
'subtitle': 's_npc',
'subvalue': '69420',
}
};
Map<PersonalityType, Widget> personalityWidgets = {};
for (var i in personality.keys) {
Widget w = Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(
personality[i]?['emoji'] ?? '',
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 128.0,
height: 1.2,
),
),
Text(
(personality[i]?['title'] ?? 'unknown').i18n,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 38.0,
color: Colors.white,
fontWeight: FontWeight.w800,
),
),
const SizedBox(height: 5),
Text(
(personality[i]?['description'] ?? 'unknown_personality').i18n,
textAlign: TextAlign.start,
style: TextStyle(
fontSize: 16,
height: 1.2,
color: Colors.white.withOpacity(0.8),
),
),
const SizedBox(height: 25),
Text(
(personality[i]?['subtitle'] ?? 'unknown').i18n,
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 20.0,
color: Colors.white,
fontWeight: FontWeight.bold,
),
),
Text(
personality[i]?['subvalue'] ?? '0',
textAlign: TextAlign.center,
style: const TextStyle(
fontSize: 69.0,
height: 1.15,
color: Colors.white,
fontWeight: FontWeight.w800,
),
),
],
);
personalityWidgets.addAll({i: w});
}
return personalityWidgets[finalPersonality] ?? Container();
}
@override
Widget build(BuildContext context) {
doEverything();
getPersonality();
return GestureDetector(
onLongPressDown: (_) => setState(() => hold = true),
onLongPressEnd: (_) => setState(() => hold = false),
onLongPressCancel: () => setState(() => hold = false),
child: AnimatedScale(
scale: hold ? 1.018 : 1.0,
curve: Curves.easeInOutBack,
duration: const Duration(milliseconds: 300),
child: Container(
padding:
const EdgeInsets.only(top: 12, bottom: 12, left: 12, right: 12),
decoration: BoxDecoration(
color: const Color(0x280008FF),
borderRadius: const BorderRadius.all(Radius.circular(5)),
boxShadow: [
BoxShadow(
color: Colors.black.withOpacity(0.08),
offset: const Offset(0, 5),
blurRadius: 20,
spreadRadius: 10,
),
],
),
child: DottedBorder(
color: Colors.black.withOpacity(0.9),
dashPattern: const [12, 12],
padding:
const EdgeInsets.only(top: 20, bottom: 20, left: 20, right: 20),
child: cardInnerBuilder(),
),
),
),
);
}
}

View File

@@ -1,154 +0,0 @@
import 'package:i18n_extension/i18n_extension.dart';
extension Localization on String {
static final _t = Translations.byLocale("hu_hu") +
{
"en_en": {
// main
"unknown": "???",
"unknown_personality": "Unknown personality...",
// personalities
"t_geek": "Know-It-All",
"d_geek":
"You learn a lot, but don't worry - Being a know-it-all is a blessing in disguise. You'll be successful in life.",
"s_geek": "Year-end average",
"t_sick": "Sick",
"d_sick":
"Get well soon, bro. Even if you lied about being sick to skip school.",
"s_sick": "Absences",
"t_late": "Late",
"d_late":
"The tram's wheel got punctured. The airplane was derailed. Your dog ate your shoe. We believe you.",
"s_late": "Delays (minutes)",
"t_quitter": "Skipper",
"d_quitter": "Supplementary exam incoming.",
"s_quitter": "Igazolatlan hiányzások",
"t_healthy": "Healthy",
"d_healthy":
"As cool as a cucumber! You almost never missed a class.",
"s_healthy": "Absences",
"t_acceptable": "Acceptable",
"d_acceptable":
"Final exams are D. But who cares? It's still a grade. Not a good one, but it's definitely a grade.",
"s_acceptable": "D's",
"t_fallible": "Failed",
"d_fallible": "Good luck next year.",
"s_fallible": "F's",
"t_average": "It's okay",
"d_average": "Not good, not bad. The golden mean, if you will...",
"s_average": "C's",
"t_diligent": "Hard-worker",
"d_diligent":
"You noted everything, you made that presentation, and you lead the group project.",
"s_diligent": "Class work A's",
"t_cheater": "Cheater",
"d_cheater":
"You enabled the \"Good Student\" mode. Wow. You may have outsmarted me, but I have outsmarted your outsmarting.",
"s_cheater": "Bitches",
"t_npc": "NPC",
"d_npc":
"You're such a non-player character, we couldn't give you a personality.",
"s_npc": "In-game playtime (hours)",
},
"hu_hu": {
// main
"unknown": "???",
"unknown_personality": "Ismeretlen személyiség...",
// personalities
"t_geek": "Stréber",
"d_geek":
"Sokat tanulsz, de ezzel semmi baj! Ez egyben áldás és átok, de legalább az életben sikeres leszel.",
"s_geek": "Év végi átlagod",
"t_sick": "Beteges",
"d_sick":
"Jobbulást, tesó. Még akkor is, ha hazudtál arról, hogy beteg vagy, hogy ne kelljen suliba menned.",
"s_sick": "Hiányzásaid",
"t_late": "Késős",
"d_late":
"Kilyukadt a villamos kereke. Kisiklott a repülő. A kutyád megette a cipőd. Elhisszük.",
"s_late": "Késések (perc)",
"t_quitter": "Lógós",
"d_quitter": "Osztályzóvizsga incoming.",
"s_quitter": "Igazolatlan hiányzások",
"t_healthy": "Makk",
"d_healthy":
"...egészséges vagy! Egész évben alig hiányoztál az iskolából.",
"s_healthy": "Hiányzásaid",
"t_acceptable": "Elmegy",
"d_acceptable":
"A kettes érettségi is érettségi. Nem egy jó érettségi, de biztos, hogy egy érettségi.",
"s_acceptable": "Kettesek",
"t_fallible": "Bukós",
"d_fallible": "Jövőre több sikerrel jársz.",
"s_fallible": "Karók",
"t_average": "Közepes",
"d_average": "Se jó, se rossz. Az arany középút, ha akarsz...",
"s_average": "Hármasok",
"t_diligent": "Szorgalmas",
"d_diligent":
"Leírtad a jegyzetet, megcsináltad a prezentációt, és te vezetted a projektmunkát.",
"s_diligent": "Órai munka ötösök",
"t_cheater": "Csaló",
"d_cheater":
"Bekapcsoltad a “Jó Tanuló” módot. Wow. Azt hitted, túl járhatsz az eszemen, de kijátszottam a kijátszásod.",
"s_cheater": "Bitches",
"t_npc": "NPC",
"d_npc":
"Egy akkora nagy non-player character vagy, hogy neked semmilyen személyiség nem jutott ezen kívül.",
"s_npc": "In-game playtime (óra)",
},
"de_de": {
// main
"unknown": "???",
"unknown_personality": "Unbekannte Persönlichkeit...",
// personalities
"t_geek": "Besserwisser",
"d_geek":
"Du lernst eine Menge, aber sorge dich nicht - ein Besserwisser zu sein wird sich letzten Endes doch als Segen erweisen. Du wirst erfolgreich sein im Leben.",
"s_geek": "Durchschnittsschüler",
"t_sick": "Krank",
"d_sick":
"Werd schnell wieder gesund, Brudi. Selbst wenn du gelogen hast, nur um Schule zu schwänzen zu können.",
"s_sick": "Abwesenheiten",
"t_late": "Verspätet",
"d_late":
"Die Straßenbahn hat eine Reifenpanne. Das Flugzeug ist entgleist. Dein Hund hat deinen Schuh gefressen. Klar, wir glauben dir.",
"s_late": "Verspätung (Minuten)",
"t_quitter": "Schulschwänzer",
"d_quitter": "Ein zusätzlicher Test wird anstehen.",
"s_quitter": "Unentschuldigte Abwesenheiten",
"t_healthy": "Gesund",
"d_healthy":
"Du bist die Ruhe selbst! Du hast fast nie eine Unterrichtsstunde verpasst.",
"s_healthy": "Abwesenheiten",
"t_acceptable": "Akzeptabel",
"d_acceptable":
"Die Abschlussprüfungen waren gerade einmal eine 4. Aber wen juckt's? Es ist immer noch positiv. Nicht allzu gut, aber definitiv positiv.",
"s_acceptable": "4er",
"t_fallible": "Durchgefallen",
"d_fallible": "Viel Glück im nächsten Jahr.",
"s_fallible": "5er",
"t_average": "Es ist in Ordnung",
"d_average":
"Nicht gut, nicht schlecht. Der goldene Durchschnitt, wenn du so willst...",
"s_average": "3er",
"t_diligent": "Ein Fleißiger",
"d_diligent":
"Du hast bei allem mitgeschrieben, du hast den Vortrag gehalten, und du hast die Gruppenarbeit geleitet.",
"s_diligent": "1er Schüler",
"t_cheater": "Geschummelt",
"d_cheater":
"Du hast den „Guter Schüler“ Modus aktiviert. Wow. Du magst mich zwar vielleicht überlistet haben, aber ich habe deine Überlistung überlistet.",
"s_cheater": "Bitches",
"t_npc": "COM",
"d_npc":
"Du bist einfach so sehr wie ein Computer, dass wir dir nicht einmal eine Persönlichkeit geben konnten.",
"s_npc": "Spielzeit (Stunden)",
}
};
String get i18n => localize(this, _t);
String fill(List<Object> params) => localizeFill(this, params);
String plural(int value) => localizePlural(value, this, _t);
String version(Object modifier) => localizeVersion(modifier, this, _t);
}