1
Fork 0

Add shared code between the app and quicklook generators

This commit is contained in:
Joshua Goins 2020-03-12 08:04:37 -04:00 committed by redstrate
parent af24aeef3d
commit 02a0018628
6 changed files with 76 additions and 65 deletions

View file

@ -30,6 +30,9 @@
03CB38392419CA0C0078B3E5 /* minilzo.c in Sources */ = {isa = PBXBuildFile; fileRef = 03CB38352419CA0C0078B3E5 /* minilzo.c */; }; 03CB38392419CA0C0078B3E5 /* minilzo.c in Sources */ = {isa = PBXBuildFile; fileRef = 03CB38352419CA0C0078B3E5 /* minilzo.c */; };
03CB383A2419CA0C0078B3E5 /* minilzo.h in Headers */ = {isa = PBXBuildFile; fileRef = 03CB38362419CA0C0078B3E5 /* minilzo.h */; }; 03CB383A2419CA0C0078B3E5 /* minilzo.h in Headers */ = {isa = PBXBuildFile; fileRef = 03CB38362419CA0C0078B3E5 /* minilzo.h */; };
03CB383B2419CA2D0078B3E5 /* libLZO.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 03CB382E2419C9DB0078B3E5 /* libLZO.a */; }; 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 */ /* End PBXBuildFile section */
/* Begin PBXContainerItemProxy 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; }; 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; }; 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; }; 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 = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@ -143,6 +147,7 @@
030F6FE52415C5E300A43F01 = { 030F6FE52415C5E300A43F01 = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
03CB383E241A5ACD0078B3E5 /* Shared */,
03CB38322419C9F80078B3E5 /* LZO */, 03CB38322419C9F80078B3E5 /* LZO */,
030F6FF02415C5E300A43F01 /* ProcreateViewer */, 030F6FF02415C5E300A43F01 /* ProcreateViewer */,
030F700C2415C6B500A43F01 /* Quicklook */, 030F700C2415C6B500A43F01 /* Quicklook */,
@ -221,6 +226,14 @@
path = LZO; path = LZO;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
03CB383E241A5ACD0078B3E5 /* Shared */ = {
isa = PBXGroup;
children = (
03CB383F241A5AED0078B3E5 /* Shared.swift */,
);
path = Shared;
sourceTree = "<group>";
};
/* End PBXGroup section */ /* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */ /* Begin PBXHeadersBuildPhase section */
@ -399,6 +412,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
03CB3840241A5AED0078B3E5 /* Shared.swift in Sources */,
036AFBBA24168C030075400A /* ViewController.swift in Sources */, 036AFBBA24168C030075400A /* ViewController.swift in Sources */,
03CB382424191F620078B3E5 /* cbridge.c in Sources */, 03CB382424191F620078B3E5 /* cbridge.c in Sources */,
030F6FF42415C5E300A43F01 /* Document.swift in Sources */, 030F6FF42415C5E300A43F01 /* Document.swift in Sources */,
@ -411,6 +425,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
03CB3841241A5AED0078B3E5 /* Shared.swift in Sources */,
030F700E2415C6B500A43F01 /* PreviewViewController.swift in Sources */, 030F700E2415C6B500A43F01 /* PreviewViewController.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@ -419,6 +434,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
03CB3842241A5AED0078B3E5 /* Shared.swift in Sources */,
036AFC11241800350075400A /* ThumbnailProvider.swift in Sources */, 036AFC11241800350075400A /* ThumbnailProvider.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;

View file

@ -32,19 +32,6 @@ class Document: NSDocument {
var dict: NSDictionary? 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 info = SilicaDocument()
var rows: Int = 0 var rows: Int = 0
@ -121,22 +108,6 @@ class Document: NSDocument {
} }
} }
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) { func parseSilicaLayer(archive: Archive, dict: NSDictionary) {
let objectsArray = self.dict?["$objects"] as! NSArray let objectsArray = self.dict?["$objects"] as! NSArray

View file

@ -5,7 +5,7 @@
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies> </dependencies>
<objects> <objects>
<customObject id="-2" userLabel="File's Owner" customClass="PreviewViewController" customModule="PRoQuicklook" customModuleProvider="target"> <customObject id="-2" userLabel="File's Owner" customClass="PreviewViewController" customModule="QuickLook" customModuleProvider="target">
<connections> <connections>
<outlet property="imageView" destination="EP0-7I-mXS" id="iNc-ix-LJi"/> <outlet property="imageView" destination="EP0-7I-mXS" id="iNc-ix-LJi"/>
<outlet property="view" destination="c22-O7-iKe" id="NRM-P4-wb6"/> <outlet property="view" destination="c22-O7-iKe" id="NRM-P4-wb6"/>
@ -17,17 +17,12 @@
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<subviews> <subviews>
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="EP0-7I-mXS"> <imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EP0-7I-mXS">
<rect key="frame" x="20" y="20" width="440" height="232"/> <rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" id="GAh-NG-dcL"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="GAh-NG-dcL"/>
</imageView> </imageView>
</subviews> </subviews>
<constraints>
<constraint firstItem="EP0-7I-mXS" firstAttribute="top" secondItem="c22-O7-iKe" secondAttribute="top" constant="20" id="BJO-3N-O8t"/>
<constraint firstAttribute="trailing" secondItem="EP0-7I-mXS" secondAttribute="trailing" constant="20" id="HuZ-FY-I9T"/>
<constraint firstAttribute="bottom" secondItem="EP0-7I-mXS" secondAttribute="bottom" constant="20" id="u2E-5g-XFi"/>
<constraint firstItem="EP0-7I-mXS" firstAttribute="leading" secondItem="c22-O7-iKe" secondAttribute="leading" constant="20" id="zWW-ah-XqT"/>
</constraints>
<point key="canvasLocation" x="139" y="154"/> <point key="canvasLocation" x="139" y="154"/>
</customView> </customView>
</objects> </objects>

View file

@ -3,37 +3,31 @@ import Quartz
import ZIPFoundation import ZIPFoundation
class PreviewViewController: NSViewController, QLPreviewingController { class PreviewViewController: NSViewController, QLPreviewingController {
@IBOutlet weak var imageView: NSImageView! @IBOutlet weak var imageView: NSImageView!
override var nibName: NSNib.Name? { override var nibName: NSNib.Name? {
return NSNib.Name("PreviewViewController") return NSNib.Name("PreviewViewController")
} }
var image: NSImage?
func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) { func preparePreviewOfFile(at url: URL, completionHandler handler: @escaping (Error?) -> Void) {
let fc: NSFileCoordinator = NSFileCoordinator() let fc: NSFileCoordinator = NSFileCoordinator()
let intent: NSFileAccessIntent = NSFileAccessIntent.readingIntent(with: url) let intent: NSFileAccessIntent = NSFileAccessIntent.readingIntent(with: url)
fc.coordinate(with: [intent], queue: .main) { (err) in fc.coordinate(with: [intent], queue: .main) { (err) in
if err == nil { if err == nil {
// No error loading the file? Then continue
do { 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"] guard let entry = archive[ThumbnailPath] else {
var top_data = Data() return
}
try archive?.extract(entry!, consumer: { (d) in guard let thumbnailData = readData(archive: archive, entry: entry) else {
top_data.append(d) return
}) }
self.image = NSImage(data: top_data) self.imageView?.image = NSImage(data: thumbnailData)
Swift.print("successfully loaded item " + url.absoluteString)
self.view.display()
self.imageView?.image = self.image
handler(nil) handler(nil)
} catch { } catch {

31
Shared/Shared.swift Normal file
View file

@ -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
}

View file

@ -9,16 +9,19 @@ class ThumbnailProvider: QLThumbnailProvider {
fc.coordinate(with: [intent], queue: .main) { (err) in fc.coordinate(with: [intent], queue: .main) { (err) in
if err == nil { if err == nil {
do { 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"] guard let entry = archive[ThumbnailPath] else {
var top_data = Data() return
}
try archive?.extract(entry!, consumer: { (d) in guard let thumbnailData = readData(archive: archive, entry: entry) else {
top_data.append(d) return
}) }
let image = NSImage(data: top_data) let image = NSImage(data: thumbnailData)
let maximumSize = request.maximumSize let maximumSize = request.maximumSize
let imageSize = image?.size let imageSize = image?.size
@ -48,6 +51,7 @@ class ThumbnailProvider: QLThumbnailProvider {
return false return false
} }
} }
handler(reply, nil) handler(reply, nil)
} catch { } catch {
NSLog("Could not load file \(intent.url.lastPathComponent) to preview it") NSLog("Could not load file \(intent.url.lastPathComponent) to preview it")