34 lines
1.2 KiB
Swift
34 lines
1.2 KiB
Swift
import Foundation
|
|
|
|
/// Device-local content dimensions. A nil defaults store keeps tests and demos
|
|
/// in memory; scene restoration remains responsible for individual window frames.
|
|
@MainActor
|
|
final class MainWindowSizeStore {
|
|
private let defaults: UserDefaults?
|
|
private(set) var size: CGSize?
|
|
|
|
init(defaults: UserDefaults? = nil) {
|
|
self.defaults = defaults
|
|
if let values = defaults?.array(forKey: DesktopSettingsKey.mainWindowSize) as? [Double],
|
|
values.count == 2
|
|
{
|
|
let candidate = CGSize(width: values[0], height: values[1])
|
|
if Self.isValid(candidate) { size = candidate }
|
|
}
|
|
}
|
|
|
|
var defaultSize: CGSize {
|
|
size ?? CGSize(width: Metrics.Window.defaultWidth, height: Metrics.Window.defaultHeight)
|
|
}
|
|
|
|
func save(_ size: CGSize) {
|
|
guard Self.isValid(size), size != self.size else { return }
|
|
self.size = size
|
|
defaults?.set([Double(size.width), Double(size.height)], forKey: DesktopSettingsKey.mainWindowSize)
|
|
}
|
|
|
|
static func isValid(_ size: CGSize) -> Bool {
|
|
size.width.isFinite && size.height.isFinite && size.width > 0 && size.height > 0
|
|
}
|
|
}
|