// // ApplicationWindowController.swift // PrivadoVPN // // Created by Murad Shabanov on 23.09.2021. // Copyright © 2021 Privado LLC. All rights reserved. // import Foundation protocol AppWindow { var stackManager: JSViewControllersStackManager? { get } var controller: NSViewController? { get set } } extension NSWindow.FrameAutosaveName { static let applicationWindow: NSWindow.FrameAutosaveName = "io.privado.application.FrameAutosaveName" } class ApplicationWindowController: NSWindowController, AppWindow { // MARK: - AppWindow var controller: NSViewController? private(set) var stackManager: JSViewControllersStackManager? func show(sender: Any, relativeTo origin: CGPoint?) { if let window = self.window, let origin = origin, !window.isKeyWindow { self.restoreWindowPosition(window: window, relativeTo: origin) } self.showWindow(sender) } func save() { UserSettings.shared.isDocked = false } // MARK: - Initializers convenience init(size: NSSize) { let window = ApplicationWindow(contentRect: NSRect(origin: .zero, size: size), styleMask: [ .titled, .closable, .miniaturizable], backing: .buffered, defer: true) self.init(window: window) let applicationView = ApplicationView(frame: NSRect(origin: .zero, size: size)) applicationView.wantsLayer = true applicationView.layer?.cornerRadius = 5 let controller = JSNavigationController(rootViewController: EmptyViewController(), viewDelegate: applicationView) controller.preferredContentSize = size controller.view.autoresizesSubviews = true controller.view.addSubview(applicationView) NSLayoutConstraint.activate([ applicationView.widthAnchor.constraint(equalToConstant: PrivadoConstants.Window.sizeWidth), applicationView.heightAnchor.constraint(equalToConstant: PrivadoConstants.Window.sizeHeight) ]) window.titlebarAppearsTransparent = true window.styleMask.insert(.fullSizeContentView) window.contentViewController = controller window.isOpaque = true window.backgroundColor = .clear window.makeKey() window.becomeMain() self.controller = controller self.stackManager = controller } convenience init(size: NSSize, controller: NSViewController) { let window = ApplicationWindow(contentRect: NSRect(origin: .zero, size: size), styleMask: [.titled, .closable, .miniaturizable], backing: .buffered, defer: true) controller.view.wantsLayer = true controller.view.layer?.cornerRadius = 5 self.init(window: window) self.controller = controller self.stackManager = controller as? JSViewControllersStackManager window.contentViewController = controller window.titlebarAppearsTransparent = true window.styleMask.insert(.fullSizeContentView) window.makeKey() window.becomeMain() } override init(window: NSWindow?) { super.init(window: window) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } // MARK: - Private private func restoreWindowPosition(window: NSWindow, relativeTo origin: CGPoint) { let frame = window.frame window.setFrameTopLeftPoint(NSPoint(x: origin.x - frame.size.width / 2, y: origin.y - 30)) // window.setFrameUsingName(.applicationWindow) // window.setFrameAutosaveName(.applicationWindow) } }