Add shared code between the app and quicklook generators
This commit is contained in:
parent
af24aeef3d
commit
02a0018628
6 changed files with 76 additions and 65 deletions
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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>
|
||||||
|
|
|
@ -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
31
Shared/Shared.swift
Normal 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
|
||||||
|
}
|
|
@ -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")
|
||||||
|
|
Reference in a new issue