Make the send-to-Micro.blog command work. Need some tweaking, but it mostly does the job.

This commit is contained in:
Brent Simmons
2018-01-11 22:18:46 -08:00
parent 811084c106
commit c3bcf82713
7 changed files with 115 additions and 18 deletions

View File

@@ -12,15 +12,54 @@ import Cocoa
protocol SendToCommand {
var title: String { get }
var image: NSImage? { get }
func canSendObject(_ object: Any?, selectedText: String?) -> Bool
func sendObject(_ object: Any?, selectedText: String?)
}
extension SendToCommand {
func appExistsOnDisk(_ bundleIdentifier: String) -> Bool {
final class ApplicationSpecifier {
if let _ = NSWorkspace.shared.absolutePathForApplication(withBundleIdentifier: bundleIdentifier) {
let bundleID: String
var icon: NSImage? = nil
var existsOnDisk = false
var path: String? = nil
init(bundleID: String) {
self.bundleID = bundleID
update()
}
func update() {
path = NSWorkspace.shared.absolutePathForApplication(withBundleIdentifier: bundleID)
if let path = path {
if icon == nil {
icon = NSWorkspace.shared.icon(forFile: path)
}
existsOnDisk = true
}
else {
existsOnDisk = false
icon = nil
}
}
func launch() -> Bool {
guard existsOnDisk, let path = path else {
return false
}
let url = URL(fileURLWithPath: path)
if let runningApplication = try? NSWorkspace.shared.launchApplication(at: url, options: [.withErrorPresentation], configuration: [:]) {
if runningApplication.isFinishedLaunching {
return true
}
sleep(3) // Give the app time to launch. This is ugly.
return true
}
return false

View File

@@ -6,16 +6,45 @@
// Copyright © 2018 Ranchero Software. All rights reserved.
//
import Foundation
import Cocoa
final class SendToMarsEditCommand: SendToCommand {
let title = NSLocalizedString("Send to MarsEdit", comment: "Send to command")
var image: NSImage? {
return appSpecifierToUse()?.icon ?? nil
}
private let marsEditApps = [ApplicationSpecifier(bundleID: "com.red-sweater.marsedit4"), ApplicationSpecifier(bundleID: "com.red-sweater.marsedit")]
func canSendObject(_ object: Any?, selectedText: String?) -> Bool {
if let _ = appSpecifierToUse() {
return true
}
return false
}
func sendObject(_ object: Any?, selectedText: String?) {
if !canSendObject(object, selectedText: selectedText) {
return
}
}
}
private extension SendToMarsEditCommand {
func appSpecifierToUse() -> ApplicationSpecifier? {
for specifier in marsEditApps {
specifier.update()
if specifier.existsOnDisk {
return specifier
}
}
return nil
}
}

View File

@@ -13,18 +13,18 @@ import Data
final class SendToMicroBlogCommand: SendToCommand {
private let bundleID = "blog.micro.mac"
private var appExists = false
let title = NSLocalizedString("Send to Micro.blog", comment: "Send to command")
init() {
self.appExists = appExistsOnDisk(bundleID)
NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive(_:)), name: NSApplication.didBecomeActiveNotification, object: nil)
var image: NSImage? {
return microBlogApp.icon
}
private let microBlogApp = ApplicationSpecifier(bundleID: "blog.micro.mac")
func canSendObject(_ object: Any?, selectedText: String?) -> Bool {
guard appExists, let article = object as? Article, let _ = article.preferredLink else {
microBlogApp.update()
guard microBlogApp.existsOnDisk, let article = (object as? ArticlePasteboardWriter)?.article, let _ = article.preferredLink else {
return false
}
@@ -36,7 +36,10 @@ final class SendToMicroBlogCommand: SendToCommand {
guard canSendObject(object, selectedText: selectedText) else {
return
}
guard let article = object as? Article else {
guard let article = (object as? ArticlePasteboardWriter)?.article else {
return
}
guard microBlogApp.existsOnDisk, microBlogApp.launch() else {
return
}
@@ -67,11 +70,6 @@ final class SendToMicroBlogCommand: SendToCommand {
let _ = try? NSWorkspace.shared.open(url, options: [], configuration: [:])
}
@objc func appDidBecomeActive(_ note: Notification) {
self.appExists = appExistsOnDisk(bundleID)
}
}