diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 684291fc5..e9d36d37f 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -128,6 +128,14 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, public var topLevelWebFeeds = Set() public var folders: Set? = Set() + + public var sortedFolders: [Folder]? { + if let folders = folders { + return Array(folders).sorted(by: { $0.nameForDisplay > $1.nameForDisplay }) + } + return nil + } + private var webFeedDictionaryNeedsUpdate = true private var _idToWebFeedDictionary = [String: WebFeed]() var idToWebFeedDictionary: [String: WebFeed] { diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index 644ce65ea..cf157c2cc 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -8,6 +8,7 @@ import AppKit import RSCore +import Account extension NSImage.Name { static let star = NSImage.Name("star") @@ -116,4 +117,19 @@ struct AppAssets { return RSImage(named: "swipeMarkUnstarred")! }() + static func image(for accountType: AccountType) -> NSImage? { + switch accountType { + case .onMyMac: + return AppAssets.accountLocal + case .feedbin: + return AppAssets.accountFeedbin + case .feedly: + return AppAssets.accountFeedly + case .freshRSS: + return AppAssets.accountFreshRSS + default: + return nil + } + } + } diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index e5f714d63..a95a35bf9 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -101,7 +101,6 @@ 516AE9DF2372269A007DEEAA /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9DE2372269A007DEEAA /* IconImage.swift */; }; 516AE9E02372269A007DEEAA /* IconImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 516AE9DE2372269A007DEEAA /* IconImage.swift */; }; 51707439232AA97100A461A3 /* ShareFolderPickerController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51707438232AA97100A461A3 /* ShareFolderPickerController.swift */; }; - 5170743A232AABFC00A461A3 /* FlattenedAccountFolderPickerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */; }; 517630042336215100E15FFF /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; 517630052336215100E15FFF /* main.js in Resources */ = {isa = PBXBuildFile; fileRef = 517630032336215100E15FFF /* main.js */; }; 517630232336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 517630222336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift */; }; @@ -169,7 +168,6 @@ 51C4527B2265091600C03939 /* MasterUnreadIndicatorView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452742265091600C03939 /* MasterUnreadIndicatorView.swift */; }; 51C4527C2265091600C03939 /* MasterTimelineDefaultCellLayout.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452752265091600C03939 /* MasterTimelineDefaultCellLayout.swift */; }; 51C4527F2265092C00C03939 /* ArticleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C4527E2265092C00C03939 /* ArticleViewController.swift */; }; - 51C452852265093600C03939 /* FlattenedAccountFolderPickerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */; }; 51C452862265093600C03939 /* Add.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 51C452822265093600C03939 /* Add.storyboard */; }; 51C452882265093600C03939 /* AddWebFeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C452842265093600C03939 /* AddWebFeedViewController.swift */; }; 51C4528D2265095F00C03939 /* AddFolderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51C4528B2265095F00C03939 /* AddFolderViewController.swift */; }; @@ -212,6 +210,10 @@ 51D87EE12311D34700E63F03 /* ActivityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D87EE02311D34700E63F03 /* ActivityType.swift */; }; 51E3EB33229AB02C00645299 /* ErrorHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E3EB32229AB02C00645299 /* ErrorHandler.swift */; }; 51E3EB3D229AB08300645299 /* ErrorHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E3EB3C229AB08300645299 /* ErrorHandler.swift */; }; + 51E43962238037C400015C31 /* AddWebFeedFolderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E43961238037C400015C31 /* AddWebFeedFolderViewController.swift */; }; + 51E4397D23805A6D00015C31 /* FlattenedAccountFolderPickerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4397C23805A6C00015C31 /* FlattenedAccountFolderPickerData.swift */; }; + 51E4397E23805A6D00015C31 /* FlattenedAccountFolderPickerData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4397C23805A6C00015C31 /* FlattenedAccountFolderPickerData.swift */; }; + 51E4398023805EBC00015C31 /* AddWebFeedFolderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4397F23805EBC00015C31 /* AddWebFeedFolderTableViewCell.swift */; }; 51E595A5228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */; }; 51E595A6228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */; }; 51EAED96231363EF00A9EEE3 /* NonIntrinsicButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51EAED95231363EF00A9EEE3 /* NonIntrinsicButton.swift */; }; @@ -1306,7 +1308,6 @@ 51C452742265091600C03939 /* MasterUnreadIndicatorView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterUnreadIndicatorView.swift; sourceTree = ""; }; 51C452752265091600C03939 /* MasterTimelineDefaultCellLayout.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MasterTimelineDefaultCellLayout.swift; sourceTree = ""; }; 51C4527E2265092C00C03939 /* ArticleViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArticleViewController.swift; sourceTree = ""; }; - 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlattenedAccountFolderPickerData.swift; sourceTree = ""; }; 51C452822265093600C03939 /* Add.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Add.storyboard; sourceTree = ""; }; 51C452842265093600C03939 /* AddWebFeedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddWebFeedViewController.swift; sourceTree = ""; }; 51C4528B2265095F00C03939 /* AddFolderViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddFolderViewController.swift; sourceTree = ""; }; @@ -1319,6 +1320,9 @@ 51D87EE02311D34700E63F03 /* ActivityType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActivityType.swift; sourceTree = ""; }; 51E3EB32229AB02C00645299 /* ErrorHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorHandler.swift; sourceTree = ""; }; 51E3EB3C229AB08300645299 /* ErrorHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ErrorHandler.swift; sourceTree = ""; }; + 51E43961238037C400015C31 /* AddWebFeedFolderViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedFolderViewController.swift; sourceTree = ""; }; + 51E4397C23805A6C00015C31 /* FlattenedAccountFolderPickerData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlattenedAccountFolderPickerData.swift; sourceTree = ""; }; + 51E4397F23805EBC00015C31 /* AddWebFeedFolderTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddWebFeedFolderTableViewCell.swift; sourceTree = ""; }; 51E595A4228CC36500FCC42B /* ArticleStatusSyncTimer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleStatusSyncTimer.swift; sourceTree = ""; }; 51EAED95231363EF00A9EEE3 /* NonIntrinsicButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonIntrinsicButton.swift; sourceTree = ""; }; 51EC114B2149FE3300B296E3 /* FolderTreeMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = FolderTreeMenu.swift; path = AddFeed/FolderTreeMenu.swift; sourceTree = ""; }; @@ -1706,7 +1710,7 @@ 512E08DD22687FA000BDCFDD /* Tree */ = { isa = PBXGroup; children = ( - 51C452812265093600C03939 /* FlattenedAccountFolderPickerData.swift */, + 51E4397C23805A6C00015C31 /* FlattenedAccountFolderPickerData.swift */, 849A97611ED9EB96007D329B /* WebFeedTreeControllerDelegate.swift */, 849A97A11ED9F180007D329B /* FolderTreeControllerDelegate.swift */, ); @@ -1925,8 +1929,10 @@ 51C452822265093600C03939 /* Add.storyboard */, 51121B5A22661FEF00BC0EC1 /* AddContainerViewController.swift */, 514B7D1E23219F3C00BAC947 /* AddControllerType.swift */, - 51C452842265093600C03939 /* AddWebFeedViewController.swift */, 51C4528B2265095F00C03939 /* AddFolderViewController.swift */, + 51C452842265093600C03939 /* AddWebFeedViewController.swift */, + 51E43961238037C400015C31 /* AddWebFeedFolderViewController.swift */, + 51E4397F23805EBC00015C31 /* AddWebFeedFolderTableViewCell.swift */, ); path = Add; sourceTree = ""; @@ -3692,8 +3698,8 @@ 515D4FC123257A3200EE1167 /* FolderTreeControllerDelegate.swift in Sources */, 515D4FCA23257CB500EE1167 /* Node-Extensions.swift in Sources */, 513C5CE9232571C2003D4054 /* ShareViewController.swift in Sources */, - 5170743A232AABFC00A461A3 /* FlattenedAccountFolderPickerData.swift in Sources */, 51707439232AA97100A461A3 /* ShareFolderPickerController.swift in Sources */, + 51E4397E23805A6D00015C31 /* FlattenedAccountFolderPickerData.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -3876,6 +3882,7 @@ 512E08E72268801200BDCFDD /* WebFeedTreeControllerDelegate.swift in Sources */, 51C452A422650A2D00C03939 /* ArticleUtilities.swift in Sources */, 51EF0F79227716380050506E /* ColorHash.swift in Sources */, + 51E4397D23805A6D00015C31 /* FlattenedAccountFolderPickerData.swift in Sources */, 5183CCDA226E31A50010922C /* NonIntrinsicImageView.swift in Sources */, 51EAED96231363EF00A9EEE3 /* NonIntrinsicButton.swift in Sources */, 51C4527B2265091600C03939 /* MasterUnreadIndicatorView.swift in Sources */, @@ -3889,6 +3896,7 @@ 51C45269226508F600C03939 /* MasterFeedTableViewCell.swift in Sources */, 51F85BFD2275DCA800C787DC /* SingleLineUILabelSizer.swift in Sources */, 517630232336657E00E15FFF /* ArticleViewControllerWebViewProvider.swift in Sources */, + 51E43962238037C400015C31 /* AddWebFeedFolderViewController.swift in Sources */, 51C4528F226509BD00C03939 /* UnreadFeed.swift in Sources */, 51FD413B2342BD0500880194 /* MasterTimelineUnreadCountView.swift in Sources */, 513146B2235A81A400387FDC /* AddWebFeedIntentHandler.swift in Sources */, @@ -3906,7 +3914,6 @@ 51C4525C226508DF00C03939 /* String-Extensions.swift in Sources */, 51C452792265091600C03939 /* MasterTimelineTableViewCell.swift in Sources */, 51FA73AB2332C2FD0090D516 /* ArticleExtractorConfig.swift in Sources */, - 51C452852265093600C03939 /* FlattenedAccountFolderPickerData.swift in Sources */, 51C4526B226508F600C03939 /* MasterFeedViewController.swift in Sources */, 5126EE97226CB48A00C22AFC /* SceneCoordinator.swift in Sources */, 84CAFCB022BC8C35007694F0 /* FetchRequestOperation.swift in Sources */, @@ -3934,6 +3941,7 @@ 51C45258226508CF00C03939 /* AppAssets.swift in Sources */, 51FA73A82332BE880090D516 /* ExtractedArticle.swift in Sources */, 51C4527C2265091600C03939 /* MasterTimelineDefaultCellLayout.swift in Sources */, + 51E4398023805EBC00015C31 /* AddWebFeedFolderTableViewCell.swift in Sources */, 51C4529A22650A0400C03939 /* ArticleStyle.swift in Sources */, 51C4527F2265092C00C03939 /* ArticleViewController.swift in Sources */, 51C4526A226508F600C03939 /* MasterFeedTableViewCellLayout.swift in Sources */, diff --git a/Shared/Data/SmallIconProvider.swift b/Shared/Data/SmallIconProvider.swift index 3fb85ec9d..a26b83fb6 100644 --- a/Shared/Data/SmallIconProvider.swift +++ b/Shared/Data/SmallIconProvider.swift @@ -16,6 +16,15 @@ protocol SmallIconProvider { var smallIcon: IconImage? { get } } +extension Account: SmallIconProvider { + var smallIcon: IconImage? { + if let image = AppAssets.image(for: type) { + return IconImage(image) + } + return nil + } +} + extension WebFeed: SmallIconProvider { var smallIcon: IconImage? { diff --git a/iOS/Add/Add.storyboard b/iOS/Add/Add.storyboard index 9e37ccd87..89934d793 100644 --- a/iOS/Add/Add.storyboard +++ b/iOS/Add/Add.storyboard @@ -7,26 +7,25 @@ - + - + - - + - + - + @@ -40,14 +39,14 @@ - + - + - + @@ -60,56 +59,32 @@ - - - - - - + + - - + + - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + @@ -121,7 +96,7 @@ - + @@ -130,9 +105,9 @@ + - - + @@ -141,6 +116,94 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -165,31 +228,43 @@ - - + + + + + + + + + + + + + + + + + + - + + + - - - - - - - - + - + - + + + + - - - + @@ -225,6 +300,7 @@ + @@ -236,22 +312,21 @@ - + - - + - + - + @@ -269,10 +344,10 @@ - + - + - + - + - + @@ -326,6 +401,7 @@ + @@ -334,7 +410,7 @@ - + diff --git a/iOS/Add/AddContainerViewController.swift b/iOS/Add/AddContainerViewController.swift index b8729be97..5a9245c33 100644 --- a/iOS/Add/AddContainerViewController.swift +++ b/iOS/Add/AddContainerViewController.swift @@ -28,6 +28,7 @@ class AddContainerViewController: UIViewController { @IBOutlet weak var cancelButton: UIBarButtonItem! @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView! @IBOutlet weak var addButton: UIBarButtonItem! + @IBOutlet weak var typeSelectorContainer: UIView! @IBOutlet weak var typeSelectorSegmentedControl: UISegmentedControl! @IBOutlet weak var containerView: UIView! @@ -43,6 +44,7 @@ class AddContainerViewController: UIViewController { activityIndicatorView.color = UIColor.label activityIndicatorView.isHidden = true + typeSelectorContainer.layer.cornerRadius = 10 typeSelectorSegmentedControl.selectedSegmentIndex = initialControllerType?.rawValue ?? 0 switch initialControllerType { case .feed: diff --git a/iOS/Add/AddWebFeedFolderTableViewCell.swift b/iOS/Add/AddWebFeedFolderTableViewCell.swift new file mode 100644 index 000000000..c8c849956 --- /dev/null +++ b/iOS/Add/AddWebFeedFolderTableViewCell.swift @@ -0,0 +1,16 @@ +// +// AddWebFeedFolderTableViewCell.swift +// NetNewsWire +// +// Created by Maurice Parker on 11/16/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import UIKit + +class AddWebFeedFolderTableViewCell: UITableViewCell { + + @IBOutlet weak var icon: UIImageView! + @IBOutlet weak var label: UILabel! + +} diff --git a/iOS/Add/AddWebFeedFolderViewController.swift b/iOS/Add/AddWebFeedFolderViewController.swift new file mode 100644 index 000000000..cdf3b7978 --- /dev/null +++ b/iOS/Add/AddWebFeedFolderViewController.swift @@ -0,0 +1,78 @@ +// +// AddWebFeedLocationViewController.swift +// NetNewsWire-iOS +// +// Created by Maurice Parker on 11/16/19. +// Copyright © 2019 Ranchero Software. All rights reserved. +// + +import UIKit +import RSCore +import Account + +protocol AddWebFeedFolderViewControllerDelegate { + func didSelect(container: Container) +} + +class AddWebFeedFolderViewController: UITableViewController { + + var delegate: AddWebFeedFolderViewControllerDelegate? + var initialContainer: Container? + + var containers = [Container]() + + override func viewDidLoad() { + super.viewDidLoad() + + for account in AccountManager.shared.sortedActiveAccounts { + containers.append(account) + if let sortedFolders = account.sortedFolders { + containers.append(contentsOf: sortedFolders) + } + } + } + + // MARK: - Table view data source + + override func numberOfSections(in tableView: UITableView) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return containers.count + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let container = containers[indexPath.row] + let cell: AddWebFeedFolderTableViewCell = { + if container is Account { + return tableView.dequeueReusableCell(withIdentifier: "AccountCell", for: indexPath) as! AddWebFeedFolderTableViewCell + } else { + return tableView.dequeueReusableCell(withIdentifier: "FolderCell", for: indexPath) as! AddWebFeedFolderTableViewCell + } + }() + + if let smallIconProvider = container as? SmallIconProvider { + cell.icon?.image = smallIconProvider.smallIcon?.image + } + + if let displayNameProvider = container as? DisplayNameProvider { + cell.label?.text = displayNameProvider.nameForDisplay + } + + if let compContainer = initialContainer, container === compContainer { + cell.accessoryType = .checkmark + } + + return cell + } + + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + let cell = tableView.cellForRow(at: indexPath) + cell?.accessoryType = .checkmark + + delegate?.didSelect(container: containers[indexPath.row]) + navigationController?.popViewController(animated: true) + } + +} diff --git a/iOS/Add/AddWebFeedViewController.swift b/iOS/Add/AddWebFeedViewController.swift index 49774cc60..ec119fe42 100644 --- a/iOS/Add/AddWebFeedViewController.swift +++ b/iOS/Add/AddWebFeedViewController.swift @@ -16,20 +16,16 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle @IBOutlet private weak var urlTextField: UITextField! @IBOutlet private weak var nameTextField: UITextField! - @IBOutlet private weak var folderPickerView: UIPickerView! @IBOutlet private weak var folderLabel: UILabel! - private lazy var pickerData: FlattenedAccountFolderPickerData = FlattenedAccountFolderPickerData() - private var shouldDisplayPicker: Bool { - return pickerData.containerNames.count > 1 - } - private var userCancelled = false weak var delegate: AddContainerViewControllerChildDelegate? var initialFeed: String? var initialFeedName: String? + var container: Container? + override func viewDidLoad() { super.viewDidLoad() @@ -51,15 +47,17 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle nameTextField.text = initialFeedName nameTextField.delegate = self - folderLabel.text = pickerData.containerNames.first - if shouldDisplayPicker { - folderPickerView.dataSource = self - folderPickerView.delegate = self + if let accountID = AppDefaults.addWebFeedAccountID, let account = AccountManager.shared.activeAccounts.first(where: { $0.accountID == accountID }) { + container = account + } else if let account = AccountManager.shared.sortedActiveAccounts.first { + container = account } else { - folderPickerView.isHidden = true + delegate?.readyToAdd(state: false) } + updateFolderLabel() + // I couldn't figure out the gap at the top of the UITableView, so I took a hammer to it. tableView.contentInset = UIEdgeInsets(top: -28, left: 0, bottom: 0, right: 0) @@ -82,7 +80,7 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle return } - let container = pickerData.containers[folderPickerView.selectedRow(inComponent: 0)] + guard let container = container else { return } var account: Account? if let containerAccount = container as? Account { @@ -123,38 +121,29 @@ class AddWebFeedViewController: UITableViewController, AddContainerViewControlle delegate?.readyToAdd(state: urlTextField.text?.rs_stringMayBeURL() ?? false) } - override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - let defaultNumberOfRows = super.tableView(tableView, numberOfRowsInSection: section) - if section == 1 && !shouldDisplayPicker { - return defaultNumberOfRows - 1 + override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { + if indexPath.row == 2 { + let folderViewController = UIStoryboard.add.instantiateController(ofType: AddWebFeedFolderViewController.self) + folderViewController.delegate = self + folderViewController.initialContainer = container + navigationController?.pushViewController(folderViewController, animated: true) } - - return defaultNumberOfRows } - } -extension AddWebFeedViewController: UIPickerViewDataSource, UIPickerViewDelegate { - - func numberOfComponents(in pickerView: UIPickerView) ->Int { - return 1 +// MARK: AddWebFeedFolderViewControllerDelegate + +extension AddWebFeedViewController: AddWebFeedFolderViewControllerDelegate { + func didSelect(container: Container) { + self.container = container + updateFolderLabel() + AppDefaults.addWebFeedAccountID = container.account?.accountID } - - func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { - return pickerData.containerNames.count - } - - func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { - return pickerData.containerNames[row] - } - - func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { - folderLabel.text = pickerData.containerNames[row] - } - } +// MARK: UITextFieldDelegate + extension AddWebFeedViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { @@ -163,3 +152,17 @@ extension AddWebFeedViewController: UITextFieldDelegate { } } + +// MARK: Private + +private extension AddWebFeedViewController { + func updateFolderLabel() { + if let containerName = (container as? DisplayNameProvider)?.nameForDisplay { + if container is Folder { + folderLabel.text = "\(container?.account?.nameForDisplay ?? "") / \(containerName)" + } else { + folderLabel.text = containerName + } + } + } +} diff --git a/iOS/AppDefaults.swift b/iOS/AppDefaults.swift index e2e576835..13599d85d 100644 --- a/iOS/AppDefaults.swift +++ b/iOS/AppDefaults.swift @@ -25,6 +25,8 @@ struct AppDefaults { static let timelineSortDirection = "timelineSortDirection" static let displayUndoAvailableTip = "displayUndoAvailableTip" static let lastRefresh = "lastRefresh" + static let addWebFeedAccountID = "addWebFeedAccountID" + static let addFolderAccountID = "addFolderAccountID" } static let isFirstRun: Bool = { @@ -34,6 +36,24 @@ struct AppDefaults { firstRunDate = Date() return true }() + + static var addWebFeedAccountID: String? { + get { + return string(for: Key.addWebFeedAccountID) + } + set { + setString(for: Key.addWebFeedAccountID, newValue) + } + } + + static var addFolderAccountID: String? { + get { + return string(for: Key.addFolderAccountID) + } + set { + setString(for: Key.addFolderAccountID, newValue) + } + } static var lastImageCacheFlushDate: Date? { get { @@ -122,6 +142,14 @@ private extension AppDefaults { } } + static func string(for key: String) -> String? { + return UserDefaults.standard.string(forKey: key) + } + + static func setString(for key: String, _ value: String?) { + UserDefaults.standard.set(value, forKey: key) + } + static func bool(for key: String) -> Bool { return AppDefaults.shared.bool(forKey: key) } diff --git a/iOS/Settings/TimelineCustomizerViewController.swift b/iOS/Settings/TimelineCustomizerViewController.swift index 07e642e4b..284b5785d 100644 --- a/iOS/Settings/TimelineCustomizerViewController.swift +++ b/iOS/Settings/TimelineCustomizerViewController.swift @@ -26,11 +26,11 @@ class TimelineCustomizerViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() - iconSizeSliderContainerView.layer.cornerRadius = 12 + iconSizeSliderContainerView.layer.cornerRadius = 10 iconSizeSlider.value = Float(AppDefaults.timelineIconSize.rawValue) iconSizeSlider.addTickMarks() - numberOfLinesSliderContainerView.layer.cornerRadius = 12 + numberOfLinesSliderContainerView.layer.cornerRadius = 10 numberOfLinesSlider.value = Float(AppDefaults.timelineNumberOfLines) numberOfLinesSlider.addTickMarks() }