diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 5bc3e79f6..9bd16dd3a 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -169,6 +169,8 @@ "keepScreenOnAlways": "Always", "@keepScreenOnAlways": {}, + "albumTierNew": "New", + "@albumTierNew": {}, "albumTierPinned": "Pinned", "@albumTierPinned": {}, "albumTierSpecial": "Common", diff --git a/lib/l10n/app_ko.arb b/lib/l10n/app_ko.arb index b98b0d610..bd2ffe50b 100644 --- a/lib/l10n/app_ko.arb +++ b/lib/l10n/app_ko.arb @@ -88,6 +88,7 @@ "keepScreenOnViewerOnly": "뷰어 이용 시 작동", "keepScreenOnAlways": "항상 켜짐", + "albumTierNew": "신규", "albumTierPinned": "고정", "albumTierSpecial": "기본", "albumTierApps": "앱", diff --git a/lib/theme/icons.dart b/lib/theme/icons.dart index 5b5faa1ce..423dd0d92 100644 --- a/lib/theme/icons.dart +++ b/lib/theme/icons.dart @@ -49,6 +49,7 @@ class AIcons { static const IconData import = MdiIcons.fileImportOutline; static const IconData info = Icons.info_outlined; static const IconData layers = Icons.layers_outlined; + static const IconData newTier = Icons.fiber_new_outlined; static const IconData openOutside = Icons.open_in_new_outlined; static const IconData pin = Icons.push_pin_outlined; static const IconData unpin = MdiIcons.pinOffOutline; diff --git a/lib/widgets/filter_grids/album_pick.dart b/lib/widgets/filter_grids/album_pick.dart index 0cf21bef7..714cadc13 100644 --- a/lib/widgets/filter_grids/album_pick.dart +++ b/lib/widgets/filter_grids/album_pick.dart @@ -65,7 +65,7 @@ class _AlbumPickPageState extends State { queryNotifier: _queryNotifier, ), appBarHeight: AlbumPickAppBar.preferredHeight, - sections: AlbumListPage.groupToSections(context, gridItems), + sections: AlbumListPage.groupToSections(context, source, gridItems), newFilters: source.getNewAlbumFilters(context), sortFactor: settings.albumSortFactor, showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, diff --git a/lib/widgets/filter_grids/albums_page.dart b/lib/widgets/filter_grids/albums_page.dart index 0f5cfccfc..28eee742d 100644 --- a/lib/widgets/filter_grids/albums_page.dart +++ b/lib/widgets/filter_grids/albums_page.dart @@ -45,7 +45,7 @@ class AlbumListPage extends StatelessWidget { groupable: true, showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, actionDelegate: AlbumChipSetActionDelegate(gridItems), - filterSections: groupToSections(context, gridItems), + filterSections: groupToSections(context, source, gridItems), newFilters: source.getNewAlbumFilters(context), emptyBuilder: () => EmptyContent( icon: AIcons.album, @@ -67,11 +67,21 @@ class AlbumListPage extends StatelessWidget { return FilterNavigationPage.sort(settings.albumSortFactor, source, filters); } - static Map>> groupToSections(BuildContext context, Iterable> sortedMapEntries) { + static Map>> groupToSections(BuildContext context, CollectionSource source, Iterable> sortedMapEntries) { + final newFilters = source.getNewAlbumFilters(context); final pinned = settings.pinnedFilters.whereType(); - final byPin = groupBy, bool>(sortedMapEntries, (e) => pinned.contains(e.filter)); - final pinnedMapEntries = byPin[true] ?? []; - final unpinnedMapEntries = byPin[false] ?? []; + + final List> newMapEntries = [], pinnedMapEntries = [], unpinnedMapEntries = []; + for (final item in sortedMapEntries) { + final filter = item.filter; + if (newFilters.contains(filter)) { + newMapEntries.add(item); + } else if (pinned.contains(filter)) { + pinnedMapEntries.add(item); + } else { + unpinnedMapEntries.add(item); + } + } var sections = >>{}; switch (settings.albumGroupFactor) { @@ -104,8 +114,9 @@ class AlbumListPage extends StatelessWidget { break; case AlbumChipGroupFactor.none: return { - if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) + if (sortedMapEntries.isNotEmpty) const ChipSectionKey(): [ + ...newMapEntries, ...pinnedMapEntries, ...unpinnedMapEntries, ], @@ -119,6 +130,13 @@ class AlbumListPage extends StatelessWidget { ]); } + if (newMapEntries.isNotEmpty) { + sections = Map.fromEntries([ + MapEntry(AlbumImportanceSectionKey.newAlbum(context), newMapEntries), + ...sections.entries, + ]); + } + return sections; } } diff --git a/lib/widgets/filter_grids/common/section_keys.dart b/lib/widgets/filter_grids/common/section_keys.dart index 5e7c661b2..79154fd29 100644 --- a/lib/widgets/filter_grids/common/section_keys.dart +++ b/lib/widgets/filter_grids/common/section_keys.dart @@ -32,6 +32,8 @@ class AlbumImportanceSectionKey extends ChipSectionKey { AlbumImportanceSectionKey._private(BuildContext context, this.importance) : super(title: importance.getText(context)); + factory AlbumImportanceSectionKey.newAlbum(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.newAlbum); + factory AlbumImportanceSectionKey.pinned(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.pinned); factory AlbumImportanceSectionKey.special(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.special); @@ -44,11 +46,13 @@ class AlbumImportanceSectionKey extends ChipSectionKey { Widget get leading => Icon(importance.getIcon()); } -enum AlbumImportance { pinned, special, apps, regular } +enum AlbumImportance { newAlbum, pinned, special, apps, regular } extension ExtraAlbumImportance on AlbumImportance { String getText(BuildContext context) { switch (this) { + case AlbumImportance.newAlbum: + return context.l10n.albumTierNew; case AlbumImportance.pinned: return context.l10n.albumTierPinned; case AlbumImportance.special: @@ -62,6 +66,8 @@ extension ExtraAlbumImportance on AlbumImportance { IconData getIcon() { switch (this) { + case AlbumImportance.newAlbum: + return AIcons.newTier; case AlbumImportance.pinned: return AIcons.pin; case AlbumImportance.special: