import Foundation final class PageSettings: ObservableObject { @Published var contentWidth: Int @Published var largeImageWidth: Int @Published var pageLinkImageSize: Int @Published var defaultCssFile: FileResource? @Published var codeHighlightingJsFile: FileResource? @Published var modelViewerJsFile: FileResource? @Published var imageCompareJsFile: FileResource? @Published var imageCompareCssFile: FileResource? @Published var manifestFile: FileResource? @Published var german: LocalizedPageSettings @Published var english: LocalizedPageSettings init(contentWidth: Int, largeImageWidth: Int, pageLinkImageSize: Int, defaultCssFile: FileResource? = nil, codeHighlightingJsFile: FileResource? = nil, modelViewerJsFile: FileResource? = nil, imageCompareJsFile: FileResource? = nil, imageCompareCssFile: FileResource? = nil, manifestFile: FileResource? = nil, german: LocalizedPageSettings, english: LocalizedPageSettings) { self.contentWidth = contentWidth self.largeImageWidth = largeImageWidth self.pageLinkImageSize = pageLinkImageSize self.defaultCssFile = defaultCssFile self.codeHighlightingJsFile = codeHighlightingJsFile self.modelViewerJsFile = modelViewerJsFile self.imageCompareJsFile = imageCompareJsFile self.imageCompareCssFile = imageCompareCssFile self.manifestFile = manifestFile self.german = german self.english = english } func remove(_ file: FileResource) { if codeHighlightingJsFile == file { codeHighlightingJsFile = nil } if modelViewerJsFile == file { modelViewerJsFile = nil } if defaultCssFile == file { defaultCssFile = nil } if imageCompareJsFile == file { imageCompareJsFile = nil } if imageCompareCssFile == file { imageCompareCssFile = nil } if manifestFile == file { manifestFile = nil } } } // MARK: Storage extension PageSettings { convenience init(context: LoadingContext, data: Data) { self.init( contentWidth: data.contentWidth, largeImageWidth: data.largeImageWidth, pageLinkImageSize: data.pageLinkImageSize, defaultCssFile: data.defaultCssFile.map(context.file), codeHighlightingJsFile: data.codeHighlightingJsFile.map(context.file), modelViewerJsFile: data.modelViewerJsFile.map(context.file), imageCompareJsFile: data.imageCompareJsFile.map(context.file), imageCompareCssFile: data.imageCompareCssFile.map(context.file), manifestFile: data.manifestFile.map(context.file), german: .init(data: data.german), english: .init(data: data.english)) } var data: Data { .init(contentWidth: contentWidth, largeImageWidth: largeImageWidth, pageLinkImageSize: pageLinkImageSize, defaultCssFile: defaultCssFile?.id, codeHighlightingJsFile: codeHighlightingJsFile?.id, modelViewerJsFile: modelViewerJsFile?.id, imageCompareJsFile: imageCompareJsFile?.id, imageCompareCssFile: imageCompareCssFile?.id, manifestFile: manifestFile?.id, german: german.data, english: english.data) } struct Data: Codable, Equatable { let contentWidth: Int let largeImageWidth: Int let pageLinkImageSize: Int let defaultCssFile: String? let codeHighlightingJsFile: String? let modelViewerJsFile: String? let imageCompareJsFile: String? let imageCompareCssFile: String? let manifestFile: String? let german: LocalizedPageSettings.Data let english: LocalizedPageSettings.Data } } extension PageSettings: LocalizedItem { }