diff --git a/lib/storage/timetable/timetableSettings.dart b/lib/storage/timetable/timetableSettings.dart index 69d0729..cd1098d 100644 --- a/lib/storage/timetable/timetableSettings.dart +++ b/lib/storage/timetable/timetableSettings.dart @@ -4,7 +4,9 @@ part 'timetableSettings.g.dart'; @JsonSerializable() class TimetableSettings { - TimetableSettings(); + bool connectDoubleLessons; + + TimetableSettings({required this.connectDoubleLessons}); factory TimetableSettings.fromJson(Map json) => _$TimetableSettingsFromJson(json); Map toJson() => _$TimetableSettingsToJson(this); diff --git a/lib/storage/timetable/timetableSettings.g.dart b/lib/storage/timetable/timetableSettings.g.dart index 03f2db8..29c7e48 100644 --- a/lib/storage/timetable/timetableSettings.g.dart +++ b/lib/storage/timetable/timetableSettings.g.dart @@ -7,7 +7,11 @@ part of 'timetableSettings.dart'; // ************************************************************************** TimetableSettings _$TimetableSettingsFromJson(Map json) => - TimetableSettings(); + TimetableSettings( + connectDoubleLessons: json['connectDoubleLessons'] as bool, + ); Map _$TimetableSettingsToJson(TimetableSettings instance) => - {}; + { + 'connectDoubleLessons': instance.connectDoubleLessons, + }; diff --git a/lib/view/pages/timetable/timetable.dart b/lib/view/pages/timetable/timetable.dart index d0c9614..58e93c2 100644 --- a/lib/view/pages/timetable/timetable.dart +++ b/lib/view/pages/timetable/timetable.dart @@ -243,9 +243,43 @@ class _TimetableState extends State { ]; } + List _removeDuplicates(TimetableProps data, Duration maxTimeBetweenDouble) { + + List timetableList = data.getTimetableResponse.result.toList(); + + if(timetableList.isEmpty){ return timetableList; } + + timetableList.sort((a, b) => _parseWebuntisTimestamp(a.date, a.startTime).compareTo(_parseWebuntisTimestamp(b.date, b.startTime))); + + GetTimetableResponseObject previousElement = timetableList.first; + for (var i = 1; i < timetableList.length; i++) { + GetTimetableResponseObject currentElement = timetableList.elementAt(i); + + bool isSameSubject() => (currentElement.su.firstOrNull?.id ?? 1) == (previousElement.su.firstOrNull?.id ?? 2); + bool isNotSeparated() => _parseWebuntisTimestamp(previousElement.date, previousElement.endTime).add(maxTimeBetweenDouble).add(const Duration(seconds: 1)) + .isAfter(_parseWebuntisTimestamp(currentElement.date, currentElement.startTime)); + + if(isSameSubject() && isNotSeparated()){ + previousElement.endTime = currentElement.endTime; + timetableList.remove(currentElement); + i--; + }else{ + previousElement = currentElement; + } + } + + return timetableList; + } + TimetableEvents _buildTableEvents(TimetableProps data) { - List appointments = data.getTimetableResponse.result.map((element) { + List timetableList = data.getTimetableResponse.result.toList(); + + if(settings.val().timetableSettings.connectDoubleLessons){ + timetableList = _removeDuplicates(data, const Duration(minutes: 5)); + } + + List appointments = timetableList.map((element) { GetRoomsResponse rooms = data.getRoomsResponse; GetSubjectsResponse subjects = data.getSubjectsResponse; diff --git a/lib/view/settings/defaultSettings.dart b/lib/view/settings/defaultSettings.dart index 1b99f8d..e26034e 100644 --- a/lib/view/settings/defaultSettings.dart +++ b/lib/view/settings/defaultSettings.dart @@ -22,7 +22,9 @@ class DefaultSettings { askedForPreferredGradeSystem: false, inputs: [] ), - timetableSettings: TimetableSettings(), + timetableSettings: TimetableSettings( + connectDoubleLessons: false, + ), talkSettings: TalkSettings( sortFavoritesToTop: true, sortUnreadToTop: false, diff --git a/lib/view/settings/settings.dart b/lib/view/settings/settings.dart index ecdacd8..7d546e8 100644 --- a/lib/view/settings/settings.dart +++ b/lib/view/settings/settings.dart @@ -98,6 +98,19 @@ class _SettingsState extends State { const Divider(), + ListTile( + leading: const Icon(Icons.calendar_view_day_outlined), + title: const Text("Doppelstunden als eine Stunde anzeigen"), + trailing: Checkbox( + value: settings.val().timetableSettings.connectDoubleLessons, + onChanged: (e) { + settings.val(write: true).timetableSettings.connectDoubleLessons = e!; + }, + ), + ), + + const Divider(), + ListTile( leading: const Icon(Icons.star_border), title: const Text("Favoriten im Talk nach oben sortieren"),