mirror of
https://github.com/Ranchero-Software/NetNewsWire
synced 2025-08-12 06:26:36 +00:00
Make the send-to-Micro.blog command work. Need some tweaking, but it mostly does the job.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user