Blitz fadet, Einstellungsfenster mittig und veränderbar
Der Blitz fadet beim Laden zwischen Weiß und Schwarz — so gewünscht, und ich hätte vorher fragen sollen statt eine eigene Lösung zu bauen und sie hinterher zu begründen. Über den Kosinus statt linear: ein linearer Ping-Pong knickt an den Umkehrpunkten sichtbar. Der Zeitgeber läuft mit 30 Bildern je Sekunde und nur, solange geladen wird — steht das Kabel nicht drin, läuft gar nichts. Der Stecker für „am Netz, lädt nicht" bleibt ausgestanzt; dort bewegt sich ohnehin nichts. Das Einstellungsfenster lässt sich jetzt vergrößern und startet mit 620 × 620 statt 520 × 420. Der Bereich „Displays" passt mit der Vorschau der Auslösefläche nicht mehr in die alte Höhe, und ein Fenster, in dem man scrollt, obwohl der Bildschirm frei ist, ist eine Zumutung. Die feste Größe in der View musste dafür weichen — sonst wächst das Fenster und der Inhalt bleibt stehen. Und es öffnet jetzt wirklich mittig. Mein erster Versuch mit 60 Punkten Abstand von oben war zu zaghaft: der Titelbalken lag weiter so hoch, dass man auf dem Weg zu seinen Knöpfen durch die Auslösefläche fuhr. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -113,6 +113,14 @@ final class MetricStatusView: NSView, WidthReporting {
|
||||
@available(*, unavailable)
|
||||
required init?(coder: NSCoder) { fatalError() }
|
||||
|
||||
/// Läuft nur, solange geladen wird — nur dann bewegt sich der Blitz.
|
||||
///
|
||||
/// 30 Bilder je Sekunde reichen für ein weiches Faden und kosten deutlich
|
||||
/// weniger als die 60, die man reflexhaft nähme. Steht das Ladekabel nicht
|
||||
/// drin, läuft gar nichts.
|
||||
private var fadeTimer: Timer?
|
||||
private var fadePhase: Double = 0
|
||||
|
||||
private var adaptive = AdaptiveWidth(minimum: MenuBarText.minimumWidth)
|
||||
private var shownWidth: CGFloat = MenuBarText.minimumWidth
|
||||
|
||||
@@ -170,6 +178,8 @@ final class MetricStatusView: NSView, WidthReporting {
|
||||
self.mode = mode
|
||||
needsDisplay = true
|
||||
|
||||
updateFadeTimer()
|
||||
|
||||
let next = adaptive.update(needed: width)
|
||||
guard next != shownWidth else { return }
|
||||
shownWidth = next
|
||||
@@ -248,10 +258,31 @@ final class MetricStatusView: NSView, WidthReporting {
|
||||
return
|
||||
}
|
||||
BatteryGlyph.draw(charge: battery.charge, isCharging: battery.isCharging,
|
||||
isPluggedIn: battery.isPluggedIn, color: color,
|
||||
isPluggedIn: battery.isPluggedIn, fadePhase: fadePhase,
|
||||
color: color,
|
||||
in: CGRect(origin: origin, size: BatteryGlyph.size))
|
||||
}
|
||||
|
||||
/// Der Zeitgeber fürs Faden — an und aus mit dem Ladevorgang.
|
||||
private func updateFadeTimer() {
|
||||
let shouldFade = metric == .battery && snapshot.battery?.isCharging == true
|
||||
if shouldFade, fadeTimer == nil {
|
||||
let timer = Timer(timeInterval: 1.0 / 30, repeats: true) { [weak self] _ in
|
||||
MainActor.assumeIsolated {
|
||||
guard let self else { return }
|
||||
self.fadePhase += (1.0 / 30) / BatteryGlyph.fadeDuration
|
||||
self.needsDisplay = true
|
||||
}
|
||||
}
|
||||
RunLoop.main.add(timer, forMode: .common)
|
||||
fadeTimer = timer
|
||||
} else if !shouldFade, fadeTimer != nil {
|
||||
fadeTimer?.invalidate()
|
||||
fadeTimer = nil
|
||||
needsDisplay = true
|
||||
}
|
||||
}
|
||||
|
||||
/// Wie breit das Glyph ist. Der Akku wird selbst gezeichnet und hat eigene
|
||||
/// Maße; alles andere ist ein SF-Symbol.
|
||||
private var symbolSlot: CGFloat {
|
||||
|
||||
Reference in New Issue
Block a user