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