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),