124 lines
4.0 KiB
Swift
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)
|
|
}
|
|
}
|