fixed compare functions

This commit is contained in:
Thibault Deckers 2020-09-22 15:40:55 +09:00
parent e93d46cc8d
commit 01b148139b
8 changed files with 40 additions and 31 deletions

View file

@ -7,6 +7,7 @@ import 'package:aves/services/metadata_service.dart';
import 'package:aves/services/service_policy.dart';
import 'package:aves/utils/change_notifier.dart';
import 'package:aves/utils/time_utils.dart';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:geocoder/geocoder.dart';
@ -395,4 +396,19 @@ class ImageEntry {
favourites.remove([this]);
}
}
static int compareByName(ImageEntry a, ImageEntry b) {
final c = compareAsciiUpperCase(a.bestTitle, b.bestTitle);
return c != 0 ? c : compareAsciiUpperCase(a.extension, b.extension);
}
static int compareBySize(ImageEntry a, ImageEntry b) {
final c = b.sizeBytes.compareTo(a.sizeBytes);
return c != 0 ? c : compareByName(a, b);
}
static int compareByDate(ImageEntry a, ImageEntry b) {
final c = b.bestDate?.compareTo(a.bestDate) ?? -1;
return c != 0 ? c : compareByName(a, b);
}
}

View file

@ -9,13 +9,18 @@ mixin AlbumMixin on SourceBase {
List<String> sortedAlbums = List.unmodifiable([]);
int compareAlbumsByName(String a, String b) {
final ua = getUniqueAlbumName(a);
final ub = getUniqueAlbumName(b);
final c = compareAsciiUpperCase(ua, ub);
if (c != 0) return c;
final va = androidFileUtils.getStorageVolume(a)?.path ?? '';
final vb = androidFileUtils.getStorageVolume(b)?.path ?? '';
return compareAsciiUpperCase(va, vb);
}
void updateAlbums() {
final sorted = _folderPaths.toList()
..sort((a, b) {
final ua = getUniqueAlbumName(a);
final ub = getUniqueAlbumName(b);
return compareAsciiUpperCase(ua, ub);
});
final sorted = _folderPaths.toList()..sort(compareAlbumsByName);
sortedAlbums = List.unmodifiable(sorted);
invalidateFilterEntryCounts();
eventBus.fire(AlbumsChangedEvent());

View file

@ -7,7 +7,6 @@ import 'package:aves/model/image_entry.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/model/source/collection_source.dart';
import 'package:aves/model/source/tag.dart';
import 'package:aves/utils/android_file_utils.dart';
import 'package:aves/utils/change_notifier.dart';
import 'package:collection/collection.dart';
import 'package:flutter/foundation.dart';
@ -137,16 +136,13 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
void _applySort() {
switch (sortFactor) {
case EntrySortFactor.date:
_filteredEntries.sort((a, b) {
final c = b.bestDate?.compareTo(a.bestDate) ?? -1;
return c != 0 ? c : compareAsciiUpperCase(a.bestTitle, b.bestTitle);
});
_filteredEntries.sort(ImageEntry.compareByDate);
break;
case EntrySortFactor.size:
_filteredEntries.sort((a, b) => b.sizeBytes.compareTo(a.sizeBytes));
_filteredEntries.sort(ImageEntry.compareBySize);
break;
case EntrySortFactor.name:
_filteredEntries.sort((a, b) => compareAsciiUpperCase(a.bestTitle, b.bestTitle));
_filteredEntries.sort(ImageEntry.compareByName);
break;
}
}
@ -178,16 +174,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel
break;
case EntrySortFactor.name:
final byAlbum = groupBy<ImageEntry, String>(_filteredEntries, (entry) => entry.directory);
int compare(a, b) {
final ua = source.getUniqueAlbumName(a);
final ub = source.getUniqueAlbumName(b);
final c = compareAsciiUpperCase(ua, ub);
if (c != 0) return c;
final va = androidFileUtils.getStorageVolume(a)?.path ?? '';
final vb = androidFileUtils.getStorageVolume(b)?.path ?? '';
return compareAsciiUpperCase(va, vb);
}
sections = SplayTreeMap.of(byAlbum, compare);
sections = SplayTreeMap<String, List<ImageEntry>>.of(byAlbum, source.compareAlbumsByName);
break;
}
sections = Map.unmodifiable(sections);

View file

@ -68,8 +68,8 @@ class AlbumListPage extends StatelessWidget {
entriesByDate.firstWhere((entry) => entry.directory == album, orElse: () => null),
));
final byPin = groupBy<MapEntry<String, ImageEntry>, bool>(allAlbumMapEntries, (e) => pinned.contains(e.key));
final pinnedMapEntries = (byPin[true] ?? [])..sort(FilterNavigationPage.compareChipByDate);
final unpinnedMapEntries = (byPin[false] ?? [])..sort(FilterNavigationPage.compareChipByDate);
final pinnedMapEntries = (byPin[true] ?? [])..sort(FilterNavigationPage.compareChipsByDate);
final unpinnedMapEntries = (byPin[false] ?? [])..sort(FilterNavigationPage.compareChipsByDate);
return Map.fromEntries([...pinnedMapEntries, ...unpinnedMapEntries]);
case ChipSortFactor.name:
default:

View file

@ -136,7 +136,7 @@ class FilterNavigationPage extends StatelessWidget {
));
}
static int compareChipByDate(MapEntry<String, ImageEntry> a, MapEntry<String, ImageEntry> b) {
static int compareChipsByDate(MapEntry<String, ImageEntry> a, MapEntry<String, ImageEntry> b) {
final c = b.value.bestDate?.compareTo(a.value.bestDate) ?? -1;
return c != 0 ? c : compareAsciiUpperCase(a.key, b.key);
}

View file

@ -71,8 +71,8 @@ class CountryListPage extends StatelessWidget {
switch (settings.countrySortFactor) {
case ChipSortFactor.date:
pinnedMapEntries.sort(FilterNavigationPage.compareChipByDate);
unpinnedMapEntries.sort(FilterNavigationPage.compareChipByDate);
pinnedMapEntries.sort(FilterNavigationPage.compareChipsByDate);
unpinnedMapEntries.sort(FilterNavigationPage.compareChipsByDate);
break;
case ChipSortFactor.name:
// already sorted by name at the source level

View file

@ -67,8 +67,8 @@ class TagListPage extends StatelessWidget {
switch (settings.tagSortFactor) {
case ChipSortFactor.date:
pinnedMapEntries.sort(FilterNavigationPage.compareChipByDate);
unpinnedMapEntries.sort(FilterNavigationPage.compareChipByDate);
pinnedMapEntries.sort(FilterNavigationPage.compareChipsByDate);
unpinnedMapEntries.sort(FilterNavigationPage.compareChipsByDate);
break;
case ChipSortFactor.name:
// already sorted by name at the source level

View file

@ -6,6 +6,7 @@ import 'package:aves/services/metadata_service.dart';
import 'package:aves/widgets/common/highlight_title.dart';
import 'package:aves/widgets/common/icons.dart';
import 'package:aves/widgets/fullscreen/info/info_page.dart';
import 'package:collection/collection.dart';
import 'package:expansion_tile_card/expansion_tile_card.dart';
import 'package:flutter/material.dart';
@ -126,7 +127,7 @@ class _MetadataSectionSliverState extends State<MetadataSectionSliver> with Auto
}).where((kv) => kv != null)));
return _MetadataDirectory(directoryName, tags);
}).toList()
..sort((a, b) => a.name.compareTo(b.name));
..sort((a, b) => compareAsciiUpperCase(a.name, b.name));
_loadedMetadataUri = widget.entry.uri;
} else {
_metadata = [];