From 35bb8afab7a302e9eca0fb0c939ef004a3e812a9 Mon Sep 17 00:00:00 2001 From: Ethan Wong Date: Fri, 4 Mar 2022 22:17:22 +0800 Subject: [PATCH] Implement the filter bar for podcasts. --- Assets/icons.sketch | Bin 382674 -> 388533 bytes Doughnut.xcodeproj/project.pbxproj | 8 + .../PodcastFilter.imageset/Contents.json | 15 ++ .../PodcastFilter@2x.png | Bin 0 -> 1042 bytes .../Contents.json | 15 ++ .../PodcastFilterActive@2x.png | Bin 0 -> 843 bytes Doughnut/Base.lproj/Main.storyboard | 39 +++-- Doughnut/PodcastSearchFiled.swift | 156 ++++++++++++++++++ Doughnut/Utilities/NSImage+Tint.swift | 44 +++++ Doughnut/Utilities/NSMenu+Extensions.swift | 9 + .../PodcastViewController.swift | 62 ++++--- Doughnut/Views/SortingMenuProvider.swift | 7 +- 12 files changed, 305 insertions(+), 50 deletions(-) create mode 100644 Doughnut/Assets.xcassets/PodcastFilter.imageset/Contents.json create mode 100644 Doughnut/Assets.xcassets/PodcastFilter.imageset/PodcastFilter@2x.png create mode 100644 Doughnut/Assets.xcassets/PodcastFilterActive.imageset/Contents.json create mode 100644 Doughnut/Assets.xcassets/PodcastFilterActive.imageset/PodcastFilterActive@2x.png create mode 100644 Doughnut/PodcastSearchFiled.swift create mode 100644 Doughnut/Utilities/NSImage+Tint.swift diff --git a/Assets/icons.sketch b/Assets/icons.sketch index 2dd81bada559218156f64ff50e5e48a441a0582c..5ed2f450517d49a7d75f6c524834ec25fb60ea24 100644 GIT binary patch delta 37930 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 delta 32013 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 PF(L!f*(|VWAIyIPeWn9b diff --git a/Doughnut.xcodeproj/project.pbxproj b/Doughnut.xcodeproj/project.pbxproj index 8257c35..872600e 100644 --- a/Doughnut.xcodeproj/project.pbxproj +++ b/Doughnut.xcodeproj/project.pbxproj @@ -12,8 +12,10 @@ 5E0288D17E6858855545E02E /* Pods_DoughnutTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6BE29F62CFF7B122D5C39998 /* Pods_DoughnutTests.framework */; }; 6B0233BD27B2CA6500500E28 /* ControlMenuProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B0233BC27B2CA6500500E28 /* ControlMenuProvider.swift */; }; 6B0605C52788627D00A8A91E /* NSMenu+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B0605C42788627D00A8A91E /* NSMenu+Extensions.swift */; }; + 6B36624627CFB339008E1CA5 /* NSImage+Tint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B36624527CFB339008E1CA5 /* NSImage+Tint.swift */; }; 6B3A75F8278F44F500F25578 /* NSView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B3A75F7278F44F500F25578 /* NSView+Extensions.swift */; }; 6B94DF4C278968F500BCB149 /* NSTableView+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B94DF4B278968F500BCB149 /* NSTableView+Extensions.swift */; }; + 6B96F45D27CE6F10001941BA /* PodcastSearchFiled.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B96F45C27CE6F10001941BA /* PodcastSearchFiled.swift */; }; 6B9C30BB27B5708300D462BE /* BaseTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B9C30BA27B5708300D462BE /* BaseTableView.swift */; }; 6BA21C4F279D690700CD3672 /* WindowController+Toolbar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BA21C4E279D690700CD3672 /* WindowController+Toolbar.swift */; }; 6BB5771E278602B400DFF99F /* MainMenu.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6BB5771C278602B400DFF99F /* MainMenu.storyboard */; }; @@ -101,10 +103,12 @@ 5E1DC050EEE121FD033C44DF /* Pods-Doughnut.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Doughnut.debug.xcconfig"; path = "Pods/Target Support Files/Pods-Doughnut/Pods-Doughnut.debug.xcconfig"; sourceTree = ""; }; 6B0233BC27B2CA6500500E28 /* ControlMenuProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ControlMenuProvider.swift; sourceTree = ""; }; 6B0605C42788627D00A8A91E /* NSMenu+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSMenu+Extensions.swift"; sourceTree = ""; }; + 6B36624527CFB339008E1CA5 /* NSImage+Tint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSImage+Tint.swift"; sourceTree = ""; }; 6B3A75F7278F44F500F25578 /* NSView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSView+Extensions.swift"; sourceTree = ""; }; 6B3ACC982773555700CF1EF1 /* .swiftlint.yml */ = {isa = PBXFileReference; lastKnownFileType = text.yaml; path = .swiftlint.yml; sourceTree = ""; }; 6B730B732767A90900FB5F84 /* Doughnut-Release.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "Doughnut-Release.entitlements"; sourceTree = ""; }; 6B94DF4B278968F500BCB149 /* NSTableView+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "NSTableView+Extensions.swift"; sourceTree = ""; }; + 6B96F45C27CE6F10001941BA /* PodcastSearchFiled.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PodcastSearchFiled.swift; sourceTree = ""; }; 6B9C30BA27B5708300D462BE /* BaseTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTableView.swift; sourceTree = ""; }; 6BA21C4E279D690700CD3672 /* WindowController+Toolbar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WindowController+Toolbar.swift"; sourceTree = ""; }; 6BB5771D278602B400DFF99F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainMenu.storyboard; sourceTree = ""; }; @@ -237,6 +241,7 @@ 6B0605C42788627D00A8A91E /* NSMenu+Extensions.swift */, 6B94DF4B278968F500BCB149 /* NSTableView+Extensions.swift */, 6B3A75F7278F44F500F25578 /* NSView+Extensions.swift */, + 6B36624527CFB339008E1CA5 /* NSImage+Tint.swift */, ); name = AppKit; sourceTree = ""; @@ -373,6 +378,7 @@ 6B0233BC27B2CA6500500E28 /* ControlMenuProvider.swift */, 832A04331F76EBDC00C92D25 /* WindowController.swift */, 6BA21C4E279D690700CD3672 /* WindowController+Toolbar.swift */, + 6B96F45C27CE6F10001941BA /* PodcastSearchFiled.swift */, 832BB7511F95184700988AE8 /* Doughnut-Bridging-Header.h */, 838257D11F759F6F00DB4FD1 /* Assets.xcassets */, 831EBAD927CC11E700F212B4 /* Credits.rtf */, @@ -788,6 +794,7 @@ 83659AB81F7D8A0300E09833 /* Podcast.swift in Sources */, 837D52BE1F8E622200C17514 /* TasksViewController.swift in Sources */, 8379899B1F81616C00234577 /* SeekSlider.swift in Sources */, + 6B36624627CFB339008E1CA5 /* NSImage+Tint.swift in Sources */, 837068131F7BBD63007FE973 /* EpisodeCellView.swift in Sources */, 832FF90B1F8D60430065E593 /* DownloadManager.swift in Sources */, 83667DF41F76D22600F1ABC0 /* DetailViewController.swift in Sources */, @@ -803,6 +810,7 @@ 83235C012009472F00BC356F /* PrefGeneralViewController.swift in Sources */, 83235BFE2009472900BC356F /* Preference.swift in Sources */, 83FB4EB81F7BD9A1001CD842 /* Library.swift in Sources */, + 6B96F45D27CE6F10001941BA /* PodcastSearchFiled.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Doughnut/Assets.xcassets/PodcastFilter.imageset/Contents.json b/Doughnut/Assets.xcassets/PodcastFilter.imageset/Contents.json new file mode 100644 index 0000000..4a4d59d --- /dev/null +++ b/Doughnut/Assets.xcassets/PodcastFilter.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "PodcastFilter@2x.png", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Doughnut/Assets.xcassets/PodcastFilter.imageset/PodcastFilter@2x.png b/Doughnut/Assets.xcassets/PodcastFilter.imageset/PodcastFilter@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..2d8bfd04d5896d4eac74638e7f310552952e1a47 GIT binary patch literal 1042 zcmV+t1nv8YP)Px#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91AOHXW0N-OZ{Qv+1d`Uz>RA>e5n7M0IQ51*cUWgGl zh`WV~hEysxNnz(o(14&sh}u|LYT;H}2>t;g38*Ndq7uQwzNahD$-ko>Pz4x5Eztq%JRqcUl4~*s>7?Uyhao9IPGc>^*sDlYm z3H8zF2Y3fva22|t9|m15)c6d3k8t!+UrSOcGoY55&cLQzjds9exCXDm5pX0bA^o2X z%V0gMf}l7@DnyvFyugRx}N3ao#Dh4;mjoWZ*XxqNN1;+}B{hFbe+ zK;MkTm`c`VEG_678Xr??V=g~y;8A;>aswMmd2EM0%$N!kcM43w>Jv-?*L^z-l;{2- zi0--rZHoPNS-DxAC}uQBc{{1c7~B(P!dED&E#x{ z#uyocu^5xFPI86&NxC<}9b-Wp(GI)J7 zU$#M#ZjzyY#+IkCdB5_1SRhSHG06HIP)nHwX%&RJYDAC0T~ykUP;vCN=j|E@qY}*v=_e!} zg&$=+=TgR*;M19O5H3QRc4Kf7dZDCa&1iAt!CM!hO~!|MX4e>b>sS5@tSY7bOPx#L}ge>W=%~1DgXcg2mk?xX#fNO00031000^Q000001E2u_0{{R30RRC20H6W@ z1ONa40RR91K%fHv1ONa40RR91AOHXW0N-OZ{Qv+0wMj%lRA>e5n9WO6Q5c6!ivqDW zEhH16+yu4h!$sp_+J}&90|%1+jfiSn%ZR{o;kplzmLudY+A2kU6qxiu5G@oleSX2< z@ytE_(@{LVgho%?j!!Ww_L|hg=y|Z6H%ncyD~Eql zC!^j%vn1<^Q#mM?XpJ+%<+Rz_l}nV)WBmtQiGHK+VwA_-#s{fh1DF4-+m(xQ3f40$ z(}I`^_T)CyD_F0uwCiNqr<|&kbPnjk>MIbDy_^&j*vd2Gz?GgOY44UX~* z?Vn%-e#3RJrT!u;fKI93L8nuff^vJn=(HI(`(9xidkog$M1h-rlFIL~ISEobJO$HE zcm5PeTFMW>>`yA+m$4~1wxxlgdWWI*gBbn9Si$?GyHy4)1MT7^m;gx=cm;IlE6Lxa z9Id1!pq)8X+Qf9o(A^4=f*pX%A;#F8h8ZY=CanZtKzI8C$loKl0U-*?tx+~X^ATPo zyFM#JCI1*qJ72kK6O<*kkKacOHe4mOv%! zaSEfAisx5J%tG1{I7`2l!G7oo7mZmie`9R<&tc6%56nY79@D+JhGJI^HR%|mTlOz8 zbLNJr{C9tfrfq^|@|AK2g#rx0An3!R8)Cl)7?O!L@KU$G#WRUGcaqOQJ_8Lk1Kacs V2K{q4+fV=i002ovPDHLkV1khuY_$LY literal 0 HcmV?d00001 diff --git a/Doughnut/Base.lproj/Main.storyboard b/Doughnut/Base.lproj/Main.storyboard index 4a401cd..561041d 100644 --- a/Doughnut/Base.lproj/Main.storyboard +++ b/Doughnut/Base.lproj/Main.storyboard @@ -460,15 +460,15 @@ Gw - + - + + + + + + + + + + + + - + - + @@ -507,7 +518,8 @@ Gw - + + @@ -571,19 +583,6 @@ Gw - - - - - - - - - - - - - diff --git a/Doughnut/PodcastSearchFiled.swift b/Doughnut/PodcastSearchFiled.swift new file mode 100644 index 0000000..ff7931e --- /dev/null +++ b/Doughnut/PodcastSearchFiled.swift @@ -0,0 +1,156 @@ +/* + * Doughnut Podcast Client + * Copyright (C) 2017 - 2022 Chris Dyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import AppKit + +protocol PodcastSearchFiledDelegate: AnyObject { + + func podcastSearchFiledDidUpdate(withFilter filter: PodcastViewController.Filter) + +} + +final class PodcastSearchFiled: NSSearchField { + + weak var searchFieldDelegate: PodcastSearchFiledDelegate? + + private var filter: PodcastViewController.Filter = .all { + didSet { + updateFilteringButtonState() + searchFieldDelegate?.podcastSearchFiledDidUpdate(withFilter: filter) + } + } + + private var previousFilterCategory: PodcastViewController.Filter.Category = .newEpisodes + + // NSButtonCell has no methods fo tintColor, images have to be tinted manually + private var filterImage: NSImage? + private var filterImageActive: NSImage? + private var cancelImage: NSImage? + private var controlSelectedImage: NSImage? + + private static let searchButtonSize = CGSize(width: 32, height: 16) + + init() { + super.init(frame: .zero) + commonInit() + } + + required init?(coder: NSCoder) { + super.init(coder: coder) + commonInit() + } + + private func commonInit() { + updateIconImages() + + let searchFieldCell = cell as? NSSearchFieldCell + searchFieldCell?.searchButtonCell?.image = filterImage + searchFieldCell?.searchButtonCell?.alternateImage = filterImageActive + searchFieldCell?.searchButtonCell?.showsStateBy = [.contentsCellMask] + searchFieldCell?.searchButtonCell?.imageScaling = .scaleProportionallyDown + + searchFieldCell?.cancelButtonCell?.image = cancelImage + searchFieldCell?.cancelButtonCell?.alternateImage = controlSelectedImage + + target = self + action = #selector(onSearchTextChange(_:)) + + let menu = NSMenu() + menu.addItem(withTitle: "New Episodes", action: #selector(toggleFilterPodcasts(_:)), keyEquivalent: "") + for item in menu.items[0...] { + item.configureWithDefaultFont() + } + searchMenuTemplate = menu + } + + private func updateIconImages() { + // FIXME: refresh icon image on appearance or control tint color change. + filterImage = NSImage(named: "PodcastFilter")?.tinted(with: .secondaryLabelColor) + filterImageActive = NSImage(named: "PodcastFilterActive")?.tinted(with: .controlAccentColor) + + cancelImage = NSImage(named: NSImage.stopProgressFreestandingTemplateName)?.tinted(with: .secondaryLabelColor) + controlSelectedImage = NSImage(named: NSImage.stopProgressFreestandingTemplateName)?.tinted(with: .labelColor) + } + + override func draw(_ dirtyRect: NSRect) { + // This override is required, otherwise icon images won't update + super.draw(dirtyRect) + } + + override func rectForSearchButton(whenCentered isCentered: Bool) -> NSRect { + let originalRect = super.rectForSearchButton(whenCentered: isCentered) + return CGRect( + x: originalRect.origin.x, + y: originalRect.origin.y - (Self.searchButtonSize.height - originalRect.size.height) / 2, + width: Self.searchButtonSize.width, + height: Self.searchButtonSize.height + ) + } + + override func rectForSearchText(whenCentered isCentered: Bool) -> NSRect { + var rect = super.rectForSearchText(whenCentered: isCentered) + let searchButtonRect = super.rectForSearchButton(whenCentered: isCentered) + rect.origin.x += Self.searchButtonSize.width - searchButtonRect.width + rect.size.width -= Self.searchButtonSize.width - searchButtonRect.width + return rect + } + + override func mouseDown(with event: NSEvent) { + // If the click resides on the left half of the filter icon, perform a + // toggle against previous selected filter category, otherwise, fall back to + // the default behavior that shows the category menu. + let searchButtonRect = rectForSearchButton(whenCentered: centersPlaceholder) + let pointInSearchField = convert(event.locationInWindow, from: nil) + if + searchButtonRect.contains(pointInSearchField), + pointInSearchField.x <= searchButtonRect.midX, + filter.query.isEmpty + { + swap(&previousFilterCategory, &filter.category) + } else { + super.mouseDown(with: event) + } + } + + private func updateFilteringButtonState() { + let isActive = !filter.query.isEmpty || filter.category != .all + let searchFieldCell = cell as? NSSearchFieldCell + searchFieldCell?.searchButtonCell?.state = isActive ? .on : .off + needsDisplay = true + } + + @objc func toggleFilterPodcasts(_ sender: Any) { + previousFilterCategory = filter.category + filter.category = (filter.category == .newEpisodes) ? .all : .newEpisodes + } + + @objc func onSearchTextChange(_ sender: Any) { + filter.query = stringValue + } + + @objc func validateMenuItem(_ menuItem: NSMenuItem) -> Bool { + switch menuItem.action { + case #selector(toggleFilterPodcasts(_:)): + menuItem.state = filter.category == .newEpisodes ? .on : .off + return true + default: + return false + } + } + +} diff --git a/Doughnut/Utilities/NSImage+Tint.swift b/Doughnut/Utilities/NSImage+Tint.swift new file mode 100644 index 0000000..ec218fe --- /dev/null +++ b/Doughnut/Utilities/NSImage+Tint.swift @@ -0,0 +1,44 @@ +/* + * Doughnut Podcast Client + * Copyright (C) 2017 - 2022 Chris Dyer + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +import AppKit + +// https://gist.github.com/usagimaru/c0a03ef86b5829fb9976b650ec2f1bf4 + +extension NSImage { + + func tinted(with tintColor: NSColor) -> NSImage { + if isTemplate == false { + return self + } + + let image = copy() as! NSImage + image.lockFocus() + + tintColor.set() + + let imageRect = NSRect(origin: .zero, size: image.size) + imageRect.fill(using: .sourceIn) + + image.unlockFocus() + image.isTemplate = false + + return image + } + +} diff --git a/Doughnut/Utilities/NSMenu+Extensions.swift b/Doughnut/Utilities/NSMenu+Extensions.swift index b73478a..8a0397c 100644 --- a/Doughnut/Utilities/NSMenu+Extensions.swift +++ b/Doughnut/Utilities/NSMenu+Extensions.swift @@ -63,4 +63,13 @@ extension NSMenuItem { return menu?.menuType } + func configureWithDefaultFont() { + attributedTitle = NSAttributedString( + string: title, + attributes: [ + .font: NSFont.controlContentFont(ofSize: NSFont.systemFontSize), + ] + ) + } + } diff --git a/Doughnut/View Controllers/PodcastViewController.swift b/Doughnut/View Controllers/PodcastViewController.swift index 6679ffc..eb6156b 100644 --- a/Doughnut/View Controllers/PodcastViewController.swift +++ b/Doughnut/View Controllers/PodcastViewController.swift @@ -28,16 +28,27 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl case recentEpisodes = "Recent Episode" } - enum Filter { - case all - case newEpisodes + struct Filter: Equatable { + enum Category: Equatable { + case all + case newEpisodes + } + + var category: Category + var query: String + + static var all: Self { + return Self(category: .all, query: "") + } } var podcasts = [Podcast]() @IBOutlet var tableView: NSTableView! + @IBOutlet var sortView: NSView! - @IBOutlet var filteringButton: NSButton! + @IBOutlet var moreButton: NSButton! + @IBOutlet var searchField: PodcastSearchFiled! private var sortingMenuProvider: SortingMenuProvider { return SortingMenuProvider.Shared.podcasts @@ -47,9 +58,8 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl return tableView.enclosingScrollView! } - var filter: Filter = .all { + private var filter: Filter = .all { didSet { - updateFilteringButtonState() reloadPodcasts() } } @@ -92,12 +102,15 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl sortingMenuProvider.sortParam = sortBy.rawValue sortingMenuProvider.sortDirection = sortDirection sortingMenuProvider.delegate = self + + searchField.searchFieldDelegate = self } override func viewDidAppear() { super.viewDidAppear() - updateFilteringButtonState() + let moreButtonCell = moreButton.cell as? NSButtonCell + moreButtonCell?.highlightsBy = [] tableScrollView.automaticallyAdjustsContentInsets = false @@ -116,15 +129,6 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl ) } - private func updateFilteringButtonState() { - filteringButton.contentTintColor = filter == .all - ? .secondaryLabelColor - : .controlAccentColor - filteringButton.image = filter == .all - ? NSImage(named: "FilterInactive") - : NSImage(named: "FilterActive") - } - func reloadPodcasts() { let previousSelectedPodcastIds = tableView.selectedRowIndexes.compactMap { return podcasts[$0].id @@ -133,13 +137,22 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl podcasts = Library.global.podcasts podcasts = podcasts.filter { podcast -> Bool in - if filter == .newEpisodes { + if filter.category == .newEpisodes { return podcast.unplayedCount > 0 } else { return true } } + if !filter.query.isEmpty { + let query = filter.query.lowercased().filter { !$0.isWhitespace } + podcasts = podcasts.filter { podcast in + return podcast.title + .lowercased().filter { !$0.isWhitespace } + .contains(query) + } + } + // Sort into ascending order podcasts.sort { (a, b) -> Bool in switch sortBy { @@ -242,10 +255,6 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl // MARK: - Actions - @IBAction func toggleFilterPodcasts(_ sender: Any) { - filter = (filter == .newEpisodes) ? .all : .newEpisodes - } - @IBAction func reloadPodcast(_ sender: Any) { let podcasts = activePodcastsForAction() assert(podcasts.count == 1) @@ -349,9 +358,6 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl let podcasts = activePodcastsForAction() switch menuItem.action { - case #selector(toggleFilterPodcasts(_:)): - menuItem.state = filter == .newEpisodes ? .on : .off - return true case #selector(reloadPodcast(_:)): return podcasts.count == 1 case #selector(getInfo(_:)): @@ -378,6 +384,14 @@ final class PodcastViewController: NSViewController, NSTableViewDelegate, NSTabl } +extension PodcastViewController: PodcastSearchFiledDelegate { + + func podcastSearchFiledDidUpdate(withFilter filter: Filter) { + self.filter = filter + } + +} + extension PodcastViewController: NSMenuDelegate { func menuNeedsUpdate(_ menu: NSMenu) { diff --git a/Doughnut/Views/SortingMenuProvider.swift b/Doughnut/Views/SortingMenuProvider.swift index 45be4e9..563ed71 100644 --- a/Doughnut/Views/SortingMenuProvider.swift +++ b/Doughnut/Views/SortingMenuProvider.swift @@ -107,12 +107,7 @@ final class SortingMenuProvider { // Ensure menuItems' title font is consistent with normal menus for // recessed pull-down button. for item in sortMenu.items[1...] { - item.attributedTitle = NSAttributedString( - string: item.title, - attributes: [ - .font: NSFont.controlContentFont(ofSize: NSFont.systemFontSize), - ] - ) + item.configureWithDefaultFont() } }