From a112a485e891a98ca3c3f5d9e08bdd3ea2e6f664 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Thu, 24 Jul 2025 18:15:50 +0200 Subject: feat: Development commit --- Sora/Data/ColumnsDataCache.swift | 5 ++++ Sora/Views/Post/Grid/PostGridView.swift | 45 ++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 7 deletions(-) create mode 100644 Sora/Data/ColumnsDataCache.swift (limited to 'Sora') diff --git a/Sora/Data/ColumnsDataCache.swift b/Sora/Data/ColumnsDataCache.swift new file mode 100644 index 0000000..4858e80 --- /dev/null +++ b/Sora/Data/ColumnsDataCache.swift @@ -0,0 +1,5 @@ +struct ColumnsDataCache { + let data: [[BooruPost]] + let columnCount: Int + let posts: [BooruPost] +} diff --git a/Sora/Views/Post/Grid/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift index 99c7966..a63bf97 100644 --- a/Sora/Views/Post/Grid/PostGridView.swift +++ b/Sora/Views/Post/Grid/PostGridView.swift @@ -17,6 +17,8 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length @State private var suggestions: [BooruTag] = [] private static let topID = "PostGridScrollTop" @State private var scrollID: String? + @State private var cachedColumnsData: ColumnsDataCache? + @State private var scrollDebounceTask: Task? @Environment(\.isSearching) private var isSearching @@ -72,7 +74,7 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length @ViewBuilder private func gridView(columnCount: Int) -> some View { if settings.alternativeThumbnailGrid { - let columnsData = computeColumnsData(columnCount: columnCount) + let columnsData = getColumnsData(columnCount: columnCount) HStack(alignment: .top) { ForEach(0.. [[BooruPost]] { - (0.. [[BooruPost]] { + if let cached = cachedColumnsData, + cached.columnCount == columnCount, + cached.posts == activePosts + { + return cached.data + } + + let computedData = (0..= 0 && newIndex < manager.searchHistory.count else { return } @@ -359,7 +384,11 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length ) } .onAppear { - scrollID = viewStates[queryID]?.scrollPostID ?? Self.topID + let targetScrollID = viewStates[queryID]?.scrollPostID ?? Self.topID + + if scrollID == nil || scrollID != targetScrollID { + scrollID = targetScrollID + } } .onDisappear { guard manager.historyIndex >= 0 && manager.historyIndex < manager.searchHistory.count else { @@ -368,7 +397,9 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length let queryID = manager.searchHistory[manager.historyIndex].id - updateViewState(for: queryID, scrollPostID: scrollID) + if viewStates[queryID]?.scrollPostID != scrollID { + updateViewState(for: queryID, scrollPostID: scrollID) + } } #if os(iOS) .gesture( -- cgit v1.2.3