diff --git a/CUE4Parse b/CUE4Parse index 65d2cc0b..1b823977 160000 --- a/CUE4Parse +++ b/CUE4Parse @@ -1 +1 @@ -Subproject commit 65d2cc0ba1a2abd86c46c4721cd1372843731c2e +Subproject commit 1b82397777d33851781e96134e5afef03028b557 diff --git a/FModel/ViewModels/SearchViewModel.cs b/FModel/ViewModels/SearchViewModel.cs index 9299131d..d488ca43 100644 --- a/FModel/ViewModels/SearchViewModel.cs +++ b/FModel/ViewModels/SearchViewModel.cs @@ -3,8 +3,10 @@ using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text.RegularExpressions; +using System.Threading.Tasks; using System.Windows.Data; using CUE4Parse.FileProvider.Objects; +using CUE4Parse.UE4.VirtualFileSystem; using FModel.Framework; namespace FModel.ViewModels; @@ -64,7 +66,7 @@ public class SearchViewModel : ViewModel SearchResultsView.Refresh(); } - public void CycleSortSizeMode() + public async Task CycleSortSizeMode() { CurrentSortSizeMode = CurrentSortSizeMode switch { @@ -73,18 +75,37 @@ public class SearchViewModel : ViewModel _ => ESortSizeMode.None }; - using (SearchResultsView.DeferRefresh()) + var sorted = await Task.Run(() => { - SearchResultsView.SortDescriptions.Clear(); - if (CurrentSortSizeMode != ESortSizeMode.None) - { - var sort = CurrentSortSizeMode == ESortSizeMode.Ascending - ? ListSortDirection.Ascending - : ListSortDirection.Descending; + var archiveDict = SearchResults + .OfType() + .Select(f => f.Vfs.Name) + .Distinct() + .Select((name, idx) => (name, idx)) + .ToDictionary(x => x.name, x => x.idx); - SearchResultsView.SortDescriptions.Add(new SortDescription(nameof(GameFile.Size), sort)); - } - } + var keyed = SearchResults.Select(f => + { + int archiveKey = f is VfsEntry ve && archiveDict.TryGetValue(ve.Vfs.Name, out var key) ? key : -1; + return (File: f, f.Size, ArchiveKey: archiveKey); + }); + + return CurrentSortSizeMode switch + { + ESortSizeMode.Ascending => keyed + .OrderBy(x => x.Size).ThenBy(x => x.ArchiveKey) + .Select(x => x.File).ToList(), + ESortSizeMode.Descending => keyed + .OrderByDescending(x => x.Size).ThenBy(x => x.ArchiveKey) + .Select(x => x.File).ToList(), + _ => keyed + .OrderBy(x => x.ArchiveKey).ThenBy(x => x.File.Path, StringComparer.OrdinalIgnoreCase) + .Select(x => x.File).ToList() + }; + }); + + SearchResults.Clear(); + SearchResults.AddRange(sorted.ToList()); } private bool ItemFilter(object item, IEnumerable filters) diff --git a/FModel/Views/SearchView.xaml b/FModel/Views/SearchView.xaml index 2c19bed0..5bfacacc 100644 --- a/FModel/Views/SearchView.xaml +++ b/FModel/Views/SearchView.xaml @@ -97,7 +97,11 @@ - +