Remove ExtensionPoint code.
|
@ -79,12 +79,12 @@ struct AppAssets {
|
|||
return NSImage(systemSymbolName: "wind", accessibilityDescription: nil)!
|
||||
}()
|
||||
|
||||
static var extensionPointMarsEdit: RSImage = {
|
||||
return RSImage(named: "extensionPointMarsEdit")!
|
||||
static var marsEditIcon: RSImage = {
|
||||
return RSImage(named: "MarsEditIcon")!
|
||||
}()
|
||||
|
||||
static var extensionPointMicroblog: RSImage = {
|
||||
return RSImage(named: "extensionPointMicroblog")!
|
||||
static var microblogIcon: RSImage = {
|
||||
return RSImage(named: "MicroblogIcon")!
|
||||
}()
|
||||
|
||||
static var faviconTemplateImage: RSImage = {
|
||||
|
|
|
@ -24,7 +24,6 @@ final class AppDefaults {
|
|||
struct Key {
|
||||
static let firstRunDate = "firstRunDate"
|
||||
static let windowState = "windowState"
|
||||
static let activeExtensionPointIDs = "activeExtensionPointIDs"
|
||||
static let lastImageCacheFlushDate = "lastImageCacheFlushDate"
|
||||
static let sidebarFontSize = "sidebarFontSize"
|
||||
static let timelineFontSize = "timelineFontSize"
|
||||
|
@ -83,15 +82,6 @@ final class AppDefaults {
|
|||
}
|
||||
}
|
||||
|
||||
var activeExtensionPointIDs: [[AnyHashable : AnyHashable]]? {
|
||||
get {
|
||||
return UserDefaults.standard.object(forKey: Key.activeExtensionPointIDs) as? [[AnyHashable : AnyHashable]]
|
||||
}
|
||||
set {
|
||||
UserDefaults.standard.set(newValue, forKey: Key.activeExtensionPointIDs)
|
||||
}
|
||||
}
|
||||
|
||||
var lastImageCacheFlushDate: Date? {
|
||||
get {
|
||||
return AppDefaults.date(for: Key.lastImageCacheFlushDate)
|
||||
|
|
|
@ -27,7 +27,9 @@ import RSCore
|
|||
}
|
||||
|
||||
static func customSharingServices(for items: [Any]) -> [NSSharingService] {
|
||||
let customServices = ExtensionPointManager.shared.activeSendToCommands.compactMap { (sendToCommand) -> NSSharingService? in
|
||||
let customServices: [SendToCommand] = [SendToMarsEditCommand(), SendToMicroBlogCommand()]
|
||||
|
||||
return customServices.compactMap { (sendToCommand) -> NSSharingService? in
|
||||
|
||||
guard let object = items.first else {
|
||||
return nil
|
||||
|
@ -42,6 +44,5 @@ import RSCore
|
|||
sendToCommand.sendObject(object, selectedText: nil)
|
||||
}
|
||||
}
|
||||
return customServices
|
||||
}
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 2.5 KiB |
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
Before Width: | Height: | Size: 2.2 KiB After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 4.3 KiB After Width: | Height: | Size: 4.3 KiB |
|
@ -101,8 +101,6 @@
|
|||
510C418424E5D1B4008226FD /* ExtensionFeedAddRequestFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B5C8BF23F3866C00032075 /* ExtensionFeedAddRequestFile.swift */; };
|
||||
510C418524E5D1B4008226FD /* ExtensionContainers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B5C87623F22B8200032075 /* ExtensionContainers.swift */; };
|
||||
510C418624E5D1B4008226FD /* ExtensionFeedAddRequest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51B5C87A23F2317700032075 /* ExtensionFeedAddRequest.swift */; };
|
||||
510C43F7243D035C009F70C3 /* ExtensionPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F6243D035C009F70C3 /* ExtensionPoint.swift */; };
|
||||
510C43F8243D035C009F70C3 /* ExtensionPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F6243D035C009F70C3 /* ExtensionPoint.swift */; };
|
||||
510FFAB326EEA22C00F32265 /* ArticleThemesTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510FFAB226EEA22C00F32265 /* ArticleThemesTableViewController.swift */; };
|
||||
51102165233A7D6C0007A5F7 /* ArticleExtractorButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51102164233A7D6C0007A5F7 /* ArticleExtractorButton.swift */; };
|
||||
5110C37D2373A8D100A9C04F /* InspectorIconHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5110C37C2373A8D100A9C04F /* InspectorIconHeaderView.swift */; };
|
||||
|
@ -206,13 +204,6 @@
|
|||
514C16DF24D2EF15009A3AFA /* RSTree in Embed Frameworks */ = {isa = PBXBuildFile; productRef = 514C16DD24D2EF15009A3AFA /* RSTree */; settings = {ATTRIBUTES = (CodeSignOnCopy, ); }; };
|
||||
514C16E124D2EF38009A3AFA /* RSCoreResources in Frameworks */ = {isa = PBXBuildFile; productRef = 514C16E024D2EF38009A3AFA /* RSCoreResources */; };
|
||||
5154368B229404D1005E1CDF /* FaviconGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EF0F76227716200050506E /* FaviconGenerator.swift */; };
|
||||
515A50E6243D07A90089E588 /* ExtensionPointManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A50E5243D07A90089E588 /* ExtensionPointManager.swift */; };
|
||||
515A50E7243D07A90089E588 /* ExtensionPointManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A50E5243D07A90089E588 /* ExtensionPointManager.swift */; };
|
||||
515A5177243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */; };
|
||||
515A5178243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */; };
|
||||
515A517B243E90260089E588 /* ExtensionPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F6243D035C009F70C3 /* ExtensionPoint.swift */; };
|
||||
515A517C243E90260089E588 /* ExtensionPointManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A50E5243D07A90089E588 /* ExtensionPointManager.swift */; };
|
||||
515A5181243E90260089E588 /* ExtensionPointIdentifer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */; };
|
||||
515D4FCA23257CB500EE1167 /* Node-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97971ED9EFAA007D329B /* Node-Extensions.swift */; };
|
||||
515D4FCC2325815A00EE1167 /* SafariExt.js in Resources */ = {isa = PBXBuildFile; fileRef = 515D4FCB2325815A00EE1167 /* SafariExt.js */; };
|
||||
516244E3241E19F000B61C47 /* ColorPaletteTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516244E2241E19F000B61C47 /* ColorPaletteTableViewController.swift */; };
|
||||
|
@ -1142,7 +1133,6 @@
|
|||
510C416524E5CDE3008226FD /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
510C416624E5CDE3008226FD /* ShareExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = ShareExtension.entitlements; sourceTree = "<group>"; };
|
||||
510C418724E5D2E3008226FD /* NetNewsWire_shareextension_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = NetNewsWire_shareextension_target.xcconfig; sourceTree = "<group>"; };
|
||||
510C43F6243D035C009F70C3 /* ExtensionPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionPoint.swift; sourceTree = "<group>"; };
|
||||
510FFAB226EEA22C00F32265 /* ArticleThemesTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleThemesTableViewController.swift; sourceTree = "<group>"; };
|
||||
51102164233A7D6C0007A5F7 /* ArticleExtractorButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleExtractorButton.swift; sourceTree = "<group>"; };
|
||||
5110C37C2373A8D100A9C04F /* InspectorIconHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorIconHeaderView.swift; sourceTree = "<group>"; };
|
||||
|
@ -1193,8 +1183,6 @@
|
|||
5148F44A2336DB4700F8CD8B /* MasterTimelineTitleView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = MasterTimelineTitleView.xib; sourceTree = "<group>"; };
|
||||
5148F4542336DB7000F8CD8B /* MasterTimelineTitleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MasterTimelineTitleView.swift; sourceTree = "<group>"; };
|
||||
514B7C8223205EFB00BAC947 /* RootSplitViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RootSplitViewController.swift; sourceTree = "<group>"; };
|
||||
515A50E5243D07A90089E588 /* ExtensionPointManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionPointManager.swift; sourceTree = "<group>"; };
|
||||
515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtensionPointIdentifer.swift; sourceTree = "<group>"; };
|
||||
515D4FCB2325815A00EE1167 /* SafariExt.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = SafariExt.js; sourceTree = "<group>"; };
|
||||
515D4FCD2325909200EE1167 /* NetNewsWire_iOS_ShareExtension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = NetNewsWire_iOS_ShareExtension.entitlements; sourceTree = "<group>"; };
|
||||
515D4FCE2325B3D000EE1167 /* NetNewsWire_iOSshareextension_target.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = NetNewsWire_iOSshareextension_target.xcconfig; sourceTree = "<group>"; };
|
||||
|
@ -1766,9 +1754,6 @@
|
|||
510C43F5243D0325009F70C3 /* ExtensionPoints */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
510C43F6243D035C009F70C3 /* ExtensionPoint.swift */,
|
||||
515A5176243E90200089E588 /* ExtensionPointIdentifer.swift */,
|
||||
515A50E5243D07A90089E588 /* ExtensionPointManager.swift */,
|
||||
84A1500420048DDF0046AD9A /* SendToMarsEditCommand.swift */,
|
||||
84A14FF220048CA70046AD9A /* SendToMicroBlogCommand.swift */,
|
||||
);
|
||||
|
@ -3747,7 +3732,6 @@
|
|||
65ED3FC8235DEF6C0081F399 /* SidebarCellLayout.swift in Sources */,
|
||||
65ED3FC9235DEF6C0081F399 /* SmartFeedPasteboardWriter.swift in Sources */,
|
||||
65ED3FCA235DEF6C0081F399 /* SmartFeedsController.swift in Sources */,
|
||||
515A5178243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */,
|
||||
65ED3FCB235DEF6C0081F399 /* SidebarViewController.swift in Sources */,
|
||||
51BC4B00247277E0000A6ED8 /* URL-Extensions.swift in Sources */,
|
||||
65ED3FCD235DEF6C0081F399 /* SidebarOutlineView.swift in Sources */,
|
||||
|
@ -3794,7 +3778,6 @@
|
|||
65ED3FF0235DEF6C0081F399 /* ArticleThemesManager.swift in Sources */,
|
||||
65ED3FF1235DEF6C0081F399 /* DetailContainerView.swift in Sources */,
|
||||
65ED3FF2235DEF6C0081F399 /* SharingServiceDelegate.swift in Sources */,
|
||||
515A50E7243D07A90089E588 /* ExtensionPointManager.swift in Sources */,
|
||||
65ED3FF3235DEF6C0081F399 /* ArticleSorter.swift in Sources */,
|
||||
65ED3FF4235DEF6C0081F399 /* TimelineViewController+ContextualMenus.swift in Sources */,
|
||||
65ED3FF5235DEF6C0081F399 /* ArticleStringFormatter.swift in Sources */,
|
||||
|
@ -3832,7 +3815,6 @@
|
|||
65ED4012235DEF6C0081F399 /* TimelineContainerViewController.swift in Sources */,
|
||||
65ED4013235DEF6C0081F399 /* MainWIndowKeyboardHandler.swift in Sources */,
|
||||
65ED4014235DEF6C0081F399 /* PasteboardWebFeed.swift in Sources */,
|
||||
510C43F8243D035C009F70C3 /* ExtensionPoint.swift in Sources */,
|
||||
510C417B24E5D1AE008226FD /* ExtensionContainersFile.swift in Sources */,
|
||||
65ED4015235DEF6C0081F399 /* AccountsDetailViewController.swift in Sources */,
|
||||
65ED4016235DEF6C0081F399 /* DetailViewController.swift in Sources */,
|
||||
|
@ -4011,14 +3993,12 @@
|
|||
5108F6D42375EEEF001ABC45 /* TimelinePreviewTableViewController.swift in Sources */,
|
||||
84CAFCA522BC8C08007694F0 /* FetchRequestQueue.swift in Sources */,
|
||||
512392BE24E33A3C00F11704 /* RedditSelectAccountTableViewController.swift in Sources */,
|
||||
515A517B243E90260089E588 /* ExtensionPoint.swift in Sources */,
|
||||
51C4529C22650A1000C03939 /* SingleFaviconDownloader.swift in Sources */,
|
||||
17D643B226F8A436008D4C05 /* ArticleThemeDownloader.swift in Sources */,
|
||||
51E595A6228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */,
|
||||
51F9F3F723DF6DB200A314FD /* ArticleIconSchemeHandler.swift in Sources */,
|
||||
512AF9C2236ED52C0066F8BE /* ImageHeaderView.swift in Sources */,
|
||||
512392C124E33A3C00F11704 /* RedditSelectTypeTableViewController.swift in Sources */,
|
||||
515A5181243E90260089E588 /* ExtensionPointIdentifer.swift in Sources */,
|
||||
51A1699F235E10D700EB091F /* AboutViewController.swift in Sources */,
|
||||
51C45290226509C100C03939 /* PseudoFeed.swift in Sources */,
|
||||
51C452A922650DC600C03939 /* ArticleRenderer.swift in Sources */,
|
||||
|
@ -4069,7 +4049,6 @@
|
|||
51C4528D2265095F00C03939 /* AddFolderViewController.swift in Sources */,
|
||||
51C452782265091600C03939 /* MasterTimelineCellData.swift in Sources */,
|
||||
5148F4552336DB7000F8CD8B /* MasterTimelineTitleView.swift in Sources */,
|
||||
515A517C243E90260089E588 /* ExtensionPointManager.swift in Sources */,
|
||||
51627A6723861DA3007B3B4B /* MasterFeedViewController+Drag.swift in Sources */,
|
||||
51FFF0C4235EE8E5002762AA /* VibrantButton.swift in Sources */,
|
||||
51C45259226508D300C03939 /* AppDefaults.swift in Sources */,
|
||||
|
@ -4126,9 +4105,7 @@
|
|||
D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */,
|
||||
8405DD9C22153BD7008CE1BF /* NSView-Extensions.swift in Sources */,
|
||||
849A979F1ED9F130007D329B /* SidebarCell.swift in Sources */,
|
||||
515A50E6243D07A90089E588 /* ExtensionPointManager.swift in Sources */,
|
||||
51E595A5228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */,
|
||||
515A5177243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */,
|
||||
849A97651ED9EB96007D329B /* WebFeedTreeControllerDelegate.swift in Sources */,
|
||||
849A97671ED9EB96007D329B /* UnreadCountView.swift in Sources */,
|
||||
510C418024E5D1AE008226FD /* ExtensionFeedAddRequestFile.swift in Sources */,
|
||||
|
@ -4243,7 +4220,6 @@
|
|||
179C39EB26F76B3800D4E741 /* ArticleThemePlist.swift in Sources */,
|
||||
849A97A31ED9F180007D329B /* FolderTreeControllerDelegate.swift in Sources */,
|
||||
51126DA4225FDE2F00722696 /* RSImage-Extensions.swift in Sources */,
|
||||
510C43F7243D035C009F70C3 /* ExtensionPoint.swift in Sources */,
|
||||
845A29091FC74B8E007B49E3 /* SingleFaviconDownloader.swift in Sources */,
|
||||
D5F4EDB720074D6500B9E363 /* WebFeed+Scriptability.swift in Sources */,
|
||||
84E850861FCB60CE0072EA88 /* AuthorAvatarDownloader.swift in Sources */,
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
//
|
||||
// ExtensionPoint.swift
|
||||
// NetNewsWire
|
||||
//
|
||||
// Created by Maurice Parker on 4/7/20.
|
||||
// Copyright © 2020 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
#if os(macOS)
|
||||
import AppKit
|
||||
#else
|
||||
import UIKit
|
||||
#endif
|
||||
import RSCore
|
||||
|
||||
protocol ExtensionPoint {
|
||||
|
||||
static var isSinglton: Bool { get }
|
||||
static var isDeveloperBuildRestricted: Bool { get }
|
||||
static var title: String { get }
|
||||
static var image: RSImage { get }
|
||||
static var description: NSAttributedString { get }
|
||||
|
||||
var title: String { get }
|
||||
var extensionPointID: ExtensionPointIdentifer { get }
|
||||
|
||||
}
|
||||
|
||||
extension ExtensionPoint {
|
||||
|
||||
var image: RSImage {
|
||||
return extensionPointID.extensionPointType.image
|
||||
}
|
||||
|
||||
var description: NSAttributedString {
|
||||
return extensionPointID.extensionPointType.description
|
||||
}
|
||||
|
||||
static func makeAttrString(_ text: String) -> NSMutableAttributedString {
|
||||
let paragraphStyle = NSMutableParagraphStyle()
|
||||
paragraphStyle.alignment = .center
|
||||
|
||||
#if os(macOS)
|
||||
let attrs = [
|
||||
NSAttributedString.Key.paragraphStyle: paragraphStyle,
|
||||
NSAttributedString.Key.font: NSFont.systemFont(ofSize: NSFont.systemFontSize),
|
||||
NSAttributedString.Key.foregroundColor: NSColor.textColor
|
||||
]
|
||||
#else
|
||||
let attrs = [
|
||||
NSAttributedString.Key.paragraphStyle: paragraphStyle,
|
||||
NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .body),
|
||||
NSAttributedString.Key.foregroundColor: UIColor.label
|
||||
]
|
||||
#endif
|
||||
|
||||
return NSMutableAttributedString(string: text, attributes: attrs)
|
||||
}
|
||||
|
||||
}
|
|
@ -1,70 +0,0 @@
|
|||
//
|
||||
// ExtensionPointIdentifer.swift
|
||||
// NetNewsWire
|
||||
//
|
||||
// Created by Maurice Parker on 4/8/20.
|
||||
// Copyright © 2020 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Account
|
||||
import RSCore
|
||||
|
||||
enum ExtensionPointIdentifer: Hashable {
|
||||
#if os(macOS)
|
||||
case marsEdit
|
||||
case microblog
|
||||
#endif
|
||||
|
||||
var extensionPointType: ExtensionPoint.Type {
|
||||
switch self {
|
||||
#if os(macOS)
|
||||
case .marsEdit:
|
||||
return SendToMarsEditCommand.self
|
||||
case .microblog:
|
||||
return SendToMicroBlogCommand.self
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public var userInfo: [AnyHashable: AnyHashable] {
|
||||
switch self {
|
||||
#if os(macOS)
|
||||
case .marsEdit:
|
||||
return [
|
||||
"type": "marsEdit"
|
||||
]
|
||||
case .microblog:
|
||||
return [
|
||||
"type": "microblog"
|
||||
]
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public init?(userInfo: [AnyHashable: AnyHashable]) {
|
||||
guard let type = userInfo["type"] as? String else { return nil }
|
||||
|
||||
switch type {
|
||||
#if os(macOS)
|
||||
case "marsEdit":
|
||||
self = ExtensionPointIdentifer.marsEdit
|
||||
case "microblog":
|
||||
self = ExtensionPointIdentifer.microblog
|
||||
#endif
|
||||
default:
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
public func hash(into hasher: inout Hasher) {
|
||||
switch self {
|
||||
#if os(macOS)
|
||||
case .marsEdit:
|
||||
hasher.combine("marsEdit")
|
||||
case .microblog:
|
||||
hasher.combine("microblog")
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,125 +0,0 @@
|
|||
//
|
||||
// ExtensionPointManager.swift
|
||||
// NetNewsWire
|
||||
//
|
||||
// Created by Maurice Parker on 4/7/20.
|
||||
// Copyright © 2020 Ranchero Software. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import Account
|
||||
import RSCore
|
||||
import OAuthSwift
|
||||
|
||||
public extension Notification.Name {
|
||||
static let ActiveExtensionPointsDidChange = Notification.Name(rawValue: "ActiveExtensionPointsDidChange")
|
||||
}
|
||||
|
||||
public enum ExtensionPointManagerError: LocalizedError {
|
||||
case unableToCreate
|
||||
|
||||
public var localizedDescription: String {
|
||||
switch self {
|
||||
case .unableToCreate:
|
||||
return NSLocalizedString("Unable to create extension.", comment: "Unable to create extension")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
final class ExtensionPointManager {
|
||||
|
||||
static let shared = ExtensionPointManager()
|
||||
|
||||
var activeExtensionPoints = [ExtensionPointIdentifer: ExtensionPoint]()
|
||||
let possibleExtensionPointTypes: [ExtensionPoint.Type]
|
||||
var availableExtensionPointTypes: [ExtensionPoint.Type] {
|
||||
|
||||
let activeExtensionPointTypes = activeExtensionPoints.keys.compactMap({ ObjectIdentifier($0.extensionPointType) })
|
||||
var available = [ExtensionPoint.Type]()
|
||||
for possibleExtensionPointType in possibleExtensionPointTypes {
|
||||
if !(AppDefaults.shared.isDeveloperBuild && possibleExtensionPointType.isDeveloperBuildRestricted) {
|
||||
if possibleExtensionPointType.isSinglton {
|
||||
if !activeExtensionPointTypes.contains(ObjectIdentifier(possibleExtensionPointType)) {
|
||||
available.append(possibleExtensionPointType)
|
||||
}
|
||||
} else {
|
||||
available.append(possibleExtensionPointType)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return available
|
||||
|
||||
}
|
||||
|
||||
var activeSendToCommands: [SendToCommand] {
|
||||
var commands = activeExtensionPoints.values.compactMap({ return $0 as? SendToCommand })
|
||||
|
||||
// These two SendToCommands don't need logins and are always active
|
||||
#if os(macOS)
|
||||
commands.append(SendToMarsEditCommand())
|
||||
commands.append(SendToMicroBlogCommand())
|
||||
#endif
|
||||
|
||||
return commands
|
||||
}
|
||||
|
||||
init() {
|
||||
possibleExtensionPointTypes = []
|
||||
loadExtensionPoints()
|
||||
}
|
||||
|
||||
func activateExtensionPoint(_ extensionPointType: ExtensionPoint.Type, tokenSuccess: OAuthSwift.TokenSuccess? = nil, completion: @escaping (Result<Void, Error>) -> Void) {
|
||||
self.extensionPoint(for: extensionPointType, tokenSuccess: tokenSuccess) { result in
|
||||
switch result {
|
||||
case .success(let extensionPoint):
|
||||
self.activeExtensionPoints[extensionPoint.extensionPointID] = extensionPoint
|
||||
self.saveExtensionPointIDs()
|
||||
completion(.success(()))
|
||||
case .failure(let error):
|
||||
completion(.failure(error))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func deactivateExtensionPoint(_ extensionPointID: ExtensionPointIdentifer) {
|
||||
activeExtensionPoints[extensionPointID] = nil
|
||||
saveExtensionPointIDs()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private extension ExtensionPointManager {
|
||||
|
||||
func loadExtensionPoints() {
|
||||
if let extensionPointUserInfos = AppDefaults.shared.activeExtensionPointIDs {
|
||||
for extensionPointUserInfo in extensionPointUserInfos {
|
||||
if let extensionPointID = ExtensionPointIdentifer(userInfo: extensionPointUserInfo) {
|
||||
activeExtensionPoints[extensionPointID] = extensionPoint(for: extensionPointID)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func saveExtensionPointIDs() {
|
||||
AppDefaults.shared.activeExtensionPointIDs = activeExtensionPoints.keys.map({ $0.userInfo })
|
||||
NotificationCenter.default.post(name: .ActiveExtensionPointsDidChange, object: nil, userInfo: nil)
|
||||
}
|
||||
|
||||
func extensionPoint(for extensionPointType: ExtensionPoint.Type, tokenSuccess: OAuthSwift.TokenSuccess?, completion: @escaping (Result<ExtensionPoint, Error>) -> Void) {
|
||||
switch extensionPointType {
|
||||
default:
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
func extensionPoint(for extensionPointID: ExtensionPointIdentifer) -> ExtensionPoint? {
|
||||
switch extensionPointID {
|
||||
#if os(macOS)
|
||||
default:
|
||||
return nil
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
|
@ -10,40 +10,15 @@ import AppKit
|
|||
import RSCore
|
||||
import Articles
|
||||
|
||||
final class SendToMarsEditCommand: ExtensionPoint, SendToCommand {
|
||||
final class SendToMarsEditCommand: SendToCommand {
|
||||
|
||||
static var isSinglton = true
|
||||
static var isDeveloperBuildRestricted = false
|
||||
static var title = NSLocalizedString("MarsEdit", comment: "MarsEdit")
|
||||
static var image = AppAssets.extensionPointMarsEdit
|
||||
static var description: NSAttributedString = {
|
||||
let attrString = SendToMarsEditCommand.makeAttrString("This extension enables share menu functionality to send selected article text to MarsEdit. You need the MarsEdit application for this to work.")
|
||||
let range = NSRange(location: 81, length: 8)
|
||||
attrString.beginEditing()
|
||||
attrString.addAttribute(NSAttributedString.Key.link, value: "https://red-sweater.com/marsedit/", range: range)
|
||||
attrString.addAttribute(NSAttributedString.Key.foregroundColor, value: NSColor.systemBlue, range: range)
|
||||
attrString.endEditing()
|
||||
return attrString
|
||||
}()
|
||||
|
||||
let extensionPointID = ExtensionPointIdentifer.marsEdit
|
||||
|
||||
var title: String {
|
||||
return extensionPointID.extensionPointType.title
|
||||
}
|
||||
|
||||
var image: NSImage? {
|
||||
return appToUse()?.icon ?? nil
|
||||
}
|
||||
let title = "MarsEdit"
|
||||
let image: RSImage? = AppAssets.marsEditIcon
|
||||
|
||||
private let marsEditApps = [UserApp(bundleID: "com.red-sweater.marsedit4"), UserApp(bundleID: "com.red-sweater.marsedit")]
|
||||
|
||||
func canSendObject(_ object: Any?, selectedText: String?) -> Bool {
|
||||
|
||||
if let _ = appToUse() {
|
||||
return true
|
||||
}
|
||||
return false
|
||||
appToUse() != nil
|
||||
}
|
||||
|
||||
func sendObject(_ object: Any?, selectedText: String?) {
|
||||
|
|
|
@ -12,32 +12,10 @@ import RSCore
|
|||
|
||||
// Not undoable.
|
||||
|
||||
final class SendToMicroBlogCommand: ExtensionPoint, SendToCommand {
|
||||
final class SendToMicroBlogCommand: SendToCommand {
|
||||
|
||||
static var isSinglton = true
|
||||
static var isDeveloperBuildRestricted = false
|
||||
static var title: String = NSLocalizedString("Micro.blog", comment: "Micro.blog")
|
||||
static var image = AppAssets.extensionPointMicroblog
|
||||
static var description: NSAttributedString = {
|
||||
let attrString = SendToMicroBlogCommand.makeAttrString("This extension enables share menu functionality to send selected article text to Micro.blog. You need the Micro.blog application for this to work.")
|
||||
let range = NSRange(location: 81, length: 10)
|
||||
attrString.beginEditing()
|
||||
attrString.addAttribute(NSAttributedString.Key.link, value: "https://micro.blog", range: range)
|
||||
attrString.addAttribute(NSAttributedString.Key.foregroundColor, value: NSColor.systemBlue, range: range)
|
||||
attrString.endEditing()
|
||||
return attrString
|
||||
|
||||
}()
|
||||
|
||||
let extensionPointID = ExtensionPointIdentifer.microblog
|
||||
|
||||
var title: String {
|
||||
return extensionPointID.extensionPointType.title
|
||||
}
|
||||
|
||||
var image: NSImage? {
|
||||
return microBlogApp.icon
|
||||
}
|
||||
let title = "Micro.blog"
|
||||
let image: RSImage? = AppAssets.microblogIcon
|
||||
|
||||
private let microBlogApp = UserApp(bundleID: "blog.micro.mac")
|
||||
|
||||
|
|