albums: new albums in own section
This commit is contained in:
parent
e70ffed44f
commit
2e53352f59
6 changed files with 36 additions and 8 deletions
|
@ -169,6 +169,8 @@
|
|||
"keepScreenOnAlways": "Always",
|
||||
"@keepScreenOnAlways": {},
|
||||
|
||||
"albumTierNew": "New",
|
||||
"@albumTierNew": {},
|
||||
"albumTierPinned": "Pinned",
|
||||
"@albumTierPinned": {},
|
||||
"albumTierSpecial": "Common",
|
||||
|
|
|
@ -88,6 +88,7 @@
|
|||
"keepScreenOnViewerOnly": "뷰어 이용 시 작동",
|
||||
"keepScreenOnAlways": "항상 켜짐",
|
||||
|
||||
"albumTierNew": "신규",
|
||||
"albumTierPinned": "고정",
|
||||
"albumTierSpecial": "기본",
|
||||
"albumTierApps": "앱",
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in a new issue