Files
2022-03-07 15:19:02 +03:00

173 lines
5.6 KiB
Swift

//
// PreferencesHeaderController.swift
// PrivadoVPN
//
// Created by Murad Shabanov on 08.02.2022.
// Copyright © 2022 Privado LLC. All rights reserved.
//
import Foundation
enum PrefHeaderLeftIcon {
case none
case back
}
protocol PreferencesHeaderControllerOutput: AnyObject {
func leftIconAction()
var title: String { get }
}
final class PreferencesHeaderController: NSViewController {
private enum Constants {
enum Geometry {
static let leading: CGFloat = 100
static let trailing: CGFloat = 10
static let bellWidthMultiplyer: CGFloat = 0.5
static let bellHeightMultiplyer: CGFloat = 0.8
}
enum Color {
static let background = NSColor(calibratedRed: 25.0 / 255, green: 33.0 / 255, blue: 70.0 / 255, alpha: 1.0)
}
enum Images {
static let navigationBack = "navigation.left"
}
}
private let output: PreferencesHeaderControllerOutput?
private let icon: PrefHeaderLeftIcon
// UI
private var imageBackView: View?
private var leftImageView: ImageView?
private var titleText: NSTextField?
// MARK: - Init
init(icon: PrefHeaderLeftIcon, output: PreferencesHeaderControllerOutput?) {
self.output = output
self.icon = icon
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Lyfecycle
override func loadView() {
let view = TopView(frame: .zero)
view.autoresizesSubviews = true
view.translatesAutoresizingMaskIntoConstraints = false
view.wantsLayer = true
view.viewBackgroundColor = NSColor.clear
self.view = view
}
override func viewDidLoad() {
super.viewDidLoad()
self.configureUI()
self.activateLayoutUI()
}
override func viewDidAppear() {
super.viewDidAppear()
if let superview = self.view.superview {
NSLayoutConstraint.activate([
self.view.topAnchor.constraint(equalTo: superview.topAnchor),
self.view.leadingAnchor.constraint(equalTo: superview.leadingAnchor),
self.view.trailingAnchor.constraint(equalTo: superview.trailingAnchor),
self.view.bottomAnchor.constraint(equalTo: superview.bottomAnchor)
])
}
}
// MARK: - UI
private func configureUI() {
if self.icon == .back {
if let image = NSImage(named: Constants.Images.navigationBack) {
let leftImageView = ImageView(image: image)
leftImageView.useHandCursor = true
leftImageView.increaseHitArea = true
leftImageView.target = self
leftImageView.action = #selector(self.onBackAction)
let backgroundView = ImageBackgroundView(frame: .zero)
backgroundView.translatesAutoresizingMaskIntoConstraints = false
backgroundView.isHoverEnabled = true
backgroundView.hoverColor = NSColor(red: 29, green: 36, blue: 89)
self.view.addSubview(backgroundView)
backgroundView.addSubview(leftImageView)
self.view.addSubview(leftImageView)
self.leftImageView = leftImageView
self.imageBackView = backgroundView
}
}
if let output = self.output {
let titleText = NSTextField(frame: .zero)
titleText.translatesAutoresizingMaskIntoConstraints = false
titleText.stringValue = output.title
titleText.backgroundColor = .clear
titleText.isBezeled = false
titleText.isEditable = false
titleText.sizeToFit()
titleText.textColor = .white
titleText.font = NSFont(name: PrivadoConstants.Font.semiBold, size: 13.5)
self.view.addSubview(titleText)
self.titleText = titleText
}
}
private func activateLayoutUI() {
var constraints = [NSLayoutConstraint]()
if let leftImageView = self.leftImageView, let imageBackView = self.imageBackView {
constraints.append(contentsOf: [
imageBackView.widthAnchor.constraint(equalToConstant: 25),
imageBackView.heightAnchor.constraint(equalToConstant: 25),
imageBackView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor, constant: Constants.Geometry.leading),
imageBackView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
leftImageView.centerXAnchor.constraint(equalTo: imageBackView.centerXAnchor),
leftImageView.centerYAnchor.constraint(equalTo: imageBackView.centerYAnchor),
leftImageView.heightAnchor.constraint(equalToConstant: 12),
leftImageView.widthAnchor.constraint(equalToConstant: 7)
])
}
if let titleText = self.titleText {
constraints.append(contentsOf: [
titleText.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
titleText.centerXAnchor.constraint(equalTo: self.view.centerXAnchor)
])
}
NSLayoutConstraint.activate(constraints)
}
// MARK: - On Handlers
@objc
private func onBackAction() {
self.output?.leftIconAction()
}
}