diff --git a/CHANGELOG.md b/CHANGELOG.md index 091c490f7..c7aeb187d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. ## [Unreleased] +### Changed + +- use natural order when sorting by name items, albums, tags + ### Fixed - screensaver stopping when device orientation changes diff --git a/lib/model/entry.dart b/lib/model/entry.dart index 606ac3a09..1a70bf464 100644 --- a/lib/model/entry.dart +++ b/lib/model/entry.dart @@ -819,7 +819,7 @@ class AvesEntry { // 1) title ascending // 2) extension ascending static int compareByName(AvesEntry a, AvesEntry b) { - final c = compareAsciiUpperCase(a.bestTitle ?? '', b.bestTitle ?? ''); + final c = compareAsciiUpperCaseNatural(a.bestTitle ?? '', b.bestTitle ?? ''); return c != 0 ? c : compareAsciiUpperCase(a.extension ?? '', b.extension ?? ''); } diff --git a/lib/model/filters/filters.dart b/lib/model/filters/filters.dart index 4fdd2822a..1c0b7a300 100644 --- a/lib/model/filters/filters.dart +++ b/lib/model/filters/filters.dart @@ -118,7 +118,7 @@ abstract class CollectionFilter extends Equatable implements Comparable entry.tags).toSet().toList()..sort(compareAsciiUpperCase); + final updatedTags = visibleEntries.expand((entry) => entry.tags).toSet().toList()..sort(compareAsciiUpperCaseNatural); if (!listEquals(updatedTags, sortedTags)) { sortedTags = List.unmodifiable(updatedTags); invalidateTagFilterSummary(); diff --git a/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart index 7c39adc58..545daab89 100644 --- a/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_tags_dialog.dart @@ -192,7 +192,7 @@ class _TagEditorPageState extends State { return entryCountByTag.entries.toList() ..sort((kv1, kv2) { final c = kv2.value.compareTo(kv1.value); - return c != 0 ? c : compareAsciiUpperCase(kv1.key, kv2.key); + return c != 0 ? c : compareAsciiUpperCaseNatural(kv1.key, kv2.key); }); } diff --git a/lib/widgets/dialogs/filter_editors/create_album_dialog.dart b/lib/widgets/dialogs/filter_editors/create_album_dialog.dart index 89312f415..c06f4a3eb 100644 --- a/lib/widgets/dialogs/filter_editors/create_album_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/create_album_dialog.dart @@ -48,7 +48,7 @@ class _CreateAlbumDialogState extends State { final volumeTiles = []; if (_allVolumes.length > 1) { final byPrimary = groupBy(_allVolumes, (volume) => volume.isPrimary); - int compare(StorageVolume a, StorageVolume b) => compareAsciiUpperCase(a.path, b.path); + int compare(StorageVolume a, StorageVolume b) => compareAsciiUpperCaseNatural(a.path, b.path); final primaryVolumes = (byPrimary[true] ?? [])..sort(compare); final otherVolumes = (byPrimary[false] ?? [])..sort(compare); volumeTiles.addAll([ diff --git a/lib/widgets/settings/privacy/file_picker/file_picker.dart b/lib/widgets/settings/privacy/file_picker/file_picker.dart index 349ca7ab5..378a167f3 100644 --- a/lib/widgets/settings/privacy/file_picker/file_picker.dart +++ b/lib/widgets/settings/privacy/file_picker/file_picker.dart @@ -200,7 +200,7 @@ class _FilePickerState extends State { contents.add(entity); } }, onDone: () { - _contents = contents..sort((a, b) => compareAsciiUpperCase(pContext.split(a.path).last, pContext.split(b.path).last)); + _contents = contents..sort((a, b) => compareAsciiUpperCaseNatural(pContext.split(a.path).last, pContext.split(b.path).last)); setState(() {}); }); } diff --git a/lib/widgets/viewer/info/basic_section.dart b/lib/widgets/viewer/info/basic_section.dart index 2c949209a..5e599b3a6 100644 --- a/lib/widgets/viewer/info/basic_section.dart +++ b/lib/widgets/viewer/info/basic_section.dart @@ -58,7 +58,7 @@ class BasicSection extends StatelessWidget { } Widget _buildChips(BuildContext context) { - final tags = entry.tags.toList()..sort(compareAsciiUpperCase); + final tags = entry.tags.toList()..sort(compareAsciiUpperCaseNatural); final album = entry.directory; final filters = { MimeFilter(entry.mimeType),