From afe8d23365c6a84959a59e5dd06ac7889282aad2 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 9 Aug 2020 06:02:48 -0500 Subject: [PATCH] Add separator for timeline and make buttons stateful --- Mac/AppAssets.swift | 20 +++ Mac/Base.lproj/MainWindow.storyboard | 153 +++++++++++++++++- Mac/MainWindow/MainWindowController.swift | 24 ++- .../markAllAsRead.imageset/Contents.json | 16 ++ .../markAllAsRead.imageset/markAllAsRead.pdf | Bin 0 -> 4167 bytes 5 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 Mac/Resources/Assets.xcassets/markAllAsRead.imageset/Contents.json create mode 100644 Mac/Resources/Assets.xcassets/markAllAsRead.imageset/markAllAsRead.pdf diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index e9be4a115..6051eba83 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -127,10 +127,30 @@ struct AppAssets { } }() + @available(macOS 10.16, *) + static var readClosedImage: RSImage = { + return NSImage(systemSymbolName: "largecircle.fill.circle", accessibilityDescription: nil)! + }() + + @available(macOS 10.16, *) + static var readOpenImage: RSImage = { + return NSImage(systemSymbolName: "circle", accessibilityDescription: nil)! + }() + static var searchFeedImage: IconImage = { return IconImage(RSImage(named: NSImage.smartBadgeTemplateName)!, isSymbol: true) }() + @available(macOS 10.16, *) + static var starClosedImage: RSImage = { + return NSImage(systemSymbolName: "star.fill", accessibilityDescription: nil)! + }() + + @available(macOS 10.16, *) + static var starOpenImage: RSImage = { + return NSImage(systemSymbolName: "star", accessibilityDescription: nil)! + }() + static var starredFeedImage: IconImage = { if #available(macOS 10.16, *) { let image = NSImage(systemSymbolName: "star.fill", accessibilityDescription: nil)! diff --git a/Mac/Base.lproj/MainWindow.storyboard b/Mac/Base.lproj/MainWindow.storyboard index bc3b820a8..475dda607 100644 --- a/Mac/Base.lproj/MainWindow.storyboard +++ b/Mac/Base.lproj/MainWindow.storyboard @@ -4,6 +4,7 @@ + @@ -269,12 +270,151 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + @@ -289,7 +429,7 @@ - + @@ -663,13 +803,20 @@ + + + + + + + diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 4870d8207..42eac5243 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -62,6 +62,11 @@ class MainWindowController : NSWindowController, NSUserInterfaceValidations { sharingServicePickerDelegate = SharingServicePickerDelegate(self.window) if #available(macOS 10.16, *) { + DispatchQueue.main.async { + if self.window?.toolbar?.existingItem(withIdentifier: .TrackingSeparator) == nil { + self.window?.toolbar?.insertItem(withItemIdentifier: .TrackingSeparator, at: 2) + } + } } else { if !AppDefaults.shared.showTitleOnMainWindow { window?.titleVisibility = .hidden @@ -687,12 +692,20 @@ extension MainWindowController : ScriptingMainWindowController { // MARK: - NSToolbarDelegate extension NSToolbarItem.Identifier { + static let TrackingSeparator = NSToolbarItem.Identifier("trackingSeparator") static let Share = NSToolbarItem.Identifier("share") static let Search = NSToolbarItem.Identifier("search") } extension MainWindowController: NSToolbarDelegate { + func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem? { + if #available(macOS 10.16, *), itemIdentifier == .TrackingSeparator { + return NSTrackingSeparatorToolbarItem(identifier: .TrackingSeparator, splitView: splitViewController!.splitView, dividerIndex: 1) + } + return nil + } + func toolbarWillAddItem(_ notification: Notification) { guard let item = notification.userInfo?["item"] as? NSToolbarItem else { return @@ -831,6 +844,10 @@ private extension MainWindowController { menuItem.title = commandName } + if #available(macOS 10.16, *), let toolbarItem = item as? NSToolbarItem, let button = toolbarItem.view as? NSButton { + button.image = markingRead ? AppAssets.readClosedImage : AppAssets.readOpenImage + } + return result } @@ -908,15 +925,16 @@ private extension MainWindowController { if let toolbarItem = item as? NSToolbarItem { toolbarItem.toolTip = commandName -// if let button = toolbarItem.view as? NSButton { -// button.image = NSImage(named: starring ? .star : .unstar) -// } } if let menuItem = item as? NSMenuItem { menuItem.title = commandName } + if #available(macOS 10.16, *), let toolbarItem = item as? NSToolbarItem, let button = toolbarItem.view as? NSButton { + button.image = starring ? AppAssets.starOpenImage : AppAssets.starClosedImage + } + return result } diff --git a/Mac/Resources/Assets.xcassets/markAllAsRead.imageset/Contents.json b/Mac/Resources/Assets.xcassets/markAllAsRead.imageset/Contents.json new file mode 100644 index 000000000..9937c57c5 --- /dev/null +++ b/Mac/Resources/Assets.xcassets/markAllAsRead.imageset/Contents.json @@ -0,0 +1,16 @@ +{ + "images" : [ + { + "filename" : "markAllAsRead.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "preserves-vector-representation" : true, + "template-rendering-intent" : "template" + } +} diff --git a/Mac/Resources/Assets.xcassets/markAllAsRead.imageset/markAllAsRead.pdf b/Mac/Resources/Assets.xcassets/markAllAsRead.imageset/markAllAsRead.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90b75e877e26f8c3dfad460418fdd6798bae9e74 GIT binary patch literal 4167 zcmai&2{@G9`^OPs2)$V%<;iPbXP6nLvhSoJkzF%pFxDDl&zdES>{$vSBnCwh#=c~E zO|m5+F(f3BUH!+q{N8^5_xHPg&-Gl-bFTZ`=RW5-=X+n*=YB*@v~^`6a*80)4(eCx zQpx&*R~=m-MF0$VpIIul#~7!(1hs)D=; zcr3~TX(fZSQq~w!Md(OiyjtZMlY)x- zOsA7DI;L1#0nq^|*VbBm{vDDQKhtl!C8K5}|=|S^Q%U;* ztnC}`cDAfE#xPyF!E=s>Nk(FLxvtCdJ_Ej;bU&*bl~T~T^{DjhC4+R)(cf@)F&_4`XUY-P6zc+9w*2{-7{4?HR|6k%Y z!FxHHVF`c@EvU9GUuLTg4HV!Ih5wu=KPN}dUB4@4Tqa$urrJ8xNunF;Dhakem3`1{ zH9fviJ2vjT8a!4{XR;r`*ha9V4}<1ga(`ZGwf*HpU&j{1NiKR0OZt`>CnrX|ZEc3( zeX>ec)+7C{>dnt`VVH&qnPw9)@6jKj$-+unB1h>!IwSB4A!2+~hBUM4PJV?SjJ+G_ zk_yof1>Sttf^y;6j!O5kjR*Cn<@I^v98 z7;AtoK0cO-qkeqpw7XVqwu6R9r?nf;-1fgn*{ET^1Lg~>^t!7) z4R{o>I@IElVk7PTes+!w3g%#o>&I*h0{2@_yUhK(7QVHpkLIQy(^w;8T^gb;gj*)b zVL*|gBQv2V;o{8vAvtc`EolKNNTPlnCOO_*px|S@b*0eQ~EJf&#pLI(Xe#lU&lbyuz@YIV0 z{p1^SM~=qiqcTtOcJa@~SP^H?7N}9QA$TOyG1KBA-#pxjOEG*Wq6j_mq}WotT+Npi ze*9j7Y=_0Q#A`NH8BdP9K`oyb&Vk%odgn&X!chA-3u)C07NE+2d3Ic)hjvp&ZfN!AWF43^hRRm@n= znC&5@mLB8ww>GbJ|k1v{gjc||TJob2u90t3JxuRUhUH3-h$`U9g6u(?bjsx_^+Y&HOZxM)H>O4wa^> z`KqRQq`ZgCdd)VWy)CbRx7Xq|?zKM3kIQdH<)R8_9DjYBTsA0GXkB=|OWE=Hjkq<{ zSsSsc*c^itgM=Pqvp2(2SFY7lYAEb(^Dbi0GFU@*LDf4et8(4Z2Z;6yFK-qG+}n|6 zQ;D~X&*7cqb&y$+F_T@A5weoBVzTt8`Bb&r{!sa(h zgXX@LZ`1`=7`q+MuJ=hf8ECoKazLHAe~7;yqbyoSTdSi%Kk?=3mwNFDyhgl!x;=WG zIwN|^?K4MW_I}lX!f(5qV3)4<+u1} z)Y3jmMUq3S)eWgLr-V*VbNz@t(N;>mSh3;o!jH;0mf8@rm$J|$y^yeGw~gITX3U6u z8ab$)(P0}2Uy=N~3<^=Qeac=Vc9=+cR`|QR+iW;r3op^D{&#tw8=3CQJq6griKmMgp zw=V&EYT7eyYS{FFX;srTm+IB|F3lI3rZZ&O0UHkYPIn&nl}V>+lIuiIgSbl-=# z4@l8>DNEBTrTy9qeCY&vZ{Iwl%(((#cRn~Ln7k5wkT80tA@{DsatLnm z*{TP5@p|>a-C5F|CZ^zpUAsN`sm=Oe>YX1sr;fxQ-Tf@r6!gRXoyubH)WINgDW|TJ95=d?7nhOS$n?AfHNTsz`(ORVJe=mIw<6c~{>jRR zsCvk@G@dok($YkEV==%Xt6m1|{=(lwUj7Sz|Hf%=K;9UO!J#z0`~e#<%>@Dl6u`gp zun!HgA%MIQ4&zPZ3q?S=dpZ9B>fV16`riPq{L=s$fMa|dY4xLo z2g(s?23TP6-Z(E$00NeSzyVtcO&^>)hPDz7m?BgWXDbPq`k?THK!8T;zXQHML6QdP zwDOWb8>LO-Z;*ucIR&r+7_1CNfDte_M9CTq7N^}bKVvVNqB|1cK(4;xqsLEG_v zAFBw5ApU8C|1>WFkHWcQ@xRySX1G8sfS?sfUS0&?@T_RXl7Xj_7jSqChiz@zsa{aV zq8**Ea3!oFL`lifNm&66gM*bYU