albums: new albums in own section

This commit is contained in:
Thibault Deckers 2021-07-16 17:47:21 +09:00
parent e70ffed44f
commit 2e53352f59
6 changed files with 36 additions and 8 deletions

View file

@ -169,6 +169,8 @@
"keepScreenOnAlways": "Always",
"@keepScreenOnAlways": {},
"albumTierNew": "New",
"@albumTierNew": {},
"albumTierPinned": "Pinned",
"@albumTierPinned": {},
"albumTierSpecial": "Common",

View file

@ -88,6 +88,7 @@
"keepScreenOnViewerOnly": "뷰어 이용 시 작동",
"keepScreenOnAlways": "항상 켜짐",
"albumTierNew": "신규",
"albumTierPinned": "고정",
"albumTierSpecial": "기본",
"albumTierApps": "앱",

View file

@ -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;

View file

@ -65,7 +65,7 @@ class _AlbumPickPageState extends State<AlbumPickPage> {
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,

View file

@ -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<ChipSectionKey, List<FilterGridItem<AlbumFilter>>> groupToSections(BuildContext context, Iterable<FilterGridItem<AlbumFilter>> sortedMapEntries) {
static Map<ChipSectionKey, List<FilterGridItem<AlbumFilter>>> groupToSections(BuildContext context, CollectionSource source, Iterable<FilterGridItem<AlbumFilter>> sortedMapEntries) {
final newFilters = source.getNewAlbumFilters(context);
final pinned = settings.pinnedFilters.whereType<AlbumFilter>();
final byPin = groupBy<FilterGridItem<AlbumFilter>, bool>(sortedMapEntries, (e) => pinned.contains(e.filter));
final pinnedMapEntries = byPin[true] ?? [];
final unpinnedMapEntries = byPin[false] ?? [];
final List<FilterGridItem<AlbumFilter>> 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 = <ChipSectionKey, List<FilterGridItem<AlbumFilter>>>{};
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;
}
}

View file

@ -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: