fix(mac): size context bar to menu
This commit is contained in:
@@ -4,7 +4,7 @@ import SwiftUI
|
|||||||
struct ContextUsageBar: View {
|
struct ContextUsageBar: View {
|
||||||
let usedTokens: Int
|
let usedTokens: Int
|
||||||
let contextTokens: Int
|
let contextTokens: Int
|
||||||
var width: CGFloat = 220
|
var width: CGFloat?
|
||||||
var height: CGFloat = 6
|
var height: CGFloat = 6
|
||||||
|
|
||||||
private var clampedFractionUsed: Double {
|
private var clampedFractionUsed: Double {
|
||||||
@@ -28,14 +28,30 @@ struct ContextUsageBar: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
// SwiftUI menus (MenuBarExtraStyle.menu) drop certain view types (including ProgressView/Canvas).
|
// SwiftUI menus (MenuBarExtraStyle.menu) drop certain view types (including ProgressView/Canvas).
|
||||||
// Render the bar as an image to reliably display inside the menu.
|
// Render the bar as an image to reliably display inside the menu.
|
||||||
Image(nsImage: Self.renderBar(
|
Group {
|
||||||
width: self.width,
|
if let width = self.width, width > 0 {
|
||||||
height: self.height,
|
Image(nsImage: Self.renderBar(
|
||||||
fractionUsed: self.clampedFractionUsed,
|
width: width,
|
||||||
percentUsed: self.percentUsed))
|
height: self.height,
|
||||||
.resizable()
|
fractionUsed: self.clampedFractionUsed,
|
||||||
.interpolation(.none)
|
percentUsed: self.percentUsed))
|
||||||
.frame(width: self.width, height: self.height)
|
.resizable()
|
||||||
|
.interpolation(.none)
|
||||||
|
.frame(width: width, height: self.height)
|
||||||
|
} else {
|
||||||
|
GeometryReader { proxy in
|
||||||
|
Image(nsImage: Self.renderBar(
|
||||||
|
width: proxy.size.width,
|
||||||
|
height: self.height,
|
||||||
|
fractionUsed: self.clampedFractionUsed,
|
||||||
|
percentUsed: self.percentUsed))
|
||||||
|
.resizable()
|
||||||
|
.interpolation(.none)
|
||||||
|
.frame(width: proxy.size.width, height: self.height)
|
||||||
|
}
|
||||||
|
.frame(height: self.height)
|
||||||
|
}
|
||||||
|
}
|
||||||
.accessibilityLabel("Context usage")
|
.accessibilityLabel("Context usage")
|
||||||
.accessibilityValue(self.accessibilityValue)
|
.accessibilityValue(self.accessibilityValue)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ struct MenuContent: View {
|
|||||||
@State private var loadingMics = false
|
@State private var loadingMics = false
|
||||||
@State private var sessionMenu: [SessionRow] = []
|
@State private var sessionMenu: [SessionRow] = []
|
||||||
@State private var mainSessionRow: SessionRow?
|
@State private var mainSessionRow: SessionRow?
|
||||||
|
@State private var mainSessionContextWidth: CGFloat = 0
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading, spacing: 8) {
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
@@ -266,9 +267,15 @@ struct MenuContent: View {
|
|||||||
ContextUsageBar(
|
ContextUsageBar(
|
||||||
usedTokens: row.tokens.total,
|
usedTokens: row.tokens.total,
|
||||||
contextTokens: row.tokens.contextTokens,
|
contextTokens: row.tokens.contextTokens,
|
||||||
width: 220)
|
width: self.mainSessionContextWidth > 0 ? self.mainSessionContextWidth : nil)
|
||||||
}
|
}
|
||||||
.padding(.vertical, 2)
|
.padding(.vertical, 2)
|
||||||
|
.onWidthChange { width in
|
||||||
|
let next = max(120, width)
|
||||||
|
if abs(next - self.mainSessionContextWidth) > 1 {
|
||||||
|
self.mainSessionContextWidth = next
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: 8) {
|
||||||
Text("Context (main)")
|
Text("Context (main)")
|
||||||
|
|||||||
@@ -154,7 +154,7 @@ struct SessionsSettings: View {
|
|||||||
ContextUsageBar(
|
ContextUsageBar(
|
||||||
usedTokens: row.tokens.total,
|
usedTokens: row.tokens.total,
|
||||||
contextTokens: row.tokens.contextTokens,
|
contextTokens: row.tokens.contextTokens,
|
||||||
width: 260)
|
width: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
HStack(spacing: 10) {
|
HStack(spacing: 10) {
|
||||||
|
|||||||
20
apps/macos/Sources/Clawdis/ViewMetrics.swift
Normal file
20
apps/macos/Sources/Clawdis/ViewMetrics.swift
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
private struct ViewWidthPreferenceKey: PreferenceKey {
|
||||||
|
static let defaultValue: CGFloat = 0
|
||||||
|
|
||||||
|
static func reduce(value: inout CGFloat, nextValue: () -> CGFloat) {
|
||||||
|
value = max(value, nextValue())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension View {
|
||||||
|
func onWidthChange(_ onChange: @escaping (CGFloat) -> Void) -> some View {
|
||||||
|
self.background(
|
||||||
|
GeometryReader { proxy in
|
||||||
|
Color.clear.preference(key: ViewWidthPreferenceKey.self, value: proxy.size.width)
|
||||||
|
})
|
||||||
|
.onPreferenceChange(ViewWidthPreferenceKey.self, perform: onChange)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Reference in New Issue
Block a user