Merge pull request #2552 from stuartbreckenridge/explainer-text

Explainer text
This commit is contained in:
Maurice Parker 2020-11-04 10:45:33 -06:00 committed by GitHub
commit f90ef4b360
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 139 additions and 21 deletions

View File

@ -45,10 +45,7 @@ final class AccountsPreferencesViewController: NSViewController {
rTable.size.width = tableView.superview!.frame.size.width rTable.size.width = tableView.superview!.frame.size.width
tableView.frame = rTable tableView.frame = rTable
// Set initial row selection hideController()
if sortedAccounts.count > 0 {
tableView.selectRow(0)
}
} }
@IBAction func addAccount(_ sender: Any) { @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") 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) addChild(textHostingController)
textHostingController.view.translatesAutoresizingMaskIntoConstraints = false textHostingController.view.translatesAutoresizingMaskIntoConstraints = false
detailView.addSubview(textHostingController.view) detailView.addSubview(textHostingController.view)

View File

@ -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)
}
}
}

View File

@ -9,11 +9,12 @@
import SwiftUI import SwiftUI
import Account import Account
private enum AddAccountSections: Int, CaseIterable { enum AddAccountSections: Int, CaseIterable {
case local = 0 case local = 0
case icloud case icloud
case web case web
case selfhosted case selfhosted
case allOrdered
var sectionHeader: String { var sectionHeader: String {
switch self { switch self {
@ -25,6 +26,8 @@ private enum AddAccountSections: Int, CaseIterable {
return NSLocalizedString("Web", comment: "Web Account") return NSLocalizedString("Web", comment: "Web Account")
case .selfhosted: case .selfhosted:
return NSLocalizedString("Self-hosted", comment: "Self hosted Account") 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") return NSLocalizedString("Web accounts sync your subscriptions across all your devices.", comment: "Web Account")
case .selfhosted: case .selfhosted:
return NSLocalizedString("Self-hosted accounts sync your subscriptions across all your devices.", comment: "Self hosted Account") 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] return [.bazQux, .feedbin, .feedly, .feedWrangler, .inoreader, .newsBlur, .theOldReader]
case .selfhosted: case .selfhosted:
return [.freshRSS] return [.freshRSS]
case .allOrdered:
return AddAccountSections.local.sectionContent +
AddAccountSections.icloud.sectionContent +
AddAccountSections.web.sectionContent +
AddAccountSections.selfhosted.sectionContent
} }
} }
} }

View File

@ -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)
}
}
}

View File

@ -14,7 +14,7 @@ struct EnableExtensionPointView: View {
weak var parent: NSHostingController<EnableExtensionPointView>? // required because presentationMode.dismiss() doesn't work weak var parent: NSHostingController<EnableExtensionPointView>? // required because presentationMode.dismiss() doesn't work
weak var enabler: ExtensionPointPreferencesEnabler? 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?) { init(enabler: ExtensionPointPreferencesEnabler?) {
self.enabler = enabler self.enabler = enabler
@ -48,7 +48,7 @@ struct EnableExtensionPointView: View {
Text("Cancel") Text("Cancel")
.frame(width: 80) .frame(width: 80)
}) })
.accessibility(label: Text("Add Account")) .accessibility(label: Text("Add Extension"))
} }
if #available(OSX 11.0, *) { if #available(OSX 11.0, *) {
Button(action: { Button(action: {
@ -58,7 +58,7 @@ struct EnableExtensionPointView: View {
Text("Continue") Text("Continue")
.frame(width: 80) .frame(width: 80)
}) })
.help("Add Account") .help("Add Extension")
.keyboardShortcut(.defaultAction) .keyboardShortcut(.defaultAction)
} else { } else {
@ -107,7 +107,7 @@ struct EnableExtensionPointView: View {
.pickerStyle(RadioGroupPickerStyle()) .pickerStyle(RadioGroupPickerStyle())
.offset(x: 7.5, y: 0) .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) .foregroundColor(.gray)
.font(.caption) .font(.caption)
.padding(.horizontal) .padding(.horizontal)
@ -144,7 +144,7 @@ struct EnableExtensionPointView: View {
.pickerStyle(RadioGroupPickerStyle()) .pickerStyle(RadioGroupPickerStyle())
.offset(x: 7.5, y: 0) .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) .foregroundColor(.gray)
.font(.caption) .font(.caption)
.padding(.horizontal) .padding(.horizontal)
@ -170,3 +170,6 @@ struct EnableExtensionPointView: View {
fatalError() fatalError()
} }
} }

View File

@ -41,10 +41,7 @@ final class ExtensionPointPreferencesViewController: NSViewController {
showDefaultView() showDefaultView()
// Set initial row selection
if activeExtensionPoints.count > 0 {
tableView.selectRow(0)
}
} }
@IBAction func enableExtensionPoints(_ sender: Any) { @IBAction func enableExtensionPoints(_ sender: Any) {
@ -183,9 +180,9 @@ private extension ExtensionPointPreferencesViewController {
if tableView.selectedRow == -1 { if tableView.selectedRow == -1 {
var helpText = "" var helpText = ""
if activeExtensionPoints.count == 0 { 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 { } 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 { if let controller = children.first {
@ -193,7 +190,7 @@ private extension ExtensionPointPreferencesViewController {
controller.view.removeFromSuperview() controller.view.removeFromSuperview()
} }
let textHostingController = NSHostingController(rootView: Text(helpText).multilineTextAlignment(.center)) let textHostingController = NSHostingController(rootView: EnableExtensionPointHelpView(helpText: helpText, preferencesController: self))
addChild(textHostingController) addChild(textHostingController)
textHostingController.view.translatesAutoresizingMaskIntoConstraints = false textHostingController.view.translatesAutoresizingMaskIntoConstraints = false
detailView.addSubview(textHostingController.view) detailView.addSubview(textHostingController.view)
@ -223,12 +220,12 @@ private extension ExtensionPointPreferencesViewController {
if tableView.selectedRow == -1 { if tableView.selectedRow == -1 {
var helpText = "" var helpText = ""
if activeExtensionPoints.count == 0 { 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 { } 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) addChild(textHostingController)
textHostingController.view.translatesAutoresizingMaskIntoConstraints = false textHostingController.view.translatesAutoresizingMaskIntoConstraints = false
detailView.addSubview(textHostingController.view) detailView.addSubview(textHostingController.view)
@ -297,3 +294,5 @@ private extension ExtensionPointPreferencesViewController {
} }
} }

View File

@ -9,6 +9,10 @@
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
1704053424E5985A00A00787 /* SceneNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704053324E5985A00A00787 /* SceneNavigationModel.swift */; }; 1704053424E5985A00A00787 /* SceneNavigationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1704053324E5985A00A00787 /* SceneNavigationModel.swift */; };
1704053524E5985A00A00787 /* 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 */; }; 1717535624BADF33004498C6 /* GeneralPreferencesModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */; };
171BCB8C24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */; }; 171BCB8C24CB08A3006E22D9 /* FixAccountCredentialView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */; };
171BCB8D24CB08A3006E22D9 /* 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 */ /* Begin PBXFileReference section */
1704053324E5985A00A00787 /* SceneNavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneNavigationModel.swift; sourceTree = "<group>"; }; 1704053324E5985A00A00787 /* SceneNavigationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneNavigationModel.swift; sourceTree = "<group>"; };
1710B9122552354E00679C0D /* AddAccountHelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddAccountHelpView.swift; sourceTree = "<group>"; };
1710B928255246F900679C0D /* EnableExtensionPointHelpView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnableExtensionPointHelpView.swift; sourceTree = "<group>"; };
1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesModel.swift; sourceTree = "<group>"; }; 1717535524BADF33004498C6 /* GeneralPreferencesModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GeneralPreferencesModel.swift; sourceTree = "<group>"; };
171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixAccountCredentialView.swift; sourceTree = "<group>"; }; 171BCB8B24CB08A3006E22D9 /* FixAccountCredentialView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FixAccountCredentialView.swift; sourceTree = "<group>"; };
172199C824AB228900A31D04 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; }; 172199C824AB228900A31D04 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
@ -2311,6 +2317,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
5183CFAE254C78C8006B83A5 /* EnableExtensionPointView.swift */, 5183CFAE254C78C8006B83A5 /* EnableExtensionPointView.swift */,
1710B928255246F900679C0D /* EnableExtensionPointHelpView.swift */,
515A516D243E7F950089E588 /* ExtensionPointDetail.xib */, 515A516D243E7F950089E588 /* ExtensionPointDetail.xib */,
515A5170243E802B0089E588 /* ExtensionPointDetailViewController.swift */, 515A5170243E802B0089E588 /* ExtensionPointDetailViewController.swift */,
515A5147243E64BA0089E588 /* ExtensionPointEnableWindowController.swift */, 515A5147243E64BA0089E588 /* ExtensionPointEnableWindowController.swift */,
@ -3336,6 +3343,7 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
178A9F9C2549449F00AB7E9D /* AddAccountsView.swift */, 178A9F9C2549449F00AB7E9D /* AddAccountsView.swift */,
1710B9122552354E00679C0D /* AddAccountHelpView.swift */,
84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */, 84C9FC7222629E1200D921D6 /* AccountsPreferencesViewController.swift */,
84C9FC7422629E1200D921D6 /* AccountsDetail.xib */, 84C9FC7422629E1200D921D6 /* AccountsDetail.xib */,
5144EA2E2279FAB600D19003 /* AccountsDetailViewController.swift */, 5144EA2E2279FAB600D19003 /* AccountsDetailViewController.swift */,
@ -4805,6 +4813,7 @@
65ED3FBD235DEF6C0081F399 /* AppDefaults.swift in Sources */, 65ED3FBD235DEF6C0081F399 /* AppDefaults.swift in Sources */,
65ED3FBE235DEF6C0081F399 /* Account+Scriptability.swift in Sources */, 65ED3FBE235DEF6C0081F399 /* Account+Scriptability.swift in Sources */,
65ED3FBF235DEF6C0081F399 /* NothingInspectorViewController.swift in Sources */, 65ED3FBF235DEF6C0081F399 /* NothingInspectorViewController.swift in Sources */,
1710B92A255246F900679C0D /* EnableExtensionPointHelpView.swift in Sources */,
65ED3FC0235DEF6C0081F399 /* AppNotifications.swift in Sources */, 65ED3FC0235DEF6C0081F399 /* AppNotifications.swift in Sources */,
65ED3FC1235DEF6C0081F399 /* TimelineKeyboardDelegate.swift in Sources */, 65ED3FC1235DEF6C0081F399 /* TimelineKeyboardDelegate.swift in Sources */,
65ED3FC2235DEF6C0081F399 /* Browser.swift in Sources */, 65ED3FC2235DEF6C0081F399 /* Browser.swift in Sources */,
@ -4875,6 +4884,7 @@
65ED3FF7235DEF6C0081F399 /* SearchFeedDelegate.swift in Sources */, 65ED3FF7235DEF6C0081F399 /* SearchFeedDelegate.swift in Sources */,
65ED3FF8235DEF6C0081F399 /* ErrorHandler.swift in Sources */, 65ED3FF8235DEF6C0081F399 /* ErrorHandler.swift in Sources */,
65ED3FF9235DEF6C0081F399 /* ActivityManager.swift in Sources */, 65ED3FF9235DEF6C0081F399 /* ActivityManager.swift in Sources */,
1710B9142552354E00679C0D /* AddAccountHelpView.swift in Sources */,
65ED3FFA235DEF6C0081F399 /* WebFeedInspectorViewController.swift in Sources */, 65ED3FFA235DEF6C0081F399 /* WebFeedInspectorViewController.swift in Sources */,
65ED3FFB235DEF6C0081F399 /* AccountsReaderAPIWindowController.swift in Sources */, 65ED3FFB235DEF6C0081F399 /* AccountsReaderAPIWindowController.swift in Sources */,
65ED3FFC235DEF6C0081F399 /* AccountsAddLocalWindowController.swift in Sources */, 65ED3FFC235DEF6C0081F399 /* AccountsAddLocalWindowController.swift in Sources */,
@ -5192,6 +5202,7 @@
D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */, D5907D7F2004AC00005947E5 /* NSApplication+Scriptability.swift in Sources */,
8405DD9C22153BD7008CE1BF /* NSView-Extensions.swift in Sources */, 8405DD9C22153BD7008CE1BF /* NSView-Extensions.swift in Sources */,
849A979F1ED9F130007D329B /* SidebarCell.swift in Sources */, 849A979F1ED9F130007D329B /* SidebarCell.swift in Sources */,
1710B929255246F900679C0D /* EnableExtensionPointHelpView.swift in Sources */,
515A50E6243D07A90089E588 /* ExtensionPointManager.swift in Sources */, 515A50E6243D07A90089E588 /* ExtensionPointManager.swift in Sources */,
51E595A5228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */, 51E595A5228CC36500FCC42B /* ArticleStatusSyncTimer.swift in Sources */,
515A5177243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */, 515A5177243E90200089E588 /* ExtensionPointIdentifer.swift in Sources */,
@ -5248,6 +5259,7 @@
511B9806237DCAC90028BCAA /* UserInfoKey.swift in Sources */, 511B9806237DCAC90028BCAA /* UserInfoKey.swift in Sources */,
84C9FC7722629E1200D921D6 /* AdvancedPreferencesViewController.swift in Sources */, 84C9FC7722629E1200D921D6 /* AdvancedPreferencesViewController.swift in Sources */,
849EE72120391F560082A1EA /* SharingServicePickerDelegate.swift in Sources */, 849EE72120391F560082A1EA /* SharingServicePickerDelegate.swift in Sources */,
1710B9132552354E00679C0D /* AddAccountHelpView.swift in Sources */,
5108F6B62375E612001ABC45 /* CacheCleaner.swift in Sources */, 5108F6B62375E612001ABC45 /* CacheCleaner.swift in Sources */,
849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */, 849A97981ED9EFAA007D329B /* Node-Extensions.swift in Sources */,
849EE70F203919360082A1EA /* AppAssets.swift in Sources */, 849EE70F203919360082A1EA /* AppAssets.swift in Sources */,