Auslösefläche einstellbar, Blitz immer lesbar, Menüleiste schmaler
Der Blitz war ein Loch in der Füllung — über dem gefüllten Teil liest man ihn, über dem leeren ist es Transparenz auf Transparenz. Bei wenig Ladung sitzt er fast ganz im Leeren und verschwindet. Statt zwischen Schwarz und Weiß zu faden geht er den Weg von macOS: geteilt gezeichnet, über der Füllung ausgestanzt, daneben ausgemalt. Damit ist er bei jedem Ladestand lesbar, ohne Bewegung in der Menüleiste. Ein Test prüft, dass sich die beiden Teile an der Kante treffen statt zu überlappen — sonst wäre der Blitz an der Nahtstelle dicker. Die Auslösefläche der Notch lässt sich jetzt einstellen, mit Vorschau. Wie genau jemand die Notch trifft, hängt an Hand und Zeigegerät; feste Werte im Code waren dafür die falsche Antwort. Die Vorschau zeigt einen nachgebildeten Bildschirm mit Notch und eingefärbter Fläche — „24 Punkte unter der Notch" ist keine Vorstellung, die jemand im Kopf hat. Die Menüleistenbreiten folgen jetzt dem, was dasteht. „Temp 53°" stand in einer Box für „Temp 100 °C", und in der Menüleiste ist Platz das knappste Gut. Dieselbe Hysterese wie beim Netzwerk: sofort wachsen, zögernd schrumpfen. Das Mixer-Symbol war ausgeschaltet auf 55 % abgeblendet. Das war meine Idee und ein Fehlgriff: über einem hellen Schreibtischhintergrund ist es damit praktisch weg. Ob der Mixer läuft, erfährt man beim Klick — dafür muss man das Symbol aber erst finden. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
72
Packages/OnyxKit/Tests/OnyxNotchTests/TriggerAreaTests.swift
Normal file
72
Packages/OnyxKit/Tests/OnyxNotchTests/TriggerAreaTests.swift
Normal file
@@ -0,0 +1,72 @@
|
||||
import Testing
|
||||
import CoreGraphics
|
||||
import Foundation
|
||||
@testable import OnyxNotch
|
||||
|
||||
// Wie weit die Auslösefläche über die Notch hinausreicht, ist Geschmackssache
|
||||
// und hängt an der Hand: manche zielen genau, andere fahren nur grob nach oben.
|
||||
// Feste Werte im Code sind dafür die falsche Antwort.
|
||||
|
||||
@Suite("Auslösefläche")
|
||||
struct TriggerAreaTests {
|
||||
|
||||
private let notch = CGRect(x: 790, y: 1131, width: 220, height: 38)
|
||||
private let screen = CGRect(x: 0, y: 0, width: 1800, height: 1169)
|
||||
|
||||
@Test("Ohne Zugabe ist die Fläche die Notch selbst")
|
||||
func zeroMeansNotchOnly() {
|
||||
let area = TriggerArea(extraWidth: 0, extraHeight: 0)
|
||||
#expect(area.rect(notch: notch, screen: screen) == notch)
|
||||
}
|
||||
|
||||
@Test("Die Breite wächst nach beiden Seiten")
|
||||
func widthGrowsBothWays() {
|
||||
// Sonst säße die Fläche außermittig, und man träfe sie links anders
|
||||
// als rechts.
|
||||
let rect = TriggerArea(extraWidth: 30, extraHeight: 0)
|
||||
.rect(notch: notch, screen: screen)
|
||||
#expect(rect.minX == notch.minX - 30)
|
||||
#expect(rect.maxX == notch.maxX + 30)
|
||||
}
|
||||
|
||||
@Test("Die Höhe wächst nur nach unten")
|
||||
func heightGrowsDownwards() {
|
||||
// Nach oben ist der Bildschirmrand — dort kommt niemand her.
|
||||
let rect = TriggerArea(extraWidth: 0, extraHeight: 25)
|
||||
.rect(notch: notch, screen: screen)
|
||||
#expect(rect.maxY == notch.maxY)
|
||||
#expect(rect.minY == notch.minY - 25)
|
||||
}
|
||||
|
||||
@Test("Die Fläche bleibt auf dem Bildschirm")
|
||||
func staysOnScreen() {
|
||||
let rect = TriggerArea(extraWidth: 5000, extraHeight: 5000)
|
||||
.rect(notch: notch, screen: screen)
|
||||
#expect(rect.minX >= screen.minX)
|
||||
#expect(rect.maxX <= screen.maxX)
|
||||
#expect(rect.minY >= screen.minY)
|
||||
}
|
||||
|
||||
@Test("Werte außerhalb des Erlaubten werden eingefangen")
|
||||
func valuesAreClamped() {
|
||||
#expect(TriggerArea(extraWidth: -50, extraHeight: -50).extraWidth == 0)
|
||||
#expect(TriggerArea(extraWidth: 9999, extraHeight: 0).extraWidth
|
||||
== TriggerArea.maximumExtraWidth)
|
||||
#expect(TriggerArea(extraWidth: 0, extraHeight: 9999).extraHeight
|
||||
== TriggerArea.maximumExtraHeight)
|
||||
}
|
||||
|
||||
@Test("Die Voreinstellung ist die, mit der bisher gearbeitet wurde")
|
||||
func defaultMatchesPreviousBehaviour() {
|
||||
// Wer nichts einstellt, soll nichts merken.
|
||||
#expect(TriggerArea.standard.extraWidth == 16)
|
||||
#expect(TriggerArea.standard.extraHeight == 14)
|
||||
}
|
||||
|
||||
@Test("Gespeichert und gelesen ergibt dasselbe")
|
||||
func roundTrips() throws {
|
||||
let area = TriggerArea(extraWidth: 42, extraHeight: 7)
|
||||
let data = try JSONEncoder().encode(area)
|
||||
#expect(try JSONDecoder().decode(TriggerArea.self, from: data) == area)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user