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:
@@ -50,44 +50,35 @@ struct MenuBarTextTests {
|
||||
}
|
||||
}
|
||||
|
||||
// Eine Breite, die dem Höchstwert der letzten Messungen folgt, ist bei einem
|
||||
// Wert, der ständig schwankt, fast immer zu groß: der Netzwerkdurchsatz
|
||||
// wechselt im Sekundentakt, und das Element blieb dauerhaft auf der Breite
|
||||
// eines vergangenen Ausschlags stehen. Die Differenz stand als Lücke daneben.
|
||||
// Ein Menüleistenelement darf seine Breite **nicht** ändern, wenn sich der
|
||||
// Messwert ändert — sonst rutschen alle Symbole rechts davon mit. Das gilt auch
|
||||
// dann, wenn eine Stelle dazukommt: aus „14 KB/s" wird „431 KB/s", und die
|
||||
// halbe Leiste wandert.
|
||||
//
|
||||
// Stattdessen: die Ziffern durch Neunen ersetzen. Das ergibt die breiteste
|
||||
// Zeichenfolge **derselben Gestalt** — die Breite ändert sich dann nur noch,
|
||||
// wenn eine Stelle dazukommt oder die Einheit wechselt.
|
||||
// Also eine feste Breite je Darstellung, bemessen am breitesten Wert, der
|
||||
// vorkommen kann. Der frühere Fehler war nicht die feste Breite, sondern ein
|
||||
// falscher Bezugswert: „100 °C" statt „100°" ist rund 15 Punkte zu viel.
|
||||
|
||||
@Suite("Breite gleicher Gestalt")
|
||||
struct DigitShapeTests {
|
||||
@Suite("Feste Breite")
|
||||
struct FixedWidthTests {
|
||||
|
||||
@Test("Ziffern werden zu Neunen")
|
||||
func digitsBecomeNines() {
|
||||
#expect(MenuBarText.widestOfSameShape("↓ 14 KB/s") == "↓ 99 KB/s")
|
||||
#expect(MenuBarText.widestOfSameShape("34 %") == "99 %")
|
||||
@Test("Der Bezugswert hängt nicht vom Messwert ab")
|
||||
func referenceIsIndependentOfValue() {
|
||||
#expect(MenuBarText.width(for: "100 %") == MenuBarText.width(for: "100 %"))
|
||||
}
|
||||
|
||||
@Test("Alles außer Ziffern bleibt stehen")
|
||||
func nonDigitsSurvive() {
|
||||
#expect(MenuBarText.widestOfSameShape("↑ 2,4 MB/s") == "↑ 9,9 MB/s")
|
||||
@Test("Ein Bezugswert deckt alle kürzeren ab")
|
||||
func referenceCoversShorterValues() {
|
||||
// Was hineinpasst, wird nicht abgeschnitten.
|
||||
for value in ["0 %", "9 %", "34 %", "100 %"] {
|
||||
#expect(MenuBarText.width(of: value) <= MenuBarText.width(of: "100 %"))
|
||||
}
|
||||
}
|
||||
|
||||
@Test("Gleich lange Zahlen ergeben dieselbe Gestalt")
|
||||
func sameLengthIsStable() {
|
||||
// Genau darum geht es: von 14 auf 37 KB/s darf sich nichts bewegen.
|
||||
#expect(MenuBarText.widestOfSameShape("↓ 14 KB/s")
|
||||
== MenuBarText.widestOfSameShape("↓ 37 KB/s"))
|
||||
}
|
||||
|
||||
@Test("Eine Stelle mehr ist eine andere Gestalt")
|
||||
func moreDigitsIsWider() {
|
||||
#expect(MenuBarText.widestOfSameShape("↓ 999 KB/s")
|
||||
!= MenuBarText.widestOfSameShape("↓ 99 KB/s"))
|
||||
}
|
||||
|
||||
@Test("Ohne Ziffern bleibt der Text, wie er ist")
|
||||
func textWithoutDigitsIsUnchanged() {
|
||||
#expect(MenuBarText.widestOfSameShape("–") == "–")
|
||||
@Test("Grad ohne Einheitenbuchstaben ist deutlich schmaler")
|
||||
func degreeWithoutUnitIsNarrower() {
|
||||
// Der eigentliche Fund: gezeichnet wird „63°", bemessen wurde früher
|
||||
// „100 °C".
|
||||
#expect(MenuBarText.width(of: "100°") < MenuBarText.width(of: "100 °C") - 10)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user