summaryrefslogtreecommitdiff
path: root/Sora/Views
diff options
context:
space:
mode:
authorFuwn <[email protected]>2025-02-22 07:07:57 -0800
committerFuwn <[email protected]>2025-02-22 07:07:57 -0800
commitcafece91bae45194d64f4932bb04be018b82d21b (patch)
tree02d727a13fe530550e3b29b28b7ee9980262eef2 /Sora/Views
parentfeat: Development commit (diff)
downloadsora-testing-cafece91bae45194d64f4932bb04be018b82d21b.tar.xz
sora-testing-cafece91bae45194d64f4932bb04be018b82d21b.zip
feat: Development commit
Diffstat (limited to 'Sora/Views')
-rw-r--r--Sora/Views/Bookmarks/BookmarksListItemView.swift (renamed from Sora/Views/Bookmarks/BookmarkListItemView.swift)2
-rw-r--r--Sora/Views/Bookmarks/BookmarksView.swift2
-rw-r--r--Sora/Views/InteractiveImageView.swift (renamed from Sora/Views/ZoomableImageView.swift)4
-rw-r--r--Sora/Views/Post/Details/PostDetailsImageView.swift106
-rw-r--r--Sora/Views/Post/Details/PostDetailsView.swift (renamed from Sora/Views/Post/PostDetailsView.swift)6
-rw-r--r--Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift (renamed from Sora/Views/Post/PostGridBookmarkButtonView.swift)0
-rw-r--r--Sora/Views/Post/Grid/PostGridThumbnailView.swift (renamed from Sora/Views/Post/PostView.swift)2
-rw-r--r--Sora/Views/Post/Grid/PostGridView.swift (renamed from Sora/Views/Post/PostGridView.swift)4
-rw-r--r--Sora/Views/Settings/Section/SettingsAttributionsView.swift (renamed from Sora/Views/Settings/SettingsAttributionsView.swift)0
-rw-r--r--Sora/Views/Settings/Section/SettingsDetailsView.swift (renamed from Sora/Views/Settings/SettingsDetailsView.swift)0
-rw-r--r--Sora/Views/Settings/Section/SettingsProviderView.swift (renamed from Sora/Views/Settings/SettingsProviderView.swift)0
-rw-r--r--Sora/Views/Settings/Section/SettingsSearchView.swift (renamed from Sora/Views/Settings/SettingsSearchView.swift)0
-rw-r--r--Sora/Views/Settings/Section/SettingsThumbnailsView.swift (renamed from Sora/Views/Settings/SettingsThumbnailsView.swift)0
-rw-r--r--Sora/Views/Settings/SettingsView.swift (renamed from Sora/Views/SettingsView.swift)0
14 files changed, 116 insertions, 10 deletions
diff --git a/Sora/Views/Bookmarks/BookmarkListItemView.swift b/Sora/Views/Bookmarks/BookmarksListItemView.swift
index 611c9fe..cfe267b 100644
--- a/Sora/Views/Bookmarks/BookmarkListItemView.swift
+++ b/Sora/Views/Bookmarks/BookmarksListItemView.swift
@@ -1,6 +1,6 @@
import SwiftUI
-struct BookmarkListItemView: View {
+struct BookmarksListItemView: View {
@EnvironmentObject var settings: Settings
var bookmark: Bookmark
diff --git a/Sora/Views/Bookmarks/BookmarksView.swift b/Sora/Views/Bookmarks/BookmarksView.swift
index b52e7b7..b32b46b 100644
--- a/Sora/Views/Bookmarks/BookmarksView.swift
+++ b/Sora/Views/Bookmarks/BookmarksView.swift
@@ -47,7 +47,7 @@ struct BookmarksView: View {
manager.performSearch()
}
}) {
- BookmarkListItemView(bookmark: bookmark)
+ BookmarksListItemView(bookmark: bookmark)
}
#if os(macOS)
.buttonStyle(.plain)
diff --git a/Sora/Views/ZoomableImageView.swift b/Sora/Views/InteractiveImageView.swift
index 8304c6e..7afde7d 100644
--- a/Sora/Views/ZoomableImageView.swift
+++ b/Sora/Views/InteractiveImageView.swift
@@ -1,6 +1,6 @@
import SwiftUI
-struct ZoomableImageView: View {
+struct InteractiveImageView: View {
let image: Image
@State private var screenWidth = 0.0
@State private var screenHeight = 0.0
@@ -85,5 +85,5 @@ struct ZoomableImageView: View {
}
#Preview {
- ZoomableImageView(image: Image(systemName: "photo"))
+ InteractiveImageView(image: Image(systemName: "photo"))
}
diff --git a/Sora/Views/Post/Details/PostDetailsImageView.swift b/Sora/Views/Post/Details/PostDetailsImageView.swift
new file mode 100644
index 0000000..d6307d5
--- /dev/null
+++ b/Sora/Views/Post/Details/PostDetailsImageView.swift
@@ -0,0 +1,106 @@
+import SwiftUI
+
+struct PostDetailsImageView<Placeholder: View>: View {
+ @EnvironmentObject var settings: Settings
+ var url: URL?
+ @Binding var loadingState: BooruPostLoadingState
+ var finalLoadingState: BooruPostLoadingState
+ var postURL: URL?
+ let placeholder: () -> Placeholder
+ @State private var currentScale: CGFloat = 1.0
+ @State private var finalScale: CGFloat = 1.0
+ @State private var currentOffset: CGSize = .zero
+ @State private var finalOffset: CGSize = .zero
+
+ #if os(iOS)
+ var keyWindow: UIWindow? {
+ guard
+ let window = UIApplication.shared.connectedScenes
+ .compactMap({ $0 as? UIWindowScene })
+ .flatMap(\.windows)
+ .first(where: \.isKeyWindow)
+ else {
+ return nil
+ }
+
+ return window
+ }
+ #endif
+
+ var body: some View {
+ AsyncImage(url: url) { image in
+ InteractiveImageView(image: image)
+ .onAppear {
+ loadingState = finalLoadingState
+ }
+ .contextMenu {
+ #if os(iOS)
+ Button {
+ guard let url else { return }
+
+ URLSession.shared.dataTask(with: url) { data, _, _ in
+ guard let data, let uiImage = UIImage(data: data) else { return }
+
+ UIImageWriteToSavedPhotosAlbum(uiImage, nil, nil, nil)
+ }
+ .resume()
+ } label: {
+ Label("Save Image", systemImage: "square.and.arrow.down")
+ }
+ #endif
+
+ #if os(iOS)
+ if settings.enableShareShortcut {
+ Button {
+ keyWindow?.rootViewController?.present(
+ UIActivityViewController(
+ activityItems: [url ?? URL(string: "")!], applicationActivities: nil
+ ), animated: true
+ )
+ } label: {
+ Label("Share Image", systemImage: "square.and.arrow.up")
+ }
+ }
+ #endif
+
+ if let url = postURL {
+ Button {
+ #if os(iOS)
+ UIApplication.shared.open(url)
+ #else
+ NSWorkspace.shared.open(url)
+ #endif
+ } label: {
+ Label("Open in Safari", systemImage: "safari")
+ }
+ }
+ }
+ } placeholder: {
+ placeholder()
+ .onAppear {
+ loadingState = .loadingPreview
+ }
+ }
+ }
+
+ init(
+ url: URL?,
+ loadingStage: Binding<BooruPostLoadingState>,
+ finalLoadingState: BooruPostLoadingState = .loadingFile,
+ postURL: URL? = nil,
+ @ViewBuilder placeholder: @escaping () -> Placeholder = {
+ GeometryReader { geometry in
+ ProgressView()
+ .frame(width: geometry.size.width, height: geometry.size.height)
+ .position(x: geometry.size.width / 2, y: geometry.size.height / 2)
+ .padding()
+ }
+ }
+ ) {
+ self.url = url
+ _loadingState = loadingStage
+ self.finalLoadingState = finalLoadingState
+ self.postURL = postURL
+ self.placeholder = placeholder
+ }
+}
diff --git a/Sora/Views/Post/PostDetailsView.swift b/Sora/Views/Post/Details/PostDetailsView.swift
index f61b82a..3c004ca 100644
--- a/Sora/Views/Post/PostDetailsView.swift
+++ b/Sora/Views/Post/Details/PostDetailsView.swift
@@ -3,7 +3,7 @@ import SwiftUI
struct PostDetailsView: View {
@EnvironmentObject var settings: Settings
let post: BooruPost
- @State private var loadingStage: PostLoadingState = .loadingPreview
+ @State private var loadingStage: BooruPostLoadingState = .loadingPreview
private var imageURL: URL? {
switch settings.detailViewType {
case .preview:
@@ -19,13 +19,13 @@ struct PostDetailsView: View {
var body: some View {
VStack(spacing: 0) {
- AsyncImageWithPreview(
+ PostDetailsImageView(
url: imageURL,
loadingStage: $loadingStage,
finalLoadingState: .loaded,
postURL: URL(string: "https://yande.re/post/show/\(post.id)")!
) {
- AsyncImageWithPreview(
+ PostDetailsImageView(
url: post.previewURL,
loadingStage: $loadingStage
)
diff --git a/Sora/Views/Post/PostGridBookmarkButtonView.swift b/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift
index 9f85a20..9f85a20 100644
--- a/Sora/Views/Post/PostGridBookmarkButtonView.swift
+++ b/Sora/Views/Post/Grid/PostGridBookmarkButtonView.swift
diff --git a/Sora/Views/Post/PostView.swift b/Sora/Views/Post/Grid/PostGridThumbnailView.swift
index c2cafb2..e90b39b 100644
--- a/Sora/Views/Post/PostView.swift
+++ b/Sora/Views/Post/Grid/PostGridThumbnailView.swift
@@ -1,6 +1,6 @@
import SwiftUI
-struct PostView: View {
+struct PostGridThumbnailView: View {
@EnvironmentObject var settings: Settings
@EnvironmentObject var manager: BooruManager
let post: BooruPost
diff --git a/Sora/Views/Post/PostGridView.swift b/Sora/Views/Post/Grid/PostGridView.swift
index fb813af..9738a15 100644
--- a/Sora/Views/Post/PostGridView.swift
+++ b/Sora/Views/Post/Grid/PostGridView.swift
@@ -28,7 +28,7 @@ struct PostGridView: View {
Button {
manager.selectedPost = post
} label: {
- PostView(
+ PostGridThumbnailView(
post: post,
posts: filteredPosts
)
@@ -36,7 +36,7 @@ struct PostGridView: View {
.buttonStyle(PlainButtonStyle())
#else
NavigationLink(value: post) {
- PostView(
+ PostGridThumbnailView(
post: post,
posts: filteredPosts
)
diff --git a/Sora/Views/Settings/SettingsAttributionsView.swift b/Sora/Views/Settings/Section/SettingsAttributionsView.swift
index 3c94c4e..3c94c4e 100644
--- a/Sora/Views/Settings/SettingsAttributionsView.swift
+++ b/Sora/Views/Settings/Section/SettingsAttributionsView.swift
diff --git a/Sora/Views/Settings/SettingsDetailsView.swift b/Sora/Views/Settings/Section/SettingsDetailsView.swift
index c51ab76..c51ab76 100644
--- a/Sora/Views/Settings/SettingsDetailsView.swift
+++ b/Sora/Views/Settings/Section/SettingsDetailsView.swift
diff --git a/Sora/Views/Settings/SettingsProviderView.swift b/Sora/Views/Settings/Section/SettingsProviderView.swift
index 1de25c3..1de25c3 100644
--- a/Sora/Views/Settings/SettingsProviderView.swift
+++ b/Sora/Views/Settings/Section/SettingsProviderView.swift
diff --git a/Sora/Views/Settings/SettingsSearchView.swift b/Sora/Views/Settings/Section/SettingsSearchView.swift
index 63be2f1..63be2f1 100644
--- a/Sora/Views/Settings/SettingsSearchView.swift
+++ b/Sora/Views/Settings/Section/SettingsSearchView.swift
diff --git a/Sora/Views/Settings/SettingsThumbnailsView.swift b/Sora/Views/Settings/Section/SettingsThumbnailsView.swift
index f787e59..f787e59 100644
--- a/Sora/Views/Settings/SettingsThumbnailsView.swift
+++ b/Sora/Views/Settings/Section/SettingsThumbnailsView.swift
diff --git a/Sora/Views/SettingsView.swift b/Sora/Views/Settings/SettingsView.swift
index ab92a42..ab92a42 100644
--- a/Sora/Views/SettingsView.swift
+++ b/Sora/Views/Settings/SettingsView.swift