Fix action button style on tvOS
This commit is contained in:
@@ -27,7 +27,10 @@ public extension View {
|
|||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
func actionButtonStyle() -> some View {
|
func actionButtonStyle() -> some View {
|
||||||
if #available(iOS 26.0, macOS 26.0, tvOS 26.0, *) {
|
#if os(tvOS)
|
||||||
|
ActionButtonWrapper { self }
|
||||||
|
#else
|
||||||
|
if #available(iOS 26.0, macOS 26.0, *) {
|
||||||
self.frame(width: 36, height: 36)
|
self.frame(width: 36, height: 36)
|
||||||
.glassEffect(.regular.interactive(), in: .circle)
|
.glassEffect(.regular.interactive(), in: .circle)
|
||||||
} else {
|
} else {
|
||||||
@@ -35,5 +38,21 @@ public extension View {
|
|||||||
.background(Color.secondary.opacity(0.1))
|
.background(Color.secondary.opacity(0.1))
|
||||||
.clipShape(Circle())
|
.clipShape(Circle())
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if os(tvOS)
|
||||||
|
private struct ActionButtonWrapper<Content: View>: View {
|
||||||
|
@Environment(\.isFocused) private var isFocused
|
||||||
|
let content: () -> Content
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
content()
|
||||||
|
.frame(width: 36, height: 36)
|
||||||
|
.background(isFocused ? Color.secondary.opacity(0.3) : Color.secondary.opacity(0.1))
|
||||||
|
.clipShape(Circle())
|
||||||
|
.focusEffectDisabled()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -101,24 +101,26 @@ public struct ProfileCard: View {
|
|||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
Button {
|
HStack(spacing: actionButtonSpacing) {
|
||||||
viewModel.showNewProfile = true
|
|
||||||
} label: {
|
|
||||||
Image(systemName: "plus")
|
|
||||||
.font(.system(size: 16))
|
|
||||||
}
|
|
||||||
.buttonStyle(.plain)
|
|
||||||
.actionButtonStyle()
|
|
||||||
|
|
||||||
if !profileList.isEmpty {
|
|
||||||
Button {
|
Button {
|
||||||
viewModel.showManageProfiles = true
|
viewModel.showNewProfile = true
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "line.3.horizontal")
|
Image(systemName: "plus")
|
||||||
.font(.system(size: 16))
|
.font(.system(size: 16))
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
.actionButtonStyle()
|
.actionButtonStyle()
|
||||||
|
|
||||||
|
if !profileList.isEmpty {
|
||||||
|
Button {
|
||||||
|
viewModel.showManageProfiles = true
|
||||||
|
} label: {
|
||||||
|
Image(systemName: "line.3.horizontal")
|
||||||
|
.font(.system(size: 16))
|
||||||
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
.actionButtonStyle()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -146,9 +148,17 @@ public struct ProfileCard: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var actionButtonSpacing: CGFloat {
|
||||||
|
#if os(tvOS)
|
||||||
|
24
|
||||||
|
#else
|
||||||
|
12
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
@ViewBuilder
|
@ViewBuilder
|
||||||
private func actionButtonsRow(for profile: ProfilePreview) -> some View {
|
private func actionButtonsRow(for profile: ProfilePreview) -> some View {
|
||||||
HStack(spacing: 12) {
|
HStack(spacing: actionButtonSpacing) {
|
||||||
editButton(for: profile)
|
editButton(for: profile)
|
||||||
|
|
||||||
if profile.type == .remote {
|
if profile.type == .remote {
|
||||||
@@ -156,12 +166,14 @@ public struct ProfileCard: View {
|
|||||||
qrCodeButton(for: profile)
|
qrCodeButton(for: profile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !os(tvOS)
|
||||||
ProfileShareButton($viewModel.alert, profile.origin) {
|
ProfileShareButton($viewModel.alert, profile.origin) {
|
||||||
Image(systemName: "square.and.arrow.up")
|
Image(systemName: "square.and.arrow.up")
|
||||||
.font(.system(size: 16))
|
.font(.system(size: 16))
|
||||||
}
|
}
|
||||||
.buttonStyle(.plain)
|
.buttonStyle(.plain)
|
||||||
.actionButtonStyle()
|
.actionButtonStyle()
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -472,6 +484,14 @@ extension ProfileCard {
|
|||||||
_profile = State(initialValue: profile)
|
_profile = State(initialValue: profile)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var actionButtonSpacing: CGFloat {
|
||||||
|
#if os(tvOS)
|
||||||
|
24
|
||||||
|
#else
|
||||||
|
8
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack {
|
HStack {
|
||||||
Image(systemName: "line.3.horizontal")
|
Image(systemName: "line.3.horizontal")
|
||||||
@@ -489,7 +509,7 @@ extension ProfileCard {
|
|||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: actionButtonSpacing) {
|
||||||
if profile.type == .remote {
|
if profile.type == .remote {
|
||||||
Button {
|
Button {
|
||||||
isUpdating = true
|
isUpdating = true
|
||||||
@@ -532,6 +552,7 @@ extension ProfileCard {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !os(tvOS)
|
||||||
ShareButtonCompat($viewModel.alert) {
|
ShareButtonCompat($viewModel.alert) {
|
||||||
Image(systemName: "square.and.arrow.up")
|
Image(systemName: "square.and.arrow.up")
|
||||||
.font(.system(size: 16))
|
.font(.system(size: 16))
|
||||||
@@ -539,6 +560,7 @@ extension ProfileCard {
|
|||||||
try profile.origin.toContent().generateShareFile()
|
try profile.origin.toContent().generateShareFile()
|
||||||
}
|
}
|
||||||
.actionButtonStyle()
|
.actionButtonStyle()
|
||||||
|
#endif
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
Task {
|
Task {
|
||||||
|
|||||||
Reference in New Issue
Block a user