NetNewsWire/Multiplatform/macOS/Preferences/MacPreferencesModel.swift

130 lines
3.0 KiB
Swift
Raw Normal View History

2020-07-12 08:07:52 +02:00
//
// MacPreferencesModel.swift
// Multiplatform macOS
//
// Created by Stuart Breckenridge on 12/7/20.
// Copyright © 2020 Ranchero Software. All rights reserved.
//
import Foundation
2020-07-12 12:53:37 +02:00
enum PreferencePane: Int, CaseIterable {
case general = 0
case accounts = 1
case advanced = 2
2020-07-12 08:07:52 +02:00
2020-07-12 12:53:37 +02:00
var description: String {
switch self {
case .general:
return "General"
case .accounts:
return "Accounts"
case .advanced:
return "Advanced"
2020-07-12 08:07:52 +02:00
}
}
2020-07-12 12:53:37 +02:00
}
class MacPreferencesModel: ObservableObject {
2020-07-12 08:07:52 +02:00
2020-07-12 12:53:37 +02:00
@Published var currentPreferencePane: PreferencePane = PreferencePane.general
@Published var rssReaders = Array(RSSReaderInfo.fetchRSSReaders(nil))
@Published var rssReaderSelection: Set<RSSReader> = RSSReaderInfo.fetchRSSReaders(nil)
2020-07-12 08:07:52 +02:00
2020-07-12 12:53:37 +02:00
}
// MARK:- RSS Readers
private extension MacPreferencesModel {
2020-07-12 08:07:52 +02:00
2020-07-12 12:53:37 +02:00
func prepareRSSReaders() {
// Top item should always be: NetNewsWire (this app)
// Additional items should be sorted alphabetically.
// Any older versions of NetNewsWire should be listed as: NetNewsWire (old version)
}
func registerAppWithBundleID(_ bundleID: String) {
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feed", to: bundleID)
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feeds", to: bundleID)
objectWillChange.send()
}
2020-07-12 08:07:52 +02:00
}
2020-07-12 12:53:37 +02:00
// MARK: - RSSReaderInfo
struct RSSReaderInfo {
let defaultRSSReaderBundleID: String?
let rssReaders: Set<RSSReader>
static let feedURLScheme = "feed:"
init() {
let defaultRSSReaderBundleID = NSWorkspace.shared.defaultAppBundleID(forURLScheme: RSSReaderInfo.feedURLScheme)
self.defaultRSSReaderBundleID = defaultRSSReaderBundleID
self.rssReaders = RSSReaderInfo.fetchRSSReaders(defaultRSSReaderBundleID)
}
static func fetchRSSReaders(_ defaultRSSReaderBundleID: String?) -> Set<RSSReader> {
let rssReaderBundleIDs = NSWorkspace.shared.bundleIDsForApps(forURLScheme: feedURLScheme)
var rssReaders = Set<RSSReader>()
if let defaultRSSReaderBundleID = defaultRSSReaderBundleID, let defaultReader = RSSReader(bundleID: defaultRSSReaderBundleID) {
rssReaders.insert(defaultReader)
}
rssReaderBundleIDs.forEach { (bundleID) in
if let reader = RSSReader(bundleID: bundleID) {
rssReaders.insert(reader)
}
}
return rssReaders
}
}
// MARK: - RSSReader
struct RSSReader: Hashable {
let bundleID: String
let name: String
let nameMinusAppSuffix: String
let path: String
init?(bundleID: String) {
guard let path = NSWorkspace.shared.urlForApplication(withBundleIdentifier: bundleID) else {
return nil
}
self.path = path.path
self.bundleID = bundleID
let name = (self.path as NSString).lastPathComponent
self.name = name
if name.hasSuffix(".app") {
self.nameMinusAppSuffix = name.stripping(suffix: ".app")
}
else {
self.nameMinusAppSuffix = name
}
}
// MARK: - Hashable
func hash(into hasher: inout Hasher) {
hasher.combine(bundleID)
}
// MARK: - Equatable
static func ==(lhs: RSSReader, rhs: RSSReader) -> Bool {
return lhs.bundleID == rhs.bundleID
}
}