another.im-ios/Monal/Classes/BackgroundSettings.swift

101 lines
4.3 KiB
Swift
Raw Normal View History

2024-11-18 14:53:52 +00:00
//
// BackgroundSettings.swift
// Monal
//
// Created by Thilo Molitor on 14.11.22.
// Copyright © 2022 monal-im.org. All rights reserved.
//
//swiftui is somehow needed to let the PhotosUI import succeed, even if it's already imported by SwiftuiHelpers.swift using @_exported
import SwiftUI
import PhotosUI
@ViewBuilder
func title(contact: ObservableKVOWrapper<MLContact>?) -> some View {
if let contact = contact {
Text("Select a background to display behind conversations with \(contact.contactDisplayName as String)")
} else {
Text("Select a default background to display behind conversations.")
}
}
struct BackgroundSettings: View {
@State private var selectedItem: PhotosPickerItem? = nil
@State private var showingImagePicker = false
@State private var inputImage: UIImage?
let contact: ObservableKVOWrapper<MLContact>?
init(contact: ObservableKVOWrapper<MLContact>?) {
self.contact = contact
_inputImage = State(initialValue:MLImageManager.sharedInstance().getBackgroundFor(self.contact?.obj))
}
var body: some View {
VStack {
Form {
Section(header:title(contact:contact)) {
VStack(spacing: 20) {
Spacer().frame(height: 0)
PhotosPicker(selection:$selectedItem, matching:.images, photoLibrary:.shared()) {
if let inputImage = inputImage {
HStack(alignment: .center) {
Image(uiImage:inputImage)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(maxWidth: .infinity, alignment: .center)
}
.addTopRight {
Button(action: {
self.inputImage = nil
}, label: {
Image(systemName: "xmark.circle.fill")
.resizable()
.frame(width: 32.0, height: 32.0)
.accessibilityLabel(Text("Remove Background Image"))
.symbolRenderingMode(.palette)
.foregroundStyle(.white, .red)
})
.buttonStyle(.borderless)
.offset(x: 12, y: -12)
}
} else {
Text("Select background image")
.frame(maxWidth: .infinity, alignment: .center)
}
}
.accessibilityLabel(Text("Change Background Image"))
.onChange(of:selectedItem) { newItem in
// Retrive selected asset in the form of Data
newItem?.loadTransferable(type:Data.self) { result in
guard let data = try? result.get() else {
self.inputImage = nil
return
}
guard let loadedImage = UIImage(data: data) else {
self.inputImage = nil
return
}
self.inputImage = loadedImage
}
}
Spacer().frame(height: 0)
}
}
}
}
.navigationBarTitle(contact != nil ? Text("Chat Background") : Text("Default Background"))
.onChange(of:inputImage) { _ in
MLImageManager.sharedInstance().saveBackgroundImageData(inputImage?.pngData(), for:self.contact?.obj)
}
}
}
struct BackgroundSettings_Previews: PreviewProvider {
static var previews: some View {
BackgroundSettings(contact:nil)
}
}