feat: improve Atlas narrow window responsiveness

This commit is contained in:
zhukang
2026-03-10 18:39:04 +08:00
parent 994e63f0b3
commit e37927b143
10 changed files with 184 additions and 111 deletions

View File

@@ -86,38 +86,20 @@ public struct SmartCleanFeatureView: View {
systemImage: primaryAction.systemImage
)
HStack(alignment: .center, spacing: AtlasSpacing.md) {
Button(action: primaryAction.handler(startScan: onStartScan, refreshPreview: onRefreshPreview, executePlan: onExecutePlan)) {
Label(primaryAction.buttonTitle, systemImage: primaryAction.buttonSystemImage)
ViewThatFits(in: .horizontal) {
HStack(alignment: .center, spacing: AtlasSpacing.md) {
primaryActionButton
supportingActionButtons
Spacer(minLength: 0)
}
.buttonStyle(.atlasPrimary)
.keyboardShortcut(.defaultAction)
.disabled(primaryAction.isDisabled(canExecutePlan: canExecutePlan))
.accessibilityIdentifier(primaryAction.accessibilityIdentifier)
.accessibilityHint(primaryAction.accessibilityHint)
if primaryAction != .scan {
Button(action: onStartScan) {
Label(AtlasL10n.string("smartclean.action.runScan"), systemImage: "sparkles")
VStack(alignment: .leading, spacing: AtlasSpacing.md) {
primaryActionButton
HStack(alignment: .center, spacing: AtlasSpacing.md) {
supportingActionButtons
Spacer(minLength: 0)
}
.buttonStyle(.atlasSecondary)
.keyboardShortcut("s", modifiers: [.command, .option])
.disabled(isScanning || isExecutingPlan)
.accessibilityIdentifier("smartclean.runScan")
.accessibilityHint(AtlasL10n.string("smartclean.action.runScan.hint"))
}
if primaryAction != .refresh, !findings.isEmpty {
Button(action: onRefreshPreview) {
Label(AtlasL10n.string("smartclean.action.refreshPreview"), systemImage: "arrow.clockwise")
}
.buttonStyle(.atlasGhost)
.disabled(isScanning || isExecutingPlan)
.accessibilityIdentifier("smartclean.refreshPreview")
.accessibilityHint(AtlasL10n.string("smartclean.action.refreshPreview.hint"))
}
Spacer(minLength: 0)
}
}
}
@@ -399,6 +381,41 @@ public struct SmartCleanFeatureView: View {
return .refresh
}
private var primaryActionButton: some View {
Button(action: primaryAction.handler(startScan: onStartScan, refreshPreview: onRefreshPreview, executePlan: onExecutePlan)) {
Label(primaryAction.buttonTitle, systemImage: primaryAction.buttonSystemImage)
}
.buttonStyle(.atlasPrimary)
.keyboardShortcut(.defaultAction)
.disabled(primaryAction.isDisabled(canExecutePlan: canExecutePlan))
.accessibilityIdentifier(primaryAction.accessibilityIdentifier)
.accessibilityHint(primaryAction.accessibilityHint)
}
@ViewBuilder
private var supportingActionButtons: some View {
if primaryAction != .scan {
Button(action: onStartScan) {
Label(AtlasL10n.string("smartclean.action.runScan"), systemImage: "sparkles")
}
.buttonStyle(.atlasSecondary)
.keyboardShortcut("s", modifiers: [.command, .option])
.disabled(isScanning || isExecutingPlan)
.accessibilityIdentifier("smartclean.runScan")
.accessibilityHint(AtlasL10n.string("smartclean.action.runScan.hint"))
}
if primaryAction != .refresh, !findings.isEmpty {
Button(action: onRefreshPreview) {
Label(AtlasL10n.string("smartclean.action.refreshPreview"), systemImage: "arrow.clockwise")
}
.buttonStyle(.atlasGhost)
.disabled(isScanning || isExecutingPlan)
.accessibilityIdentifier("smartclean.refreshPreview")
.accessibilityHint(AtlasL10n.string("smartclean.action.refreshPreview.hint"))
}
}
private func supportText(for kind: ActionItem.Kind) -> String {
switch kind {
case .removeCache: