things in v5 personalize settings (rename thingie)

This commit is contained in:
Kima 2024-02-01 22:02:46 +01:00
parent 458971392e
commit 6e23397905
5 changed files with 308 additions and 9 deletions

View File

@ -14,6 +14,7 @@ class SplittedPanel extends StatelessWidget {
this.isSeparated = false, this.isSeparated = false,
this.spacing = 6.0, this.spacing = 6.0,
this.isTransparent = false, this.isTransparent = false,
this.hasBorder = false,
}); });
final List<Widget>? children; final List<Widget>? children;
@ -24,6 +25,7 @@ class SplittedPanel extends StatelessWidget {
final bool isSeparated; final bool isSeparated;
final double spacing; final double spacing;
final bool isTransparent; final bool isTransparent;
final bool hasBorder;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -49,6 +51,12 @@ class SplittedPanel extends StatelessWidget {
top: Radius.circular(i == 0 ? 16.0 : 8.0), top: Radius.circular(i == 0 ? 16.0 : 8.0),
bottom: Radius.circular(children!.length == i + 1 ? 16.0 : 8.0), bottom: Radius.circular(children!.length == i + 1 ? 16.0 : 8.0),
), ),
border: hasBorder
? Border.all(
color:
Theme.of(context).colorScheme.primary.withOpacity(.25),
width: 1.0)
: null,
), ),
margin: EdgeInsets.only(top: i == 0 ? 0.0 : sp), margin: EdgeInsets.only(top: i == 0 ? 0.0 : sp),
padding: cardPadding ?? EdgeInsets.zero, padding: cardPadding ?? EdgeInsets.zero,

View File

@ -328,7 +328,7 @@ class SettingsScreenState extends State<SettingsScreen>
AccountView.show(user.user!, context: context), AccountView.show(user.user!, context: context),
title: Text("personal_details".i18n), title: Text("personal_details".i18n),
leading: Icon( leading: Icon(
FeatherIcons.user, FeatherIcons.info,
size: 22.0, size: 22.0,
color: AppColors.of(context).text.withOpacity(0.95), color: AppColors.of(context).text.withOpacity(0.95),
), ),

View File

@ -83,6 +83,7 @@ extension SettingsLocalization on String {
"edit": "Edit", "edit": "Edit",
"switch_account": "Switch Account", "switch_account": "Switch Account",
"subjects": "Subjects", "subjects": "Subjects",
"select_subject": "Select Subject",
}, },
"hu_hu": { "hu_hu": {
"personal_details": "Személyes információk", "personal_details": "Személyes információk",
@ -164,6 +165,7 @@ extension SettingsLocalization on String {
"edit": "Szerkesztés", "edit": "Szerkesztés",
"switch_account": "Fiókváltás", "switch_account": "Fiókváltás",
"subjects": "Tantárgyak", "subjects": "Tantárgyak",
"select_subject": "Válassz tantárgyat",
}, },
"de_de": { "de_de": {
"personal_details": "Persönliche Angaben", "personal_details": "Persönliche Angaben",
@ -245,6 +247,7 @@ extension SettingsLocalization on String {
"edit": "Bearbeiten", "edit": "Bearbeiten",
"switch_account": "Benutzer wechseln", "switch_account": "Benutzer wechseln",
"subjects": "Themen", "subjects": "Themen",
"select_subject": "Fach auswählen",
}, },
}; };

View File

@ -0,0 +1,52 @@
import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo/theme/colors/colors.dart';
import 'package:filcnaplo/utils/format.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class EditSubjectScreen extends StatefulWidget {
const EditSubjectScreen({super.key, required this.subject});
final GradeSubject subject;
@override
EditSubjectScreenState createState() => EditSubjectScreenState();
}
class EditSubjectScreenState extends State<EditSubjectScreen> {
@override
Widget build(BuildContext context) {
SettingsProvider settingsProvider = Provider.of<SettingsProvider>(context);
return Scaffold(
appBar: AppBar(
surfaceTintColor: Theme.of(context).scaffoldBackgroundColor,
leading: BackButton(color: AppColors.of(context).text),
title: Text(
(widget.subject.isRenamed && settingsProvider.renamedSubjectsEnabled
? widget.subject.renamedTo
: widget.subject.name.capital()) ??
'',
style: TextStyle(
color: AppColors.of(context).text,
fontStyle: settingsProvider.renamedSubjectsItalics
? FontStyle.italic
: FontStyle.normal,
),
),
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0),
child: Column(
children: [
],
),
),
),
);
}
}

View File

@ -1,14 +1,18 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:dropdown_button2/dropdown_button2.dart';
import 'package:filcnaplo/helpers/subject.dart'; import 'package:filcnaplo/helpers/subject.dart';
import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo/theme/colors/colors.dart'; import 'package:filcnaplo/theme/colors/colors.dart';
import 'package:filcnaplo/utils/format.dart'; import 'package:filcnaplo/utils/format.dart';
import 'package:filcnaplo_kreta_api/models/subject.dart'; import 'package:filcnaplo_kreta_api/models/subject.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/grade_provider.dart';
import 'package:filcnaplo_kreta_api/providers/timetable_provider.dart';
import 'package:filcnaplo_mobile_ui/common/panel/panel_button.dart'; import 'package:filcnaplo_mobile_ui/common/panel/panel_button.dart';
import 'package:filcnaplo_mobile_ui/common/splitted_panel/splitted_panel.dart'; import 'package:filcnaplo_mobile_ui/common/splitted_panel/splitted_panel.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart'; import 'package:filcnaplo_mobile_ui/screens/settings/settings_helper.dart';
import 'package:filcnaplo_mobile_ui/screens/settings/submenu/edit_subject.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_feather_icons/flutter_feather_icons.dart'; import 'package:flutter_feather_icons/flutter_feather_icons.dart';
@ -61,15 +65,26 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
late AnimationController _hideContainersController; late AnimationController _hideContainersController;
late List<GradeSubject> subjects; late List<GradeSubject> editedSubjects;
late List<GradeSubject> otherSubjects;
late List<Widget> tiles; late List<Widget> tiles;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
subjects = Provider.of<GradeProvider>(context, listen: false) editedSubjects = Provider.of<GradeProvider>(context, listen: false)
.grades .grades
.where((e) => e.teacher.isRenamed || e.subject.isRenamed)
.map((e) => e.subject)
.toSet()
.toList()
..sort((a, b) => a.name.compareTo(b.name));
otherSubjects = Provider.of<GradeProvider>(context, listen: false)
.grades
.where((e) => !e.teacher.isRenamed && !e.subject.isRenamed)
.map((e) => e.subject) .map((e) => e.subject)
.toSet() .toSet()
.toList() .toList()
@ -84,15 +99,23 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
var i = 0; var i = 0;
for (var s in subjects) { for (var s in editedSubjects) {
Widget widget = PanelButton( Widget widget = PanelButton(
onPressed: () { onPressed: () => Navigator.of(context, rootNavigator: true).push(
// TODO: open subject's config page CupertinoPageRoute(
}, builder: (context) => EditSubjectScreen(subject: s),
),
),
title: Text( title: Text(
(s.isRenamed ? s.renamedTo : s.name.capital()) ?? '', (s.isRenamed && settingsProvider.renamedSubjectsEnabled
? s.renamedTo
: s.name.capital()) ??
'',
style: TextStyle( style: TextStyle(
color: AppColors.of(context).text.withOpacity(.95), color: AppColors.of(context).text.withOpacity(.95),
fontStyle: settingsProvider.renamedSubjectsItalics
? FontStyle.italic
: FontStyle.normal,
), ),
), ),
leading: Icon( leading: Icon(
@ -107,7 +130,7 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
), ),
borderRadius: BorderRadius.vertical( borderRadius: BorderRadius.vertical(
top: Radius.circular(i == 0 ? 12.0 : 4.0), top: Radius.circular(i == 0 ? 12.0 : 4.0),
bottom: Radius.circular(i + 1 == subjects.length ? 12.0 : 4.0), bottom: Radius.circular(i + 1 == editedSubjects.length ? 12.0 : 4.0),
), ),
); );
@ -150,6 +173,7 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0), const EdgeInsets.symmetric(vertical: 16.0, horizontal: 24.0),
child: Column( child: Column(
children: [ children: [
// app theme
SplittedPanel( SplittedPanel(
padding: const EdgeInsets.only(top: 8.0), padding: const EdgeInsets.only(top: 8.0),
cardPadding: const EdgeInsets.all(4.0), cardPadding: const EdgeInsets.all(4.0),
@ -177,6 +201,7 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
), ),
], ],
), ),
// color magic shit
SplittedPanel( SplittedPanel(
padding: const EdgeInsets.only(top: 9.0), padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0), cardPadding: const EdgeInsets.all(4.0),
@ -216,6 +241,7 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
), ),
], ],
), ),
// change subject icons
SplittedPanel( SplittedPanel(
padding: const EdgeInsets.only(top: 9.0), padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0), cardPadding: const EdgeInsets.all(4.0),
@ -247,6 +273,7 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
), ),
], ],
), ),
// grade colors
SplittedPanel( SplittedPanel(
padding: const EdgeInsets.only(top: 9.0), padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0), cardPadding: const EdgeInsets.all(4.0),
@ -290,6 +317,138 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
), ),
], ],
), ),
// rename subjects
SplittedPanel(
padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0),
isSeparated: true,
children: [
PanelButton(
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
onPressed: () async {
settingsProvider.update(
renamedSubjectsEnabled:
!settingsProvider.renamedSubjectsEnabled);
await Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<TimetableProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<AbsenceProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
},
title: Text(
"rename_subjects".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(
settingsProvider.renamedSubjectsEnabled
? .95
: .25),
),
),
leading: Icon(
FeatherIcons.penTool,
size: 22.0,
color: AppColors.of(context).text.withOpacity(
settingsProvider.renamedSubjectsEnabled
? .95
: .25),
),
trailing: Switch(
onChanged: (v) async {
settingsProvider.update(renamedSubjectsEnabled: v);
await Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<TimetableProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<AbsenceProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
},
value: settingsProvider.renamedSubjectsEnabled,
activeColor: Theme.of(context).colorScheme.secondary,
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
],
),
// rename teachers
SplittedPanel(
padding: const EdgeInsets.only(top: 9.0),
cardPadding: const EdgeInsets.all(4.0),
isSeparated: true,
children: [
PanelButton(
padding: const EdgeInsets.only(left: 14.0, right: 6.0),
onPressed: () async {
settingsProvider.update(
renamedTeachersEnabled:
!settingsProvider.renamedTeachersEnabled);
await Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<TimetableProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<AbsenceProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
},
title: Text(
"rename_teachers".i18n,
style: TextStyle(
color: AppColors.of(context).text.withOpacity(
settingsProvider.renamedTeachersEnabled
? .95
: .25),
),
),
leading: Icon(
FeatherIcons.user,
size: 22.0,
color: AppColors.of(context).text.withOpacity(
settingsProvider.renamedTeachersEnabled
? .95
: .25),
),
trailing: Switch(
onChanged: (v) async {
settingsProvider.update(renamedTeachersEnabled: v);
await Provider.of<GradeProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<TimetableProvider>(context,
listen: false)
.convertBySettings();
await Provider.of<AbsenceProvider>(context,
listen: false)
.convertBySettings();
setState(() {});
},
value: settingsProvider.renamedTeachersEnabled,
activeColor: Theme.of(context).colorScheme.secondary,
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
],
),
const SizedBox( const SizedBox(
height: 18.0, height: 18.0,
), ),
@ -299,6 +458,83 @@ class PersonalizeSettingsScreenState extends State<PersonalizeSettingsScreen>
cardPadding: const EdgeInsets.all(4.0), cardPadding: const EdgeInsets.all(4.0),
children: tiles, children: tiles,
), ),
const SizedBox(
height: 9.0,
),
SplittedPanel(
padding: EdgeInsets.zero,
cardPadding: const EdgeInsets.all(3.0),
hasBorder: true,
isTransparent: true,
children: [
DropdownButton2(
items: otherSubjects
.map((item) => DropdownMenuItem<String>(
value: item.id,
child: Text(
item.name,
style: TextStyle(
fontSize: 14,
fontWeight: FontWeight.bold,
color: AppColors.of(context).text,
),
overflow: TextOverflow.ellipsis,
),
))
.toList(),
onChanged: (String? v) {
Navigator.of(context, rootNavigator: true).push(
CupertinoPageRoute(
builder: (context) => EditSubjectScreen(
subject:
otherSubjects.firstWhere((e) => e.id == v),
),
),
);
// _subjectName.text = "";
},
iconSize: 14,
iconEnabledColor: AppColors.of(context).text,
iconDisabledColor: AppColors.of(context).text,
underline: const SizedBox(),
itemHeight: 40,
itemPadding: const EdgeInsets.only(left: 14, right: 14),
buttonWidth: 50,
dropdownWidth: 300,
dropdownPadding: null,
buttonDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(12.0),
),
dropdownDecoration: BoxDecoration(
borderRadius: BorderRadius.circular(14),
),
dropdownElevation: 8,
scrollbarRadius: const Radius.circular(40),
scrollbarThickness: 6,
scrollbarAlwaysShow: true,
offset: const Offset(-10, -10),
buttonSplashColor: Colors.transparent,
customButton: PanelButton(
title: Text(
"select_subject".i18n,
style: TextStyle(
color:
AppColors.of(context).text.withOpacity(.95),
),
),
leading: Icon(
FeatherIcons.plus,
size: 22.0,
color: AppColors.of(context).text.withOpacity(.95),
),
borderRadius: const BorderRadius.vertical(
top: Radius.circular(12.0),
bottom: Radius.circular(12.0),
),
),
),
],
),
], ],
), ),
), ),