Add a preference for the browser to use to open articles
- Selectable in General Preferences - Toolbar item now updates to show the browser's icon
This commit is contained in:
parent
0c2d057860
commit
1ab17b2574
|
@ -11,14 +11,26 @@ import RSWeb
|
||||||
|
|
||||||
struct Browser {
|
struct Browser {
|
||||||
|
|
||||||
static func open(_ urlString: String, invertPreference invert: Bool = false) {
|
static var defaultBrowser: MacWebBrowser? {
|
||||||
|
if let bundleID = AppDefaults.defaultBrowserID, let browser = MacWebBrowser(bundleIdentifier: bundleID) {
|
||||||
|
return browser
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
static func open(_ urlString: String) {
|
||||||
// Opens according to prefs.
|
// Opens according to prefs.
|
||||||
open(urlString, inBackground: invert ? !AppDefaults.openInBrowserInBackground : AppDefaults.openInBrowserInBackground)
|
open(urlString, inBackground: invert ? !AppDefaults.openInBrowserInBackground : AppDefaults.openInBrowserInBackground)
|
||||||
}
|
}
|
||||||
|
|
||||||
static func open(_ urlString: String, inBackground: Bool) {
|
static func open(_ urlString: String, inBackground: Bool) {
|
||||||
if let url = URL(string: urlString) {
|
if let url = URL(string: urlString) {
|
||||||
MacWebBrowser.openURL(url, inBackground: inBackground)
|
if let defaultBrowser = defaultBrowser {
|
||||||
|
defaultBrowser.openURL(url, inBackground: inBackground)
|
||||||
|
} else {
|
||||||
|
MacWebBrowser.openURL(url, inBackground: inBackground)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,11 +90,14 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil)
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil)
|
NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil)
|
||||||
|
|
||||||
|
NotificationCenter.default.addObserver(self, selector: #selector(defaultBrowserDidChange(_:)), name: .DefaultBrowserDidChange, object: nil)
|
||||||
|
NotificationCenter.default.addObserver(self, selector: #selector(defaultBrowserDidChange(_:)), name: NSApplication.willBecomeActiveNotification, object: nil)
|
||||||
|
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
self.updateWindowTitle()
|
self.updateWindowTitle()
|
||||||
|
self.updateOpenInBrowserToolbarItem()
|
||||||
}
|
}
|
||||||
|
|
||||||
defaultBrowserDidChange(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - API
|
// MARK: - API
|
||||||
|
@ -170,7 +173,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func defaultBrowserDidChange(_ note: Notification?) {
|
func updateOpenInBrowserToolbarItem() {
|
||||||
guard let item = self.window?.toolbar?.items.first(where: { $0.action == #selector(openArticleInBrowser(_:)) }) else {
|
guard let item = self.window?.toolbar?.items.first(where: { $0.action == #selector(openArticleInBrowser(_:)) }) else {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -196,9 +199,13 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations {
|
||||||
|
|
||||||
button.image = icon
|
button.image = icon
|
||||||
|
|
||||||
let format = NSLocalizedString("Open in $@", comment: "Open in Browser toolbar item tooltip format")
|
let format = NSLocalizedString("Open in %@", comment: "Open in Browser toolbar item tooltip format")
|
||||||
item.toolTip = String(format: format, browserName)
|
item.toolTip = String(format: format, browserName)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@objc func defaultBrowserDidChange(_ note: Notification?) {
|
||||||
|
updateOpenInBrowserToolbarItem()
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Toolbar
|
// MARK: - Toolbar
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,12 @@
|
||||||
|
|
||||||
import AppKit
|
import AppKit
|
||||||
import RSCore
|
import RSCore
|
||||||
|
import RSWeb
|
||||||
|
|
||||||
final class GeneralPreferencesViewController: NSViewController {
|
final class GeneralPreferencesViewController: NSViewController {
|
||||||
|
|
||||||
@IBOutlet var defaultRSSReaderPopup: NSPopUpButton!
|
@IBOutlet var defaultRSSReaderPopup: NSPopUpButton!
|
||||||
|
@IBOutlet var defaultBrowserPopup: NSPopUpButton!
|
||||||
private var rssReaderInfo = RSSReaderInfo()
|
private var rssReaderInfo = RSSReaderInfo()
|
||||||
|
|
||||||
public override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
|
public override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) {
|
||||||
|
@ -47,6 +49,16 @@ final class GeneralPreferencesViewController: NSViewController {
|
||||||
registerAppWithBundleID(bundleID)
|
registerAppWithBundleID(bundleID)
|
||||||
updateUI()
|
updateUI()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@IBAction func browserPopUpDidChangeValue(_ sender: Any?) {
|
||||||
|
guard let menuItem = defaultBrowserPopup.selectedItem else {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let bundleID = menuItem.representedObject as? String
|
||||||
|
AppDefaults.defaultBrowserID = bundleID
|
||||||
|
NotificationCenter.default.post(name: .DefaultBrowserDidChange, object: nil)
|
||||||
|
updateUI()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private
|
// MARK: - Private
|
||||||
|
@ -60,6 +72,7 @@ private extension GeneralPreferencesViewController {
|
||||||
func updateUI() {
|
func updateUI() {
|
||||||
rssReaderInfo = RSSReaderInfo()
|
rssReaderInfo = RSSReaderInfo()
|
||||||
updateRSSReaderPopup()
|
updateRSSReaderPopup()
|
||||||
|
updateBrowserPopup()
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateRSSReaderPopup() {
|
func updateRSSReaderPopup() {
|
||||||
|
@ -123,6 +136,37 @@ private extension GeneralPreferencesViewController {
|
||||||
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feed", to: bundleID)
|
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feed", to: bundleID)
|
||||||
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feeds", to: bundleID)
|
NSWorkspace.shared.setDefaultAppBundleID(forURLScheme: "feeds", to: bundleID)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateBrowserPopup() {
|
||||||
|
let menu = defaultBrowserPopup.menu!
|
||||||
|
let allBrowsers = MacWebBrowser.sortedBrowsers()
|
||||||
|
|
||||||
|
menu.removeAllItems()
|
||||||
|
|
||||||
|
let defaultBrowser = MacWebBrowser.default
|
||||||
|
|
||||||
|
let defaultBrowserFormat = NSLocalizedString("System Default (%@)", comment: "Default browser item title format")
|
||||||
|
let defaultBrowserTitle = String(format: defaultBrowserFormat, defaultBrowser.name!)
|
||||||
|
let item = NSMenuItem(title: defaultBrowserTitle, action: nil, keyEquivalent: "")
|
||||||
|
let icon = defaultBrowser.icon!
|
||||||
|
icon.size = NSSize(width: 16.0, height: 16.0)
|
||||||
|
item.image = icon
|
||||||
|
|
||||||
|
menu.addItem(item)
|
||||||
|
menu.addItem(NSMenuItem.separator())
|
||||||
|
|
||||||
|
for browser in allBrowsers {
|
||||||
|
let item = NSMenuItem(title: browser.name!, action: nil, keyEquivalent: "")
|
||||||
|
item.representedObject = browser.bundleIdentifier
|
||||||
|
|
||||||
|
let icon = browser.icon!
|
||||||
|
icon.size = NSSize(width: 16.0, height: 16.0)
|
||||||
|
item.image = browser.icon
|
||||||
|
menu.addItem(item)
|
||||||
|
}
|
||||||
|
|
||||||
|
defaultBrowserPopup.selectItem(at: defaultBrowserPopup.indexOfItem(withRepresentedObject: AppDefaults.defaultBrowserID))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import Articles
|
||||||
extension Notification.Name {
|
extension Notification.Name {
|
||||||
static let InspectableObjectsDidChange = Notification.Name("TimelineSelectionDidChangeNotification")
|
static let InspectableObjectsDidChange = Notification.Name("TimelineSelectionDidChangeNotification")
|
||||||
static let UserDidAddFeed = Notification.Name("UserDidAddFeedNotification")
|
static let UserDidAddFeed = Notification.Name("UserDidAddFeedNotification")
|
||||||
|
static let DefaultBrowserDidChange = Notification.Name("DefaultBrowserDidChangeNotification")
|
||||||
|
|
||||||
#if !MAC_APP_STORE
|
#if !MAC_APP_STORE
|
||||||
static let WebInspectorEnabledDidChange = Notification.Name("WebInspectorEnabledDidChange")
|
static let WebInspectorEnabledDidChange = Notification.Name("WebInspectorEnabledDidChange")
|
||||||
|
|
Loading…
Reference in New Issue