Files
ChWebsiteApp/CHDataManagement/Views/Pages/Commands/Insert+Video.swift
2025-06-11 08:19:44 +02:00

131 lines
3.8 KiB
Swift

import SwiftUI
import SFSafeSymbols
struct InsertableVideo: View, InsertableCommandView {
final class Model: ObservableObject, InsertableCommandModel {
@Published
var posterImage: FileResource?
@Published
var videoH265: FileResource?
@Published
var videoH264: FileResource?
@Published
var videoWebm: FileResource?
@Published
var controls: Bool = false
@Published
var autoplay: Bool = false
@Published
var loop: Bool = false
@Published
var muted: Bool = false
@Published
var playsinline = false
@Published
var preload = false
@Published
var preloadType: VideoBlock.Option.Preload = .metadata
var isReady: Bool {
videoH265 != nil || videoH264 != nil
}
init() {
}
var command: String? {
var lines: [String] = []
lines.append("```video")
if let posterImage {
lines.append("\(VideoBlock.Key.poster): \(posterImage.identifier)")
}
if let videoH265 {
lines.append("\(VideoBlock.Key.h265): \(videoH265.identifier)")
}
if let videoH264 {
lines.append("\(VideoBlock.Key.h264): \(videoH264.identifier)")
}
if let videoWebm {
lines.append("\(VideoBlock.Key.webm): \(videoWebm.identifier)")
}
if controls { lines.append(VideoBlock.Key.controls.rawValue) }
if autoplay { lines.append(VideoBlock.Key.autoplay.rawValue) }
if loop { lines.append(VideoBlock.Key.loop.rawValue) }
if muted { lines.append(VideoBlock.Key.muted.rawValue) }
if playsinline { lines.append(VideoBlock.Key.playsinline.rawValue) }
if preload {
lines.append("\(VideoBlock.Key.preload.rawValue):\(preloadType.rawValue)")
}
lines.append("```")
return lines.joined(separator: "\n")
}
}
static let title = "Video"
static let sheetTitle = "Insert video"
static let icon: SFSymbol = .movieclapper
@ObservedObject
private var model: Model
init(model: Model) {
self.model = model
}
var body: some View {
VStack {
FilePropertyView(
title: "Video (h265)",
footer: "Select the video encoded using h265",
selectedFile: $model.videoH265,
allowedType: .video)
FilePropertyView(
title: "Video (h264)",
footer: "Select the video encoded using h264",
selectedFile: $model.videoH264,
allowedType: .video)
FilePropertyView(
title: "Poster image",
footer: "Select the image to show as the poster",
selectedFile: $model.posterImage,
allowedType: .image)
HStack {
Toggle("controls", isOn: $model.controls)
Toggle("autoplay", isOn: $model.autoplay)
Toggle("loop", isOn: $model.loop)
Toggle("muted", isOn: $model.muted)
Toggle("playsinline", isOn: $model.playsinline)
Spacer()
}
HStack {
Toggle("preload", isOn: $model.preload)
Picker("", selection: $model.preloadType) {
ForEach(VideoBlock.Option.Preload.allCases, id: \.rawValue) { type in
Text("\(type.rawValue)").tag(type)
}
}
.disabled(!model.preload)
.frame(maxWidth: 100)
Spacer()
}
}
.toggleStyle(.checkbox)
}
}