Menüleiste: Breite für die Gestalt, nicht für den Höchstwert

Nachgemessen statt geraten. Das Netzwerkelement war 69 Punkte breit, meine
Rechnung ergab 47 — und die anderen Module lagen konstant 16 darüber. Sechs
Punkte hatte allein das Netzwerk zusätzlich.

Zwei Ursachen. Die Hysterese hielt die Breite auf dem Höchstwert der letzten
zwanzig Sekunden; bei einem Wert, der im Sekundentakt schwankt, ist der fast
immer größer als der aktuelle. Und der Text wurde linksbündig gezeichnet, die
Differenz stand also komplett rechts als Lücke.

Jetzt wird die Breite für die **Gestalt** reserviert: alle Ziffern auf 9
gesetzt, das ergibt die breiteste Zeichenfolge derselben Form. Von 14 auf
37 KB/s bewegt sich damit nichts, und breiter wird es nur, wenn eine Stelle
dazukommt. Gezeichnet wird mittig, damit ein Rest sich auf beide Seiten
verteilt statt rechts zu stehen. Ergebnis: 69 → 57 Punkte.

Die verbleibenden rund 16 Punkte je Element legt macOS selbst um jedes
Statuselement; die Lücken zwischen benachbarten Elementen sind gemessen 0.

Neue Menüleistenmodule starten jetzt mit „Symbol + Wert" statt „Wert" —
bestehende Einstellungen bleiben, wie sie sind.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-13 12:57:13 +02:00
parent 8f0831391e
commit 5d261ed3d8
5 changed files with 76 additions and 11 deletions

View File

@@ -121,9 +121,14 @@ final class MetricStatusView: NSView, WidthReporting {
private var fadeTimer: Timer?
private var fadePhase: Double = 0
private var adaptive = AdaptiveWidth(minimum: MenuBarText.minimumWidth)
private var shownWidth: CGFloat = MenuBarText.minimumWidth
/// Die Breite für die Gestalt des Werts, nicht für seinen Höchstwert
/// zwischen 34 %" und 87 %" darf sich nichts bewegen.
private func shape(_ text: String) -> String {
MenuBarText.widestOfSameShape(text)
}
override var intrinsicContentSize: NSSize {
NSSize(width: shownWidth, height: 22)
}
@@ -139,11 +144,11 @@ final class MetricStatusView: NSView, WidthReporting {
case .symbol: max(MenuBarText.minimumWidth, symbolSlot + 4)
case .graph: 28
case .bars: barsWidth
case .value: MenuBarText.width(for: displayValue)
case .valueAndGraph: MenuBarText.width(for: displayValue) + 2 + 28
case .labelAndValue: MenuBarText.width(for: "\(label) \(displayValue)")
case .value: MenuBarText.width(for: shape(displayValue))
case .valueAndGraph: MenuBarText.width(for: shape(displayValue)) + 2 + 28
case .labelAndValue: MenuBarText.width(for: shape("\(label) \(displayValue)"))
case .symbolAndValue:
MenuBarText.width(for: displayValue) + symbolSlot + MenuBarText.innerGap
MenuBarText.width(for: shape(displayValue)) + symbolSlot + MenuBarText.innerGap
}
}
@@ -180,7 +185,7 @@ final class MetricStatusView: NSView, WidthReporting {
updateFadeTimer()
let next = adaptive.update(needed: width)
let next = max(width, MenuBarText.minimumWidth)
guard next != shownWidth else { return }
shownWidth = next
invalidateIntrinsicContentSize()