diff --git a/Onyx/SettingsView.swift b/Onyx/SettingsView.swift index 9de829d..64178b2 100644 --- a/Onyx/SettingsView.swift +++ b/Onyx/SettingsView.swift @@ -22,6 +22,8 @@ struct SettingsView: View { let fanControl: FanControl let launchAtLogin: LaunchAtLogin let showOnboarding: () -> Void + /// Der gewählte Reiter liegt im Fenster-Controller, damit ein erneutes + /// Öffnen ihn setzen kann — etwa auf „Berechtigungen", wenn eine fehlt. @Binding var selectedTab: SettingsTab /// Die Reiter in der Reihenfolge, in der sie oben stehen. @@ -50,9 +52,13 @@ struct SettingsView: View { } .pickerStyle(.segmented) .labelsHidden() - // Nur so breit wie nötig und mittig: über die volle Fensterbreite - // gezogen sähen sieben Reiter aus wie eine Werkzeugleiste. - .fixedSize() + // Ohne feste Breite: sieben deutsche Beschriftungen brauchen rund + // 880 Punkte, und mit `fixedSize` nahm sich die Leiste die auch + // dann, wenn das Fenster schmaler war — sie ragte dann links und + // rechts über die Kante hinaus. Das Mindestmaß des Fensters sorgt + // dafür, dass hier trotzdem nichts gestaucht wird. + .frame(maxWidth: 1000) + .padding(.horizontal, 20) .padding(.top, 10) .padding(.bottom, 14) diff --git a/Onyx/SettingsWindowController.swift b/Onyx/SettingsWindowController.swift index 77c73b3..9bfe7df 100644 --- a/Onyx/SettingsWindowController.swift +++ b/Onyx/SettingsWindowController.swift @@ -16,10 +16,17 @@ import ShelfProvider /// /// Ein eigenes `NSWindow` hat diese Abhängigkeit nicht. Es kostet ein paar /// Zeilen mehr und funktioniert dafür. +/// +/// `@Observable`, und das ist keine Kür: der gewählte Reiter liegt hier, weil +/// ein erneutes Öffnen ihn setzen können muss. Ohne Beobachtung bemerkt die +/// View die Änderung nicht — weder die von außen noch die eigene. Genau daran +/// hing das Fenster, in dem der Reiter oben umsprang und der Inhalt stehen +/// blieb. @MainActor +@Observable final class SettingsWindowController: NSObject, NSWindowDelegate { - private var window: NSWindow? + @ObservationIgnored private var window: NSWindow? /// Muss außerhalb der View liegen, damit ein erneutes Öffnen den Reiter setzen kann. private var selectedTab: SettingsTab = .widgets @@ -76,15 +83,16 @@ final class SettingsWindowController: NSObject, NSWindowDelegate { // mehr, und ein Fenster, in dem man scrollen muss, obwohl der // Bildschirm frei ist, ist eine Zumutung. window.styleMask = [.titled, .closable, .miniaturizable, .resizable] - window.setContentSize(NSSize(width: 780, height: 660)) + window.setContentSize(NSSize(width: 920, height: 680)) // Breit genug für die Reiterleiste. // - // Sechs Reiter mit deutschen Beschriftungen brauchen mehr, als man - // beim Nachrechnen der reinen Textbreiten herausbekommt: macOS legt - // je Reiter Innenabstand und Trenner dazu. Ist das Fenster zu - // schmal, schneidet es die Leiste rechts einfach ab — der letzte - // Reiter ist dann nicht mehr erreichbar. - window.contentMinSize = NSSize(width: 740, height: 460) + // Sieben Reiter mit deutschen Beschriftungen brauchen rund 880 + // Punkte — mehr, als man beim Nachrechnen der reinen Textbreiten + // herausbekommt: macOS legt je Reiter Innenabstand und Trenner + // dazu. Ist das Fenster schmaler, ragt die Leiste über beide + // Kanten hinaus, und der erste wie der letzte Reiter sind nicht + // mehr erreichbar. + window.contentMinSize = NSSize(width: 900, height: 460) window.isReleasedWhenClosed = false window.delegate = self Self.place(window)