#1549 week day filters

This commit is contained in:
Thibault Deckers 2025-05-05 23:12:23 +02:00
parent 91cfe01af3
commit 4b87717cd2
7 changed files with 76 additions and 1 deletions

View file

@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file.
## <a id="unreleased"></a>[Unreleased] ## <a id="unreleased"></a>[Unreleased]
### Added
- Search: week day filters
### Changed ### Changed
- revert to Skia rendering engine - revert to Skia rendering engine

View file

@ -21,6 +21,7 @@ import 'package:aves/model/filters/set_and.dart';
import 'package:aves/model/filters/set_or.dart'; import 'package:aves/model/filters/set_or.dart';
import 'package:aves/model/filters/trash.dart'; import 'package:aves/model/filters/trash.dart';
import 'package:aves/model/filters/type.dart'; import 'package:aves/model/filters/type.dart';
import 'package:aves/model/filters/weekday.dart';
import 'package:aves/theme/colors.dart'; import 'package:aves/theme/colors.dart';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
@ -36,11 +37,13 @@ abstract class CollectionFilter extends Equatable implements Comparable<Collecti
SetAndFilter.type, SetAndFilter.type,
SetOrFilter.type, SetOrFilter.type,
MimeFilter.type, MimeFilter.type,
AlbumGroupFilter.type,
DynamicAlbumFilter.type, DynamicAlbumFilter.type,
StoredAlbumFilter.type, StoredAlbumFilter.type,
TypeFilter.type, TypeFilter.type,
RecentlyAddedFilter.type, RecentlyAddedFilter.type,
DateFilter.type, DateFilter.type,
WeekDayFilter.type,
LocationFilter.type, LocationFilter.type,
CoordinateFilter.type, CoordinateFilter.type,
FavouriteFilter.type, FavouriteFilter.type,
@ -98,6 +101,8 @@ abstract class CollectionFilter extends Equatable implements Comparable<Collecti
return TypeFilter.fromMap(jsonMap); return TypeFilter.fromMap(jsonMap);
case TrashFilter.type: case TrashFilter.type:
return TrashFilter.fromMap(jsonMap); return TrashFilter.fromMap(jsonMap);
case WeekDayFilter.type:
return WeekDayFilter.fromMap(jsonMap);
} }
debugPrint('failed to deserialize filter from JSON map=$jsonMap'); debugPrint('failed to deserialize filter from JSON map=$jsonMap');
return null; return null;

View file

@ -0,0 +1,57 @@
import 'package:aves/model/filters/filters.dart';
import 'package:aves/theme/icons.dart';
import 'package:aves/widgets/common/extensions/build_context.dart';
import 'package:flutter/widgets.dart';
import 'package:intl/intl.dart';
class WeekDayFilter extends CollectionFilter {
static const type = 'weekday';
late final int weekday;
late final EntryFilter _test;
@override
List<Object?> get props => [weekday, reversed];
WeekDayFilter(this.weekday, {super.reversed = false}) {
_test = (entry) => entry.bestDate?.weekday == weekday;
}
factory WeekDayFilter.fromMap(Map<String, dynamic> json) {
return WeekDayFilter(
json['weekday'] as int,
reversed: json['reversed'] ?? false,
);
}
@override
Map<String, dynamic> toMap() => {
'type': type,
'weekday': weekday,
'reversed': reversed,
};
@override
EntryFilter get positiveTest => _test;
@override
bool get exclusiveProp => true;
@override
String get universalLabel => weekday.toString();
@override
String getLabel(BuildContext context) {
final dateSymbols = DateFormat(null, context.locale).dateSymbols;
return dateSymbols.STANDALONEWEEKDAYS[weekday % 7];
}
@override
Widget? iconBuilder(BuildContext context, double size, {bool allowGenericIcon = true}) => Icon(AIcons.dateWeekday, size: size);
@override
String get category => type;
@override
String get key => '$type-$reversed-$weekday';
}

View file

@ -72,6 +72,7 @@ class AIcons {
static const dateByMonth = Symbols.calendar_month; static const dateByMonth = Symbols.calendar_month;
static const dateRecent = Symbols.today; static const dateRecent = Symbols.today;
static const dateUndated = Symbols.event_busy; static const dateUndated = Symbols.event_busy;
static const dateWeekday = Symbols.today;
static const geoBounds = Symbols.public; static const geoBounds = Symbols.public;
static const location = Symbols.place; static const location = Symbols.place;
static const locationUnlocated = Symbols.location_off; static const locationUnlocated = Symbols.location_off;

View file

@ -15,6 +15,7 @@ import 'package:aves/model/filters/rating.dart';
import 'package:aves/model/filters/recent.dart'; import 'package:aves/model/filters/recent.dart';
import 'package:aves/model/filters/set_and.dart'; import 'package:aves/model/filters/set_and.dart';
import 'package:aves/model/filters/type.dart'; import 'package:aves/model/filters/type.dart';
import 'package:aves/model/filters/weekday.dart';
import 'package:aves/model/grouping/common.dart'; import 'package:aves/model/grouping/common.dart';
import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/album.dart'; import 'package:aves/model/source/album.dart';
@ -67,6 +68,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
]; ];
static final _monthFilters = List.generate(12, (i) => DateFilter(DateLevel.m, DateTime(1, i + 1))); static final _monthFilters = List.generate(12, (i) => DateFilter(DateLevel.m, DateTime(1, i + 1)));
static final _weekdayFilters = List.generate(7, (i) => WeekDayFilter(i + 1));
CollectionSearchDelegate({ CollectionSearchDelegate({
required super.searchFieldLabel, required super.searchFieldLabel,
@ -200,6 +202,7 @@ class CollectionSearchDelegate extends AvesSearchDelegate with FeedbackMixin, Va
DateFilter.onThisDay, DateFilter.onThisDay,
RecentlyAddedFilter.instance, RecentlyAddedFilter.instance,
..._monthFilters, ..._monthFilters,
..._weekdayFilters,
].where((f) => containQuery(f.getLabel(context))).toList(); ].where((f) => containQuery(f.getLabel(context))).toList();
return _buildFilterRow( return _buildFilterRow(
context: context, context: context,

View file

@ -13,6 +13,7 @@ import 'package:aves/model/filters/favourite.dart';
import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/filters/mime.dart';
import 'package:aves/model/filters/rating.dart'; import 'package:aves/model/filters/rating.dart';
import 'package:aves/model/filters/type.dart'; import 'package:aves/model/filters/type.dart';
import 'package:aves/model/filters/weekday.dart';
import 'package:aves/model/settings/settings.dart'; import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_lens.dart';
import 'package:aves/ref/mime_types.dart'; import 'package:aves/ref/mime_types.dart';
@ -130,7 +131,7 @@ class _BasicSectionState extends State<BasicSection> {
if (entry.isImage && entry.is360) TypeFilter.panorama, if (entry.isImage && entry.is360) TypeFilter.panorama,
if (entry.isPureVideo && entry.is360) TypeFilter.sphericalVideo, if (entry.isPureVideo && entry.is360) TypeFilter.sphericalVideo,
if (entry.isPureVideo && !entry.is360) MimeFilter.video, if (entry.isPureVideo && !entry.is360) MimeFilter.video,
if (dateTime != null) DateFilter(DateLevel.ymd, dateTime.date), if (dateTime != null) ...[DateFilter(DateLevel.ymd, dateTime.date), WeekDayFilter(dateTime.weekday)],
if (album != null) StoredAlbumFilter(album, collection?.source.getStoredAlbumDisplayName(context, album)), if (album != null) StoredAlbumFilter(album, collection?.source.getStoredAlbumDisplayName(context, album)),
if (entry.rating != 0) RatingFilter(entry.rating), if (entry.rating != 0) RatingFilter(entry.rating),
...tags.map(TagFilter.new), ...tags.map(TagFilter.new),

View file

@ -18,6 +18,7 @@ import 'package:aves/model/filters/recent.dart';
import 'package:aves/model/filters/set_and.dart'; import 'package:aves/model/filters/set_and.dart';
import 'package:aves/model/filters/set_or.dart'; import 'package:aves/model/filters/set_or.dart';
import 'package:aves/model/filters/type.dart'; import 'package:aves/model/filters/type.dart';
import 'package:aves/model/filters/weekday.dart';
import 'package:aves/model/grouping/common.dart'; import 'package:aves/model/grouping/common.dart';
import 'package:aves/services/common/services.dart'; import 'package:aves/services/common/services.dart';
import 'package:latlong2/latlong.dart'; import 'package:latlong2/latlong.dart';
@ -80,6 +81,9 @@ void main() {
final type = TypeFilter.sphericalVideo; final type = TypeFilter.sphericalVideo;
expect(type, jsonRoundTrip(type)); expect(type, jsonRoundTrip(type));
final weekday = WeekDayFilter(5);
expect(weekday, jsonRoundTrip(weekday));
// covered // covered
final album = StoredAlbumFilter('path/to/album', 'album'); final album = StoredAlbumFilter('path/to/album', 'album');