From 2e5e4dceea04c4d61400d689e6afdd72c28a2017 Mon Sep 17 00:00:00 2001 From: Stuart Breckenridge Date: Thu, 1 Apr 2021 10:22:10 +0800 Subject: [PATCH] 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)]) + } + } +}