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": "Always",
|
||||||
"@keepScreenOnAlways": {},
|
"@keepScreenOnAlways": {},
|
||||||
|
|
||||||
|
"albumTierNew": "New",
|
||||||
|
"@albumTierNew": {},
|
||||||
"albumTierPinned": "Pinned",
|
"albumTierPinned": "Pinned",
|
||||||
"@albumTierPinned": {},
|
"@albumTierPinned": {},
|
||||||
"albumTierSpecial": "Common",
|
"albumTierSpecial": "Common",
|
||||||
|
|
|
@ -88,6 +88,7 @@
|
||||||
"keepScreenOnViewerOnly": "뷰어 이용 시 작동",
|
"keepScreenOnViewerOnly": "뷰어 이용 시 작동",
|
||||||
"keepScreenOnAlways": "항상 켜짐",
|
"keepScreenOnAlways": "항상 켜짐",
|
||||||
|
|
||||||
|
"albumTierNew": "신규",
|
||||||
"albumTierPinned": "고정",
|
"albumTierPinned": "고정",
|
||||||
"albumTierSpecial": "기본",
|
"albumTierSpecial": "기본",
|
||||||
"albumTierApps": "앱",
|
"albumTierApps": "앱",
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue