diff options
| author | Fuwn <[email protected]> | 2025-07-24 18:15:50 +0200 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-07-24 18:15:50 +0200 |
| commit | a112a485e891a98ca3c3f5d9e08bdd3ea2e6f664 (patch) | |
| tree | ca3f94ceefc3c7ca78c9ed6dd48bcd4c964a0395 | |
| parent | feat: Development commit (diff) | |
| download | sora-testing-a112a485e891a98ca3c3f5d9e08bdd3ea2e6f664.tar.xz sora-testing-a112a485e891a98ca3c3f5d9e08bdd3ea2e6f664.zip | |
feat: Development commit
| -rw-r--r-- | Sora/Data/ColumnsDataCache.swift | 5 | ||||
| -rw-r--r-- | Sora/Views/Post/Grid/PostGridView.swift | 45 |
2 files changed, 43 insertions, 7 deletions
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<Void, Never>? @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..<columnCount, id: \.self) { columnIndex in @@ -109,12 +111,27 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length } } - private func computeColumnsData(columnCount: Int) -> [[BooruPost]] { - (0..<columnCount).map { columnIndex in + private func getColumnsData(columnCount: Int) -> [[BooruPost]] { + if let cached = cachedColumnsData, + cached.columnCount == columnCount, + cached.posts == activePosts + { + return cached.data + } + + let computedData = (0..<columnCount).map { columnIndex in activePosts.enumerated().compactMap { index, post in index % columnCount == columnIndex ? post : nil } } + + cachedColumnsData = ColumnsDataCache( + data: computedData, + columnCount: columnCount, + posts: activePosts + ) + + return computedData } var body: some View { @@ -213,9 +230,17 @@ struct PostGridView: View { // swiftlint:disable:this type_body_length return } - let queryID = manager.searchHistory[manager.historyIndex].id + scrollDebounceTask?.cancel() + + scrollDebounceTask = Task { + try? await Task.sleep(nanoseconds: 200_000_000) - updateViewState(for: queryID, scrollPostID: newValue) + guard !Task.isCancelled else { return } + + let queryID = manager.searchHistory[manager.historyIndex].id + + updateViewState(for: queryID, scrollPostID: newValue) + } } .onChange(of: manager.historyIndex) { _, newIndex in guard newIndex >= 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( |