diff options
| author | Fuwn <[email protected]> | 2026-02-18 12:45:11 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-02-18 12:45:19 -0800 |
| commit | 2aaf7665047f61e72495b99b6caaef54d19332fe (patch) | |
| tree | c82cbc7a8b99bdc2eb59e75748c2c18bb9d39713 /Sora/Views/FavoritesView.swift | |
| parent | perf: memoize post grid derived collections and remove columns cache (diff) | |
| download | sora-testing-2aaf7665047f61e72495b99b6caaef54d19332fe.tar.xz sora-testing-2aaf7665047f61e72495b99b6caaef54d19332fe.zip | |
chore: finalise performance optimisation batch and metrics
Diffstat (limited to 'Sora/Views/FavoritesView.swift')
| -rw-r--r-- | Sora/Views/FavoritesView.swift | 54 |
1 files changed, 50 insertions, 4 deletions
diff --git a/Sora/Views/FavoritesView.swift b/Sora/Views/FavoritesView.swift index 12f1bc0..04ecd24 100644 --- a/Sora/Views/FavoritesView.swift +++ b/Sora/Views/FavoritesView.swift @@ -25,6 +25,9 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length @State private var displayedFavorites: [SettingsFavoritePost] = [] @State private var displayedPosts: [BooruPost] = [] @State private var displayedColumnsData: [[SettingsFavoritePost]] = [] + @State private var shuffleOrderByIdentifier: [UUID: Int] = [:] + @State private var shuffleSourceIdentifiers: [UUID] = [] + @State private var shouldRefreshShuffleOrder = true private func refreshFolderHierarchy() { folderHierarchy = FolderHierarchy(folders: settings.folders) @@ -61,7 +64,7 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length } } - private func sortedFavorites(from unsortedFavorites: [SettingsFavoritePost]) + private func orderedFavorites(from unsortedFavorites: [SettingsFavoritePost]) -> [SettingsFavoritePost] { unsortedFavorites.sorted { leftFavorite, rightFavorite in @@ -76,8 +79,40 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length return leftFavorite.visitedCount > rightFavorite.visitedCount case .shuffle: - return Bool.random() + return leftFavorite.date > rightFavorite.date + } + } + } + + private func refreshShuffleOrder(for favoritesToShuffle: [SettingsFavoritePost]) { + let currentIdentifiers = favoritesToShuffle.map(\.id) + + if shouldRefreshShuffleOrder || shuffleSourceIdentifiers != currentIdentifiers { + var refreshedShuffleOrderByIdentifier: [UUID: Int] = [:] + let shuffledIdentifiers = currentIdentifiers.shuffled() + + for (identifierIndex, identifier) in shuffledIdentifiers.enumerated() { + refreshedShuffleOrderByIdentifier[identifier] = identifierIndex + } + + shuffleOrderByIdentifier = refreshedShuffleOrderByIdentifier + shuffleSourceIdentifiers = currentIdentifiers + shouldRefreshShuffleOrder = false + } + } + + private func shuffledFavorites(from favoritesToShuffle: [SettingsFavoritePost]) + -> [SettingsFavoritePost] + { + favoritesToShuffle.sorted { leftFavorite, rightFavorite in + let leftIndex = shuffleOrderByIdentifier[leftFavorite.id] ?? Int.max + let rightIndex = shuffleOrderByIdentifier[rightFavorite.id] ?? Int.max + + if leftIndex != rightIndex { + return leftIndex < rightIndex } + + return leftFavorite.id.uuidString < rightFavorite.id.uuidString } } @@ -93,7 +128,7 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length private func refreshDisplayedFavorites() { let normalizedSearchText = searchText.lowercased() - let filteredFavorites = settings.favorites.filter { favorite in + let matchingFavorites = settings.favorites.filter { favorite in let matchesSearch = normalizedSearchText.isEmpty || favorite.tags @@ -106,7 +141,14 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length return matchesSelectedCollection(for: favorite) && matchesSearch && matchesProvider } - let sortedFavorites = sortedFavorites(from: filteredFavorites) + let sortedFavorites: [SettingsFavoritePost] + + if sort == .shuffle { + refreshShuffleOrder(for: matchingFavorites) + sortedFavorites = shuffledFavorites(from: matchingFavorites) + } else { + sortedFavorites = orderedFavorites(from: matchingFavorites) + } displayedFavorites = sortedFavorites displayedPosts = sortedFavorites.map { $0.toBooruPost() } @@ -365,6 +407,10 @@ struct FavoritesView: View { // swiftlint:disable:this type_body_length refreshDisplayedFavorites() } .onChange(of: sort) { + if sort == .shuffle { + shouldRefreshShuffleOrder = true + } + refreshDisplayedFavorites() } .onChange(of: settings.folders) { |