From 9c4f96e6116b5228a20d74b9a50411e399e5995d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 18 Sep 2018 21:57:38 -0500 Subject: [PATCH 1/4] Modified window title to reflect the current sidebar selection. Issue #48 --- .../MainWindow/MainWindowController.swift | 78 ++++++++++++++++--- 1 file changed, 66 insertions(+), 12 deletions(-) diff --git a/NetNewsWire/MainWindow/MainWindowController.swift b/NetNewsWire/MainWindow/MainWindowController.swift index 5adbe168a..cedf0a2c4 100644 --- a/NetNewsWire/MainWindow/MainWindowController.swift +++ b/NetNewsWire/MainWindow/MainWindowController.swift @@ -19,14 +19,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { private let windowAutosaveName = NSWindow.FrameAutosaveName(rawValue: "MainWindow") static var didPositionWindowOnFirstRun = false - private var unreadCount: Int = 0 { + private var currentFeedOrFolder: DisplayNameProvider? = nil { didSet { - if unreadCount != oldValue { - updateWindowTitle() - } + updateWindowTitle() } } - + private var shareToolbarItem: NSToolbarItem? { return window?.toolbar?.existingItem(withIdentifier: .Share) } @@ -66,7 +64,9 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressDidChange(_:)), name: .AccountRefreshDidFinish, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(refreshProgressDidChange(_:)), name: .AccountRefreshProgressDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(sidebarSelectionDidChange(_:)), name: .SidebarSelectionDidChange, object: nil) NotificationCenter.default.addObserver(self, selector: #selector(unreadCountDidChange(_:)), name: .UnreadCountDidChange, object: nil) + NotificationCenter.default.addObserver(self, selector: #selector(displayNameDidChange(_:)), name: .DisplayNameDidChange, object: nil) DispatchQueue.main.async { self.updateWindowTitle() @@ -99,13 +99,48 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { CoalescingQueue.standard.add(self, #selector(makeToolbarValidate)) } - @objc func unreadCountDidChange(_ note: Notification) { - - if note.object is AccountManager { - unreadCount = AccountManager.shared.unreadCount + @objc func sidebarSelectionDidChange(_ note: Notification) { + + let selectedObjects = selectedObjectsInSidebar() + guard selectedObjects?.count == 1 else { + currentFeedOrFolder = nil + return } + + guard let displayNameProvider = selectedObjects?[0] as? DisplayNameProvider else { + currentFeedOrFolder = nil + return + } + + currentFeedOrFolder = displayNameProvider + + } + + @objc func unreadCountDidChange(_ note: Notification) { + updateWindowTitleIfNecessary(note.object) + } + + @objc func displayNameDidChange(_ note: Notification) { + updateWindowTitleIfNecessary(note.object) } + private func updateWindowTitleIfNecessary(_ object: Any?) { + + if let folder = currentFeedOrFolder as? Folder, let countNote = object as? Folder { + if folder == countNote { + updateWindowTitle() + return + } + } + + if let feed = currentFeedOrFolder as? Feed, let countNote = object as? Feed { + if feed == countNote { + updateWindowTitle() + } + } + + } + // MARK: - Toolbar @objc func makeToolbarValidate() { @@ -509,12 +544,31 @@ private extension MainWindowController { func updateWindowTitle() { - if unreadCount < 1 { + if currentFeedOrFolder == nil { window?.title = appDelegate.appName! + return } - else if unreadCount > 0 { - window?.title = "\(appDelegate.appName!) (\(unreadCount))" + + if let folder = currentFeedOrFolder as? Folder { + if folder.unreadCount < 1 { + window?.title = "\(folder.nameForDisplay)" + } + else { + window?.title = "\(folder.nameForDisplay) (\(folder.unreadCount))" + } + return } + + if let feed = currentFeedOrFolder as? Feed { + if feed.unreadCount < 1 { + window?.title = "\(feed.nameForDisplay)" + } + else { + window?.title = "\(feed.nameForDisplay) (\(feed.unreadCount))" + } + return + } + } func saveSplitViewState() { From 5fc1ce4389425dd7f4f6d0607d4bda51fe9a5c7d Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Tue, 18 Sep 2018 23:10:11 -0500 Subject: [PATCH 2/4] Updated window title display code to take into consideration pseudo feeds. Issue #48 --- .../MainWindow/MainWindowController.swift | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/NetNewsWire/MainWindow/MainWindowController.swift b/NetNewsWire/MainWindow/MainWindowController.swift index cedf0a2c4..f1dc9a498 100644 --- a/NetNewsWire/MainWindow/MainWindowController.swift +++ b/NetNewsWire/MainWindow/MainWindowController.swift @@ -19,7 +19,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { private let windowAutosaveName = NSWindow.FrameAutosaveName(rawValue: "MainWindow") static var didPositionWindowOnFirstRun = false - private var currentFeedOrFolder: DisplayNameProvider? = nil { + private var currentFeedOrFolder: AnyObject? = nil { didSet { updateWindowTitle() } @@ -107,12 +107,12 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { return } - guard let displayNameProvider = selectedObjects?[0] as? DisplayNameProvider else { + guard selectedObjects?[0] is DisplayNameProvider && selectedObjects?[0] is UnreadCountProvider else { currentFeedOrFolder = nil return } - currentFeedOrFolder = displayNameProvider + currentFeedOrFolder = selectedObjects?[0] } @@ -126,16 +126,17 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { private func updateWindowTitleIfNecessary(_ object: Any?) { - if let folder = currentFeedOrFolder as? Folder, let countNote = object as? Folder { - if folder == countNote { + if let folder = currentFeedOrFolder as? Folder, let noteObject = object as? Folder { + if folder == noteObject { updateWindowTitle() return } } - if let feed = currentFeedOrFolder as? Feed, let countNote = object as? Feed { - if feed == countNote { + if let feed = currentFeedOrFolder as? Feed, let noteObject = object as? Feed { + if feed == noteObject { updateWindowTitle() + return } } @@ -544,31 +545,30 @@ private extension MainWindowController { func updateWindowTitle() { - if currentFeedOrFolder == nil { + var displayName: String? = nil + var unreadCount: Int? = nil + + if let displayNameProvider = currentFeedOrFolder as? DisplayNameProvider { + displayName = displayNameProvider.nameForDisplay + } + + if let unreadCountProvider = currentFeedOrFolder as? UnreadCountProvider { + unreadCount = unreadCountProvider.unreadCount + } + + if displayName != nil { + if unreadCount ?? 0 > 0 { + window?.title = "\(displayName!) (\(unreadCount!))" + } + else { + window?.title = "\(displayName!)" + } + } + else { window?.title = appDelegate.appName! return } - if let folder = currentFeedOrFolder as? Folder { - if folder.unreadCount < 1 { - window?.title = "\(folder.nameForDisplay)" - } - else { - window?.title = "\(folder.nameForDisplay) (\(folder.unreadCount))" - } - return - } - - if let feed = currentFeedOrFolder as? Feed { - if feed.unreadCount < 1 { - window?.title = "\(feed.nameForDisplay)" - } - else { - window?.title = "\(feed.nameForDisplay) (\(feed.unreadCount))" - } - return - } - } func saveSplitViewState() { From cef22fc9e7367c258ff0549cad3f994990f909bd Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 19 Sep 2018 11:15:04 -0500 Subject: [PATCH 3/4] Made title window title work for PseudoFeeds. Issue #48 --- .../MainWindow/MainWindowController.swift | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/NetNewsWire/MainWindow/MainWindowController.swift b/NetNewsWire/MainWindow/MainWindowController.swift index f1dc9a498..823e31c88 100644 --- a/NetNewsWire/MainWindow/MainWindowController.swift +++ b/NetNewsWire/MainWindow/MainWindowController.swift @@ -102,12 +102,14 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { @objc func sidebarSelectionDidChange(_ note: Notification) { let selectedObjects = selectedObjectsInSidebar() + + // We can only meaninfully display one feed or folder at a time guard selectedObjects?.count == 1 else { currentFeedOrFolder = nil return } - guard selectedObjects?[0] is DisplayNameProvider && selectedObjects?[0] is UnreadCountProvider else { + guard selectedObjects?[0] is DisplayNameProvider else { currentFeedOrFolder = nil return } @@ -124,22 +126,31 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { updateWindowTitleIfNecessary(note.object) } - private func updateWindowTitleIfNecessary(_ object: Any?) { + private func updateWindowTitleIfNecessary(_ noteObject: Any?) { - if let folder = currentFeedOrFolder as? Folder, let noteObject = object as? Folder { + if let folder = currentFeedOrFolder as? Folder, let noteObject = noteObject as? Folder { if folder == noteObject { updateWindowTitle() return } } - if let feed = currentFeedOrFolder as? Feed, let noteObject = object as? Feed { + if let feed = currentFeedOrFolder as? Feed, let noteObject = noteObject as? Feed { if feed == noteObject { updateWindowTitle() return } } + // If we don't recognize the changed object, we will test it for identity instead + // of equality. This works well for us if the window display is displaying a + // PsuedoFeed object. + if let currentObject = currentFeedOrFolder, let noteObject = noteObject { + if currentObject === noteObject as AnyObject { + updateWindowTitle() + } + } + } // MARK: - Toolbar From 2abd4f34b409b40d7712fb42f7317b6202a0c605 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 19 Sep 2018 11:26:19 -0500 Subject: [PATCH 4/4] Made a comment clearer. Issue #48 --- NetNewsWire/MainWindow/MainWindowController.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NetNewsWire/MainWindow/MainWindowController.swift b/NetNewsWire/MainWindow/MainWindowController.swift index 823e31c88..42bef3427 100644 --- a/NetNewsWire/MainWindow/MainWindowController.swift +++ b/NetNewsWire/MainWindow/MainWindowController.swift @@ -143,7 +143,7 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { } // If we don't recognize the changed object, we will test it for identity instead - // of equality. This works well for us if the window display is displaying a + // of equality. This works well for us if the window title is displaying a // PsuedoFeed object. if let currentObject = currentFeedOrFolder, let noteObject = noteObject { if currentObject === noteObject as AnyObject {