Menüleiste springt nicht mehr, Mixer fasst Hilfsprozesse zusammen
Die Breite folgte der Stellenzahl des aktuellen Werts. Aus „14 KB/s" wird „431 KB/s", und mit der zusätzlichen Stelle wanderte die halbe Leiste. Jetzt wieder feste Breiten, bemessen am breitesten Wert, der vorkommen kann. Der frühere Fehler war nicht die feste Breite, sondern der falsche Bezugswert: gezeichnet wird „63°", bemessen wurde „100 °C" — fünfzehn Punkte für zwei Zeichen, die nie erscheinen. Nachgemessen: zwei Aufnahmen im Abstand von sechs Sekunden mit geänderten Werten ergeben identische Breiten. Der Mixer fasst Hilfsprozesse mit ihrem Programm zusammen. „Google Chrome" und „Google Chrome Helper" standen als zwei Zeilen nebeneinander, mit getrennten Reglern für dasselbe Programm — zieht man den einen, hört man den anderen. Chrome hat je Tab einen Helfer; fünfzehn Regler für einen Browser sind keine Auskunft. Abgegriffen wird weiterhin je Prozess, geregelt aber je Programm. Der Schlüssel der Taps muss deshalb den Prozess mitführen: mehrere Helfer teilen sich eine Kennung und überschrieben sich sonst gegenseitig. Der Pegel einer Zeile ist der lauteste ihrer Prozesse. Die Zeilen sind einzeilig statt zweizeilig: Symbol, Stummschalter, Regler, Wert. Der Name ist weg — bei einem erkennbaren Programmsymbol ist er redundant, und die gewonnene Zeile macht die Liste halb so hoch. Dafür ist das Symbol größer, und wer den Namen braucht, hält den Zeiger darauf. Popover 420 statt 330 Punkte breit. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -81,19 +81,16 @@ final class NetworkStatusView: NSView, WidthReporting {
|
||||
/// die halbe Breite leer zu lassen — und genau so sah es aus. Gemessen wird
|
||||
/// deshalb, was gerade dasteht; `AdaptiveWidth` sorgt dafür, dass die
|
||||
/// Leiste dabei nicht zappelt.
|
||||
private static func ratesWidth(_ snapshot: NetworkSnapshot) -> CGFloat {
|
||||
/// Feste Breite, bemessen am breitesten Wert, der vorkommen kann.
|
||||
///
|
||||
/// Nicht am aktuellen: aus „14 KB/s" wird „431 KB/s", und mit jeder
|
||||
/// zusätzlichen Stelle wanderte die halbe Menüleiste. „999 MB/s" kostet
|
||||
/// gegenüber einem dreistelligen KB-Wert nur wenige Punkte — das ist der
|
||||
/// Preis dafür, dass nie etwas springt.
|
||||
private static var ratesWidth: 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
|
||||
return ceil(widest) + 2 * MenuBarText.sidePadding
|
||||
let widest = NSAttributedString(string: "↓ 999 MB/s", attributes: [.font: font])
|
||||
return ceil(widest.size().width) + 2 * MenuBarText.sidePadding
|
||||
}
|
||||
|
||||
private func neededWidth() -> CGFloat {
|
||||
@@ -102,13 +99,13 @@ final class NetworkStatusView: NSView, WidthReporting {
|
||||
max(MenuBarText.minimumWidth,
|
||||
MenuBarText.symbolWidth(snapshot.interfaceKind.symbolName, height: 15) + 4)
|
||||
case .graph, .bars: 28
|
||||
case .value: Self.ratesWidth(snapshot)
|
||||
case .valueAndGraph: Self.ratesWidth(snapshot) + 26
|
||||
case .value: Self.ratesWidth
|
||||
case .valueAndGraph: Self.ratesWidth + 26
|
||||
// Die Raten tragen mit ↓ und ↑ ihre Beschriftung schon in sich; ein
|
||||
// Kürzel davor wäre doppelt gemoppelt, ein Symbol dagegen nützlich —
|
||||
// es zeigt WLAN, Ethernet oder VPN.
|
||||
case .labelAndValue, .symbolAndValue:
|
||||
Self.ratesWidth(snapshot) + symbolSlot + MenuBarText.innerGap
|
||||
Self.ratesWidth + symbolSlot + MenuBarText.innerGap
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user