diff --git a/SilicaViewer/AppDelegate.swift b/SilicaViewer/AppDelegate.swift index c8ea0b5..c85ddda 100644 --- a/SilicaViewer/AppDelegate.swift +++ b/SilicaViewer/AppDelegate.swift @@ -23,9 +23,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations { return true } - func addAccessoryView(_ savePanel : NSSavePanel) { + func addAccessoryView(_ savePanel : NSSavePanel, fileTypes : Array) { let accessoryView = (ExportAccessoryView.fromNib()! as ExportAccessoryView) accessoryView.setSavePanel(savePanel) + accessoryView.setPossibleOptions(fileTypes) savePanel.accessoryView = accessoryView as NSView } @@ -139,33 +140,15 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations { savePanel.allowedFileTypes = ["tiff"] savePanel.nameFieldStringValue = (document?.getIdealFilename())! - addAccessoryView(savePanel) + addAccessoryView(savePanel, fileTypes: ["png", "tiff", "jpeg", "psd"]) savePanel.begin { (result) in if result.rawValue == NSApplication.ModalResponse.OK.rawValue { if savePanel.allowedFileTypes![0] != "psd" { - var fileType: NSBitmapImageRep.FileType = .tiff - switch(savePanel.allowedFileTypes![0]) { - case "tiff": - fileType = .tiff; - break; - case "bmp": - fileType = .bmp; - break; - case "jpeg": - fileType = .jpeg; - break; - case "png": - fileType = .png; - break; - default: - break; - } - let canvas = document?.makeComposite() let canvasTiff = canvas?.tiffRepresentation let bitmapImage = NSBitmapImageRep(data: canvasTiff!) - let canvasPng = bitmapImage!.representation(using: fileType, properties: [:]) + let canvasPng = bitmapImage!.representation(using: self.getBitmapType(savePanel.allowedFileTypes![0]), properties: [:]) try? canvasPng?.write(to: savePanel.url!) } else { @@ -197,7 +180,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations { writer?.addLayer(with: document!.makeBlendImage(layer), andName: layer.name + " (Mask)", andOpacity: 1.0, andOffset: .zero) } - writer?.addLayer(with: finalCgImage, andName: layer.name, andOpacity: Float(layer.data.opacity), andOffset: .zero, andBlendMode: Int(blendMode.rawValue), andIsNonBaseLayer: layer.clipped) + writer?.addLayer(with: finalCgImage, andName: layer.name, andOpacity: Float(layer.data.opacity), andOffset: .zero, andBlendMode: Int(self.getPSDBlendMode(layer).rawValue), andIsNonBaseLayer: layer.clipped) } let data = writer?.createPSDData() @@ -212,17 +195,17 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations { let savePanel = NSSavePanel() savePanel.title = "Save Thumbnail" - savePanel.allowedFileTypes = ["public.png"] + savePanel.allowedFileTypes = ["png"] savePanel.nameFieldStringValue = (document?.getIdealFilename())! - addAccessoryView(savePanel) + addAccessoryView(savePanel, fileTypes: ["png", "tiff", "jpeg"]) savePanel.begin { (result) in if result.rawValue == NSApplication.ModalResponse.OK.rawValue { let canvas = document?.makeThumbnail() let canvasTiff = canvas?.tiffRepresentation let bitmapImage = NSBitmapImageRep(data: canvasTiff!) - let canvasPng = bitmapImage!.representation(using: .png, properties: [:]) + let canvasPng = bitmapImage!.representation(using: self.getBitmapType(savePanel.allowedFileTypes![0]), properties: [:]) try? canvasPng?.write(to: savePanel.url!) } @@ -241,6 +224,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations { savePanel.allowedFileTypes = ["public.mpeg-4"] savePanel.nameFieldStringValue = (document?.getIdealFilename())! + addAccessoryView(savePanel, fileTypes: ["mp4", "mov", "heic"]) + savePanel.begin { (result) in if result.rawValue == NSApplication.ModalResponse.OK.rawValue { guard let archive = Archive(data: (document?.data)!, accessMode: Archive.AccessMode.read) else { @@ -292,9 +277,22 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserInterfaceValidations { self.exporter = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetHighestQuality) self.exporter?.outputURL = savePanel.url! - self.exporter?.outputFileType = AVFileType.mp4 self.exporter?.videoComposition = mainComposition + switch(savePanel.allowedFileTypes![0]) { + case "mp4": + self.exporter?.outputFileType = .mp4; + break; + case "mov": + self.exporter?.outputFileType = .mov; + break; + case "heic": + self.exporter?.outputFileType = .heic; + break; + default: + break; + } + let alert = NSAlert() alert.messageText = "Exporting timelapse..." alert.addButton(withTitle: "Cancel") diff --git a/SilicaViewer/ExportAccessoryView.swift b/SilicaViewer/ExportAccessoryView.swift index 5ddfb2d..e4303d1 100644 --- a/SilicaViewer/ExportAccessoryView.swift +++ b/SilicaViewer/ExportAccessoryView.swift @@ -11,27 +11,16 @@ class ExportAccessoryView : NSView { self.savePanel = savePanel } - @IBAction func changeFileFormat(_ sender: Any) { - switch(typeBox.indexOfSelectedItem) { - case 0: - savePanel?.allowedFileTypes = ["tiff"] - break - case 1: - savePanel?.allowedFileTypes = ["bmp"] - break - case 2: - savePanel?.allowedFileTypes = ["jpeg"] - break - case 3: - savePanel?.allowedFileTypes = ["png"] - break - case 4: - savePanel?.allowedFileTypes = ["psd"] - break - default: - break + func setPossibleOptions(_ options : Array) { + for option in options { + typeBox.addItem(withTitle: option.uppercased()) } } + + @IBAction func changeFileFormat(_ sender: Any) { + savePanel?.allowedFileTypes?.removeAll() + savePanel?.allowedFileTypes?.append((typeBox.titleOfSelectedItem?.lowercased())!) + } } extension NSView { diff --git a/SilicaViewer/ExportAccessoryView.xib b/SilicaViewer/ExportAccessoryView.xib index 34262b2..44cc517 100644 --- a/SilicaViewer/ExportAccessoryView.xib +++ b/SilicaViewer/ExportAccessoryView.xib @@ -25,18 +25,10 @@ - + - - - - - - - - - +