From 47395491b713ed0d320975d6dafb6ba113818d7a Mon Sep 17 00:00:00 2001 From: hl-valdemar Date: Sun, 18 Oct 2026 23:18:33 +0200 Subject: [PATCH] fix: enforce start size through SwiftUI window constraints --- Sources/App/TerebiApp.swift | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Sources/App/TerebiApp.swift b/Sources/App/TerebiApp.swift index 494ce6c..3b87001 100644 --- a/Sources/App/TerebiApp.swift +++ b/Sources/App/TerebiApp.swift @@ -33,6 +33,7 @@ final class PlayerModel: ObservableObject { @Published private(set) var commandError: String? @Published private(set) var queue = PlaybackQueue() @Published private(set) var recentMedia: [PlaybackProgress.RecentMedia] = [] + @Published private(set) var startContentHeight: CGFloat = 400 @Published var showsQueue = false { didSet { if showsQueue != oldValue { transitionQueue() } @@ -827,6 +828,7 @@ final class PlayerModel: ObservableObject { func attachWindow(_ window: NSWindow) { guard self.window !== window else { return } + startContentHeight = 400 - (window.frame.height - window.contentLayoutRect.height) finishQueueTransition() self.window = window window.title = fileName ?? "Terebi" @@ -2756,6 +2758,7 @@ private struct PlayerContent: View { var body: some View { let titleControlsVisible = model.showsQueue || model.isQueueTransitioning || model.controlsVisible + let startScreen = model.fileName == nil && !model.isCompact && !model.compactWindow.isTransitioning HStack(spacing: 0) { videoContent if !model.isCompact && !model.compactWindow.isTransitioning && model.queueWidth > 0 { @@ -2766,8 +2769,10 @@ private struct PlayerContent: View { .accessibilityHidden(!model.showsQueue) } } - .frame(minWidth: model.isCompact || model.compactWindow.isTransitioning ? 160 : 400 + model.queueWidth, - minHeight: model.isCompact || model.compactWindow.isTransitioning ? model.compactContentMinimumHeight : 240) + .frame(minWidth: startScreen ? 640 : (model.isCompact || model.compactWindow.isTransitioning ? 160 : 400 + model.queueWidth), + maxWidth: startScreen ? 640 : .infinity, + minHeight: startScreen ? model.startContentHeight : (model.isCompact || model.compactWindow.isTransitioning ? model.compactContentMinimumHeight : 240), + maxHeight: startScreen ? model.startContentHeight : .infinity) .overlay(alignment: .topTrailing) { if !model.isCompact && !model.compactWindow.isTransitioning { titleControls @@ -3143,7 +3148,8 @@ struct TerebiApp: App { PlayerContent(model: model) .focusedSceneObject(model) } - .defaultSize(width: 900, height: 560) + .defaultSize(width: 640, height: 400) + .windowResizability(.contentSize) .windowStyle(.hiddenTitleBar) .commands { PlayerCommands() } }