diff --git a/CHDataManagement/Views/Generic/OptionalImagePropertyView.swift b/CHDataManagement/Views/Generic/OptionalImagePropertyView.swift index dd3a423..9404c91 100644 --- a/CHDataManagement/Views/Generic/OptionalImagePropertyView.swift +++ b/CHDataManagement/Views/Generic/OptionalImagePropertyView.swift @@ -7,13 +7,26 @@ struct OptionalImagePropertyView: View { @Binding var selectedImage: FileResource? + let transferImage: (language: ContentLanguage, image: FileResource)? + let footer: LocalizedStringKey @State private var showSelectionSheet = false var body: some View { - GenericPropertyView(title: title, footer: footer) { + VStack(alignment: .leading) { + HStack { + Text(title) + .font(.headline) + Spacer() + if let transferImage { + Button("From \(transferImage.language.shortText)") { + selectedImage = transferImage.image + } + } + } + if let image = selectedImage { image.imageToDisplay .resizable() @@ -21,6 +34,7 @@ struct OptionalImagePropertyView: View { .frame(maxHeight: 300) .cornerRadius(8) } + HStack { Text(selectedImage?.id ?? "No file selected") Spacer() @@ -28,6 +42,9 @@ struct OptionalImagePropertyView: View { showSelectionSheet = true } } + Text(footer) + .foregroundStyle(.secondary) + .padding(.bottom) } .sheet(isPresented: $showSelectionSheet) { FileSelectionView(selectedFile: $selectedImage, allowedType: .image) diff --git a/CHDataManagement/Views/LinkPreviewDetailView.swift b/CHDataManagement/Views/LinkPreviewDetailView.swift index 49f96a3..266f5d7 100644 --- a/CHDataManagement/Views/LinkPreviewDetailView.swift +++ b/CHDataManagement/Views/LinkPreviewDetailView.swift @@ -7,6 +7,8 @@ struct LinkPreviewDetailView: View { let fallbackTitle: String? + let transferImage: (language: ContentLanguage, image: FileResource)? + var body: some View { VStack(alignment: .leading) { OptionalStringPropertyView( @@ -18,6 +20,7 @@ struct LinkPreviewDetailView: View { OptionalImagePropertyView( title: "Preview Image", selectedImage: $linkPreview.image, + transferImage: transferImage, footer: "The image to show in a link preview") OptionalTextFieldPropertyView( diff --git a/CHDataManagement/Views/Pages/LocalizedPageDetailView.swift b/CHDataManagement/Views/Pages/LocalizedPageDetailView.swift index 2a733ea..5ffa347 100644 --- a/CHDataManagement/Views/Pages/LocalizedPageDetailView.swift +++ b/CHDataManagement/Views/Pages/LocalizedPageDetailView.swift @@ -8,6 +8,8 @@ struct LocalizedPageDetailView: View { @ObservedObject var page: LocalizedPage + let transferImage: (language: ContentLanguage, image: FileResource)? + var body: some View { VStack(alignment: .leading) { IdPropertyView( @@ -30,12 +32,15 @@ struct LocalizedPageDetailView: View { } } - LinkPreviewDetailView(linkPreview: page.linkPreview, fallbackTitle: page.title) + LinkPreviewDetailView( + linkPreview: page.linkPreview, + fallbackTitle: page.title, + transferImage: transferImage) } } } #Preview { - LocalizedPageDetailView(isExternalPage: false, page: .english) + LocalizedPageDetailView(isExternalPage: false, page: .english, transferImage: nil) .environmentObject(Content.mock) } diff --git a/CHDataManagement/Views/Pages/PageDetailView.swift b/CHDataManagement/Views/Pages/PageDetailView.swift index 60f48fa..95d359e 100644 --- a/CHDataManagement/Views/Pages/PageDetailView.swift +++ b/CHDataManagement/Views/Pages/PageDetailView.swift @@ -15,6 +15,10 @@ struct PageDetailView: View { @State private var showFileSelectionSheet = false + private var transferImage: (language: ContentLanguage, image: FileResource)? { + page.localized(in: language.next).linkPreview.image.map { (language.next, $0) } + } + init(page: Page) { self.page = page } @@ -113,7 +117,8 @@ struct PageDetailView: View { LocalizedPageDetailView( isExternalPage: page.isExternalUrl, - page: page.localized(in: language)) + page: page.localized(in: language), + transferImage: transferImage) .id(page.id + language.rawValue) } .padding() diff --git a/CHDataManagement/Views/Posts/LocalizedPostDetailView.swift b/CHDataManagement/Views/Posts/LocalizedPostDetailView.swift index 6b7625a..14762c9 100644 --- a/CHDataManagement/Views/Posts/LocalizedPostDetailView.swift +++ b/CHDataManagement/Views/Posts/LocalizedPostDetailView.swift @@ -5,6 +5,8 @@ struct LocalizedPostDetailView: View { @ObservedObject var post: LocalizedPost + let transferImage: (language: ContentLanguage, image: FileResource)? + var body: some View { VStack(alignment: .leading) { OptionalStringPropertyView( @@ -12,7 +14,10 @@ struct LocalizedPostDetailView: View { text: $post.pageLinkText, footer: "The custom text to show for the link to the linked page") - LinkPreviewDetailView(linkPreview: post.linkPreview, fallbackTitle: post.title) + LinkPreviewDetailView( + linkPreview: post.linkPreview, + fallbackTitle: post.title, + transferImage: transferImage) } } } diff --git a/CHDataManagement/Views/Posts/PostDetailView.swift b/CHDataManagement/Views/Posts/PostDetailView.swift index 3cbf14d..71358eb 100644 --- a/CHDataManagement/Views/Posts/PostDetailView.swift +++ b/CHDataManagement/Views/Posts/PostDetailView.swift @@ -43,6 +43,10 @@ struct PostDetailView: View { self.post = post } + private var transferImage: (language: ContentLanguage, image: FileResource)? { + post.localized(in: language.next).linkPreview.image.map { (language.next, $0) } + } + var body: some View { ScrollView { VStack(alignment: .leading) { @@ -87,7 +91,9 @@ struct PostDetailView: View { } } - LocalizedPostDetailView(post: post.localized(in: language)) + LocalizedPostDetailView( + post: post.localized(in: language), + transferImage: transferImage) } .padding() } diff --git a/CHDataManagement/Views/Settings/TagOverviewDetailView.swift b/CHDataManagement/Views/Settings/TagOverviewDetailView.swift index eb770b6..333f238 100644 --- a/CHDataManagement/Views/Settings/TagOverviewDetailView.swift +++ b/CHDataManagement/Views/Settings/TagOverviewDetailView.swift @@ -8,6 +8,10 @@ struct TagOverviewDetailView: View { @EnvironmentObject private var content: Content + private var transferImage: (language: ContentLanguage, image: FileResource)? { + content.tagOverview?.localized(in: language.next).linkPreview.image.map { (language.next, $0) } + } + var body: some View { ScrollView { VStack(alignment: .leading) { @@ -16,7 +20,9 @@ struct TagOverviewDetailView: View { text: "Configure the page showing all tags") if let tag = content.tagOverview?.localized(in: language) { - LocalizedTagDetailView(tag: tag) + LocalizedTagDetailView( + tag: tag, + transferImage: transferImage) .id(language) } else { Button("Create", action: createTagOverviewPage) diff --git a/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift b/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift index 865aa42..4a3826b 100644 --- a/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift +++ b/CHDataManagement/Views/Tags/LocalizedTagDetailView.swift @@ -10,7 +10,9 @@ struct LocalizedTagDetailView: View { @State private var showImagePicker = false - + + let transferImage: (language: ContentLanguage, image: FileResource)? + var body: some View { VStack(alignment: .leading) { StringPropertyView( @@ -31,11 +33,14 @@ struct LocalizedTagDetailView: View { } } - LinkPreviewDetailView(linkPreview: tag.linkPreview, fallbackTitle: tag.name) + LinkPreviewDetailView( + linkPreview: tag.linkPreview, + fallbackTitle: tag.name, + transferImage: transferImage) } } } #Preview { - LocalizedTagDetailView(tag: Tag.mock.english) + LocalizedTagDetailView(tag: Tag.mock.english, transferImage: nil) } diff --git a/CHDataManagement/Views/Tags/TagDetailView.swift b/CHDataManagement/Views/Tags/TagDetailView.swift index f8439fb..061c954 100644 --- a/CHDataManagement/Views/Tags/TagDetailView.swift +++ b/CHDataManagement/Views/Tags/TagDetailView.swift @@ -9,6 +9,10 @@ struct TagDetailView: View { @ObservedObject var tag: Tag + private var transferImage: (language: ContentLanguage, image: FileResource)? { + tag.localized(in: language.next).linkPreview.image.map { (language.next, $0) } + } + var body: some View { ScrollView { VStack(alignment: .leading) { @@ -30,7 +34,8 @@ struct TagDetailView: View { } LocalizedTagDetailView( - tag: tag.localized(in: language)) + tag: tag.localized(in: language), + transferImage: transferImage) .id(tag.id + language.rawValue) } .padding()