Files
onyx/Packages/OnyxKit/Sources/MetricsProvider/BatterySymbol.swift
Scarriffle 4b5e86b3f4 Akkusymbol folgt dem Ladestand
Ein Symbol, das bei 5 % genauso aussieht wie bei 95 %, ist Dekoration und
keine Anzeige. Wer in der Menüleiste nur das Glyph stehen hat, will es ohne
die Zahl daneben lesen können.

Fünf Füllstufen, gerundet zur nächsten: 60 % soll nicht halbleer aussehen
und 40 % nicht dreiviertel voll.

Beim Bauen fiel auf, dass die naheliegende Lösung nicht geht. Die erste
Fassung hängte beim Laden ein „.bolt" an den Füllstand — von diesen
kombinierten Symbolen existiert aber allein `battery.100percent.bolt`, und
`battery.slash` gibt es auch nicht. Die übrigen wären leere Felder in der
Menüleiste gewesen. Nachgemessen statt angenommen, und ein Test prüft jetzt
für jeden erzeugten Namen, dass es ihn wirklich gibt.

Den Füllstand beim Laden gegen einen Blitz einzutauschen wäre die falsche
Wahl gewesen: dass geladen wird, sieht man am Netzstecker; wie weit es ist,
sieht man nirgends sonst. Also bleibt der Füllstand, und der Blitz kommt als
kleines Zeichen darüber.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 13:30:13 +02:00

36 lines
1.5 KiB
Swift

import Foundation
/// Das Akkusymbol zum jeweiligen Zustand.
///
/// Ein Symbol, das bei 5 % genauso aussieht wie bei 95 %, ist Dekoration und
/// keine Anzeige es beantwortet die eine Frage nicht, für die es da ist. Wer
/// in der Menüleiste nur das Symbol stehen hat, will es auf einen Blick lesen
/// können, ohne die Zahl daneben.
public enum BatterySymbol {
/// Kein Akku da oder keiner zu lesen.
public static let unavailable = "batteryblock.slash"
/// Der Blitz beim Laden **getrennt** vom Füllstand.
///
/// Nachgemessen, nicht angenommen: von den kombinierten Symbolen existiert
/// allein `battery.100percent.bolt`. Für 0, 25, 50 und 75 Prozent gibt es
/// keine Blitz-Variante, und `battery.slash` gibt es auch nicht.
///
/// Den Füllstand beim Laden gegen einen Blitz einzutauschen wäre die
/// falsche Wahl: dass geladen wird, sieht man am Netzstecker; **wie weit**
/// es ist, sieht man nirgends sonst. Also bleibt der Füllstand, und der
/// Blitz kommt als kleines Zeichen darüber.
public static let chargingBolt = "bolt.fill"
/// SF Symbols kennt fünf Füllstufen. Gerundet wird zur nächsten: 60 % soll
/// nicht halbleer aussehen und 40 % nicht dreiviertel voll.
private static let steps = [0, 25, 50, 75, 100]
public static func name(charge: Double) -> String {
let percent = Int((min(max(charge, 0), 1) * 100).rounded())
let step = steps.min { abs($0 - percent) < abs($1 - percent) } ?? 0
return "battery.\(step)percent"
}
}