Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 28 additions & 23 deletions VoidDisplay/Features/Capture/Views/CaptureChoose.swift
Original file line number Diff line number Diff line change
Expand Up @@ -219,29 +219,34 @@ struct IsCapturing: View {
private var screenCapturePermissionView: some View {
@Bindable var bindableCatalog = viewModel.catalog

return ScreenCapturePermissionGuideView(
loadErrorMessage: viewModel.catalog.loadErrorMessage,
onOpenSettings: {
viewModel.openScreenCapturePrivacySettings { url in
openURL(url)
}
},
onRequestPermission: {
viewModel.requestScreenCapturePermission()
},
onRefresh: {
viewModel.refreshPermissionAndMaybeLoad()
},
onRetry: (viewModel.catalog.loadErrorMessage != nil || viewModel.catalog.lastLoadError != nil) ? {
viewModel.loadDisplays()
} : nil,
isDebugInfoExpanded: $bindableCatalog.showDebugInfo,
debugItems: capturePermissionDebugItems,
rootAccessibilityIdentifier: "capture_permission_guide",
openSettingsButtonAccessibilityIdentifier: "capture_open_settings_button",
requestPermissionButtonAccessibilityIdentifier: "capture_request_permission_button",
refreshButtonAccessibilityIdentifier: "capture_refresh_button"
)
return ScrollView {
ScreenCapturePermissionGuideView(
loadErrorMessage: viewModel.catalog.loadErrorMessage,
onOpenSettings: {
viewModel.openScreenCapturePrivacySettings { url in
openURL(url)
}
},
onRequestPermission: {
viewModel.requestScreenCapturePermission()
},
onRefresh: {
viewModel.refreshPermissionAndMaybeLoad()
},
onRetry: (viewModel.catalog.loadErrorMessage != nil || viewModel.catalog.lastLoadError != nil) ? {
viewModel.loadDisplays()
} : nil,
isDebugInfoExpanded: $bindableCatalog.showDebugInfo,
debugItems: capturePermissionDebugItems,
rootAccessibilityIdentifier: "capture_permission_guide",
openSettingsButtonAccessibilityIdentifier: "capture_open_settings_button",
requestPermissionButtonAccessibilityIdentifier: "capture_request_permission_button",
refreshButtonAccessibilityIdentifier: "capture_refresh_button"
)
.frame(maxWidth: .infinity, minHeight: 200, alignment: .top)
.appListContentInsets()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
}

private var capturePermissionDebugItems: [(title: String, value: String)] {
Expand Down
55 changes: 30 additions & 25 deletions VoidDisplay/Features/Sharing/Views/ShareView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -181,31 +181,36 @@ struct ShareView: View {
private var screenCapturePermissionView: some View {
@Bindable var bindableCatalog = viewModel.catalog

return ScreenCapturePermissionGuideView(
loadErrorMessage: viewModel.catalog.loadErrorMessage,
onOpenSettings: {
viewModel.openScreenCapturePrivacySettings { url in
openURL(url)
}
},
onRequestPermission: {
viewModel.requestScreenCapturePermission()
},
onRefresh: {
viewModel.refreshPermissionAndMaybeLoad()
},
onRetry: (viewModel.catalog.loadErrorMessage != nil || viewModel.catalog.lastLoadError != nil) ? {
// User-initiated retry: attempt to load the display list.
// If permission is still missing, macOS may prompt here (expected).
viewModel.loadDisplays()
} : nil,
isDebugInfoExpanded: $bindableCatalog.showDebugInfo,
debugItems: sharingPermissionDebugItems,
rootAccessibilityIdentifier: "share_permission_guide",
openSettingsButtonAccessibilityIdentifier: "share_open_settings_button",
requestPermissionButtonAccessibilityIdentifier: "share_request_permission_button",
refreshButtonAccessibilityIdentifier: "share_refresh_button"
)
return ScrollView {
ScreenCapturePermissionGuideView(
loadErrorMessage: viewModel.catalog.loadErrorMessage,
onOpenSettings: {
viewModel.openScreenCapturePrivacySettings { url in
openURL(url)
}
},
onRequestPermission: {
viewModel.requestScreenCapturePermission()
},
onRefresh: {
viewModel.refreshPermissionAndMaybeLoad()
},
onRetry: (viewModel.catalog.loadErrorMessage != nil || viewModel.catalog.lastLoadError != nil) ? {
// User-initiated retry: attempt to load the display list.
// If permission is still missing, macOS may prompt here (expected).
viewModel.loadDisplays()
} : nil,
isDebugInfoExpanded: $bindableCatalog.showDebugInfo,
debugItems: sharingPermissionDebugItems,
rootAccessibilityIdentifier: "share_permission_guide",
openSettingsButtonAccessibilityIdentifier: "share_open_settings_button",
requestPermissionButtonAccessibilityIdentifier: "share_request_permission_button",
refreshButtonAccessibilityIdentifier: "share_refresh_button"
)
.frame(maxWidth: .infinity, minHeight: 200, alignment: .top)
.appListContentInsets()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.accessibilityElement(children: .contain)
.accessibilityIdentifier("share_permission_guide")
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ struct DisplaysView: View {
accessibilityIdentifier: "display_row_card"
)

return AppListRowCard(model: model) {
return AppListRowCard(model: model, pushTrailingToEdge: false) {
EmptyView()
}
}
Expand Down
49 changes: 27 additions & 22 deletions VoidDisplay/Features/VirtualDisplay/Views/VirtualDisplayView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -103,28 +103,7 @@ struct VirtualDisplayView: View {
.appListContentInsets()
}
} else if !virtualDisplay.displayConfigs.isEmpty {
if UITestRuntime.isEnabled {
ScrollView {
LazyVStack(spacing: AppUI.List.sectionSpacing) {
ForEach(virtualDisplay.displayConfigs) { config in
virtualDisplayRow(config)
}
}
.appListContentInsets()
}
.accessibilityIdentifier("virtual_displays_list")
.accessibilityValue(Text("\(virtualDisplay.rebuildRequestCount)"))
} else {
ScrollView {
LazyVStack(spacing: AppUI.List.sectionSpacing) {
ForEach(virtualDisplay.displayConfigs) { config in
virtualDisplayRow(config)
}
}
.appListContentInsets()
}
.accessibilityIdentifier("virtual_displays_list")
}
virtualDisplayList
} else {
ScrollView {
ContentUnavailableView(
Expand All @@ -139,6 +118,21 @@ struct VirtualDisplayView: View {
}
}

private var virtualDisplayList: some View {
ScrollView {
LazyVStack(spacing: AppUI.List.sectionSpacing) {
ForEach(virtualDisplay.displayConfigs) { config in
virtualDisplayRow(config)
}
}
.appListContentInsets()
}
.accessibilityIdentifier("virtual_displays_list")
.optionalAccessibilityValue(
UITestRuntime.isEnabled ? Text("\(virtualDisplay.rebuildRequestCount)") : nil
)
}

private var configStoreErrorPanel: some View {
VStack(alignment: .leading, spacing: 12) {
Label("Virtual Display Config File Unavailable", systemImage: "exclamationmark.triangle.fill")
Expand Down Expand Up @@ -249,6 +243,17 @@ struct VirtualDisplayView: View {
}
}

private extension View {
@ViewBuilder
func optionalAccessibilityValue(_ value: Text?) -> some View {
if let value {
accessibilityValue(value)
} else {
self
}
}
}

#Preview {
let env = AppBootstrap.makeEnvironment(preview: true, isRunningUnderXCTestOverride: false)
VirtualDisplayView(controller: env.virtualDisplay)
Expand Down
1 change: 1 addition & 0 deletions VoidDisplay/Shared/UI/AppListRowCard.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ struct AppListRowCard<Trailing: View>: View {
.frame(minHeight: AppUI.List.rowMinHeight + 8)
.padding(.horizontal, AppUI.List.rowHorizontalInset)
.padding(.vertical, AppUI.List.rowVerticalInset + 1)
.frame(maxWidth: .infinity, alignment: .leading)
.appInteractiveCardStyle(isHovered: isHovered)
.onHover { hovered in
isHovered = hovered
Expand Down
7 changes: 1 addition & 6 deletions VoidDisplay/Shared/UI/ScreenCapturePermissionGuideView.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,7 @@ struct ScreenCapturePermissionGuideView: View {
let refreshButtonAccessibilityIdentifier: String?

var body: some View {
ScrollView {
permissionPanel
.frame(maxWidth: .infinity, minHeight: 200, alignment: .top)
.appListContentInsets()
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
permissionPanel
}

private var permissionPanel: some View {
Expand Down