// // SearchPanelView.swift // PrivadoVPN // // Created by Zhandos Bolatbekov on 25.05.2021. // Copyright © 2021 Privado LLC. All rights reserved. // protocol SearchPanelViewInput: AnyObject {} protocol SearchPanelViewOutput: AnyObject { func viewIsReady() func search(query: String) func searchCancel() } final class SearchPanelView: NSView { private enum Constants { enum Color { static let background = NSColor(red: 45, green: 51, blue: 82) static let searchText = NSColor.white } enum Geometry { static let height: CGFloat = 40 static let leadingButtonLeft: CGFloat = 26.7 static let trailingButtonRight: CGFloat = 59 static let searchButtonLeft: CGFloat = 23.3 static let searchFieldIndentX: CGFloat = 19 static let searchFieldIndentY: CGFloat = 4 } enum LocalizedString { static let sortByName = "serverlist.panelSort.sortByName" static let sortByLatency = "serverlist.panelSort.sortByLatency" } enum Image { static let buttonSearch = "search" } } enum ButtonTag { static let nameButton: Int = 1 << 10 static let latencyButton: Int = 1 << 11 } private let output: SearchPanelViewOutput private var searchField: BackgroundTextField? // MARK: - Init init(output: SearchPanelViewOutput) { self.output = output super.init(frame: .zero) self.translatesAutoresizingMaskIntoConstraints = false self.configureUI() } required init?(coder: NSCoder) { nil } // MARK: - Lifecycle override func viewDidMoveToSuperview() { super.viewDidMoveToSuperview() if self.superview.isExist { self.output.viewIsReady() } } override func viewDidUnhide() { super.viewDidUnhide() self.window?.makeFirstResponder(self.searchField?.textField) } override func viewDidHide() { super.viewDidHide() self.searchField?.textField.stringValue = "" } // MARK: - Private private func configureUI() { let field = self.initializeSearchField() self.addSubview(field) self.searchField = field NSLayoutConstraint.activate([ field.topAnchor.constraint(equalTo: self.topAnchor), field.bottomAnchor.constraint(equalTo: self.bottomAnchor), field.leadingAnchor.constraint(equalTo: self.leadingAnchor), field.trailingAnchor.constraint(equalTo: self.trailingAnchor) ]) } func initializeSearchField() -> BackgroundTextField { let searchField = BackgroundTextField(frame: .zero, textFieldType: .login, iconSize: CGSize(width: 13, height: 12)) searchField.placeHolderFont = NSFont(name: PrivadoConstants.Font.medium, size: 12) searchField.coloredPlaceHolder = NSLocalizedString("serverlist.searchPanel.placeholder", comment: "") searchField.backgroundColor = NSColor(red: 64, green: 72, blue: 172) searchField.highlightBackgroundColor = NSColor(red: 64, green: 72, blue: 172) searchField.backgroundRadius = 6 searchField.textField.font = NSFont(name: PrivadoConstants.Font.medium, size: 12) searchField.textFieldYTopOffset = 10 searchField.textFieldYBottomOffset = 0 searchField.textFieldTrailingOffset = 30 searchField.textField.textColor = .white if let image = NSImage(named: "panel.search.icon"), let rightImage = NSImage(named: "panel.search.close") { searchField.iconImage = image searchField.rightImage = rightImage } searchField.strokeWidth = 1.5 searchField.strokeColor = NSColor(red: 143, green: 148, blue: 220) searchField.rightIconSize = CGSize(width: 12, height: 12) searchField.rightImageTappedClosure = { self.output.searchCancel() } searchField.textDidChangeClosure = { text in self.searchFieldQueryChange(text: text) } searchField.wantsLayer = true return searchField } } extension SearchPanelView: SearchPanelViewInput {} // MARK: - SearchFieldOutput extension SearchPanelView: SearchFieldOutput { func searchFieldQueryChange(text: String) { self.output.search(query: text) } func searchFieldCancel() {} }