From 36b53766d6c10175bc268a79ab8efcb2d9845d75 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 22 Mar 2020 15:39:37 -0500 Subject: [PATCH 1/2] Add view options and filter to timeline. Issue #1937 --- Mac/AppAssets.swift | 16 +++- Mac/Base.lproj/MainWindow.storyboard | 80 +++++++++++++++++- .../TimelineContainerViewController.swift | 58 ++++++++++++- .../filterActive.imageset/Contents.json | 15 ++++ .../filterActive.imageset/filterActive.pdf | Bin 0 -> 4139 bytes .../filterInactive.imageset/Contents.json | 15 ++++ .../filterInactive.pdf | Bin 0 -> 4216 bytes 7 files changed, 177 insertions(+), 7 deletions(-) create mode 100644 Mac/Resources/Assets.xcassets/filterActive.imageset/Contents.json create mode 100644 Mac/Resources/Assets.xcassets/filterActive.imageset/filterActive.pdf create mode 100644 Mac/Resources/Assets.xcassets/filterInactive.imageset/Contents.json create mode 100644 Mac/Resources/Assets.xcassets/filterInactive.imageset/filterInactive.pdf diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index 038dcfa39..c537ee21b 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -17,10 +17,6 @@ extension NSImage.Name { struct AppAssets { - static var timelineStar: RSImage! = { - return RSImage(named: .timelineStar) - }() - static var accountCloudKit: RSImage! = { return RSImage(named: "accountCloudKit") }() @@ -81,6 +77,14 @@ struct AppAssets { return RSImage(named: "faviconTemplateImage")! }() + static var filterActive: RSImage = { + return RSImage(named: "filterActive")! + }() + + static var filterInactive: RSImage = { + return RSImage(named: "filterInactive")! + }() + static var iconLightBackgroundColor: NSColor = { return NSColor(named: NSColor.Name("iconLightBackgroundColor"))! }() @@ -101,6 +105,10 @@ struct AppAssets { return IconImage(RSImage(named: NSImage.smartBadgeTemplateName)!) }() + static var timelineStar: RSImage! = { + return RSImage(named: .timelineStar) + }() + static var todayFeedImage: IconImage = { return IconImage(RSImage(named: NSImage.smartBadgeTemplateName)!) }() diff --git a/Mac/Base.lproj/MainWindow.storyboard b/Mac/Base.lproj/MainWindow.storyboard index c25cc2cbd..db2da075c 100644 --- a/Mac/Base.lproj/MainWindow.storyboard +++ b/Mac/Base.lproj/MainWindow.storyboard @@ -432,12 +432,87 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + @@ -503,6 +578,7 @@ + diff --git a/Mac/MainWindow/Timeline/TimelineContainerViewController.swift b/Mac/MainWindow/Timeline/TimelineContainerViewController.swift index 778c196cf..09008682b 100644 --- a/Mac/MainWindow/Timeline/TimelineContainerViewController.swift +++ b/Mac/MainWindow/Timeline/TimelineContainerViewController.swift @@ -19,6 +19,12 @@ protocol TimelineContainerViewControllerDelegate: class { final class TimelineContainerViewController: NSViewController { + @IBOutlet weak var viewOptionsPopUpButton: NSPopUpButton! + @IBOutlet weak var newestToOldestMenuItem: NSMenuItem! + @IBOutlet weak var oldestToNewestMenuItem: NSMenuItem! + @IBOutlet weak var groupByFeedMenuItem: NSMenuItem! + + @IBOutlet weak var readFilteredButton: NSButton! @IBOutlet var containerView: TimelineContainerView! var currentTimelineViewController: TimelineViewController? { @@ -52,12 +58,22 @@ final class TimelineContainerViewController: NSViewController { super.viewDidLoad() setRepresentedObjects(nil, mode: .regular) showTimeline(for: .regular) + updateViewOptionsPopUpButton() + + NotificationCenter.default.addObserver(self, selector: #selector(userDefaultsDidChange(_:)), name: UserDefaults.didChangeNotification, object: nil) } - + + // MARK: - Notifications + + @objc func userDefaultsDidChange(_ note: Notification) { + updateViewOptionsPopUpButton() + } + // MARK: - API func setRepresentedObjects(_ objects: [AnyObject]?, mode: TimelineSourceMode) { timelineViewController(for: mode).representedObjects = objects + updateReadFilterButton() } func showTimeline(for mode: TimelineSourceMode) { @@ -95,6 +111,7 @@ final class TimelineContainerViewController: NSViewController { func toggleReadFilter() { regularTimelineViewController.toggleReadFilter() + updateReadFilterButton() } // MARK: State Restoration @@ -105,6 +122,7 @@ final class TimelineContainerViewController: NSViewController { func restoreState(from state: [AnyHashable : Any]) { regularTimelineViewController.restoreState(from: state) + updateReadFilterButton() } } @@ -145,4 +163,42 @@ private extension TimelineContainerViewController { assertionFailure("Expected timelineViewController to match either regular or search timelineViewController, but it doesn’t.") return .regular // Should never get here. } + + func updateViewOptionsPopUpButton() { + let localizedTitle = NSLocalizedString("Sort %@", comment: "Sort") + + if AppDefaults.timelineSortDirection == .orderedAscending { + newestToOldestMenuItem.state = .off + oldestToNewestMenuItem.state = .on + let title = NSString.localizedStringWithFormat(localizedTitle as NSString, oldestToNewestMenuItem.title) as String + viewOptionsPopUpButton.setTitle(title) + } else { + newestToOldestMenuItem.state = .on + oldestToNewestMenuItem.state = .off + let title = NSString.localizedStringWithFormat(localizedTitle as NSString, newestToOldestMenuItem.title) as String + viewOptionsPopUpButton.setTitle(title) + } + + if AppDefaults.timelineGroupByFeed == true { + groupByFeedMenuItem.state = .on + } else { + groupByFeedMenuItem.state = .off + } + } + + func updateReadFilterButton() { + guard let isReadFiltered = regularTimelineViewController.isReadFiltered else { + readFilteredButton.isHidden = true + return + } + + readFilteredButton.isHidden = false + + if isReadFiltered { + readFilteredButton.image = AppAssets.filterActive + } else { + readFilteredButton.image = AppAssets.filterInactive + } + } + } diff --git a/Mac/Resources/Assets.xcassets/filterActive.imageset/Contents.json b/Mac/Resources/Assets.xcassets/filterActive.imageset/Contents.json new file mode 100644 index 000000000..6d8907a7a --- /dev/null +++ b/Mac/Resources/Assets.xcassets/filterActive.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "filterActive.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Mac/Resources/Assets.xcassets/filterActive.imageset/filterActive.pdf b/Mac/Resources/Assets.xcassets/filterActive.imageset/filterActive.pdf new file mode 100644 index 0000000000000000000000000000000000000000..68eb230b5c4a75b24abb7d215353d2a3455de17a GIT binary patch literal 4139 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 UR4sor8X+qK2aAYk7-)k32W9^wz5oCK literal 0 HcmV?d00001 diff --git a/Mac/Resources/Assets.xcassets/filterInactive.imageset/Contents.json b/Mac/Resources/Assets.xcassets/filterInactive.imageset/Contents.json new file mode 100644 index 000000000..93ba12c1b --- /dev/null +++ b/Mac/Resources/Assets.xcassets/filterInactive.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "filterInactive.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + }, + "properties" : { + "template-rendering-intent" : "template" + } +} \ No newline at end of file diff --git a/Mac/Resources/Assets.xcassets/filterInactive.imageset/filterInactive.pdf b/Mac/Resources/Assets.xcassets/filterInactive.imageset/filterInactive.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d6b6c9b2335471913a98e2715d59b243b412bc9 GIT binary patch literal 4216 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 Date: Sun, 22 Mar 2020 16:19:33 -0500 Subject: [PATCH 2/2] Add Feeds Read Filter button. --- Mac/Base.lproj/MainWindow.storyboard | 45 +++++++++++++++---- .../Sidebar/SidebarViewController.swift | 12 +++++ 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Mac/Base.lproj/MainWindow.storyboard b/Mac/Base.lproj/MainWindow.storyboard index db2da075c..48694b502 100644 --- a/Mac/Base.lproj/MainWindow.storyboard +++ b/Mac/Base.lproj/MainWindow.storyboard @@ -273,17 +273,42 @@ - + + + + + + + + + + + + - + - + - + @@ -389,18 +414,22 @@ + + + - + + @@ -426,7 +455,7 @@ - + @@ -470,7 +499,7 @@