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:
@@ -83,8 +83,13 @@ final class NetworkStatusView: NSView, WidthReporting {
|
||||
/// Leiste dabei nicht zappelt.
|
||||
private static func ratesWidth(_ snapshot: NetworkSnapshot) -> CGFloat {
|
||||
let font = NSFont.monospacedDigitSystemFont(ofSize: 9, weight: .regular)
|
||||
// Die **Gestalt** reservieren, nicht den Höchstwert der letzten
|
||||
// Messungen: der Durchsatz schwankt im Sekundentakt, und der Höchstwert
|
||||
// ist fast immer größer als das, was gerade dasteht. Die Differenz
|
||||
// stand als Lücke daneben.
|
||||
let lines = ["↓ " + Throughput.formatted(snapshot.downloadRate),
|
||||
"↑ " + Throughput.formatted(snapshot.uploadRate)]
|
||||
.map(MenuBarText.widestOfSameShape)
|
||||
let widest = lines
|
||||
.map { NSAttributedString(string: $0, attributes: [.font: font]).size().width }
|
||||
.max() ?? 0
|
||||
@@ -111,7 +116,6 @@ final class NetworkStatusView: NSView, WidthReporting {
|
||||
MenuBarText.symbolWidth(snapshot.interfaceKind.symbolName, height: 13)
|
||||
}
|
||||
|
||||
private var adaptive = AdaptiveWidth(minimum: MenuBarText.minimumWidth)
|
||||
private var width: CGFloat = MenuBarText.minimumWidth
|
||||
var onWidthChange: ((CGFloat) -> Void)?
|
||||
|
||||
@@ -124,7 +128,7 @@ final class NetworkStatusView: NSView, WidthReporting {
|
||||
self.history = history
|
||||
needsDisplay = true
|
||||
|
||||
let next = adaptive.update(needed: neededWidth())
|
||||
let next = max(neededWidth(), MenuBarText.minimumWidth)
|
||||
guard next != width else { return }
|
||||
width = next
|
||||
invalidateIntrinsicContentSize()
|
||||
@@ -175,8 +179,11 @@ final class NetworkStatusView: NSView, WidthReporting {
|
||||
attributes: attributes)
|
||||
let up = NSAttributedString(string: "↑ " + Throughput.formatted(snapshot.uploadRate),
|
||||
attributes: attributes)
|
||||
down.draw(at: NSPoint(x: rect.minX + 2, y: rect.midY - 0.5))
|
||||
up.draw(at: NSPoint(x: rect.minX + 2, y: rect.midY - 10.5))
|
||||
// Mittig statt links: bleibt doch einmal Platz übrig — etwa weil die
|
||||
// zweite Zeile schmaler ist —, verteilt er sich auf beide Seiten statt
|
||||
// als Lücke rechts zu stehen.
|
||||
down.draw(at: NSPoint(x: rect.midX - down.size().width / 2, y: rect.midY - 0.5))
|
||||
up.draw(at: NSPoint(x: rect.midX - up.size().width / 2, y: rect.midY - 10.5))
|
||||
}
|
||||
|
||||
private func drawGraph(color: NSColor, in rect: NSRect) {
|
||||
|
||||
Reference in New Issue
Block a user