macOS: stabilize context menu card layout

This commit is contained in:
Peter Steinberger
2025-12-13 03:52:09 +00:00
parent 772b5fdf0f
commit 36ff508fec
2 changed files with 24 additions and 13 deletions

View File

@@ -6,7 +6,10 @@ struct ContextMenuCardView: View {
private let rows: [SessionRow]
private let statusText: String?
private let isLoading: Bool
private let padding: CGFloat = 10
private let paddingTop: CGFloat = 6
private let paddingBottom: CGFloat = 6
private let paddingTrailing: CGFloat = 16
private let paddingLeading: CGFloat = 22
private let barHeight: CGFloat = 3
init(
@@ -20,7 +23,7 @@ struct ContextMenuCardView: View {
}
var body: some View {
VStack(alignment: .leading, spacing: 8) {
VStack(alignment: .leading, spacing: 6) {
HStack(alignment: .firstTextBaseline) {
Text("Context")
.font(.caption.weight(.semibold))
@@ -53,7 +56,10 @@ struct ContextMenuCardView: View {
}
}
}
.padding(self.padding)
.padding(.top, self.paddingTop)
.padding(.bottom, self.paddingBottom)
.padding(.leading, self.paddingLeading)
.padding(.trailing, self.paddingTrailing)
.frame(minWidth: 300, maxWidth: .infinity, alignment: .leading)
.transaction { txn in txn.animation = nil }
}

View File

@@ -70,17 +70,22 @@ final class MenuContextCardInjector: NSObject, NSMenuDelegate {
self.adoptMenuWidthIfAvailable(for: menu, hosting: hosting)
}
self.loadTask = Task { [weak hosting] in
await self.refreshCache(force: initialIsLoading)
guard let hosting else { return }
let view = self.cachedView()
await MainActor.run {
hosting.rootView = view
hosting.invalidateIntrinsicContentSize()
self.adoptMenuWidthIfAvailable(for: menu, hosting: hosting)
let size = hosting.fittingSize
hosting.frame.size.height = size.height
if initialIsLoading {
self.loadTask = Task { [weak hosting] in
await self.refreshCache(force: true)
guard let hosting else { return }
let view = self.cachedView()
await MainActor.run {
hosting.rootView = view
hosting.invalidateIntrinsicContentSize()
self.adoptMenuWidthIfAvailable(for: menu, hosting: hosting)
let size = hosting.fittingSize
hosting.frame.size.height = size.height
}
}
} else {
// Keep the menu stable while it's open; refresh in the background for next open.
self.loadTask = Task { await self.refreshCache(force: false) }
}
}