aboutsummaryrefslogtreecommitdiff
path: root/Hotline/Models/FilePreview.swift
diff options
context:
space:
mode:
authorDustin Mierau <dustin@mierau.me>2024-01-05 19:46:13 -0800
committerDustin Mierau <dustin@mierau.me>2024-01-05 19:46:37 -0800
commit2f8f71d0410f59d5d303a4c221a628630168bfe2 (patch)
tree6a18ae2e4dbd72a688667bd9e819ecee72d76b52 /Hotline/Models/FilePreview.swift
parent57c33eb798f6802fe5af8fcd3d1992a4b63a448f (diff)
Add image preview to Files so you don't have to download images to view them, works with animated GIFs too. Added cmd-R shortcut for Servers window. More work on login view.
Diffstat (limited to 'Hotline/Models/FilePreview.swift')
-rw-r--r--Hotline/Models/FilePreview.swift110
1 files changed, 71 insertions, 39 deletions
diff --git a/Hotline/Models/FilePreview.swift b/Hotline/Models/FilePreview.swift
index 552ccff..a7b183f 100644
--- a/Hotline/Models/FilePreview.swift
+++ b/Hotline/Models/FilePreview.swift
@@ -1,41 +1,73 @@
import SwiftUI
+import UniformTypeIdentifiers
-//struct FilePreview: Identifiable, Hashable {
-// let id: UUID
-//
-// let path: [String]
-// let name: String
-//
-// let type: String
-// let creator: String
-// let fileSize: UInt
-//
-// let isFolder: Bool
-// let isUnavailable: Bool
-// var expanded: Bool = false
-// var children: [FileInfo]? = nil
-//
-// init(hotlineFile: HotlineFile) {
-// self.id = UUID()
-// self.path = hotlineFile.path
-// self.name = hotlineFile.name
-// self.type = hotlineFile.type
-// self.creator = hotlineFile.creator
-// self.fileSize = UInt(hotlineFile.fileSize)
-// self.isFolder = hotlineFile.isFolder
-// self.isUnavailable = (!self.isFolder && (self.fileSize == 0))
-//
-// print(self.name, self.type, self.creator, self.isUnavailable)
-// if self.isFolder {
-// self.children = []
-// }
-// }
-//
-// static func == (lhs: FileInfo, rhs: FileInfo) -> Bool {
-// return lhs.id == rhs.id
-// }
-//
-// func hash(into hasher: inout Hasher) {
-// hasher.combine(self.id)
-// }
-//}
+enum FilePreviewState: Equatable {
+ case unloaded
+ case loading
+ case loaded
+ case failed
+}
+
+@Observable
+final class FilePreview: HotlineFileClientDelegate {
+ @ObservationIgnored let info: PreviewFileInfo
+ @ObservationIgnored var client: HotlineFileClient? = nil
+
+ var state: FilePreviewState = .unloaded
+ var progress: Double = 0.0
+
+ #if os(macOS)
+ var image: NSImage?
+ #endif
+
+ init(info: PreviewFileInfo) {
+ self.info = info
+
+ self.client = HotlineFileClient(address: info.address, port: UInt16(info.port), reference: info.id, size: UInt32(info.size), type: .preview)
+ self.client?.delegate = self
+ }
+
+ func download() {
+ self.client?.downloadToMemory()
+ }
+
+ func cancel() {
+ self.client?.cancel(deleteIncompleteFile: true)
+ }
+
+ func hotlineFileStatusChanged(client: HotlineFileClient, reference: UInt32, status: HotlineFileClientStatus, timeRemaining: TimeInterval) {
+ print("FILE STATUS CHANGED", status)
+
+ switch status {
+ case .unconnected:
+ state = .unloaded
+ progress = 0.0
+ case .connecting:
+ state = .loading
+ progress = 0.0
+ case .connected:
+ state = .loading
+ progress = 0.0
+ case .progress(let p):
+ state = .loading
+ progress = p
+ case .failed(_):
+ state = .failed
+ progress = 0.0
+ case .completed:
+ state = .loaded
+ progress = 1.0
+ }
+ }
+
+ func hotlineFileDownloadedData(client: HotlineFileClient, reference: UInt32, data: Data) {
+ self.state = .loaded
+
+ let fileExtension = (info.name as NSString).pathExtension
+ if let fileType = UTType(filenameExtension: fileExtension) {
+ if fileType.isSubtype(of: .image) {
+ self.image = NSImage(data: data)
+ }
+ }
+ }
+}