diff options
| author | Fuwn <[email protected]> | 2025-02-22 07:07:57 -0800 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2025-02-22 07:07:57 -0800 |
| commit | cafece91bae45194d64f4932bb04be018b82d21b (patch) | |
| tree | 02d727a13fe530550e3b29b28b7ee9980262eef2 /Sora/Views | |
| parent | feat: Development commit (diff) | |
| download | sora-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.swift | 2 | ||||
| -rw-r--r-- | Sora/Views/InteractiveImageView.swift (renamed from Sora/Views/ZoomableImageView.swift) | 4 | ||||
| -rw-r--r-- | Sora/Views/Post/Details/PostDetailsImageView.swift | 106 | ||||
| -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 |