Einstellungen: die Linie unter den Reitern ist weg, und eine Fläche für alles
Die Linie kam von `TabView` selbst: es zieht unter seiner Leiste einen Trenner quer durchs Fenster, und der lässt sich nicht abschalten. Der Abstand nach oben, den ich beim letzten Mal eingebaut habe, hat deshalb nichts geändert — der Trenner ist mitgewandert. Jetzt ist die Reiterleiste selbst gebaut, ein Auswahlfeld über dem Inhalt, dann gibt es die Linie gar nicht erst. Der zweite Punkt hat dieselbe Wurzel: die Formulare bringen ihren eigenen Untergrund mit, der Rest des Fensters hat den des Systems. In Dunkelgrau liegen die beiden ein, zwei Prozent auseinander — sichtbar als Kante quer durchs Fenster, genau dort, wo das Formular anfängt. Der Untergrund der Formulare ist jetzt abgeschaltet, und das ganze Fenster hat einen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -88,6 +88,9 @@ struct ColorSettingsView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.formStyle(.grouped)
|
.formStyle(.grouped)
|
||||||
|
// Der eigene Untergrund des Formulars weicht ein, zwei Prozent von dem
|
||||||
|
// des Fensters ab. In Dunkelgrau sieht man genau das als Kante.
|
||||||
|
.scrollContentBackground(.hidden)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,6 +29,9 @@ struct FanSettingsView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.formStyle(.grouped)
|
.formStyle(.grouped)
|
||||||
|
// Der eigene Untergrund des Formulars weicht ein, zwei Prozent von dem
|
||||||
|
// des Fensters ab. In Dunkelgrau sieht man genau das als Kante.
|
||||||
|
.scrollContentBackground(.hidden)
|
||||||
.padding()
|
.padding()
|
||||||
.onAppear {
|
.onAppear {
|
||||||
control.refreshInstallState()
|
control.refreshInstallState()
|
||||||
|
|||||||
@@ -24,42 +24,73 @@ struct SettingsView: View {
|
|||||||
let showOnboarding: () -> Void
|
let showOnboarding: () -> Void
|
||||||
@Binding var selectedTab: SettingsTab
|
@Binding var selectedTab: SettingsTab
|
||||||
|
|
||||||
|
/// Die Reiter in der Reihenfolge, in der sie oben stehen.
|
||||||
|
private static let tabs: [(tab: SettingsTab, label: LocalizedStringKey)] = [
|
||||||
|
(.widgets, "settings.tab.widgets"),
|
||||||
|
(.display, "settings.tab.display"),
|
||||||
|
(.colors, "settings.tab.colors"),
|
||||||
|
(.sources, "settings.tab.options"),
|
||||||
|
(.menubar, "settings.tab.menubar"),
|
||||||
|
(.fans, "settings.tab.fans"),
|
||||||
|
(.permissions, "settings.tab.permissions"),
|
||||||
|
]
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
TabView(selection: $selectedTab) {
|
// Eigene Reiterleiste statt `TabView`.
|
||||||
WidgetSettings(model: model, shelfStore: shelfStore)
|
//
|
||||||
.tabItem { Label("settings.tab.widgets", systemImage: "square.grid.2x2") }
|
// `TabView` zieht unter seiner Leiste einen Trenner quer durchs
|
||||||
.tag(SettingsTab.widgets)
|
// Fenster — nicht abschaltbar, und die Leiste sitzt mittig darauf.
|
||||||
DisplaySettings(model: model)
|
// Abstand nach oben half nicht: der Trenner wandert mit. Also die
|
||||||
.tabItem { Label("settings.tab.display", systemImage: "macbook") }
|
// Leiste selbst gebaut, dann gibt es die Linie gar nicht erst.
|
||||||
.tag(SettingsTab.display)
|
VStack(spacing: 0) {
|
||||||
ColorSettingsView(theme: OnyxTheme.shared)
|
Picker("", selection: $selectedTab) {
|
||||||
.tabItem { Label("settings.tab.colors", systemImage: "paintpalette") }
|
ForEach(Self.tabs, id: \.tab) { entry in
|
||||||
.tag(SettingsTab.colors)
|
Text(entry.label).tag(entry.tab)
|
||||||
WidgetOptionsView(calendarModel: calendarModel, weatherModel: weatherModel,
|
}
|
||||||
shelfStore: shelfStore)
|
}
|
||||||
.tabItem { Label("settings.tab.options", systemImage: "slider.horizontal.3") }
|
.pickerStyle(.segmented)
|
||||||
.tag(SettingsTab.sources)
|
.labelsHidden()
|
||||||
MenuBarSettings(model: model, metricsModel: metricsModel)
|
// Nur so breit wie nötig und mittig: über die volle Fensterbreite
|
||||||
.tabItem { Label("settings.tab.menubar", systemImage: "menubar.rectangle") }
|
// gezogen sähen sieben Reiter aus wie eine Werkzeugleiste.
|
||||||
.tag(SettingsTab.menubar)
|
.fixedSize()
|
||||||
FanSettingsView(control: fanControl)
|
.padding(.top, 10)
|
||||||
.tabItem { Label("settings.tab.fans", systemImage: "fan") }
|
.padding(.bottom, 14)
|
||||||
.tag(SettingsTab.fans)
|
|
||||||
PermissionSettings(calendarModel: calendarModel, weatherModel: weatherModel,
|
content
|
||||||
launchAtLogin: launchAtLogin, showOnboarding: showOnboarding)
|
|
||||||
.tabItem { Label("settings.tab.permissions", systemImage: "hand.raised") }
|
|
||||||
.tag(SettingsTab.permissions)
|
|
||||||
}
|
}
|
||||||
// Abstand nach oben: ohne ihn sitzt die Reiterleiste genau auf der
|
// Eine Fläche für alles.
|
||||||
// Trennlinie unter dem Titelbalken und sieht aus, als läge sie auf
|
//
|
||||||
// einer Kante. `TabView` in einem gewöhnlichen Fenster bekommt diesen
|
// Vorher hatte jeder Bereich seinen eigenen Untergrund: die
|
||||||
// Abstand nicht von selbst — in Apples `Settings`-Szene schon, und die
|
// Formulare bringen einen mit, der Rest des Fensters hat den des
|
||||||
// benutzt Onyx bewusst nicht.
|
// Systems, und die beiden liegen in Dunkelgrau ein, zwei Prozent
|
||||||
.padding(.top, 12)
|
// auseinander. Sichtbar wurde das als Kante quer durchs Fenster.
|
||||||
|
.background(Color(nsColor: .windowBackgroundColor))
|
||||||
// Nur ein Mindestmaß, keine feste Größe: sonst kann das Fenster
|
// Nur ein Mindestmaß, keine feste Größe: sonst kann das Fenster
|
||||||
// wachsen, der Inhalt aber nicht mit.
|
// wachsen, der Inhalt aber nicht mit.
|
||||||
.frame(minWidth: 740, minHeight: 460)
|
.frame(minWidth: 740, minHeight: 460)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ViewBuilder
|
||||||
|
private var content: some View {
|
||||||
|
switch selectedTab {
|
||||||
|
case .widgets:
|
||||||
|
WidgetSettings(model: model, shelfStore: shelfStore)
|
||||||
|
case .display:
|
||||||
|
DisplaySettings(model: model)
|
||||||
|
case .colors:
|
||||||
|
ColorSettingsView(theme: OnyxTheme.shared)
|
||||||
|
case .sources:
|
||||||
|
WidgetOptionsView(calendarModel: calendarModel, weatherModel: weatherModel,
|
||||||
|
shelfStore: shelfStore)
|
||||||
|
case .menubar:
|
||||||
|
MenuBarSettings(model: model, metricsModel: metricsModel)
|
||||||
|
case .fans:
|
||||||
|
FanSettingsView(control: fanControl)
|
||||||
|
case .permissions:
|
||||||
|
PermissionSettings(calendarModel: calendarModel, weatherModel: weatherModel,
|
||||||
|
launchAtLogin: launchAtLogin, showOnboarding: showOnboarding)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Berechtigungen
|
// MARK: - Berechtigungen
|
||||||
@@ -141,6 +172,9 @@ private struct PermissionSettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.formStyle(.grouped)
|
.formStyle(.grouped)
|
||||||
|
// Der eigene Untergrund des Formulars weicht ein, zwei Prozent von dem
|
||||||
|
// des Fensters ab. In Dunkelgrau sieht man genau das als Kante.
|
||||||
|
.scrollContentBackground(.hidden)
|
||||||
.padding()
|
.padding()
|
||||||
.task {
|
.task {
|
||||||
launchAtLogin.refresh()
|
launchAtLogin.refresh()
|
||||||
@@ -517,6 +551,9 @@ private struct DisplaySettings: View {
|
|||||||
.fixedSize(horizontal: false, vertical: true)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
}
|
}
|
||||||
.formStyle(.grouped)
|
.formStyle(.grouped)
|
||||||
|
// Der eigene Untergrund des Formulars weicht ein, zwei Prozent von dem
|
||||||
|
// des Fensters ab. In Dunkelgrau sieht man genau das als Kante.
|
||||||
|
.scrollContentBackground(.hidden)
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,9 @@ struct WidgetOptionsView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.formStyle(.grouped)
|
.formStyle(.grouped)
|
||||||
|
// Der eigene Untergrund des Formulars weicht ein, zwei Prozent von dem
|
||||||
|
// des Fensters ab. In Dunkelgrau sieht man genau das als Kante.
|
||||||
|
.scrollContentBackground(.hidden)
|
||||||
.padding()
|
.padding()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user