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 */; };
|
||||
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 = "<group>"; };
|
||||
/* 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 = "<group>";
|
||||
};
|
||||
03CB383E241A5ACD0078B3E5 /* Shared */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
03CB383F241A5AED0078B3E5 /* Shared.swift */,
|
||||
);
|
||||
path = Shared;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* 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;
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
|
||||
</dependencies>
|
||||
<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>
|
||||
<outlet property="imageView" destination="EP0-7I-mXS" id="iNc-ix-LJi"/>
|
||||
<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"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<subviews>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" translatesAutoresizingMaskIntoConstraints="NO" id="EP0-7I-mXS">
|
||||
<rect key="frame" x="20" y="20" width="440" height="232"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" id="GAh-NG-dcL"/>
|
||||
<imageView horizontalHuggingPriority="251" verticalHuggingPriority="251" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="EP0-7I-mXS">
|
||||
<rect key="frame" x="0.0" y="0.0" width="480" height="272"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<imageCell key="cell" refusesFirstResponder="YES" alignment="left" imageScaling="proportionallyDown" id="GAh-NG-dcL"/>
|
||||
</imageView>
|
||||
</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"/>
|
||||
</customView>
|
||||
</objects>
|
||||
|
|
|
@ -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 {
|
||||
|
|
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
|
||||
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")
|
||||
|
|
Reference in a new issue