mirror of
https://github.com/yattee/yattee.git
synced 2026-07-21 14:52:03 +00:00
Render Add Source buttons inline on macOS where toolbar items aren't shown
Pre-macOS 26 doesn't reliably surface a detail-pane NavigationStack's toolbar confirmation items in the window title bar, leaving the "Add Source" actions invisible. Gate the toolbar placement behind macOS 26+ and fall back to an inline form/header button on older macOS across the add-source views and the sources list.
This commit is contained in:
@@ -31,6 +31,21 @@ struct AddLocalFolderView: View {
|
||||
!name.isEmpty && selectedFolderURL != nil
|
||||
}
|
||||
|
||||
/// macOS surfaces toolbar confirmation items from a pushed-in-sheet view
|
||||
/// reliably only from macOS 26 onward. On older macOS we render the
|
||||
/// "Add Source" action button inline in the form instead.
|
||||
private var usesToolbarActionButton: Bool {
|
||||
#if os(macOS)
|
||||
if #available(macOS 26, *) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
#else
|
||||
return false
|
||||
#endif
|
||||
}
|
||||
|
||||
// MARK: - Body
|
||||
|
||||
var body: some View {
|
||||
@@ -99,16 +114,22 @@ struct AddLocalFolderView: View {
|
||||
if let result = testResult {
|
||||
SourceTestResultSection(result: result)
|
||||
}
|
||||
|
||||
if !usesToolbarActionButton {
|
||||
actionSection
|
||||
}
|
||||
}
|
||||
.formStyle(.grouped)
|
||||
.navigationTitle(String(localized: "sources.addLocalFolder"))
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button(String(localized: "sources.addSource")) {
|
||||
addSource()
|
||||
if usesToolbarActionButton {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button(String(localized: "sources.addSource")) {
|
||||
addSource()
|
||||
}
|
||||
.disabled(!canAdd)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
.disabled(!canAdd)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,6 +87,22 @@ struct AddRemoteServerView: View {
|
||||
return false
|
||||
}
|
||||
|
||||
/// macOS surfaces toolbar confirmation items from a pushed-in-sheet view
|
||||
/// reliably only from macOS 26 onward. On older macOS (and on iOS/tvOS) we
|
||||
/// render the "Add Source" action button inline in the form instead, so it
|
||||
/// is always visible.
|
||||
private var usesToolbarActionButton: Bool {
|
||||
#if os(macOS)
|
||||
if #available(macOS 26, *) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
#else
|
||||
return false
|
||||
#endif
|
||||
}
|
||||
|
||||
private var canAdd: Bool {
|
||||
guard !urlString.isEmpty else { return false }
|
||||
|
||||
@@ -172,9 +188,9 @@ struct AddRemoteServerView: View {
|
||||
|
||||
if isFieldsRevealed {
|
||||
serverConfigurationFields
|
||||
#if !os(macOS)
|
||||
actionSection
|
||||
#endif
|
||||
if !usesToolbarActionButton {
|
||||
actionSection
|
||||
}
|
||||
}
|
||||
}
|
||||
#if os(iOS)
|
||||
@@ -183,8 +199,8 @@ struct AddRemoteServerView: View {
|
||||
#if os(macOS)
|
||||
.formStyle(.grouped)
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
if isFieldsRevealed {
|
||||
if isFieldsRevealed, usesToolbarActionButton {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button {
|
||||
addSource()
|
||||
} label: {
|
||||
|
||||
@@ -36,6 +36,21 @@ struct AddSMBView: View {
|
||||
!name.isEmpty && !server.isEmpty
|
||||
}
|
||||
|
||||
/// macOS surfaces toolbar confirmation items from a pushed-in-sheet view
|
||||
/// reliably only from macOS 26 onward. On older macOS we render the
|
||||
/// "Add Source" action button inline in the form instead.
|
||||
private var usesToolbarActionButton: Bool {
|
||||
#if os(macOS)
|
||||
if #available(macOS 26, *) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
#else
|
||||
return false
|
||||
#endif
|
||||
}
|
||||
|
||||
// MARK: - Body
|
||||
|
||||
var body: some View {
|
||||
@@ -133,25 +148,31 @@ struct AddSMBView: View {
|
||||
if let result = testResult {
|
||||
SourceTestResultSection(result: result)
|
||||
}
|
||||
|
||||
if !usesToolbarActionButton {
|
||||
actionSection
|
||||
}
|
||||
}
|
||||
.formStyle(.grouped)
|
||||
.navigationTitle(String(localized: "sources.addSMB"))
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button {
|
||||
addSource()
|
||||
} label: {
|
||||
if isTesting {
|
||||
HStack(spacing: 6) {
|
||||
ProgressView().controlSize(.small)
|
||||
Text(testProgress ?? String(localized: "sources.testing"))
|
||||
if usesToolbarActionButton {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button {
|
||||
addSource()
|
||||
} label: {
|
||||
if isTesting {
|
||||
HStack(spacing: 6) {
|
||||
ProgressView().controlSize(.small)
|
||||
Text(testProgress ?? String(localized: "sources.testing"))
|
||||
}
|
||||
} else {
|
||||
Text(String(localized: "sources.addSource"))
|
||||
}
|
||||
} else {
|
||||
Text(String(localized: "sources.addSource"))
|
||||
}
|
||||
.disabled(!canAdd || isTesting)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
.disabled(!canAdd || isTesting)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
|
||||
@@ -37,6 +37,21 @@ struct AddWebDAVView: View {
|
||||
!name.isEmpty && !urlString.isEmpty && URL(string: urlString) != nil
|
||||
}
|
||||
|
||||
/// macOS surfaces toolbar confirmation items from a pushed-in-sheet view
|
||||
/// reliably only from macOS 26 onward. On older macOS we render the
|
||||
/// "Add Source" action button inline in the form instead.
|
||||
private var usesToolbarActionButton: Bool {
|
||||
#if os(macOS)
|
||||
if #available(macOS 26, *) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
#else
|
||||
return false
|
||||
#endif
|
||||
}
|
||||
|
||||
// MARK: - Body
|
||||
|
||||
var body: some View {
|
||||
@@ -134,25 +149,31 @@ struct AddWebDAVView: View {
|
||||
if let result = testResult {
|
||||
SourceTestResultSection(result: result)
|
||||
}
|
||||
|
||||
if !usesToolbarActionButton {
|
||||
actionSection
|
||||
}
|
||||
}
|
||||
.formStyle(.grouped)
|
||||
.navigationTitle(String(localized: "sources.addWebDAV"))
|
||||
.toolbar {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button {
|
||||
addSource()
|
||||
} label: {
|
||||
if isTesting {
|
||||
HStack(spacing: 6) {
|
||||
ProgressView().controlSize(.small)
|
||||
Text(testProgress ?? String(localized: "sources.testing"))
|
||||
if usesToolbarActionButton {
|
||||
ToolbarItem(placement: .confirmationAction) {
|
||||
Button {
|
||||
addSource()
|
||||
} label: {
|
||||
if isTesting {
|
||||
HStack(spacing: 6) {
|
||||
ProgressView().controlSize(.small)
|
||||
Text(testProgress ?? String(localized: "sources.testing"))
|
||||
}
|
||||
} else {
|
||||
Text(String(localized: "sources.addSource"))
|
||||
}
|
||||
} else {
|
||||
Text(String(localized: "sources.addSource"))
|
||||
}
|
||||
.disabled(!canAdd || isTesting)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
.disabled(!canAdd || isTesting)
|
||||
.keyboardShortcut(.defaultAction)
|
||||
}
|
||||
}
|
||||
.onAppear {
|
||||
|
||||
Reference in New Issue
Block a user