From 2e5e4dceea04c4d61400d689e6afdd72c28a2017 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Thu, 1 Apr 2021 10:22:10 +0800 Subject: [PATCH 1/6] Add Account Sheet The web accounts are now chunked into two columns of upto 4 accounts. Fixes #2955. --- .../Accounts/AddAccountsView.swift | 58 +++++++++++-------- NetNewsWire.xcodeproj/project.pbxproj | 12 ++++ Shared/Extensions/Array-Extensions.swift | 22 +++++++ 3 files changed, 68 insertions(+), 24 deletions(-) create mode 100644 Shared/Extensions/Array-Extensions.swift diff --git a/Mac/Preferences/Accounts/AddAccountsView.swift b/Mac/Preferences/Accounts/AddAccountsView.swift index 1eefa3d4b..9ed6d8e1b 100644 --- a/Mac/Preferences/Accounts/AddAccountsView.swift +++ b/Mac/Preferences/Accounts/AddAccountsView.swift @@ -53,11 +53,11 @@ enum AddAccountSections: Int, CaseIterable { case .icloud: return [.cloudKit] case .web: - #if DEBUG - return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader] - #else - return [.bazQux, .feedbin, .feedly, .inoreader, .newsBlur, .theOldReader] - #endif + if AppDefaults.shared.isDeveloperBuild { + return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader].filter({ $0.isDeveloperRestricted == false }) + } else { + return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader] + } case .selfhosted: return [.freshRSS] case .allOrdered: @@ -67,12 +67,17 @@ enum AddAccountSections: Int, CaseIterable { AddAccountSections.selfhosted.sectionContent } } + + + + } struct AddAccountsView: View { weak var parent: NSHostingController? // required because presentationMode.dismiss() doesn't work var addAccountDelegate: AccountsPreferencesAddAccountDelegate? + private let chunkLimit = 4 // use this to control number of accounts in each web account column @State private var selectedAccount: AccountType = .onMyMac init(delegate: AccountsPreferencesAddAccountDelegate?) { @@ -207,6 +212,7 @@ struct AddAccountsView: View { } } + @ViewBuilder var webAccounts: some View { VStack(alignment: .leading) { Text("Web") @@ -214,22 +220,28 @@ struct AddAccountsView: View { .padding(.horizontal) .padding(.top, 8) - Picker(selection: $selectedAccount, label: Text(""), content: { - ForEach(AddAccountSections.web.sectionContent.filter({ isRestricted($0) != true }), id: \.self, content: { account in - - HStack(alignment: .center) { - account.image() - .resizable() - .aspectRatio(contentMode: .fit) - .frame(width: 25, height: 25, alignment: .center) - .padding(.leading, 4) - - Text(account.localizedAccountName()) + HStack { + ForEach(0.. Bool { - if AppDefaults.shared.isDeveloperBuild && accountType.isDeveloperRestricted { - return true - } - return false + private func chunkedWebAccounts() -> [[AccountType]] { + AddAccountSections.web.sectionContent.chunked(into: chunkLimit) } + } diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index a13bd83b6..f65aaba67 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -99,6 +99,11 @@ 1769E33024BD6271000E1E8E /* EditAccountCredentialsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769E32F24BD6271000E1E8E /* EditAccountCredentialsView.swift */; }; 1769E33624BD9621000E1E8E /* EditAccountCredentialsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769E33524BD9621000E1E8E /* EditAccountCredentialsModel.swift */; }; 1769E33824BD97CB000E1E8E /* AccountUpdateErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769E33724BD97CB000E1E8E /* AccountUpdateErrors.swift */; }; + 176F8CEE26154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; + 176F8CEF26154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; + 176F8CF026154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; + 176F8CF126154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; + 176F8CF226154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; 1776E88E24AC5F8A00E78166 /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1776E88D24AC5F8A00E78166 /* AppDefaults.swift */; }; 1776E88F24AC5F8A00E78166 /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1776E88D24AC5F8A00E78166 /* AppDefaults.swift */; }; 177A0C2D25454AAB00D7EAF6 /* ReaderAPIAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177A0C2C25454AAB00D7EAF6 /* ReaderAPIAccountViewController.swift */; }; @@ -1508,6 +1513,7 @@ 1769E32F24BD6271000E1E8E /* EditAccountCredentialsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditAccountCredentialsView.swift; sourceTree = ""; }; 1769E33524BD9621000E1E8E /* EditAccountCredentialsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditAccountCredentialsModel.swift; sourceTree = ""; }; 1769E33724BD97CB000E1E8E /* AccountUpdateErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountUpdateErrors.swift; sourceTree = ""; }; + 176F8CED26154347005978CE /* Array-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array-Extensions.swift"; sourceTree = ""; }; 1776E88D24AC5F8A00E78166 /* AppDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDefaults.swift; sourceTree = ""; }; 177A0C2C25454AAB00D7EAF6 /* ReaderAPIAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderAPIAccountViewController.swift; sourceTree = ""; }; 17897AC924C281A40014BA03 /* InspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorView.swift; sourceTree = ""; }; @@ -3258,6 +3264,7 @@ 51126DA3225FDE2F00722696 /* RSImage-Extensions.swift */, 84411E701FE5FBFA004B527F /* SmallIconProvider.swift */, 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */, + 176F8CED26154347005978CE /* Array-Extensions.swift */, ); path = Extensions; sourceTree = ""; @@ -4699,6 +4706,7 @@ 51E4992F24A8676400B667CB /* ArticleArray.swift in Sources */, 5177471C24B387AC00EB0F74 /* ImageScrollView.swift in Sources */, 51E498F824A8085D00B667CB /* UnreadFeed.swift in Sources */, + 176F8CF126154347005978CE /* Array-Extensions.swift in Sources */, 6591723124B5C35400B638E8 /* AccountHeaderImageView.swift in Sources */, 51B8104524C0E6D200C6C32D /* TimelineTextSizer.swift in Sources */, FF64D0E724AF53EE0084080A /* RefreshProgressModel.swift in Sources */, @@ -4862,6 +4870,7 @@ buildActionMask = 2147483647; files = ( 17930ED524AF10EE00A9BA52 /* AddWebFeedView.swift in Sources */, + 176F8CF226154347005978CE /* Array-Extensions.swift in Sources */, 51E4993A24A8708800B667CB /* AppDelegate.swift in Sources */, 51E498CE24A8085D00B667CB /* UnreadFeed.swift in Sources */, 51B8BCC324C25C3E00360B00 /* SidebarContextMenu.swift in Sources */, @@ -5054,6 +5063,7 @@ 65ED3FC9235DEF6C0081F399 /* SmartFeedPasteboardWriter.swift in Sources */, 515A5149243E64BA0089E588 /* ExtensionPointEnableWindowController.swift in Sources */, 65ED3FCA235DEF6C0081F399 /* SmartFeedsController.swift in Sources */, + 176F8CEF26154347005978CE /* Array-Extensions.swift in Sources */, 515A5178243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */, 65ED3FCB235DEF6C0081F399 /* SidebarViewController.swift in Sources */, 51BC4B00247277E0000A6ED8 /* URL-Extensions.swift in Sources */, @@ -5255,6 +5265,7 @@ 176813D02564BA5900D98635 /* WidgetData.swift in Sources */, 510289CD24519A1D00426DDF /* SelectComboTableViewCell.swift in Sources */, 514B7C8323205EFB00BAC947 /* RootSplitViewController.swift in Sources */, + 176F8CF026154347005978CE /* Array-Extensions.swift in Sources */, 51FA73A52332BE110090D516 /* ArticleExtractor.swift in Sources */, 51314704235C41FC00387FDC /* Intents.intentdefinition in Sources */, FF3ABF162325AF5D0074C542 /* ArticleSorter.swift in Sources */, @@ -5494,6 +5505,7 @@ 849EE72120391F560082A1EA /* SharingServicePickerDelegate.swift in Sources */, 1710B9132552354E00679C0D /* AddAccountHelpView.swift in Sources */, 5108F6B62375E612001ABC45 /* CacheCleaner.swift in Sources */, + 176F8CEE26154347005978CE /* Array-Extensions.swift in Sources */, 849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */, 849EE70F203919360082A1EA /* AppAssets.swift in Sources */, 849A97531ED9EAC0007D329B /* AddFeedController.swift in Sources */, diff --git a/Shared/Extensions/Array-Extensions.swift b/Shared/Extensions/Array-Extensions.swift new file mode 100644 index 000000000..defd19e76 --- /dev/null +++ b/Shared/Extensions/Array-Extensions.swift @@ -0,0 +1,22 @@ +// +// Array-Extensions.swift +// NetNewsWire +// +// Created by Stuart Breckenridge on 01/04/2021. +// Copyright © 2021 Ranchero Software. All rights reserved. +// + +import Foundation + +extension Array { + + /// Splits an array in to chunks of size `size`. + /// - Note: Code from [Hacking with Swift](https://www.hackingwithswift.com/example-code/language/how-to-split-an-array-into-chunks). + /// - Parameter size: The size of the chunk. + /// - Returns: An array of `[Element]`s. + func chunked(into size: Int) -> [[Element]] { + return stride(from: 0, to: count, by: size).map { + Array(self[$0 ..< Swift.min($0 + size, count)]) + } + } +} From 37ba4f0bb8d9d6c0d4904fd63dc3956f7b99e35d Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Thu, 1 Apr 2021 10:56:20 +0800 Subject: [PATCH 2/6] resizes images --- Mac/Preferences/Accounts/AddAccountsView.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Mac/Preferences/Accounts/AddAccountsView.swift b/Mac/Preferences/Accounts/AddAccountsView.swift index 9ed6d8e1b..abf892d7e 100644 --- a/Mac/Preferences/Accounts/AddAccountsView.swift +++ b/Mac/Preferences/Accounts/AddAccountsView.swift @@ -162,7 +162,7 @@ struct AddAccountsView: View { account.image() .resizable() .aspectRatio(contentMode: .fit) - .frame(width: 25, height: 25, alignment: .center) + .frame(width: 20, height: 20, alignment: .center) .padding(.leading, 4) Text(account.localizedAccountName()) } @@ -194,7 +194,7 @@ struct AddAccountsView: View { account.image() .resizable() .aspectRatio(contentMode: .fit) - .frame(width: 25, height: 25, alignment: .center) + .frame(width: 20, height: 20, alignment: .center) .padding(.leading, 4) Text(account.localizedAccountName()) @@ -230,7 +230,7 @@ struct AddAccountsView: View { account.image() .resizable() .aspectRatio(contentMode: .fit) - .frame(width: 25, height: 25, alignment: .center) + .frame(width: 20, height: 20, alignment: .center) .padding(.leading, 4) Text(account.localizedAccountName()) } @@ -264,7 +264,7 @@ struct AddAccountsView: View { account.image() .resizable() .aspectRatio(contentMode: .fit) - .frame(width: 25, height: 25, alignment: .center) + .frame(width: 20, height: 20, alignment: .center) .padding(.leading, 4) Text(account.localizedAccountName()) From 1f71d5a7440b3d9af4ebc74afa7acdb952f31125 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Fri, 2 Apr 2021 06:21:08 +0800 Subject: [PATCH 3/6] FeedWrangler removed and moved chunk to RSCore --- .../Accounts/AddAccountsView.swift | 5 +++-- NetNewsWire.xcodeproj/project.pbxproj | 12 ---------- Shared/Extensions/Array-Extensions.swift | 22 ------------------- 3 files changed, 3 insertions(+), 36 deletions(-) delete mode 100644 Shared/Extensions/Array-Extensions.swift diff --git a/Mac/Preferences/Accounts/AddAccountsView.swift b/Mac/Preferences/Accounts/AddAccountsView.swift index abf892d7e..1032c7968 100644 --- a/Mac/Preferences/Accounts/AddAccountsView.swift +++ b/Mac/Preferences/Accounts/AddAccountsView.swift @@ -8,6 +8,7 @@ import SwiftUI import Account +import RSCore enum AddAccountSections: Int, CaseIterable { case local = 0 @@ -54,9 +55,9 @@ enum AddAccountSections: Int, CaseIterable { return [.cloudKit] case .web: if AppDefaults.shared.isDeveloperBuild { - return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader].filter({ $0.isDeveloperRestricted == false }) + return [.bazQux, .feedbin, .feedly, .inoreader, .newsBlur, .theOldReader].filter({ $0.isDeveloperRestricted == false }) } else { - return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader] + return [.bazQux, .feedbin, .feedly, .inoreader, .newsBlur, .theOldReader] } case .selfhosted: return [.freshRSS] diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index f65aaba67..a13bd83b6 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -99,11 +99,6 @@ 1769E33024BD6271000E1E8E /* EditAccountCredentialsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769E32F24BD6271000E1E8E /* EditAccountCredentialsView.swift */; }; 1769E33624BD9621000E1E8E /* EditAccountCredentialsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769E33524BD9621000E1E8E /* EditAccountCredentialsModel.swift */; }; 1769E33824BD97CB000E1E8E /* AccountUpdateErrors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1769E33724BD97CB000E1E8E /* AccountUpdateErrors.swift */; }; - 176F8CEE26154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; - 176F8CEF26154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; - 176F8CF026154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; - 176F8CF126154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; - 176F8CF226154347005978CE /* Array-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 176F8CED26154347005978CE /* Array-Extensions.swift */; }; 1776E88E24AC5F8A00E78166 /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1776E88D24AC5F8A00E78166 /* AppDefaults.swift */; }; 1776E88F24AC5F8A00E78166 /* AppDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1776E88D24AC5F8A00E78166 /* AppDefaults.swift */; }; 177A0C2D25454AAB00D7EAF6 /* ReaderAPIAccountViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 177A0C2C25454AAB00D7EAF6 /* ReaderAPIAccountViewController.swift */; }; @@ -1513,7 +1508,6 @@ 1769E32F24BD6271000E1E8E /* EditAccountCredentialsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditAccountCredentialsView.swift; sourceTree = ""; }; 1769E33524BD9621000E1E8E /* EditAccountCredentialsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditAccountCredentialsModel.swift; sourceTree = ""; }; 1769E33724BD97CB000E1E8E /* AccountUpdateErrors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountUpdateErrors.swift; sourceTree = ""; }; - 176F8CED26154347005978CE /* Array-Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array-Extensions.swift"; sourceTree = ""; }; 1776E88D24AC5F8A00E78166 /* AppDefaults.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDefaults.swift; sourceTree = ""; }; 177A0C2C25454AAB00D7EAF6 /* ReaderAPIAccountViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReaderAPIAccountViewController.swift; sourceTree = ""; }; 17897AC924C281A40014BA03 /* InspectorView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorView.swift; sourceTree = ""; }; @@ -3264,7 +3258,6 @@ 51126DA3225FDE2F00722696 /* RSImage-Extensions.swift */, 84411E701FE5FBFA004B527F /* SmallIconProvider.swift */, 51BC4ADD247277DF000A6ED8 /* URL-Extensions.swift */, - 176F8CED26154347005978CE /* Array-Extensions.swift */, ); path = Extensions; sourceTree = ""; @@ -4706,7 +4699,6 @@ 51E4992F24A8676400B667CB /* ArticleArray.swift in Sources */, 5177471C24B387AC00EB0F74 /* ImageScrollView.swift in Sources */, 51E498F824A8085D00B667CB /* UnreadFeed.swift in Sources */, - 176F8CF126154347005978CE /* Array-Extensions.swift in Sources */, 6591723124B5C35400B638E8 /* AccountHeaderImageView.swift in Sources */, 51B8104524C0E6D200C6C32D /* TimelineTextSizer.swift in Sources */, FF64D0E724AF53EE0084080A /* RefreshProgressModel.swift in Sources */, @@ -4870,7 +4862,6 @@ buildActionMask = 2147483647; files = ( 17930ED524AF10EE00A9BA52 /* AddWebFeedView.swift in Sources */, - 176F8CF226154347005978CE /* Array-Extensions.swift in Sources */, 51E4993A24A8708800B667CB /* AppDelegate.swift in Sources */, 51E498CE24A8085D00B667CB /* UnreadFeed.swift in Sources */, 51B8BCC324C25C3E00360B00 /* SidebarContextMenu.swift in Sources */, @@ -5063,7 +5054,6 @@ 65ED3FC9235DEF6C0081F399 /* SmartFeedPasteboardWriter.swift in Sources */, 515A5149243E64BA0089E588 /* ExtensionPointEnableWindowController.swift in Sources */, 65ED3FCA235DEF6C0081F399 /* SmartFeedsController.swift in Sources */, - 176F8CEF26154347005978CE /* Array-Extensions.swift in Sources */, 515A5178243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */, 65ED3FCB235DEF6C0081F399 /* SidebarViewController.swift in Sources */, 51BC4B00247277E0000A6ED8 /* URL-Extensions.swift in Sources */, @@ -5265,7 +5255,6 @@ 176813D02564BA5900D98635 /* WidgetData.swift in Sources */, 510289CD24519A1D00426DDF /* SelectComboTableViewCell.swift in Sources */, 514B7C8323205EFB00BAC947 /* RootSplitViewController.swift in Sources */, - 176F8CF026154347005978CE /* Array-Extensions.swift in Sources */, 51FA73A52332BE110090D516 /* ArticleExtractor.swift in Sources */, 51314704235C41FC00387FDC /* Intents.intentdefinition in Sources */, FF3ABF162325AF5D0074C542 /* ArticleSorter.swift in Sources */, @@ -5505,7 +5494,6 @@ 849EE72120391F560082A1EA /* SharingServicePickerDelegate.swift in Sources */, 1710B9132552354E00679C0D /* AddAccountHelpView.swift in Sources */, 5108F6B62375E612001ABC45 /* CacheCleaner.swift in Sources */, - 176F8CEE26154347005978CE /* Array-Extensions.swift in Sources */, 849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */, 849EE70F203919360082A1EA /* AppAssets.swift in Sources */, 849A97531ED9EAC0007D329B /* AddFeedController.swift in Sources */, diff --git a/Shared/Extensions/Array-Extensions.swift b/Shared/Extensions/Array-Extensions.swift deleted file mode 100644 index defd19e76..000000000 --- a/Shared/Extensions/Array-Extensions.swift +++ /dev/null @@ -1,22 +0,0 @@ -// -// Array-Extensions.swift -// NetNewsWire -// -// Created by Stuart Breckenridge on 01/04/2021. -// Copyright © 2021 Ranchero Software. All rights reserved. -// - -import Foundation - -extension Array { - - /// Splits an array in to chunks of size `size`. - /// - Note: Code from [Hacking with Swift](https://www.hackingwithswift.com/example-code/language/how-to-split-an-array-into-chunks). - /// - Parameter size: The size of the chunk. - /// - Returns: An array of `[Element]`s. - func chunked(into size: Int) -> [[Element]] { - return stride(from: 0, to: count, by: size).map { - Array(self[$0 ..< Swift.min($0 + size, count)]) - } - } -} From 4e517a6db467ddcbcb084fb2a4de4cd5b0f314d5 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Fri, 9 Apr 2021 07:47:14 +0800 Subject: [PATCH 4/6] Disable Reader View This commit: - adds a `isFeedProvider: Bool` property to `WebFeed` - if `isFeedProvider` is `true`, the article extractor is disabled on the inspector, hidden from the context menu, and the toolbar button is disabled. Additionally, if `isFeedProvider` is `true`, `isArticleExtractorAlwaysOn` returns `false` and cannot be set to `true`. --- Account/Sources/Account/WebFeed.swift | 15 +++++++++++++++ .../WebFeedInspectorViewController.swift | 3 +++ Mac/MainWindow/MainWindowController.swift | 19 +++++++++++++++++++ ...idebarViewController+ContextualMenus.swift | 19 ++++++++++++------- 4 files changed, 49 insertions(+), 7 deletions(-) diff --git a/Account/Sources/Account/WebFeed.swift b/Account/Sources/Account/WebFeed.swift index 9fddbb5eb..80293e481 100644 --- a/Account/Sources/Account/WebFeed.swift +++ b/Account/Sources/Account/WebFeed.swift @@ -152,9 +152,14 @@ public final class WebFeed: Feed, Renamable, Hashable { public var isArticleExtractorAlwaysOn: Bool? { get { + if isFeedProvider == true { return false } // not an option for FeedProviders return metadata.isArticleExtractorAlwaysOn } set { + if isFeedProvider == true { + metadata.isArticleExtractorAlwaysOn = false + return + } metadata.isArticleExtractorAlwaysOn = newValue } } @@ -220,6 +225,16 @@ public final class WebFeed: Feed, Renamable, Hashable { postUnreadCountDidChangeNotification() } } + + // MARK: - Feed Provider + public var isFeedProvider: Bool { + get { + if FeedProviderManager.shared.best(for: URLComponents(url: URL(string: url)!, resolvingAgainstBaseURL: false)!) == nil { + return false + } + return true + } + } var metadata: WebFeedMetadata diff --git a/Mac/Inspector/WebFeedInspectorViewController.swift b/Mac/Inspector/WebFeedInspectorViewController.swift index d03fd135f..b04991916 100644 --- a/Mac/Inspector/WebFeedInspectorViewController.swift +++ b/Mac/Inspector/WebFeedInspectorViewController.swift @@ -140,6 +140,9 @@ private extension WebFeedInspectorViewController { updateIsReaderViewAlwaysOn() windowTitle = feed?.nameForDisplay ?? NSLocalizedString("Feed Inspector", comment: "Feed Inspector window title") view.needsLayout = true + if let webfeed = feed { + webfeed.isFeedProvider ? (isReaderViewAlwaysOnCheckBox?.isEnabled = false) : (isReaderViewAlwaysOnCheckBox?.isEnabled = true) + } } func updateImage() { diff --git a/Mac/MainWindow/MainWindowController.swift b/Mac/MainWindow/MainWindowController.swift index 4db72dd1e..0bef4b254 100644 --- a/Mac/MainWindow/MainWindowController.swift +++ b/Mac/MainWindow/MainWindowController.swift @@ -1061,6 +1061,7 @@ private extension MainWindowController { return false } + if #available(macOS 11.0, *) { guard let toolbarItem = item as? NSToolbarItem, let toolbarButton = toolbarItem.view as? ArticleExtractorButton else { @@ -1069,6 +1070,15 @@ private extension MainWindowController { } return currentLink != nil } + + if let webfeed = currentTimelineViewController?.selectedArticles.first?.webFeed { + if webfeed.isFeedProvider { + toolbarButton.isEnabled = false + return false + } else { + toolbarButton.isEnabled = true + } + } guard let state = articleExtractor?.state else { toolbarButton.buttonState = .off @@ -1093,6 +1103,15 @@ private extension MainWindowController { return currentLink != nil } + if let webfeed = currentTimelineViewController?.selectedArticles.first?.webFeed { + if webfeed.isFeedProvider { + toolbarButton.isEnabled = false + return false + } else { + toolbarButton.isEnabled = true + } + } + toolbarButton.state = isShowingExtractedArticle ? .on : .off guard let state = articleExtractor?.state else { diff --git a/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift b/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift index e6861aa9c..2ebe3ea22 100644 --- a/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift +++ b/Mac/MainWindow/Sidebar/SidebarViewController+ContextualMenus.swift @@ -240,15 +240,20 @@ private extension SidebarViewController { } menu.addItem(notificationMenuItem) - let articleExtractorText = NSLocalizedString("Always Use Reader View", comment: "Always Use Reader View") - let articleExtractorMenuItem = menuItem(articleExtractorText, #selector(toggleArticleExtractorFromContextMenu(_:)), webFeed) - if webFeed.isArticleExtractorAlwaysOn == nil || webFeed.isArticleExtractorAlwaysOn! == false { - articleExtractorMenuItem.state = .off - } else { - articleExtractorMenuItem.state = .on + if !webFeed.isFeedProvider { + let articleExtractorText = NSLocalizedString("Always Use Reader View", comment: "Always Use Reader View") + let articleExtractorMenuItem = menuItem(articleExtractorText, #selector(toggleArticleExtractorFromContextMenu(_:)), webFeed) + + if webFeed.isArticleExtractorAlwaysOn == nil || webFeed.isArticleExtractorAlwaysOn! == false { + articleExtractorMenuItem.state = .off + } else { + articleExtractorMenuItem.state = .on + } + menu.addItem(articleExtractorMenuItem) } - menu.addItem(articleExtractorMenuItem) + + menu.addItem(NSMenuItem.separator()) menu.addItem(renameMenuItem(webFeed)) From 0a433b8573e5ff783a9273f7610ea1b54edb2fb3 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Sat, 10 Apr 2021 09:03:08 +0800 Subject: [PATCH 5/6] Disables reader view in iOS for Feed Providers --- iOS/Article/ArticleViewController.swift | 8 ++++++-- iOS/Inspector/WebFeedInspectorViewController.swift | 9 ++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/iOS/Article/ArticleViewController.swift b/iOS/Article/ArticleViewController.swift index 07546a40d..6629ecc4d 100644 --- a/iOS/Article/ArticleViewController.swift +++ b/iOS/Article/ArticleViewController.swift @@ -92,7 +92,7 @@ class ArticleViewController: UIViewController { articleExtractorButton.addTarget(self, action: #selector(toggleArticleExtractor(_:)), for: .touchUpInside) toolbarItems?.insert(UIBarButtonItem(customView: articleExtractorButton), at: 6) - + pageViewController = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: [:]) pageViewController.delegate = self pageViewController.dataSource = self @@ -179,7 +179,11 @@ class ArticleViewController: UIViewController { starBarButtonItem.isEnabled = true let permalinkPresent = article.preferredLink != nil - articleExtractorButton.isEnabled = permalinkPresent && !AppDefaults.shared.isDeveloperBuild + var isFeedProvider = false + if let webfeed = article.webFeed { + isFeedProvider = webfeed.isFeedProvider + } + articleExtractorButton.isEnabled = permalinkPresent && !AppDefaults.shared.isDeveloperBuild && !isFeedProvider actionBarButtonItem.isEnabled = permalinkPresent if article.status.read { diff --git a/iOS/Inspector/WebFeedInspectorViewController.swift b/iOS/Inspector/WebFeedInspectorViewController.swift index c52bfeedf..d8b8120c6 100644 --- a/iOS/Inspector/WebFeedInspectorViewController.swift +++ b/iOS/Inspector/WebFeedInspectorViewController.swift @@ -48,7 +48,14 @@ class WebFeedInspectorViewController: UITableViewController { nameTextField.text = webFeed.nameForDisplay notifyAboutNewArticlesSwitch.setOn(webFeed.isNotifyAboutNewArticles ?? false, animated: false) - alwaysShowReaderViewSwitch.setOn(webFeed.isArticleExtractorAlwaysOn ?? false, animated: false) + + if webFeed.isFeedProvider { + alwaysShowReaderViewSwitch.isOn = false + alwaysShowReaderViewSwitch.isEnabled = false + } else { + alwaysShowReaderViewSwitch.setOn(webFeed.isArticleExtractorAlwaysOn ?? false, animated: false) + } + homePageLabel.text = webFeed.homePageURL?.decodedURLString feedURLLabel.text = webFeed.url.decodedURLString From 0fa30a9404e2d575372bfff737e5f13188347d02 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Sat, 10 Apr 2021 20:29:33 +0800 Subject: [PATCH 6/6] removes force unwrapping --- Account/Sources/Account/WebFeed.swift | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Account/Sources/Account/WebFeed.swift b/Account/Sources/Account/WebFeed.swift index 80293e481..a705736e9 100644 --- a/Account/Sources/Account/WebFeed.swift +++ b/Account/Sources/Account/WebFeed.swift @@ -228,8 +228,13 @@ public final class WebFeed: Feed, Renamable, Hashable { // MARK: - Feed Provider public var isFeedProvider: Bool { - get { - if FeedProviderManager.shared.best(for: URLComponents(url: URL(string: url)!, resolvingAgainstBaseURL: false)!) == nil { + get { + guard let webfeedURL = URL(string: url), + let components = URLComponents(url: webfeedURL, resolvingAgainstBaseURL: false) else { + return false + } + + if FeedProviderManager.shared.best(for: components) == nil { return false } return true