From d21924ab2054f8deccc41c740c2f38bd47f3fe6e Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 25 Sep 2018 19:20:43 -0500 Subject: [PATCH] Added "Select feed in Sidebar" to timeline content menu. Issue #225 --- NetNewsWire/AppNotifications.swift | 1 + .../Sidebar/SidebarViewController.swift | 9 +++++++ ...melineViewController+ContextualMenus.swift | 26 ++++++++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/NetNewsWire/AppNotifications.swift b/NetNewsWire/AppNotifications.swift index cb59c1223..0ac0eef3e 100644 --- a/NetNewsWire/AppNotifications.swift +++ b/NetNewsWire/AppNotifications.swift @@ -15,6 +15,7 @@ extension Notification.Name { static let TimelineSelectionDidChange = Notification.Name("TimelineSelectionDidChangeNotification") static let UserDidAddFeed = Notification.Name("UserDidAddFeedNotification") + static let UserDidRequestSidebarSelection = Notification.Name("UserDidRequestSidebarSelectionNotification") // Sent by DetailViewController when mouse hovers over link in web view. static let MouseDidEnterLink = Notification.Name("MouseDidEnterLinkNotification") diff --git a/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift b/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift index 35cb0b8ac..86d8f111a 100644 --- a/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift +++ b/NetNewsWire/MainWindow/Sidebar/SidebarViewController.swift @@ -54,6 +54,7 @@ import RSCore NotificationCenter.default.addObserver(self, selector: #selector(faviconDidBecomeAvailable(_:)), name: .FaviconDidBecomeAvailable, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(feedSettingDidChange(_:)), name: .FeedSettingDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(userDidRequestSidebarSelection(_:)), name: .UserDidRequestSidebarSelection, object: nil) outlineView.reloadData() @@ -120,6 +121,14 @@ import RSCore configureCellsForRepresentedObject(object as AnyObject) } + @objc func userDidRequestSidebarSelection(_ note: Notification) { + + guard let feed = note.userInfo?[UserInfoKey.feed] else { + return + } + revealAndSelectRepresentedObject(feed as AnyObject) + } + // MARK: - Actions @IBAction func delete(_ sender: AnyObject?) { diff --git a/NetNewsWire/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift b/NetNewsWire/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift index d1c3b98b9..6e8c7b64b 100644 --- a/NetNewsWire/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift +++ b/NetNewsWire/MainWindow/Timeline/TimelineViewController+ContextualMenus.swift @@ -71,6 +71,19 @@ extension TimelineViewController { markArticles(articles, starred: false) } + @objc func selectFeedInSidebarFromContextualMenu(_ sender: Any?) { + + guard let menuItem = sender as? NSMenuItem, let feed = menuItem.representedObject as? Feed else { + return + } + + var userInfo = UserInfoDictionary() + userInfo[UserInfoKey.feed] = feed + + NotificationCenter.default.post(name: .UserDidRequestSidebarSelection, object: self, userInfo: userInfo) + + } + @objc func openInBrowserFromContextualMenu(_ sender: Any?) { guard let menuItem = sender as? NSMenuItem, let urlString = menuItem.representedObject as? String else { @@ -145,9 +158,15 @@ private extension TimelineViewController { if articles.count > 0 { menu.addItem(markOlderReadMenuItem(articles)) } - menu.addSeparatorIfNeeded() + menu.addSeparatorIfNeeded() + + if articles.count == 1, let feed = articles.first!.feed { + menu.addItem(selectFeedInSidebar(feed)) + } + if articles.count == 1, let link = articles.first!.preferredLink { + menu.addSeparatorIfNeeded() menu.addItem(openInBrowserMenuItem(link)) } @@ -210,6 +229,11 @@ private extension TimelineViewController { return menuItem(NSLocalizedString("Mark Older as Read", comment: "Command"), #selector(markOlderArticlesReadFromContextualMenu(_:)), articles) } + func selectFeedInSidebar(_ feed: Feed) -> NSMenuItem { + let menuText = "Select “\(feed.nameForDisplay)” in Sidebar" + return menuItem(NSLocalizedString(menuText, comment: "Command"), #selector(selectFeedInSidebarFromContextualMenu(_:)), feed) + } + func openInBrowserMenuItem(_ urlString: String) -> NSMenuItem { return menuItem(NSLocalizedString("Open in Browser", comment: "Command"), #selector(openInBrowserFromContextualMenu(_:)), urlString)