diff --git a/Frameworks/FeedProvider/FeedProvider.swift b/Frameworks/FeedProvider/FeedProvider.swift new file mode 100644 index 000000000..8ce988d1e --- /dev/null +++ b/Frameworks/FeedProvider/FeedProvider.swift @@ -0,0 +1,20 @@ +// +// FeedProvider.swift +// FeedProvider +// +// Created by Maurice Parker on 4/6/20. +// Copyright © 2020 Ranchero Software, LLC. All rights reserved. +// + +import Foundation +import RSCore + +public enum FeedProviderType: Int, Codable { + // Raw values should not change since they’re stored. + case twitter = 1 +} + + +protocol FeedProvider { + +} diff --git a/Frameworks/FeedProvider/FeedProvider.xcodeproj/project.pbxproj b/Frameworks/FeedProvider/FeedProvider.xcodeproj/project.pbxproj index 949eb244d..1440e387b 100644 --- a/Frameworks/FeedProvider/FeedProvider.xcodeproj/project.pbxproj +++ b/Frameworks/FeedProvider/FeedProvider.xcodeproj/project.pbxproj @@ -13,8 +13,28 @@ 5110769E243BCF3A00D97C8C /* FeedProvider_project_debug.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 51107699243BCF3A00D97C8C /* FeedProvider_project_debug.xcconfig */; }; 5110769F243BCF3A00D97C8C /* FeedProvider_project.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = 5110769A243BCF3A00D97C8C /* FeedProvider_project.xcconfig */; }; 511076EE243BD82A00D97C8C /* Articles.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 511076ED243BD82A00D97C8C /* Articles.framework */; }; + 51107722243BE0DA00D97C8C /* FeedProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51107721243BE0DA00D97C8C /* FeedProvider.swift */; }; + 51107724243BE11800D97C8C /* RSParser.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51107723243BE11800D97C8C /* RSParser.framework */; }; + 51107725243BE11800D97C8C /* RSParser.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51107723243BE11800D97C8C /* RSParser.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51107728243BE15D00D97C8C /* RSCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51107727243BE15D00D97C8C /* RSCore.framework */; }; + 51107729243BE15D00D97C8C /* RSCore.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51107727243BE15D00D97C8C /* RSCore.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + 51107726243BE11800D97C8C /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 51107729243BE15D00D97C8C /* RSCore.framework in Embed Frameworks */, + 51107725243BE11800D97C8C /* RSParser.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ 5110765F243BCE0400D97C8C /* FeedProvider.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = FeedProvider.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 51107663243BCE0400D97C8C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -24,6 +44,9 @@ 51107699243BCF3A00D97C8C /* FeedProvider_project_debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeedProvider_project_debug.xcconfig; sourceTree = ""; }; 5110769A243BCF3A00D97C8C /* FeedProvider_project.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = FeedProvider_project.xcconfig; sourceTree = ""; }; 511076ED243BD82A00D97C8C /* Articles.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Articles.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 51107721243BE0DA00D97C8C /* FeedProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedProvider.swift; sourceTree = ""; }; + 51107723243BE11800D97C8C /* RSParser.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSParser.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 51107727243BE15D00D97C8C /* RSCore.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = RSCore.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -31,6 +54,8 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 51107728243BE15D00D97C8C /* RSCore.framework in Frameworks */, + 51107724243BE11800D97C8C /* RSParser.framework in Frameworks */, 511076EE243BD82A00D97C8C /* Articles.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -41,6 +66,7 @@ 51107655243BCE0400D97C8C = { isa = PBXGroup; children = ( + 51107721243BE0DA00D97C8C /* FeedProvider.swift */, 51107689243BCEB300D97C8C /* xcconfig */, 51107663243BCE0400D97C8C /* Info.plist */, 51107660243BCE0400D97C8C /* Products */, @@ -59,10 +85,10 @@ 51107689243BCEB300D97C8C /* xcconfig */ = { isa = PBXGroup; children = ( + 5110769A243BCF3A00D97C8C /* FeedProvider_project.xcconfig */, 51107699243BCF3A00D97C8C /* FeedProvider_project_debug.xcconfig */, 51107698243BCF3A00D97C8C /* FeedProvider_project_release.xcconfig */, 51107697243BCF3A00D97C8C /* FeedProvider_project_test.xcconfig */, - 5110769A243BCF3A00D97C8C /* FeedProvider_project.xcconfig */, 51107696243BCF3A00D97C8C /* FeedProvider_target.xcconfig */, ); path = xcconfig; @@ -71,6 +97,8 @@ 511076EC243BD82A00D97C8C /* Frameworks */ = { isa = PBXGroup; children = ( + 51107727243BE15D00D97C8C /* RSCore.framework */, + 51107723243BE11800D97C8C /* RSParser.framework */, 511076ED243BD82A00D97C8C /* Articles.framework */, ); name = Frameworks; @@ -98,6 +126,7 @@ 5110765C243BCE0400D97C8C /* Frameworks */, 5110765D243BCE0400D97C8C /* Resources */, 511076A2243BD2E600D97C8C /* Run Script: Verfiy No Build Settings */, + 51107726243BE11800D97C8C /* Embed Frameworks */, ); buildRules = ( ); @@ -115,10 +144,11 @@ isa = PBXProject; attributes = { LastUpgradeCheck = 1140; - ORGANIZATIONNAME = "Vincode, Inc"; + ORGANIZATIONNAME = "Ranchero Software, LLC"; TargetAttributes = { 5110765E243BCE0400D97C8C = { CreatedOnToolsVersion = 11.4; + LastSwiftMigration = 1140; }; }; }; @@ -181,6 +211,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 51107722243BE0DA00D97C8C /* FeedProvider.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/Mac/AppAssets.swift b/Mac/AppAssets.swift index 777438f2c..4ef1c1cc5 100644 --- a/Mac/AppAssets.swift +++ b/Mac/AppAssets.swift @@ -81,6 +81,10 @@ struct AppAssets { return RSImage(named: "faviconTemplateImage")! }() + static var feedProviderTwitter: RSImage = { + return RSImage(named: "feedProviderTwitter")! + }() + static var filterActive: RSImage = { return RSImage(named: "filterActive")! }() diff --git a/Mac/Base.lproj/Preferences.storyboard b/Mac/Base.lproj/Preferences.storyboard index 6b2ac07d5..e9aad2bd7 100644 --- a/Mac/Base.lproj/Preferences.storyboard +++ b/Mac/Base.lproj/Preferences.storyboard @@ -1,8 +1,7 @@ - + - - + @@ -375,7 +374,7 @@ - + @@ -385,17 +384,17 @@ - - + + - + - + - + @@ -403,7 +402,6 @@ - @@ -499,11 +497,11 @@ - + - + @@ -549,6 +547,158 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac/Preferences/FeedProviders/FeedProvidersAdd.xib b/Mac/Preferences/FeedProviders/FeedProvidersAdd.xib new file mode 100644 index 000000000..874bfa9e0 --- /dev/null +++ b/Mac/Preferences/FeedProviders/FeedProvidersAdd.xib @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Mac/Preferences/FeedProviders/FeedProvidersAddTableCellView.swift b/Mac/Preferences/FeedProviders/FeedProvidersAddTableCellView.swift new file mode 100644 index 000000000..8d0325832 --- /dev/null +++ b/Mac/Preferences/FeedProviders/FeedProvidersAddTableCellView.swift @@ -0,0 +1,16 @@ +// +// FeedProvidersAddTableCellView.swift +// NetNewsWire +// +// Created by Maurice Parker on 4/6/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import AppKit + +class FeedProvidersAddTableCellView: NSTableCellView { + + @IBOutlet weak var feedProviderImageView: NSImageView? + @IBOutlet weak var feedProviderNameLabel: NSTextField? + +} diff --git a/Mac/Preferences/FeedProviders/FeedProvidersAddViewController.swift b/Mac/Preferences/FeedProviders/FeedProvidersAddViewController.swift new file mode 100644 index 000000000..426037d96 --- /dev/null +++ b/Mac/Preferences/FeedProviders/FeedProvidersAddViewController.swift @@ -0,0 +1,141 @@ +// +// FeedProvidersAddViewController.swift +// NetNewsWire +// +// Created by Maurice Parker on 4/6/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import AppKit +import FeedProvider + +class FeedProvidersAddViewController: NSViewController { + + @IBOutlet weak var tableView: NSTableView! + + private var accountsAddWindowController: NSWindowController? + + #if DEBUG + private var addableFeedProviderTypes: [FeedProviderType] = [.twitter] + #else + private var addableFeedProviderTypes: [FeedProviderType] = [.twitter] + #endif + + init() { + super.init(nibName: "FeedProvidersAdd", bundle: nil) + } + + public required init?(coder: NSCoder) { + super.init(coder: coder) + } + + override func viewDidLoad() { + super.viewDidLoad() + tableView.dataSource = self + tableView.delegate = self + } + +} + +// MARK: - NSTableViewDataSource + +extension FeedProvidersAddViewController: NSTableViewDataSource { + + func numberOfRows(in tableView: NSTableView) -> Int { + return addableFeedProviderTypes.count + } + + func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { + return nil + } +} + +// MARK: - NSTableViewDelegate + +extension FeedProvidersAddViewController: NSTableViewDelegate { + + private static let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "AccountCell") + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + + if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell"), owner: nil) as? FeedProvidersAddTableCellView { + switch addableFeedProviderTypes[row] { + case .twitter: + cell.feedProviderNameLabel?.stringValue = NSLocalizedString("Twitter", comment: "Twitter") + cell.feedProviderImageView?.image = AppAssets.feedProviderTwitter + } + return cell + } + return nil + } + + func tableViewSelectionDidChange(_ notification: Notification) { + + let selectedRow = tableView.selectedRow + guard selectedRow != -1 else { + return + } + +// switch addableAccountTypes[selectedRow] { +// case .onMyMac: +// let accountsAddLocalWindowController = AccountsAddLocalWindowController() +// accountsAddLocalWindowController.runSheetOnWindow(self.view.window!) +// accountsAddWindowController = accountsAddLocalWindowController +// case .cloudKit: +// let accountsAddCloudKitWindowController = AccountsAddCloudKitWindowController() +// accountsAddCloudKitWindowController.runSheetOnWindow(self.view.window!) { response in +// if response == NSApplication.ModalResponse.OK { +// self.restrictAccounts() +// self.tableView.reloadData() +// } +// } +// accountsAddWindowController = accountsAddCloudKitWindowController +// case .feedbin: +// let accountsFeedbinWindowController = AccountsFeedbinWindowController() +// accountsFeedbinWindowController.runSheetOnWindow(self.view.window!) +// accountsAddWindowController = accountsFeedbinWindowController +// case .feedWrangler: +// let accountsFeedWranglerWindowController = AccountsFeedWranglerWindowController() +// accountsFeedWranglerWindowController.runSheetOnWindow(self.view.window!) +// accountsAddWindowController = accountsFeedWranglerWindowController +// case .freshRSS: +// let accountsReaderAPIWindowController = AccountsReaderAPIWindowController() +// accountsReaderAPIWindowController.accountType = .freshRSS +// accountsReaderAPIWindowController.runSheetOnWindow(self.view.window!) +// accountsAddWindowController = accountsReaderAPIWindowController +// case .feedly: +// let addAccount = OAuthAccountAuthorizationOperation(accountType: .feedly) +// addAccount.delegate = self +// addAccount.presentationAnchor = self.view.window! +// MainThreadOperationQueue.shared.add(addAccount) +// case .newsBlur: +// let accountsNewsBlurWindowController = AccountsNewsBlurWindowController() +// accountsNewsBlurWindowController.runSheetOnWindow(self.view.window!) +// accountsAddWindowController = accountsNewsBlurWindowController +// } + + tableView.selectRowIndexes([], byExtendingSelection: false) + + } + +} + +// MARK: OAuthAccountAuthorizationOperationDelegate + +//extension AccountsAddViewController: OAuthAccountAuthorizationOperationDelegate { +// +// func oauthAccountAuthorizationOperation(_ operation: OAuthAccountAuthorizationOperation, didCreate account: Account) { +// account.refreshAll { [weak self] result in +// switch result { +// case .success: +// break +// case .failure(let error): +// self?.presentError(error) +// } +// } +// } +// +// func oauthAccountAuthorizationOperation(_ operation: OAuthAccountAuthorizationOperation, didFailWith error: Error) { +// view.window?.presentError(error) +// } +//} diff --git a/Mac/Preferences/FeedProviders/FeedProvidersPreferencesViewController.swift b/Mac/Preferences/FeedProviders/FeedProvidersPreferencesViewController.swift new file mode 100644 index 000000000..d41b97df7 --- /dev/null +++ b/Mac/Preferences/FeedProviders/FeedProvidersPreferencesViewController.swift @@ -0,0 +1,89 @@ +// +// FeedProvidersPreferencesViewController.swift +// NetNewsWire +// +// Created by Maurice Parker on 4/6/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import AppKit + +final class FeedProvidersPreferencesViewController: NSViewController { + + @IBOutlet weak var tableView: NSTableView! + @IBOutlet weak var detailView: NSView! + @IBOutlet weak var deleteButton: NSButton! + + private var sortedAccounts = [String]() + + override func viewDidLoad() { + super.viewDidLoad() + + tableView.delegate = self + tableView.dataSource = self + + showController(FeedProvidersAddViewController()) + + // Fix tableView frame — for some reason IB wants it 1pt wider than the clip view. This leads to unwanted horizontal scrolling. + var rTable = tableView.frame + rTable.size.width = tableView.superview!.frame.size.width + tableView.frame = rTable + } + +} + +// MARK: - NSTableViewDataSource + +extension FeedProvidersPreferencesViewController: NSTableViewDataSource { + + func numberOfRows(in tableView: NSTableView) -> Int { + return sortedAccounts.count + } + + func tableView(_ tableView: NSTableView, objectValueFor tableColumn: NSTableColumn?, row: Int) -> Any? { + return sortedAccounts[row] + } +} + +// MARK: - NSTableViewDelegate + +extension FeedProvidersPreferencesViewController: NSTableViewDelegate { + + private static let cellIdentifier = NSUserInterfaceItemIdentifier(rawValue: "AccountCell") + + func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { + if let cell = tableView.makeView(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell"), owner: nil) as? NSTableCellView { + let account = sortedAccounts[row] +// cell.textField?.stringValue = account.nameForDisplay +// cell.imageView?.image = account.smallIcon?.image + return cell + } + return nil + } + + func tableViewSelectionDidChange(_ notification: Notification) { + + + } + +} + +// MARK: - Private + +private extension FeedProvidersPreferencesViewController { + + func showController(_ controller: NSViewController) { + + if let controller = children.first { + children.removeAll() + controller.view.removeFromSuperview() + } + + addChild(controller) + controller.view.translatesAutoresizingMaskIntoConstraints = false + detailView.addSubview(controller.view) + detailView.addFullSizeConstraints(forSubview: controller.view) + + } + +} diff --git a/Mac/Preferences/Accounts/AccountsControlsBackgroundView.swift b/Mac/Preferences/PreferencesControlsBackgroundView.swift similarity index 93% rename from Mac/Preferences/Accounts/AccountsControlsBackgroundView.swift rename to Mac/Preferences/PreferencesControlsBackgroundView.swift index ef4489430..36353dd6b 100644 --- a/Mac/Preferences/Accounts/AccountsControlsBackgroundView.swift +++ b/Mac/Preferences/PreferencesControlsBackgroundView.swift @@ -1,5 +1,5 @@ // -// AccountsControlsBackgroundView.swift +// PreferencesControlsBackgroundView.swift // NetNewsWire // // Created by Brent Simmons on 3/18/19. @@ -9,7 +9,7 @@ import AppKit import RSCore -final class AccountsControlsBackgroundView: NSView { +final class PreferencesControlsBackgroundView: NSView { private let lightModeFillColor = NSColor(white: 0.97, alpha: 1.0) private let darkModeFillColor = NSColor(red: 0.32, green: 0.34, blue: 0.35, alpha: 1.0) diff --git a/Mac/Preferences/Accounts/AccountsTableViewBackgroundView.swift b/Mac/Preferences/PreferencesTableViewBackgroundView.swift similarity index 81% rename from Mac/Preferences/Accounts/AccountsTableViewBackgroundView.swift rename to Mac/Preferences/PreferencesTableViewBackgroundView.swift index 2c30b96b1..34548e429 100644 --- a/Mac/Preferences/Accounts/AccountsTableViewBackgroundView.swift +++ b/Mac/Preferences/PreferencesTableViewBackgroundView.swift @@ -1,5 +1,5 @@ // -// AccountsTableViewBackgroundView.swift +// PreferencesTableViewBackgroundView.swift // NetNewsWire // // Created by Brent Simmons on 3/19/19. @@ -8,7 +8,7 @@ import AppKit -final class AccountsTableViewBackgroundView: NSView { +final class PreferencesTableViewBackgroundView: NSView { let lightBorderColor = NSColor(white: 0.71, alpha: 1.0) let darkBorderColor = NSColor(red: 0.41, green: 0.43, blue: 0.44, alpha: 1.0) diff --git a/Mac/Preferences/PreferencesWindowController.swift b/Mac/Preferences/PreferencesWindowController.swift index 79570b50a..b13adbfd4 100644 --- a/Mac/Preferences/PreferencesWindowController.swift +++ b/Mac/Preferences/PreferencesWindowController.swift @@ -24,6 +24,7 @@ private struct PreferencesToolbarItemSpec { private struct ToolbarItemIdentifier { static let General = "General" static let Accounts = "Accounts" + static let FeedProvider = "FeedProvider" static let Advanced = "Advanced" } @@ -35,6 +36,7 @@ class PreferencesWindowController : NSWindowController, NSToolbarDelegate { var specs = [PreferencesToolbarItemSpec]() specs += [PreferencesToolbarItemSpec(identifierRawValue: ToolbarItemIdentifier.General, name: NSLocalizedString("General", comment: "Preferences"), imageName: NSImage.preferencesGeneralName)] specs += [PreferencesToolbarItemSpec(identifierRawValue: ToolbarItemIdentifier.Accounts, name: NSLocalizedString("Accounts", comment: "Preferences"), imageName: NSImage.userAccountsName)] + specs += [PreferencesToolbarItemSpec(identifierRawValue: ToolbarItemIdentifier.FeedProvider, name: NSLocalizedString("Providers", comment: "Preferences"), imageName: "feedProviderToolbar")] // Omit the Advanced Preferences for now because the Software Update related functionality is // forbidden/non-applicable, and we can rely upon Apple to some extent for crash reports. We diff --git a/Mac/Resources/Assets.xcassets/feedProviderToolbar.imageset/Contents.json b/Mac/Resources/Assets.xcassets/feedProviderToolbar.imageset/Contents.json new file mode 100644 index 000000000..79f849e65 --- /dev/null +++ b/Mac/Resources/Assets.xcassets/feedProviderToolbar.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "filename" : "globe.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Mac/Resources/Assets.xcassets/feedProviderToolbar.imageset/globe.pdf b/Mac/Resources/Assets.xcassets/feedProviderToolbar.imageset/globe.pdf new file mode 100644 index 000000000..2e2ffbf18 Binary files /dev/null and b/Mac/Resources/Assets.xcassets/feedProviderToolbar.imageset/globe.pdf differ diff --git a/Mac/Resources/Assets.xcassets/feedProviderTwitter.imageset/Contents.json b/Mac/Resources/Assets.xcassets/feedProviderTwitter.imageset/Contents.json new file mode 100644 index 000000000..834100cda --- /dev/null +++ b/Mac/Resources/Assets.xcassets/feedProviderTwitter.imageset/Contents.json @@ -0,0 +1,15 @@ +{ + "images" : [ + { + "filename" : "twitter.pdf", + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + }, + "properties" : { + "template-rendering-intent" : "template" + } +} diff --git a/Mac/Resources/Assets.xcassets/feedProviderTwitter.imageset/twitter.pdf b/Mac/Resources/Assets.xcassets/feedProviderTwitter.imageset/twitter.pdf new file mode 100644 index 000000000..e50de4443 Binary files /dev/null and b/Mac/Resources/Assets.xcassets/feedProviderTwitter.imageset/twitter.pdf differ diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 573f28327..7eb562138 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -28,11 +28,19 @@ 5108F6D22375EED2001ABC45 /* TimelineCustomizerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5108F6D12375EED2001ABC45 /* TimelineCustomizerViewController.swift */; }; 5108F6D42375EEEF001ABC45 /* TimelinePreviewTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5108F6D32375EEEF001ABC45 /* TimelinePreviewTableViewController.swift */; }; 5108F6D823763094001ABC45 /* TickMarkSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5108F6D723763094001ABC45 /* TickMarkSlider.swift */; }; + 510C43ED243C0973009F70C3 /* FeedProvidersAdd.xib in Resources */ = {isa = PBXBuildFile; fileRef = 510C43EC243C0973009F70C3 /* FeedProvidersAdd.xib */; }; + 510C43EE243C0973009F70C3 /* FeedProvidersAdd.xib in Resources */ = {isa = PBXBuildFile; fileRef = 510C43EC243C0973009F70C3 /* FeedProvidersAdd.xib */; }; + 510C43F0243C0A80009F70C3 /* FeedProvidersAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43EF243C0A80009F70C3 /* FeedProvidersAddViewController.swift */; }; + 510C43F1243C0A80009F70C3 /* FeedProvidersAddViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43EF243C0A80009F70C3 /* FeedProvidersAddViewController.swift */; }; + 510C43F3243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F2243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift */; }; + 510C43F4243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 510C43F2243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift */; }; 51102165233A7D6C0007A5F7 /* ArticleExtractorButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51102164233A7D6C0007A5F7 /* ArticleExtractorButton.swift */; }; 511076F7243BDA8100D97C8C /* FeedProvider.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51107672243BCE0500D97C8C /* FeedProvider.framework */; }; 511076F8243BDA8200D97C8C /* FeedProvider.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51107672243BCE0500D97C8C /* FeedProvider.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 511076F9243BDA9600D97C8C /* FeedProvider.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 51107672243BCE0500D97C8C /* FeedProvider.framework */; }; 511076FA243BDA9600D97C8C /* FeedProvider.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 51107672243BCE0500D97C8C /* FeedProvider.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 51107746243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51107745243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift */; }; + 51107747243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51107745243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift */; }; 5110C37D2373A8D100A9C04F /* InspectorIconHeaderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5110C37C2373A8D100A9C04F /* InspectorIconHeaderView.swift */; }; 51126DA4225FDE2F00722696 /* RSImage-Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51126DA3225FDE2F00722696 /* RSImage-Extensions.swift */; }; 5115CAF42266301400B21BCE /* AddContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51121B5A22661FEF00BC0EC1 /* AddContainerViewController.swift */; }; @@ -351,7 +359,7 @@ 65ED3FDD235DEF6C0081F399 /* ActivityType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51D87EE02311D34700E63F03 /* ActivityType.swift */; }; 65ED3FDE235DEF6C0081F399 /* CrashReportWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 840BEE4021D70E64009BBAFA /* CrashReportWindowController.swift */; }; 65ED3FDF235DEF6C0081F399 /* WebFeedIconDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 842611891FCB67AA0086A189 /* WebFeedIconDownloader.swift */; }; - 65ED3FE0235DEF6C0081F399 /* AccountsControlsBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7122629E1200D921D6 /* AccountsControlsBackgroundView.swift */; }; + 65ED3FE0235DEF6C0081F399 /* PreferencesControlsBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7122629E1200D921D6 /* PreferencesControlsBackgroundView.swift */; }; 65ED3FE1235DEF6C0081F399 /* MarkCommandValidationStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84162A142038C12C00035290 /* MarkCommandValidationStatus.swift */; }; 65ED3FE2235DEF6C0081F399 /* ArticlePasteboardWriter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84E95D231FB1087500552D99 /* ArticlePasteboardWriter.swift */; }; 65ED3FE3235DEF6C0081F399 /* ArticleUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A97581ED9EB0D007D329B /* ArticleUtilities.swift */; }; @@ -406,7 +414,7 @@ 65ED4015235DEF6C0081F399 /* AccountsDetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA2E2279FAB600D19003 /* AccountsDetailViewController.swift */; }; 65ED4016235DEF6C0081F399 /* DetailViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A977E1ED9EC42007D329B /* DetailViewController.swift */; }; 65ED4017235DEF6C0081F399 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC6622629B3900D921D6 /* AppDelegate.swift */; }; - 65ED4018235DEF6C0081F399 /* AccountsTableViewBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7022629E1200D921D6 /* AccountsTableViewBackgroundView.swift */; }; + 65ED4018235DEF6C0081F399 /* PreferencesTableViewBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7022629E1200D921D6 /* PreferencesTableViewBackgroundView.swift */; }; 65ED4019235DEF6C0081F399 /* FetchRequestOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84CAFCAE22BC8C35007694F0 /* FetchRequestOperation.swift */; }; 65ED401A235DEF6C0081F399 /* HTMLMetadataDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8426119D1FCB6ED40086A189 /* HTMLMetadataDownloader.swift */; }; 65ED401B235DEF6C0081F399 /* TimelineViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 849A976B1ED9EBC8007D329B /* TimelineViewController.swift */; }; @@ -621,8 +629,8 @@ 84C9FC7722629E1200D921D6 /* AdvancedPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC6B22629E1200D921D6 /* AdvancedPreferencesViewController.swift */; }; 84C9FC7822629E1200D921D6 /* GeneralPrefencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC6D22629E1200D921D6 /* GeneralPrefencesViewController.swift */; }; 84C9FC7922629E1200D921D6 /* PreferencesWindowController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC6E22629E1200D921D6 /* PreferencesWindowController.swift */; }; - 84C9FC7A22629E1200D921D6 /* AccountsTableViewBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7022629E1200D921D6 /* AccountsTableViewBackgroundView.swift */; }; - 84C9FC7B22629E1200D921D6 /* AccountsControlsBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7122629E1200D921D6 /* AccountsControlsBackgroundView.swift */; }; + 84C9FC7A22629E1200D921D6 /* PreferencesTableViewBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7022629E1200D921D6 /* PreferencesTableViewBackgroundView.swift */; }; + 84C9FC7B22629E1200D921D6 /* PreferencesControlsBackgroundView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7122629E1200D921D6 /* PreferencesControlsBackgroundView.swift */; }; 84C9FC7C22629E1200D921D6 /* AccountsPreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */; }; 84C9FC7D22629E1200D921D6 /* AccountsDetail.xib in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC7422629E1200D921D6 /* AccountsDetail.xib */; }; 84C9FC8222629E4800D921D6 /* Preferences.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 84C9FC8022629E4800D921D6 /* Preferences.storyboard */; }; @@ -1286,8 +1294,12 @@ 5108F6D12375EED2001ABC45 /* TimelineCustomizerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineCustomizerViewController.swift; sourceTree = ""; }; 5108F6D32375EEEF001ABC45 /* TimelinePreviewTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelinePreviewTableViewController.swift; sourceTree = ""; }; 5108F6D723763094001ABC45 /* TickMarkSlider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TickMarkSlider.swift; sourceTree = ""; }; + 510C43EC243C0973009F70C3 /* FeedProvidersAdd.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = FeedProvidersAdd.xib; sourceTree = ""; }; + 510C43EF243C0A80009F70C3 /* FeedProvidersAddViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedProvidersAddViewController.swift; sourceTree = ""; }; + 510C43F2243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedProvidersAddTableCellView.swift; sourceTree = ""; }; 51102164233A7D6C0007A5F7 /* ArticleExtractorButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ArticleExtractorButton.swift; sourceTree = ""; }; 5110766A243BCE0400D97C8C /* FeedProvider.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = FeedProvider.xcodeproj; path = Frameworks/FeedProvider/FeedProvider.xcodeproj; sourceTree = SOURCE_ROOT; }; + 51107745243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedProvidersPreferencesViewController.swift; sourceTree = ""; }; 5110C37C2373A8D100A9C04F /* InspectorIconHeaderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InspectorIconHeaderView.swift; sourceTree = ""; }; 51121AA12265430A00BC0EC1 /* NetNewsWire_iOSapp_target.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = NetNewsWire_iOSapp_target.xcconfig; sourceTree = ""; }; 51121B5A22661FEF00BC0EC1 /* AddContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContainerViewController.swift; sourceTree = ""; }; @@ -1592,8 +1604,8 @@ 84C9FC6B22629E1200D921D6 /* AdvancedPreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AdvancedPreferencesViewController.swift; sourceTree = ""; }; 84C9FC6D22629E1200D921D6 /* GeneralPrefencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneralPrefencesViewController.swift; sourceTree = ""; }; 84C9FC6E22629E1200D921D6 /* PreferencesWindowController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesWindowController.swift; sourceTree = ""; }; - 84C9FC7022629E1200D921D6 /* AccountsTableViewBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsTableViewBackgroundView.swift; sourceTree = ""; }; - 84C9FC7122629E1200D921D6 /* AccountsControlsBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsControlsBackgroundView.swift; sourceTree = ""; }; + 84C9FC7022629E1200D921D6 /* PreferencesTableViewBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesTableViewBackgroundView.swift; sourceTree = ""; }; + 84C9FC7122629E1200D921D6 /* PreferencesControlsBackgroundView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PreferencesControlsBackgroundView.swift; sourceTree = ""; }; 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsPreferencesViewController.swift; sourceTree = ""; }; 84C9FC7422629E1200D921D6 /* AccountsDetail.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AccountsDetail.xib; sourceTree = ""; }; 84C9FC8122629E4800D921D6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Mac/Base.lproj/Preferences.storyboard; sourceTree = SOURCE_ROOT; }; @@ -1800,6 +1812,17 @@ name = Products; sourceTree = ""; }; + 51107744243BEDD300D97C8C /* FeedProviders */ = { + isa = PBXGroup; + children = ( + 510C43EC243C0973009F70C3 /* FeedProvidersAdd.xib */, + 510C43F2243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift */, + 510C43EF243C0A80009F70C3 /* FeedProvidersAddViewController.swift */, + 51107745243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift */, + ); + path = FeedProviders; + sourceTree = ""; + }; 511D43CE231FA51100FB1562 /* Resources */ = { isa = PBXGroup; children = ( @@ -2626,9 +2649,12 @@ children = ( 84C9FC8022629E4800D921D6 /* Preferences.storyboard */, 84C9FC6E22629E1200D921D6 /* PreferencesWindowController.swift */, + 84C9FC7022629E1200D921D6 /* PreferencesTableViewBackgroundView.swift */, + 84C9FC7122629E1200D921D6 /* PreferencesControlsBackgroundView.swift */, 84C9FC6A22629E1200D921D6 /* Advanced */, 84C9FC6C22629E1200D921D6 /* General */, 84C9FC6F22629E1200D921D6 /* Accounts */, + 51107744243BEDD300D97C8C /* FeedProviders */, ); path = Preferences; sourceTree = ""; @@ -2652,8 +2678,6 @@ 84C9FC6F22629E1200D921D6 /* Accounts */ = { isa = PBXGroup; children = ( - 84C9FC7022629E1200D921D6 /* AccountsTableViewBackgroundView.swift */, - 84C9FC7122629E1200D921D6 /* AccountsControlsBackgroundView.swift */, 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */, 51EF0F8D2279C9260050506E /* AccountsAdd.xib */, 51EF0F8F2279C9500050506E /* AccountsAddViewController.swift */, @@ -3527,6 +3551,7 @@ 65ED4051235DEF6C0081F399 /* TimelineKeyboardShortcuts.plist in Resources */, 65ED4052235DEF6C0081F399 /* template.html in Resources */, 65ED4054235DEF6C0081F399 /* Main.storyboard in Resources */, + 510C43EE243C0973009F70C3 /* FeedProvidersAdd.xib in Resources */, 65ED4055235DEF6C0081F399 /* AccountsAdd.xib in Resources */, 65ED4056235DEF6C0081F399 /* NetNewsWire.sdef in Resources */, 65ED4057235DEF6C0081F399 /* AccountsDetail.xib in Resources */, @@ -3641,6 +3666,7 @@ 3B826DCB2385C84800FC1ADB /* AccountsFeedWrangler.xib in Resources */, 55E15BCB229D65A900D6602A /* AccountsReaderAPI.xib in Resources */, 49F40DF82335B71000552BF4 /* newsfoot.js in Resources */, + 510C43ED243C0973009F70C3 /* FeedProvidersAdd.xib in Resources */, BDCB516724282C8A00102A80 /* AccountsNewsBlur.xib in Resources */, 5103A9982421643300410853 /* blank.html in Resources */, 84BAE64921CEDAF20046DB56 /* CrashReporterWindow.xib in Resources */, @@ -3820,6 +3846,7 @@ files = ( 65ED3FB7235DEF6C0081F399 /* ArticleArray.swift in Sources */, 65ED3FB8235DEF6C0081F399 /* CrashReporter.swift in Sources */, + 51107747243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift in Sources */, 65ED3FB9235DEF6C0081F399 /* IconView.swift in Sources */, 65ED3FBB235DEF6C0081F399 /* InspectorWindowController.swift in Sources */, 65ED3FBC235DEF6C0081F399 /* ColorHash.swift in Sources */, @@ -3858,7 +3885,7 @@ 65ED3FDD235DEF6C0081F399 /* ActivityType.swift in Sources */, 65ED3FDE235DEF6C0081F399 /* CrashReportWindowController.swift in Sources */, 65ED3FDF235DEF6C0081F399 /* WebFeedIconDownloader.swift in Sources */, - 65ED3FE0235DEF6C0081F399 /* AccountsControlsBackgroundView.swift in Sources */, + 65ED3FE0235DEF6C0081F399 /* PreferencesControlsBackgroundView.swift in Sources */, 65ED3FE1235DEF6C0081F399 /* MarkCommandValidationStatus.swift in Sources */, 65ED3FE2235DEF6C0081F399 /* ArticlePasteboardWriter.swift in Sources */, 65ED3FE3235DEF6C0081F399 /* ArticleUtilities.swift in Sources */, @@ -3915,13 +3942,14 @@ 65ED4015235DEF6C0081F399 /* AccountsDetailViewController.swift in Sources */, 65ED4016235DEF6C0081F399 /* DetailViewController.swift in Sources */, 65ED4017235DEF6C0081F399 /* AppDelegate.swift in Sources */, - 65ED4018235DEF6C0081F399 /* AccountsTableViewBackgroundView.swift in Sources */, + 65ED4018235DEF6C0081F399 /* PreferencesTableViewBackgroundView.swift in Sources */, 65ED4019235DEF6C0081F399 /* FetchRequestOperation.swift in Sources */, 65ED401A235DEF6C0081F399 /* HTMLMetadataDownloader.swift in Sources */, 65ED401B235DEF6C0081F399 /* TimelineViewController.swift in Sources */, 65ED401C235DEF6C0081F399 /* FaviconGenerator.swift in Sources */, 65ED401D235DEF6C0081F399 /* RefreshInterval.swift in Sources */, 65ED401E235DEF6C0081F399 /* TimelineCellData.swift in Sources */, + 510C43F1243C0A80009F70C3 /* FeedProvidersAddViewController.swift in Sources */, 65ED401F235DEF6C0081F399 /* BuiltinSmartFeedInspectorViewController.swift in Sources */, 65ED4020235DEF6C0081F399 /* AppDelegate+Scriptability.swift in Sources */, 65ED4021235DEF6C0081F399 /* NNW3Document.swift in Sources */, @@ -3956,6 +3984,7 @@ 65ED403C235DEF6C0081F399 /* SingleLineTextFieldSizer.swift in Sources */, 65ED403D235DEF6C0081F399 /* TimelineTableCellView.swift in Sources */, 65ED403E235DEF6C0081F399 /* TimelineCellAppearance.swift in Sources */, + 510C43F4243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift in Sources */, 65ED403F235DEF6C0081F399 /* ArticleRenderer.swift in Sources */, 65ED4040235DEF6C0081F399 /* GeneralPrefencesViewController.swift in Sources */, 179DB1DFBCF9177104B12E0F /* AccountsNewsBlurWindowController.swift in Sources */, @@ -4173,9 +4202,10 @@ 849A97651ED9EB96007D329B /* WebFeedTreeControllerDelegate.swift in Sources */, 849A97671ED9EB96007D329B /* UnreadCountView.swift in Sources */, 51FE10092346739D0056195D /* ActivityType.swift in Sources */, + 510C43F3243C11FE009F70C3 /* FeedProvidersAddTableCellView.swift in Sources */, 840BEE4121D70E64009BBAFA /* CrashReportWindowController.swift in Sources */, 8426118A1FCB67AA0086A189 /* WebFeedIconDownloader.swift in Sources */, - 84C9FC7B22629E1200D921D6 /* AccountsControlsBackgroundView.swift in Sources */, + 84C9FC7B22629E1200D921D6 /* PreferencesControlsBackgroundView.swift in Sources */, 84162A152038C12C00035290 /* MarkCommandValidationStatus.swift in Sources */, 84E95D241FB1087500552D99 /* ArticlePasteboardWriter.swift in Sources */, 849A975B1ED9EB0D007D329B /* ArticleUtilities.swift in Sources */, @@ -4193,6 +4223,7 @@ D5907DB22004BB37005947E5 /* ScriptingObjectContainer.swift in Sources */, 849A978A1ED9ECEF007D329B /* ArticleStylesManager.swift in Sources */, 8405DD8A2213E0E3008CE1BF /* DetailContainerView.swift in Sources */, + 51107746243BEE2500D97C8C /* FeedProvidersPreferencesViewController.swift in Sources */, 519B8D332143397200FA689C /* SharingServiceDelegate.swift in Sources */, FF3ABF1523259DDB0074C542 /* ArticleSorter.swift in Sources */, 84E8E0DB202EC49300562D8F /* TimelineViewController+ContextualMenus.swift in Sources */, @@ -4235,7 +4266,7 @@ 849A97801ED9EC42007D329B /* DetailViewController.swift in Sources */, 518C3193237B00D9004D740F /* DetailIconSchemeHandler.swift in Sources */, 84C9FC6722629B9000D921D6 /* AppDelegate.swift in Sources */, - 84C9FC7A22629E1200D921D6 /* AccountsTableViewBackgroundView.swift in Sources */, + 84C9FC7A22629E1200D921D6 /* PreferencesTableViewBackgroundView.swift in Sources */, 84CAFCAF22BC8C35007694F0 /* FetchRequestOperation.swift in Sources */, 8426119E1FCB6ED40086A189 /* HTMLMetadataDownloader.swift in Sources */, 849A976E1ED9EBC8007D329B /* TimelineViewController.swift in Sources */, @@ -4248,6 +4279,7 @@ 518651B223555EB20078E021 /* NNW3Document.swift in Sources */, D5F4EDB5200744A700B9E363 /* ScriptingObject.swift in Sources */, D5F4EDB920074D7C00B9E363 /* Folder+Scriptability.swift in Sources */, + 510C43F0243C0A80009F70C3 /* FeedProvidersAddViewController.swift in Sources */, 849A97781ED9EC04007D329B /* TimelineCellLayout.swift in Sources */, 84E8E0EB202F693600562D8F /* DetailWebView.swift in Sources */, 849A976C1ED9EBC8007D329B /* TimelineTableRowView.swift in Sources */,