Files

124 lines
4.0 KiB
Swift

//
// 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)
}
}