Generate tag overview, add file action

This commit is contained in:
Christoph Hagen
2025-01-05 09:21:21 +01:00
parent 0dca633805
commit 01baf560ee
27 changed files with 501 additions and 137 deletions

View File

@ -14,8 +14,13 @@ final class FileResource: Item {
@Published
var english: String
/// The dimensions of the image
@Published
var size: CGSize = .zero
var imageDimensions: CGSize? = nil
/// The size of the file in bytes
@Published
var fileSize: Int? = nil
init(content: Content, id: String, isExternallyStored: Bool, en: String, de: String) {
self.type = FileType(fileExtension: id.fileExtension)
@ -49,10 +54,13 @@ final class FileResource: Item {
// MARK: Images
var aspectRatio: CGFloat {
guard size.height > 0 else {
guard let imageDimensions else {
return 0
}
return size.width / size.height
guard imageDimensions.height > 0 else {
return 0
}
return imageDimensions.width / imageDimensions.height
}
var imageToDisplay: Image {
@ -60,18 +68,58 @@ final class FileResource: Item {
print("Failed to load data for image \(id)")
return failureImage
}
if fileSize == nil {
DispatchQueue.main.async {
self.fileSize = imageData.count
}
}
guard let loadedImage = NSImage(data: imageData) else {
print("Failed to create image \(id)")
return failureImage
}
if self.size == .zero && loadedImage.size != .zero {
if loadedImage.size != imageDimensions {
DispatchQueue.main.async {
self.size = loadedImage.size
self.imageDimensions = loadedImage.size
}
}
return .init(nsImage: loadedImage)
}
func determineImageDimensions() {
let size = getImageDimensions()
DispatchQueue.main.async {
self.imageDimensions = size
}
}
private func getImageDimensions() -> CGSize? {
guard type.isImage else {
return nil
}
guard let imageData = content.storage.fileData(for: id) else {
return nil
}
guard let loadedImage = NSImage(data: imageData) else {
return nil
}
return loadedImage.size
}
func determineFileSize() {
DispatchQueue.global(qos: .userInitiated).async {
let size = self.content.storage.size(of: self.id)
DispatchQueue.main.async {
self.fileSize = size
}
}
}
func removeGeneratedImages() {
content.imageGenerator.removeVersions(of: id)
content.storage.deleteInOutputFolder(path: outputImageFolder)
}
private var failureImage: Image {
Image(systemSymbol: .exclamationmarkTriangle)
}
@ -105,6 +153,13 @@ final class FileResource: Item {
// MARK: Paths
func removeFileFromOutputFolder() {
content.storage.deleteInOutputFolder(path: absoluteUrl)
if type.isImage {
removeGeneratedImages()
}
}
/**
Get the url path to a file in the output folder.
The result is an absolute path from the output folder for use in HTML.