From 2c10b02e531f6b4ddada0b43d9d7f881fc932fb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Thu, 8 Jun 2023 20:55:57 +0200 Subject: [PATCH] Added option to show folders always on top in files --- lib/storage/base/settings.dart | 3 +++ lib/storage/base/settings.g.dart | 3 +++ lib/storage/base/settingsProvider.dart | 4 ++++ lib/storage/file/fileSettings.dart | 13 +++++++++++++ lib/storage/file/fileSettings.g.dart | 16 ++++++++++++++++ lib/view/pages/files/files.dart | 8 +++++++- lib/view/settings/settings.dart | 15 +++++++++++++++ 7 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 lib/storage/file/fileSettings.dart create mode 100644 lib/storage/file/fileSettings.g.dart diff --git a/lib/storage/base/settings.dart b/lib/storage/base/settings.dart index 4b12578..93f5b0f 100644 --- a/lib/storage/base/settings.dart +++ b/lib/storage/base/settings.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:json_annotation/json_annotation.dart'; +import '../file/fileSettings.dart'; import '../gradeAverages/gradeAveragesSettings.dart'; import '../talk/talkSettings.dart'; import '../timetable/timetableSettings.dart'; @@ -19,6 +20,7 @@ class Settings { GradeAveragesSettings gradeAveragesSettings; TimetableSettings timetableSettings; TalkSettings talkSettings; + FileSettings fileSettings; Settings({ required this.appTheme, @@ -26,6 +28,7 @@ class Settings { required this.gradeAveragesSettings, required this.timetableSettings, required this.talkSettings, + required this.fileSettings, }); static String _themeToJson(ThemeMode m) => m.name; diff --git a/lib/storage/base/settings.g.dart b/lib/storage/base/settings.g.dart index 6794122..235a0fd 100644 --- a/lib/storage/base/settings.g.dart +++ b/lib/storage/base/settings.g.dart @@ -15,6 +15,8 @@ Settings _$SettingsFromJson(Map json) => Settings( json['timetableSettings'] as Map), talkSettings: TalkSettings.fromJson(json['talkSettings'] as Map), + fileSettings: + FileSettings.fromJson(json['fileSettings'] as Map), ); Map _$SettingsToJson(Settings instance) => { @@ -23,4 +25,5 @@ Map _$SettingsToJson(Settings instance) => { 'gradeAveragesSettings': instance.gradeAveragesSettings.toJson(), 'timetableSettings': instance.timetableSettings.toJson(), 'talkSettings': instance.talkSettings.toJson(), + 'fileSettings': instance.fileSettings.toJson(), }; diff --git a/lib/storage/base/settingsProvider.dart b/lib/storage/base/settingsProvider.dart index bedda8f..a1b934a 100644 --- a/lib/storage/base/settingsProvider.dart +++ b/lib/storage/base/settingsProvider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:developer'; import 'package:flutter/material.dart'; +import 'package:marianum_mobile/storage/file/fileSettings.dart'; import 'package:shared_preferences/shared_preferences.dart'; import '../gradeAverages/gradeAveragesSettings.dart'; @@ -60,6 +61,9 @@ class SettingsProvider extends ChangeNotifier { sortFavoritesToTop: true, sortUnreadToTop: false, ), + fileSettings: FileSettings( + sortFoldersToTop: true, + ), ); } } \ No newline at end of file diff --git a/lib/storage/file/fileSettings.dart b/lib/storage/file/fileSettings.dart new file mode 100644 index 0000000..a4c6b57 --- /dev/null +++ b/lib/storage/file/fileSettings.dart @@ -0,0 +1,13 @@ +import 'package:json_annotation/json_annotation.dart'; + +part 'fileSettings.g.dart'; + +@JsonSerializable() +class FileSettings { + bool sortFoldersToTop; + + FileSettings({required this.sortFoldersToTop}); + + factory FileSettings.fromJson(Map json) => _$FileSettingsFromJson(json); + Map toJson() => _$FileSettingsToJson(this); +} \ No newline at end of file diff --git a/lib/storage/file/fileSettings.g.dart b/lib/storage/file/fileSettings.g.dart new file mode 100644 index 0000000..25c5df6 --- /dev/null +++ b/lib/storage/file/fileSettings.g.dart @@ -0,0 +1,16 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'fileSettings.dart'; + +// ************************************************************************** +// JsonSerializableGenerator +// ************************************************************************** + +FileSettings _$FileSettingsFromJson(Map json) => FileSettings( + sortFoldersToTop: json['sortFoldersToTop'] as bool, + ); + +Map _$FileSettingsToJson(FileSettings instance) => + { + 'sortFoldersToTop': instance.sortFoldersToTop, + }; diff --git a/lib/view/pages/files/files.dart b/lib/view/pages/files/files.dart index 9654fec..4475b42 100644 --- a/lib/view/pages/files/files.dart +++ b/lib/view/pages/files/files.dart @@ -4,6 +4,8 @@ import 'dart:io'; import 'package:flutter/material.dart'; import 'package:loader_overlay/loader_overlay.dart'; +import 'package:marianum_mobile/storage/base/settingsProvider.dart'; +import 'package:provider/provider.dart'; import '../../../api/marianumcloud/webdav/queries/listFiles/cacheableFile.dart'; import '../../../api/marianumcloud/webdav/queries/listFiles/listFilesCache.dart'; @@ -93,7 +95,11 @@ class _FilesState extends State { @override Widget build(BuildContext context) { - List files = (data?.files.toList() ?? List.empty())..sort(SortOptions.getOption(currentSort).compare); + List files = (data?.files.toList() ?? List.empty())..sort((a, b) { + int directorySort = Provider.of(context).val().fileSettings.sortFoldersToTop ? a.isDirectory ? b.isDirectory ? 0 : 1 : -1 : 0; + if(directorySort == 0) return SortOptions.getOption(currentSort).compare(a, b); + return directorySort; + }); if(currentSortDirection) files = files.reversed.toList(); return Scaffold( diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index f107ac1..6325f37 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -119,6 +119,21 @@ class _SettingsState extends State { const Divider(), + ListTile( + leading: const Icon(Icons.drive_folder_upload_outlined), + title: const Text("Ordner in Dateien nach oben sortieren"), + trailing: Checkbox( + value: settings.val().fileSettings.sortFoldersToTop, + onChanged: (e) { + setState(() { + settings.val(write: true).fileSettings.sortFoldersToTop = e!; + }); + }, + ), + ), + + const Divider(), + ListTile( leading: const Icon(Icons.live_help_outlined), title: const Text("Informationen und Lizenzen"),