From 02a00186280af930f58bf651f03621d8eb8ce2af Mon Sep 17 00:00:00 2001 From: redstrate Date: Thu, 12 Mar 2020 08:04:37 -0400 Subject: [PATCH] Add shared code between the app and quicklook generators --- ProcreateViewer.xcodeproj/project.pbxproj | 16 +++++++++ ProcreateViewer/Document.swift | 33 ++----------------- .../Base.lproj/PreviewViewController.xib | 15 +++------ Quicklook/PreviewViewController.swift | 28 +++++++--------- Shared/Shared.swift | 31 +++++++++++++++++ Thumbnail/ThumbnailProvider.swift | 18 ++++++---- 6 files changed, 76 insertions(+), 65 deletions(-) create mode 100644 Shared/Shared.swift diff --git a/ProcreateViewer.xcodeproj/project.pbxproj b/ProcreateViewer.xcodeproj/project.pbxproj index 8e5ea2a..b0a9c67 100644 --- a/ProcreateViewer.xcodeproj/project.pbxproj +++ b/ProcreateViewer.xcodeproj/project.pbxproj @@ -30,6 +30,9 @@ 03CB38392419CA0C0078B3E5 /* minilzo.c in Sources */ = {isa = PBXBuildFile; fileRef = 03CB38352419CA0C0078B3E5 /* minilzo.c */; }; 03CB383A2419CA0C0078B3E5 /* minilzo.h in Headers */ = {isa = PBXBuildFile; fileRef = 03CB38362419CA0C0078B3E5 /* minilzo.h */; }; 03CB383B2419CA2D0078B3E5 /* libLZO.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CB382E2419C9DB0078B3E5 /* libLZO.a */; }; + 03CB3840241A5AED0078B3E5 /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CB383F241A5AED0078B3E5 /* Shared.swift */; }; + 03CB3841241A5AED0078B3E5 /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CB383F241A5AED0078B3E5 /* Shared.swift */; }; + 03CB3842241A5AED0078B3E5 /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03CB383F241A5AED0078B3E5 /* Shared.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -99,6 +102,7 @@ 03CB38342419CA0C0078B3E5 /* lzodefs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = lzodefs.h; path = "minilzo-2.10/lzodefs.h"; sourceTree = SOURCE_ROOT; }; 03CB38352419CA0C0078B3E5 /* minilzo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = minilzo.c; path = "minilzo-2.10/minilzo.c"; sourceTree = SOURCE_ROOT; }; 03CB38362419CA0C0078B3E5 /* minilzo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = minilzo.h; path = "minilzo-2.10/minilzo.h"; sourceTree = SOURCE_ROOT; }; + 03CB383F241A5AED0078B3E5 /* Shared.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Shared.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -143,6 +147,7 @@ 030F6FE52415C5E300A43F01 = { isa = PBXGroup; children = ( + 03CB383E241A5ACD0078B3E5 /* Shared */, 03CB38322419C9F80078B3E5 /* LZO */, 030F6FF02415C5E300A43F01 /* ProcreateViewer */, 030F700C2415C6B500A43F01 /* Quicklook */, @@ -221,6 +226,14 @@ path = LZO; sourceTree = ""; }; + 03CB383E241A5ACD0078B3E5 /* Shared */ = { + isa = PBXGroup; + children = ( + 03CB383F241A5AED0078B3E5 /* Shared.swift */, + ); + path = Shared; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -399,6 +412,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 03CB3840241A5AED0078B3E5 /* Shared.swift in Sources */, 036AFBBA24168C030075400A /* ViewController.swift in Sources */, 03CB382424191F620078B3E5 /* cbridge.c in Sources */, 030F6FF42415C5E300A43F01 /* Document.swift in Sources */, @@ -411,6 +425,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 03CB3841241A5AED0078B3E5 /* Shared.swift in Sources */, 030F700E2415C6B500A43F01 /* PreviewViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -419,6 +434,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 03CB3842241A5AED0078B3E5 /* Shared.swift in Sources */, 036AFC11241800350075400A /* ThumbnailProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/ProcreateViewer/Document.swift b/ProcreateViewer/Document.swift index af02aad..b965f17 100644 --- a/ProcreateViewer/Document.swift +++ b/ProcreateViewer/Document.swift @@ -31,20 +31,7 @@ class Document: NSDocument { var data: Data? // oh no... var dict: NSDictionary? - - let NSKeyedArchiveVersion = 100000 - - let ThumbnailPath = "QuickLook/Thumbnail.png" - let DocumentArchivePath = "Document.archive" - - let DocumentClassName = "SilicaDocument" - let TrackedTimeKey = "SilicaDocumentTrackedTimeKey" - let LayersKey = "layers" - let TileSizeKey = "tileSize" - let SizeKey = "size" - - let LayerClassName = "SilicaLayer" - + var info = SilicaDocument() var rows: Int = 0 @@ -120,23 +107,7 @@ class Document: NSDocument { return nil } } - - func readData(archive: Archive, entry: Entry) -> Data? { - var data = Data() - - do { - let _ = try archive.extract(entry, consumer: { (d) in - data.append(d) - }) - } catch { - Swift.print("Extracting entry from archive failed with error:\(error)") - - return nil - } - - return data - } - + func parseSilicaLayer(archive: Archive, dict: NSDictionary) { let objectsArray = self.dict?["$objects"] as! NSArray diff --git a/Quicklook/Base.lproj/PreviewViewController.xib b/Quicklook/Base.lproj/PreviewViewController.xib index d47f49f..8875cca 100644 --- a/Quicklook/Base.lproj/PreviewViewController.xib +++ b/Quicklook/Base.lproj/PreviewViewController.xib @@ -5,7 +5,7 @@ - + @@ -17,17 +17,12 @@ - - - + + + + - - - - - - diff --git a/Quicklook/PreviewViewController.swift b/Quicklook/PreviewViewController.swift index 38bd004..4a2595e 100644 --- a/Quicklook/PreviewViewController.swift +++ b/Quicklook/PreviewViewController.swift @@ -3,37 +3,31 @@ import Quartz import ZIPFoundation class PreviewViewController: NSViewController, QLPreviewingController { - @IBOutlet weak var imageView: NSImageView! override var nibName: NSNib.Name? { return NSNib.Name("PreviewViewController") } - var image: NSImage? - func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) { let fc: NSFileCoordinator = NSFileCoordinator() let intent: NSFileAccessIntent = NSFileAccessIntent.readingIntent(with: url) fc.coordinate(with: [intent], queue: .main) { (err) in if err == nil { - // No error loading the file? Then continue do { - let archive = Archive(data: try Data(contentsOf: intent.url), accessMode: Archive.AccessMode.read) + guard let archive = Archive(data: try Data(contentsOf: intent.url), accessMode: Archive.AccessMode.read) else { + return + } - let entry = archive?["QuickLook/Thumbnail.png"] - var top_data = Data() + guard let entry = archive[ThumbnailPath] else { + return + } + + guard let thumbnailData = readData(archive: archive, entry: entry) else { + return + } - try archive?.extract(entry!, consumer: { (d) in - top_data.append(d) - }) - - self.image = NSImage(data: top_data) - - Swift.print("successfully loaded item " + url.absoluteString) - - self.view.display() - self.imageView?.image = self.image + self.imageView?.image = NSImage(data: thumbnailData) handler(nil) } catch { diff --git a/Shared/Shared.swift b/Shared/Shared.swift new file mode 100644 index 0000000..28a713e --- /dev/null +++ b/Shared/Shared.swift @@ -0,0 +1,31 @@ +import Foundation +import ZIPFoundation + +let NSKeyedArchiveVersion = 100000 + +let ThumbnailPath = "QuickLook/Thumbnail.png" +let DocumentArchivePath = "Document.archive" + +let DocumentClassName = "SilicaDocument" +let TrackedTimeKey = "SilicaDocumentTrackedTimeKey" +let LayersKey = "layers" +let TileSizeKey = "tileSize" +let SizeKey = "size" + +let LayerClassName = "SilicaLayer" + +func readData(archive: Archive, entry: Entry) -> Data? { + var data = Data() + + do { + let _ = try archive.extract(entry, consumer: { (d) in + data.append(d) + }) + } catch { + Swift.print("Extracting entry from archive failed with error:\(error)") + + return nil + } + + return data +} diff --git a/Thumbnail/ThumbnailProvider.swift b/Thumbnail/ThumbnailProvider.swift index 51d6557..ce0c2d6 100644 --- a/Thumbnail/ThumbnailProvider.swift +++ b/Thumbnail/ThumbnailProvider.swift @@ -9,16 +9,19 @@ class ThumbnailProvider: QLThumbnailProvider { fc.coordinate(with: [intent], queue: .main) { (err) in if err == nil { do { - let archive = Archive(data: try Data(contentsOf: intent.url), accessMode: Archive.AccessMode.read) + guard let archive = Archive(data: try Data(contentsOf: intent.url), accessMode: Archive.AccessMode.read) else { + return + } - let entry = archive?["QuickLook/Thumbnail.png"] - var top_data = Data() + guard let entry = archive[ThumbnailPath] else { + return + } - try archive?.extract(entry!, consumer: { (d) in - top_data.append(d) - }) + guard let thumbnailData = readData(archive: archive, entry: entry) else { + return + } - let image = NSImage(data: top_data) + let image = NSImage(data: thumbnailData) let maximumSize = request.maximumSize let imageSize = image?.size @@ -48,6 +51,7 @@ class ThumbnailProvider: QLThumbnailProvider { return false } } + handler(reply, nil) } catch { NSLog("Could not load file \(intent.url.lastPathComponent) to preview it")