macos: fixed width for downloading/extracting, better padding

This commit is contained in:
Mitchell Hashimoto
2025-10-10 07:18:54 -07:00
parent f124bb4975
commit ba8eae027e
4 changed files with 29 additions and 4 deletions

View File

@@ -131,8 +131,8 @@ fileprivate struct UpdateOverlay: View {
HStack { HStack {
Spacer() Spacer()
UpdatePill(model: appDelegate.updateViewModel) UpdatePill(model: appDelegate.updateViewModel)
.padding(.bottom, 12) .padding(.bottom, 9)
.padding(.trailing, 12) .padding(.trailing, 9)
} }
} }
} }

View File

@@ -547,9 +547,10 @@ extension TerminalWindow {
@ObservedObject var model: UpdateViewModel @ObservedObject var model: UpdateViewModel
var body: some View { var body: some View {
// We use the same top/trailing padding so that it hugs the same.
UpdatePill(model: model) UpdatePill(model: model)
.padding(.top, viewModel.accessoryTopPadding) .padding(.top, viewModel.accessoryTopPadding)
.padding(.trailing, 10) .padding(.trailing, viewModel.accessoryTopPadding)
} }
} }

View File

@@ -8,6 +8,9 @@ struct UpdatePill: View {
/// Whether the update popover is currently visible /// Whether the update popover is currently visible
@State private var showPopover = false @State private var showPopover = false
/// The font used for the pill text
private let textFont = NSFont.systemFont(ofSize: 11, weight: .medium)
var body: some View { var body: some View {
if !model.state.isIdle { if !model.state.isIdle {
pillButton pillButton
@@ -43,8 +46,9 @@ struct UpdatePill: View {
.frame(width: 14, height: 14) .frame(width: 14, height: 14)
Text(model.text) Text(model.text)
.font(.system(size: 11, weight: .medium)) .font(Font(textFont))
.lineLimit(1) .lineLimit(1)
.frame(width: textWidth)
} }
.padding(.horizontal, 8) .padding(.horizontal, 8)
.padding(.vertical, 4) .padding(.vertical, 4)
@@ -58,4 +62,11 @@ struct UpdatePill: View {
.buttonStyle(.plain) .buttonStyle(.plain)
.help(model.text) .help(model.text)
} }
/// Calculated width for the text to prevent resizing during progress updates
private var textWidth: CGFloat? {
let attributes: [NSAttributedString.Key: Any] = [.font: textFont]
let size = (model.maxWidthText as NSString).size(withAttributes: attributes)
return size.width
}
} }

View File

@@ -37,6 +37,19 @@ class UpdateViewModel: ObservableObject {
} }
} }
/// The maximum width text for states that show progress.
/// Used to prevent the pill from resizing as percentages change.
var maxWidthText: String {
switch state {
case .downloading:
return "Downloading: 100%"
case .extracting:
return "Preparing: 100%"
default:
return text
}
}
/// The SF Symbol icon name for the current update state. /// The SF Symbol icon name for the current update state.
/// Returns nil for idle, downloading, and extracting states. /// Returns nil for idle, downloading, and extracting states.
var iconName: String? { var iconName: String? {