Die Fensterleiste schluckte die halbe Kopfzeile
Der Player deckt das ganze Fenster ab, und auf dem Mac zeichnet das System seine Ampelknöpfe darüber. Die Kopfzeile lag damit nicht nur optisch unter ihnen — der Streifen gehört der Fensterleiste, und die nimmt jeden Klick für sich. Verkleinern, Schließen, Tonspur, Untertitel und die Qualitätsstufe waren dort tot, und ein Doppelklick auf dieselbe Stelle legte das Fenster ins Dock. Jetzt beginnt die Kopfzeile auf dem Mac achtundzwanzig Punkte tiefer. Dazu: Tabulator springt in der Jellyfin-Anmeldung vom Namen zum Passwort und zurück. „Name, Tab, Passwort, Eingabe" ist der Weg, den jeder mit einem Passwortspeicher nimmt; SwiftUI schiebt den Fokus dort nicht von selbst weiter. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
23d10d61f3
commit
f3ea1ea891
@@ -22,6 +22,14 @@ struct PlayerView: View {
|
|||||||
@Environment(PlaybackDiagnostics.self) private var diagnostics
|
@Environment(PlaybackDiagnostics.self) private var diagnostics
|
||||||
@Environment(\.flixyAccent) private var accent
|
@Environment(\.flixyAccent) private var accent
|
||||||
|
|
||||||
|
/// Wie hoch die Fensterleiste auf dem Mac ist.
|
||||||
|
///
|
||||||
|
/// Fest, weil es keine Auskunft darüber gibt, die hier ankäme: die
|
||||||
|
/// Sicherheitsränder einer Szene kennen die Fensterleiste nicht, sie
|
||||||
|
/// gehört dem System. Achtundzwanzig Punkte sind das Maß eines
|
||||||
|
/// gewöhnlichen Fensters.
|
||||||
|
private static let titleBarHeight: CGFloat = 28
|
||||||
|
|
||||||
@State private var showsControls = true
|
@State private var showsControls = true
|
||||||
@State private var trackPicker: TrackPickerSheet.Kind?
|
@State private var trackPicker: TrackPickerSheet.Kind?
|
||||||
@State private var showsQualityChoice = false
|
@State private var showsQualityChoice = false
|
||||||
@@ -105,6 +113,18 @@ struct PlayerView: View {
|
|||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
.padding(FlixySpacing.loose)
|
.padding(FlixySpacing.loose)
|
||||||
|
// **Unter der Fensterleiste beginnen.**
|
||||||
|
//
|
||||||
|
// Der Player deckt das ganze Fenster ab, und auf dem Mac
|
||||||
|
// zeichnet das System seine Ampelknöpfe darüber. Die
|
||||||
|
// Kopfzeile lag dadurch nicht nur optisch unter ihnen: der
|
||||||
|
// ganze Streifen gehört der Fensterleiste, und die
|
||||||
|
// schluckt jeden Klick. Verkleinern, Schließen, Tonspur,
|
||||||
|
// Untertitel und die Qualitätsstufe waren dort tot — und
|
||||||
|
// ein zweiter Klick auf dieselbe Stelle legte das Fenster
|
||||||
|
// ins Dock, weil das der Doppelklick auf eine
|
||||||
|
// Fensterleiste tut.
|
||||||
|
.padding(.top, FlixyPlatform.isMac ? Self.titleBarHeight : 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,6 +190,16 @@ struct JellyfinSignInView: View {
|
|||||||
.submitLabel(.next)
|
.submitLabel(.next)
|
||||||
.focused($focusedField, equals: .userName)
|
.focused($focusedField, equals: .userName)
|
||||||
.onSubmit { focusedField = .password }
|
.onSubmit { focusedField = .password }
|
||||||
|
// **Tabulator weiterreichen, von Hand.**
|
||||||
|
//
|
||||||
|
// Auf dem Mac ist „Name, Tab, Passwort, Eingabe" der Weg, den
|
||||||
|
// jeder nimmt, der einen Passwortspeicher benutzt. SwiftUI
|
||||||
|
// schiebt den Fokus hier aber nicht selbst weiter: die Taste
|
||||||
|
// kommt im Feld an und bleibt dort liegen.
|
||||||
|
.onKeyPress(.tab) {
|
||||||
|
focusedField = .password
|
||||||
|
return .handled
|
||||||
|
}
|
||||||
.padding(FlixySpacing.regular)
|
.padding(FlixySpacing.regular)
|
||||||
.background(Color.flixyElevated, in: .rect(cornerRadius: FlixyRadius.control))
|
.background(Color.flixyElevated, in: .rect(cornerRadius: FlixyRadius.control))
|
||||||
|
|
||||||
@@ -198,6 +208,12 @@ struct JellyfinSignInView: View {
|
|||||||
.submitLabel(.go)
|
.submitLabel(.go)
|
||||||
.focused($focusedField, equals: .password)
|
.focused($focusedField, equals: .password)
|
||||||
.onSubmit { Task { await model.signInWithPassword() } }
|
.onSubmit { Task { await model.signInWithPassword() } }
|
||||||
|
// Und zurück: sonst wäre der Weg eine Einbahnstraße, und ein
|
||||||
|
// Vertipper im Namen hieße, zur Maus greifen.
|
||||||
|
.onKeyPress(.tab) {
|
||||||
|
focusedField = .userName
|
||||||
|
return .handled
|
||||||
|
}
|
||||||
.padding(FlixySpacing.regular)
|
.padding(FlixySpacing.regular)
|
||||||
.background(Color.flixyElevated, in: .rect(cornerRadius: FlixyRadius.control))
|
.background(Color.flixyElevated, in: .rect(cornerRadius: FlixyRadius.control))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user