mirror of
https://gitlab.com/nkming2/nc-photos.git
synced 2025-02-25 02:48:54 +01:00
Sort albums
This commit is contained in:
parent
7423b1fd51
commit
42b931fa62
4 changed files with 125 additions and 7 deletions
|
@ -571,6 +571,14 @@
|
|||
"@sortOptionTimeDescendingLabel": {
|
||||
"description": "Sort by time, in descending order"
|
||||
},
|
||||
"sortOptionAlbumNameLabel": "Album name",
|
||||
"@sortOptionAlbumNameLabel": {
|
||||
"description": "Sort by album name, in ascending order"
|
||||
},
|
||||
"sortOptionAlbumNameDescendingLabel": "Album name (descending)",
|
||||
"@sortOptionAlbumNameDescendingLabel": {
|
||||
"description": "Sort by album name, in descending order"
|
||||
},
|
||||
"albumEditDragRearrangeNotification": "Long press and drag an item to rearrange it manually",
|
||||
"@albumEditDragRearrangeNotification": {
|
||||
"description": "Instructions on how to rearrange photos"
|
||||
|
|
|
@ -15,6 +15,8 @@
|
|||
"settingsUseBlackInDarkThemeTitle",
|
||||
"settingsUseBlackInDarkThemeTrueDescription",
|
||||
"settingsUseBlackInDarkThemeFalseDescription",
|
||||
"sortOptionAlbumNameLabel",
|
||||
"sortOptionAlbumNameDescendingLabel",
|
||||
"listEmptyText",
|
||||
"albumTrashLabel",
|
||||
"restoreTooltip",
|
||||
|
@ -49,6 +51,11 @@
|
|||
"unmuteTooltip"
|
||||
],
|
||||
|
||||
"es": [
|
||||
"sortOptionAlbumNameLabel",
|
||||
"sortOptionAlbumNameDescendingLabel"
|
||||
],
|
||||
|
||||
"fr": [
|
||||
"collectionsTooltip",
|
||||
"settingsViewerTitle",
|
||||
|
@ -65,6 +72,8 @@
|
|||
"settingsUseBlackInDarkThemeTitle",
|
||||
"settingsUseBlackInDarkThemeTrueDescription",
|
||||
"settingsUseBlackInDarkThemeFalseDescription",
|
||||
"sortOptionAlbumNameLabel",
|
||||
"sortOptionAlbumNameDescendingLabel",
|
||||
"helpTooltip",
|
||||
"removeFromAlbumTooltip",
|
||||
"fileSharedByDescription",
|
||||
|
@ -77,5 +86,10 @@
|
|||
"unsetAlbumCoverFailureNotification",
|
||||
"muteTooltip",
|
||||
"unmuteTooltip"
|
||||
],
|
||||
|
||||
"ru": [
|
||||
"sortOptionAlbumNameLabel",
|
||||
"sortOptionAlbumNameDescendingLabel"
|
||||
]
|
||||
}
|
||||
|
|
|
@ -38,6 +38,11 @@ class Pref {
|
|||
Future<bool> setAlbumBrowserZoomLevel(int value) =>
|
||||
_pref.setInt("albumViewerZoomLevel", value);
|
||||
|
||||
int? getHomeAlbumsSort() => _pref.getInt("homeAlbumsSort");
|
||||
int getHomeAlbumsSortOr(int def) => getHomeAlbumsSort() ?? def;
|
||||
Future<bool> setHomeAlbumsSort(int value) =>
|
||||
_pref.setInt("homeAlbumsSort", value);
|
||||
|
||||
bool? isEnableExif() => _pref.getBool("isEnableExif");
|
||||
bool isEnableExifOr([bool def = true]) => isEnableExif() ?? def;
|
||||
Future<bool> setEnableExif(bool value) =>
|
||||
|
|
|
@ -27,6 +27,7 @@ import 'package:nc_photos/widget/album_search_delegate.dart';
|
|||
import 'package:nc_photos/widget/archive_browser.dart';
|
||||
import 'package:nc_photos/widget/builder/album_grid_item_builder.dart';
|
||||
import 'package:nc_photos/widget/dynamic_album_browser.dart';
|
||||
import 'package:nc_photos/widget/fancy_option_picker.dart';
|
||||
import 'package:nc_photos/widget/home_app_bar.dart';
|
||||
import 'package:nc_photos/widget/new_album_dialog.dart';
|
||||
import 'package:nc_photos/widget/page_visibility_mixin.dart';
|
||||
|
@ -172,6 +173,10 @@ class _HomeAlbumsState extends State<HomeAlbums>
|
|||
),
|
||||
],
|
||||
menuActions: [
|
||||
PopupMenuItem(
|
||||
value: _menuValueSort,
|
||||
child: Text(L10n.global().sortTooltip),
|
||||
),
|
||||
PopupMenuItem(
|
||||
value: _menuValueImport,
|
||||
child: Text(L10n.global().importFoldersTooltip),
|
||||
|
@ -179,6 +184,10 @@ class _HomeAlbumsState extends State<HomeAlbums>
|
|||
],
|
||||
onSelectedMenuActions: (option) {
|
||||
switch (option) {
|
||||
case _menuValueSort:
|
||||
_onSortPressed(context);
|
||||
break;
|
||||
|
||||
case _menuValueImport:
|
||||
_onAppBarImportPressed(context);
|
||||
break;
|
||||
|
@ -296,6 +305,56 @@ class _HomeAlbumsState extends State<HomeAlbums>
|
|||
});
|
||||
}
|
||||
|
||||
void _onSortPressed(BuildContext context) {
|
||||
showDialog(
|
||||
context: context,
|
||||
builder: (context) => FancyOptionPicker(
|
||||
title: L10n.global().sortOptionDialogTitle,
|
||||
items: [
|
||||
FancyOptionPickerItem(
|
||||
label: L10n.global().sortOptionTimeDescendingLabel,
|
||||
isSelected: _getSortFromPref() == _Sort.dateDescending,
|
||||
onSelect: () {
|
||||
_onSortSelected(_Sort.dateDescending);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
FancyOptionPickerItem(
|
||||
label: L10n.global().sortOptionTimeAscendingLabel,
|
||||
isSelected: _getSortFromPref() == _Sort.dateAscending,
|
||||
onSelect: () {
|
||||
_onSortSelected(_Sort.dateAscending);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
FancyOptionPickerItem(
|
||||
label: L10n.global().sortOptionAlbumNameLabel,
|
||||
isSelected: _getSortFromPref() == _Sort.nameAscending,
|
||||
onSelect: () {
|
||||
_onSortSelected(_Sort.nameAscending);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
FancyOptionPickerItem(
|
||||
label: L10n.global().sortOptionAlbumNameDescendingLabel,
|
||||
isSelected: _getSortFromPref() == _Sort.nameDescending,
|
||||
onSelect: () {
|
||||
_onSortSelected(_Sort.nameDescending);
|
||||
Navigator.of(context).pop();
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
void _onSortSelected(_Sort sort) async {
|
||||
await Pref.inst().setHomeAlbumsSort(sort.index);
|
||||
setState(() {
|
||||
_transformItems(_bloc.state.items);
|
||||
});
|
||||
}
|
||||
|
||||
void _onAppBarImportPressed(BuildContext context) {
|
||||
Navigator.of(context).pushNamed(AlbumImporter.routeName,
|
||||
arguments: AlbumImporterArguments(widget.account));
|
||||
|
@ -357,16 +416,28 @@ class _HomeAlbumsState extends State<HomeAlbums>
|
|||
|
||||
/// Transform an Album list to grid items
|
||||
void _transformItems(List<ListAlbumBlocItem> items) {
|
||||
final sortedAlbums = items
|
||||
.map((e) =>
|
||||
Tuple2(e.album.provider.latestItemTime ?? e.album.lastUpdated, e))
|
||||
.sorted((a, b) {
|
||||
// then sort in descending order
|
||||
final tmp = b.item1.compareTo(a.item1);
|
||||
final sort = _getSortFromPref();
|
||||
final isAscending = _isSortAscending(sort);
|
||||
final sortedAlbums = items.map<Tuple2<dynamic, ListAlbumBlocItem>>((e) {
|
||||
switch (sort) {
|
||||
case _Sort.nameAscending:
|
||||
case _Sort.nameDescending:
|
||||
return Tuple2(e.album.name, e);
|
||||
|
||||
case _Sort.dateAscending:
|
||||
case _Sort.dateDescending:
|
||||
default:
|
||||
return Tuple2(
|
||||
e.album.provider.latestItemTime ?? e.album.lastUpdated, e);
|
||||
}
|
||||
}).sorted((a, b) {
|
||||
final x = isAscending ? a : b;
|
||||
final y = isAscending ? b : a;
|
||||
final tmp = x.item1.compareTo(y.item1);
|
||||
if (tmp != 0) {
|
||||
return tmp;
|
||||
} else {
|
||||
return a.item2.album.name.compareTo(b.item2.album.name);
|
||||
return x.item2.album.name.compareTo(y.item2.album.name);
|
||||
}
|
||||
}).map((e) => e.item2);
|
||||
itemStreamListItems = [
|
||||
|
@ -400,6 +471,7 @@ class _HomeAlbumsState extends State<HomeAlbums>
|
|||
|
||||
static final _log = Logger("widget.home_albums._HomeAlbumsState");
|
||||
static const _menuValueImport = 0;
|
||||
static const _menuValueSort = 1;
|
||||
}
|
||||
|
||||
abstract class _ListItem implements SelectableItem {
|
||||
|
@ -528,3 +600,22 @@ class _AlbumListItem extends _ListItem {
|
|||
final bool isSharedByMe;
|
||||
final bool isSharedToMe;
|
||||
}
|
||||
|
||||
enum _Sort {
|
||||
dateDescending,
|
||||
dateAscending,
|
||||
nameAscending,
|
||||
nameDescending,
|
||||
}
|
||||
|
||||
_Sort _getSortFromPref() {
|
||||
try {
|
||||
return _Sort.values[Pref.inst().getHomeAlbumsSort()!];
|
||||
} catch (_) {
|
||||
// default
|
||||
return _Sort.dateDescending;
|
||||
}
|
||||
}
|
||||
|
||||
bool _isSortAscending(_Sort sort) =>
|
||||
sort == _Sort.dateAscending || sort == _Sort.nameAscending;
|
||||
|
|
Loading…
Reference in a new issue