diff --git a/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift b/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift index d28ff36e7..5d026882a 100644 --- a/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift +++ b/Mac/Preferences/Accounts/AccountsPreferencesViewController.swift @@ -45,10 +45,7 @@ final class AccountsPreferencesViewController: NSViewController { rTable.size.width = tableView.superview!.frame.size.width tableView.frame = rTable - // Set initial row selection - if sortedAccounts.count > 0 { - tableView.selectRow(0) - } + hideController() } @IBAction func addAccount(_ sender: Any) { @@ -247,7 +244,8 @@ private extension AccountsPreferencesViewController { helpText = NSLocalizedString("Select an account or add a new account by clicking the + button.", comment: "Add Account Explainer") } - let textHostingController = NSHostingController(rootView: Text(helpText).multilineTextAlignment(.center)) + let textHostingController = NSHostingController(rootView: + AddAccountHelpView(delegate: addAccountDelegate, helpText: helpText)) addChild(textHostingController) textHostingController.view.translatesAutoresizingMaskIntoConstraints = false detailView.addSubview(textHostingController.view) diff --git a/Mac/Preferences/Accounts/AddAccountHelpView.swift b/Mac/Preferences/Accounts/AddAccountHelpView.swift new file mode 100644 index 000000000..fa7675f63 --- /dev/null +++ b/Mac/Preferences/Accounts/AddAccountHelpView.swift @@ -0,0 +1,48 @@ +// +// AddAccountHelpView.swift +// NetNewsWire +// +// Created by Stuart Breckenridge on 4/11/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import SwiftUI +import Account + +struct AddAccountHelpView: View { + + let accountTypes: [AccountType] = AddAccountSections.allOrdered.sectionContent + var delegate: AccountsPreferencesAddAccountDelegate? + var helpText: String + @State private var hoveringId: String? = nil + + var body: some View { + VStack { + HStack { + ForEach(accountTypes, id: \.self) { account in + account.image() + .resizable() + .frame(width: 20, height: 20, alignment: .center) + .onTapGesture { + delegate?.presentSheetForAccount(account) + hoveringId = nil + } + .onHover(perform: { hovering in + if hovering { + hoveringId = account.localizedAccountName() + } else { + hoveringId = nil + } + }) + .scaleEffect(hoveringId == account.localizedAccountName() ? 1.2 : 1) + .shadow(radius: hoveringId == account.localizedAccountName() ? 0.8 : 0) + } + } + + Text(helpText) + .multilineTextAlignment(.center) + .padding(.top, 8) + + } + } +} diff --git a/Mac/Preferences/Accounts/AddAccountsView.swift b/Mac/Preferences/Accounts/AddAccountsView.swift index 61ccaf3f1..e79828846 100644 --- a/Mac/Preferences/Accounts/AddAccountsView.swift +++ b/Mac/Preferences/Accounts/AddAccountsView.swift @@ -9,11 +9,12 @@ import SwiftUI import Account -private enum AddAccountSections: Int, CaseIterable { +enum AddAccountSections: Int, CaseIterable { case local = 0 case icloud case web case selfhosted + case allOrdered var sectionHeader: String { switch self { @@ -25,6 +26,8 @@ private enum AddAccountSections: Int, CaseIterable { return NSLocalizedString("Web", comment: "Web Account") case .selfhosted: return NSLocalizedString("Self-hosted", comment: "Self hosted Account") + case .allOrdered: + return "" } } @@ -38,6 +41,8 @@ private enum AddAccountSections: Int, CaseIterable { return NSLocalizedString("Web accounts sync your subscriptions across all your devices.", comment: "Web Account") case .selfhosted: return NSLocalizedString("Self-hosted accounts sync your subscriptions across all your devices.", comment: "Self hosted Account") + case .allOrdered: + return "" } } @@ -51,6 +56,11 @@ private enum AddAccountSections: Int, CaseIterable { return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader] case .selfhosted: return [.freshRSS] + case .allOrdered: + return AddAccountSections.local.sectionContent + + AddAccountSections.icloud.sectionContent + + AddAccountSections.web.sectionContent + + AddAccountSections.selfhosted.sectionContent } } } diff --git a/Mac/Preferences/ExtensionPoints/EnableExtensionPointHelpView.swift b/Mac/Preferences/ExtensionPoints/EnableExtensionPointHelpView.swift new file mode 100644 index 000000000..dfebd08cb --- /dev/null +++ b/Mac/Preferences/ExtensionPoints/EnableExtensionPointHelpView.swift @@ -0,0 +1,48 @@ +// +// EnableExtensionPointHelpView.swift +// NetNewsWire +// +// Created by Stuart Breckenridge on 4/11/20. +// Copyright © 2020 Ranchero Software. All rights reserved. +// + +import AppKit +import SwiftUI +import RSCore + +struct EnableExtensionPointHelpView: View { + let imageLiterals = ["extensionPointMarsEdit", "extensionPointMicroblog", "extensionPointReddit", "extensionPointTwitter"] + var helpText: String + weak var preferencesController: ExtensionPointPreferencesViewController? + + @State private var hoveringId: String? + + var body: some View { + VStack { + HStack { + ForEach(imageLiterals, id: \.self) { name in + Image(name) + .resizable() + .frame(width: 20, height: 20, alignment: .center) + .onTapGesture { + preferencesController?.enableExtensionPoints(self) + hoveringId = nil + } + .onHover(perform: { hovering in + if hovering { + hoveringId = name + } else { + hoveringId = nil + } + }) + .scaleEffect(hoveringId == name ? 1.2 : 1) + .shadow(radius: hoveringId == name ? 0.8 : 0) + } + } + + Text(helpText) + .multilineTextAlignment(.center) + .padding(.top, 8) + } + } +} diff --git a/Mac/Preferences/ExtensionPoints/EnableExtensionPointView.swift b/Mac/Preferences/ExtensionPoints/EnableExtensionPointView.swift index b7c707321..a61649e86 100644 --- a/Mac/Preferences/ExtensionPoints/EnableExtensionPointView.swift +++ b/Mac/Preferences/ExtensionPoints/EnableExtensionPointView.swift @@ -14,7 +14,7 @@ struct EnableExtensionPointView: View { weak var parent: NSHostingController? // required because presentationMode.dismiss() doesn't work weak var enabler: ExtensionPointPreferencesEnabler? - @State private var extensionPointTypeName = String(describing: Self.feedProviderExtensionPointTypes.first!) + @State private var extensionPointTypeName = String(describing: Self.feedProviderExtensionPointTypes.first) init(enabler: ExtensionPointPreferencesEnabler?) { self.enabler = enabler @@ -48,7 +48,7 @@ struct EnableExtensionPointView: View { Text("Cancel") .frame(width: 80) }) - .accessibility(label: Text("Add Account")) + .accessibility(label: Text("Add Extension")) } if #available(OSX 11.0, *) { Button(action: { @@ -58,7 +58,7 @@ struct EnableExtensionPointView: View { Text("Continue") .frame(width: 80) }) - .help("Add Account") + .help("Add Extension") .keyboardShortcut(.defaultAction) } else { @@ -107,7 +107,7 @@ struct EnableExtensionPointView: View { .pickerStyle(RadioGroupPickerStyle()) .offset(x: 7.5, y: 0) - Text("An extension point that makes websites appear to provide RSS feeds for their content.") + Text("An extension that makes websites appear to provide RSS feeds for their content.") .foregroundColor(.gray) .font(.caption) .padding(.horizontal) @@ -144,7 +144,7 @@ struct EnableExtensionPointView: View { .pickerStyle(RadioGroupPickerStyle()) .offset(x: 7.5, y: 0) - Text("An extension point that enables a share menu item that passes article data to a third-party application.") + Text("An extension that enables a share menu item that passes article data to a third-party application.") .foregroundColor(.gray) .font(.caption) .padding(.horizontal) @@ -170,3 +170,6 @@ struct EnableExtensionPointView: View { fatalError() } } + + + diff --git a/Mac/Preferences/ExtensionPoints/ExtensionPointPreferencesViewController.swift b/Mac/Preferences/ExtensionPoints/ExtensionPointPreferencesViewController.swift index 71012e938..892a65a69 100644 --- a/Mac/Preferences/ExtensionPoints/ExtensionPointPreferencesViewController.swift +++ b/Mac/Preferences/ExtensionPoints/ExtensionPointPreferencesViewController.swift @@ -41,10 +41,7 @@ final class ExtensionPointPreferencesViewController: NSViewController { showDefaultView() - // Set initial row selection - if activeExtensionPoints.count > 0 { - tableView.selectRow(0) - } + } @IBAction func enableExtensionPoints(_ sender: Any) { @@ -183,9 +180,9 @@ private extension ExtensionPointPreferencesViewController { if tableView.selectedRow == -1 { var helpText = "" if activeExtensionPoints.count == 0 { - helpText = NSLocalizedString("Add an extension point by clicking the + button.", comment: "Extension Explainer") + helpText = NSLocalizedString("Add an extension by clicking the + button.", comment: "Extension Explainer") } else { - helpText = NSLocalizedString("Select an extension point or add a new extension point by clicking the + button.", comment: "Extension Explainer") + helpText = NSLocalizedString("Select an extension or add a new extension point by clicking the + button.", comment: "Extension Explainer") } if let controller = children.first { @@ -193,7 +190,7 @@ private extension ExtensionPointPreferencesViewController { controller.view.removeFromSuperview() } - let textHostingController = NSHostingController(rootView: Text(helpText).multilineTextAlignment(.center)) + let textHostingController = NSHostingController(rootView: EnableExtensionPointHelpView(helpText: helpText, preferencesController: self)) addChild(textHostingController) textHostingController.view.translatesAutoresizingMaskIntoConstraints = false detailView.addSubview(textHostingController.view) @@ -223,12 +220,12 @@ private extension ExtensionPointPreferencesViewController { if tableView.selectedRow == -1 { var helpText = "" if activeExtensionPoints.count == 0 { - helpText = NSLocalizedString("Add an extension point by clicking the + button.", comment: "Extension Explainer") + helpText = NSLocalizedString("Add an extension by clicking the + button.", comment: "Extension Explainer") } else { - helpText = NSLocalizedString("Select an extension point or add a new extension point by clicking the + button.", comment: "Extension Explainer") + helpText = NSLocalizedString("Select an extension or add a new extension point by clicking the + button.", comment: "Extension Explainer") } - let textHostingController = NSHostingController(rootView: Text(helpText).multilineTextAlignment(.center)) + let textHostingController = NSHostingController(rootView: EnableExtensionPointHelpView(helpText: helpText, preferencesController: self)) addChild(textHostingController) textHostingController.view.translatesAutoresizingMaskIntoConstraints = false detailView.addSubview(textHostingController.view) @@ -297,3 +294,5 @@ private extension ExtensionPointPreferencesViewController { } } + + diff --git a/NetNewsWire.xcodeproj/project.pbxproj b/NetNewsWire.xcodeproj/project.pbxproj index 938e2013b..b9da8c139 100644 --- a/NetNewsWire.xcodeproj/project.pbxproj +++ b/NetNewsWire.xcodeproj/project.pbxproj @@ -9,6 +9,10 @@ /* Begin PBXBuildFile section */ 1704053424E5985A00A00787 /* SceneNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704053324E5985A00A00787 /* SceneNavigationModel.swift */; }; 1704053524E5985A00A00787 /* SceneNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704053324E5985A00A00787 /* SceneNavigationModel.swift */; }; + 1710B9132552354E00679C0D /* AddAccountHelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1710B9122552354E00679C0D /* AddAccountHelpView.swift */; }; + 1710B9142552354E00679C0D /* AddAccountHelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1710B9122552354E00679C0D /* AddAccountHelpView.swift */; }; + 1710B929255246F900679C0D /* EnableExtensionPointHelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1710B928255246F900679C0D /* EnableExtensionPointHelpView.swift */; }; + 1710B92A255246F900679C0D /* EnableExtensionPointHelpView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1710B928255246F900679C0D /* EnableExtensionPointHelpView.swift */; }; 1717535624BADF33004498C6 /* GeneralPreferencesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */; }; 171BCB8C24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */; }; 171BCB8D24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */; }; @@ -1440,6 +1444,8 @@ /* Begin PBXFileReference section */ 1704053324E5985A00A00787 /* SceneNavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneNavigationModel.swift; sourceTree = ""; }; + 1710B9122552354E00679C0D /* AddAccountHelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountHelpView.swift; sourceTree = ""; }; + 1710B928255246F900679C0D /* EnableExtensionPointHelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnableExtensionPointHelpView.swift; sourceTree = ""; }; 1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesModel.swift; sourceTree = ""; }; 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixAccountCredentialView.swift; sourceTree = ""; }; 172199C824AB228900A31D04 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = ""; }; @@ -2311,6 +2317,7 @@ isa = PBXGroup; children = ( 5183CFAE254C78C8006B83A5 /* EnableExtensionPointView.swift */, + 1710B928255246F900679C0D /* EnableExtensionPointHelpView.swift */, 515A516D243E7F950089E588 /* ExtensionPointDetail.xib */, 515A5170243E802B0089E588 /* ExtensionPointDetailViewController.swift */, 515A5147243E64BA0089E588 /* ExtensionPointEnableWindowController.swift */, @@ -3336,6 +3343,7 @@ isa = PBXGroup; children = ( 178A9F9C2549449F00AB7E9D /* AddAccountsView.swift */, + 1710B9122552354E00679C0D /* AddAccountHelpView.swift */, 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */, 84C9FC7422629E1200D921D6 /* AccountsDetail.xib */, 5144EA2E2279FAB600D19003 /* AccountsDetailViewController.swift */, @@ -4805,6 +4813,7 @@ 65ED3FBD235DEF6C0081F399 /* AppDefaults.swift in Sources */, 65ED3FBE235DEF6C0081F399 /* Account+Scriptability.swift in Sources */, 65ED3FBF235DEF6C0081F399 /* NothingInspectorViewController.swift in Sources */, + 1710B92A255246F900679C0D /* EnableExtensionPointHelpView.swift in Sources */, 65ED3FC0235DEF6C0081F399 /* AppNotifications.swift in Sources */, 65ED3FC1235DEF6C0081F399 /* TimelineKeyboardDelegate.swift in Sources */, 65ED3FC2235DEF6C0081F399 /* Browser.swift in Sources */, @@ -4875,6 +4884,7 @@ 65ED3FF7235DEF6C0081F399 /* SearchFeedDelegate.swift in Sources */, 65ED3FF8235DEF6C0081F399 /* ErrorHandler.swift in Sources */, 65ED3FF9235DEF6C0081F399 /* ActivityManager.swift in Sources */, + 1710B9142552354E00679C0D /* AddAccountHelpView.swift in Sources */, 65ED3FFA235DEF6C0081F399 /* WebFeedInspectorViewController.swift in Sources */, 65ED3FFB235DEF6C0081F399 /* AccountsReaderAPIWindowController.swift in Sources */, 65ED3FFC235DEF6C0081F399 /* AccountsAddLocalWindowController.swift in Sources */, @@ -5192,6 +5202,7 @@ D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */, 8405DD9C22153BD7008CE1BF /* NSView-Extensions.swift in Sources */, 849A979F1ED9F130007D329B /* SidebarCell.swift in Sources */, + 1710B929255246F900679C0D /* EnableExtensionPointHelpView.swift in Sources */, 515A50E6243D07A90089E588 /* ExtensionPointManager.swift in Sources */, 51E595A5228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */, 515A5177243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */, @@ -5248,6 +5259,7 @@ 511B9806237DCAC90028BCAA /* UserInfoKey.swift in Sources */, 84C9FC7722629E1200D921D6 /* AdvancedPreferencesViewController.swift in Sources */, 849EE72120391F560082A1EA /* SharingServicePickerDelegate.swift in Sources */, + 1710B9132552354E00679C0D /* AddAccountHelpView.swift in Sources */, 5108F6B62375E612001ABC45 /* CacheCleaner.swift in Sources */, 849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */, 849EE70F203919360082A1EA /* AppAssets.swift in Sources */,