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": "Always",
"@keepScreenOnAlways": {}, "@keepScreenOnAlways": {},
"albumTierNew": "New",
"@albumTierNew": {},
"albumTierPinned": "Pinned", "albumTierPinned": "Pinned",
"@albumTierPinned": {}, "@albumTierPinned": {},
"albumTierSpecial": "Common", "albumTierSpecial": "Common",

View file

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

View file

@ -49,6 +49,7 @@ class AIcons {
static const IconData import = MdiIcons.fileImportOutline; static const IconData import = MdiIcons.fileImportOutline;
static const IconData info = Icons.info_outlined; static const IconData info = Icons.info_outlined;
static const IconData layers = Icons.layers_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 openOutside = Icons.open_in_new_outlined;
static const IconData pin = Icons.push_pin_outlined; static const IconData pin = Icons.push_pin_outlined;
static const IconData unpin = MdiIcons.pinOffOutline; static const IconData unpin = MdiIcons.pinOffOutline;

View file

@ -65,7 +65,7 @@ class _AlbumPickPageState extends State<AlbumPickPage> {
queryNotifier: _queryNotifier, queryNotifier: _queryNotifier,
), ),
appBarHeight: AlbumPickAppBar.preferredHeight, appBarHeight: AlbumPickAppBar.preferredHeight,
sections: AlbumListPage.groupToSections(context, gridItems), sections: AlbumListPage.groupToSections(context, source, gridItems),
newFilters: source.getNewAlbumFilters(context), newFilters: source.getNewAlbumFilters(context),
sortFactor: settings.albumSortFactor, sortFactor: settings.albumSortFactor,
showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none,

View file

@ -45,7 +45,7 @@ class AlbumListPage extends StatelessWidget {
groupable: true, groupable: true,
showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none,
actionDelegate: AlbumChipSetActionDelegate(gridItems), actionDelegate: AlbumChipSetActionDelegate(gridItems),
filterSections: groupToSections(context, gridItems), filterSections: groupToSections(context, source, gridItems),
newFilters: source.getNewAlbumFilters(context), newFilters: source.getNewAlbumFilters(context),
emptyBuilder: () => EmptyContent( emptyBuilder: () => EmptyContent(
icon: AIcons.album, icon: AIcons.album,
@ -67,11 +67,21 @@ class AlbumListPage extends StatelessWidget {
return FilterNavigationPage.sort(settings.albumSortFactor, source, filters); 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 pinned = settings.pinnedFilters.whereType<AlbumFilter>();
final byPin = groupBy<FilterGridItem<AlbumFilter>, bool>(sortedMapEntries, (e) => pinned.contains(e.filter));
final pinnedMapEntries = byPin[true] ?? []; final List<FilterGridItem<AlbumFilter>> newMapEntries = [], pinnedMapEntries = [], unpinnedMapEntries = [];
final unpinnedMapEntries = byPin[false] ?? []; 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>>>{}; var sections = <ChipSectionKey, List<FilterGridItem<AlbumFilter>>>{};
switch (settings.albumGroupFactor) { switch (settings.albumGroupFactor) {
@ -104,8 +114,9 @@ class AlbumListPage extends StatelessWidget {
break; break;
case AlbumChipGroupFactor.none: case AlbumChipGroupFactor.none:
return { return {
if (pinnedMapEntries.isNotEmpty || unpinnedMapEntries.isNotEmpty) if (sortedMapEntries.isNotEmpty)
const ChipSectionKey(): [ const ChipSectionKey(): [
...newMapEntries,
...pinnedMapEntries, ...pinnedMapEntries,
...unpinnedMapEntries, ...unpinnedMapEntries,
], ],
@ -119,6 +130,13 @@ class AlbumListPage extends StatelessWidget {
]); ]);
} }
if (newMapEntries.isNotEmpty) {
sections = Map.fromEntries([
MapEntry(AlbumImportanceSectionKey.newAlbum(context), newMapEntries),
...sections.entries,
]);
}
return sections; return sections;
} }
} }

View file

@ -32,6 +32,8 @@ class AlbumImportanceSectionKey extends ChipSectionKey {
AlbumImportanceSectionKey._private(BuildContext context, this.importance) : super(title: importance.getText(context)); 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.pinned(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.pinned);
factory AlbumImportanceSectionKey.special(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.special); factory AlbumImportanceSectionKey.special(BuildContext context) => AlbumImportanceSectionKey._private(context, AlbumImportance.special);
@ -44,11 +46,13 @@ class AlbumImportanceSectionKey extends ChipSectionKey {
Widget get leading => Icon(importance.getIcon()); Widget get leading => Icon(importance.getIcon());
} }
enum AlbumImportance { pinned, special, apps, regular } enum AlbumImportance { newAlbum, pinned, special, apps, regular }
extension ExtraAlbumImportance on AlbumImportance { extension ExtraAlbumImportance on AlbumImportance {
String getText(BuildContext context) { String getText(BuildContext context) {
switch (this) { switch (this) {
case AlbumImportance.newAlbum:
return context.l10n.albumTierNew;
case AlbumImportance.pinned: case AlbumImportance.pinned:
return context.l10n.albumTierPinned; return context.l10n.albumTierPinned;
case AlbumImportance.special: case AlbumImportance.special:
@ -62,6 +66,8 @@ extension ExtraAlbumImportance on AlbumImportance {
IconData getIcon() { IconData getIcon() {
switch (this) { switch (this) {
case AlbumImportance.newAlbum:
return AIcons.newTier;
case AlbumImportance.pinned: case AlbumImportance.pinned:
return AIcons.pin; return AIcons.pin;
case AlbumImportance.special: case AlbumImportance.special: