// // SearchField.swift // PrivadoVPN // // Created by Zhandos Bolatbekov on 31.05.2021. // Copyright © 2021 Privado LLC. All rights reserved. // import Foundation protocol SearchFieldOutput: AnyObject { func searchFieldQueryChange(text: String) func searchFieldCancel() } final class SearchField: NSSearchField { // swiftlint:disable nesting private enum Constants { enum Color { static let queryText = NSColor(red: 124, green: 134, blue: 186) static let background = NSColor(rgb: 0x272d4e) static let cancelButtonTint = NSColor(rgb: 0x7a86be) } enum Font { enum Name { static let query = PrivadoConstants.Font.regular } enum Size { static let query: CGFloat = 12.0 } } enum Image { static let search = "search" static let cancel = "search_cancel" } enum Geometry { static let cancelButtonSize = CGSize(width: 12, height: 12) static let cancelButtonRight: CGFloat = 7.5 static let searchIconSize = CGSize(width: 16, height: 16) static let cornerRadius: CGFloat = 5 } } // swiftlint:enable nesting private weak var output: SearchFieldOutput? // MARK: - Init init(output: SearchFieldOutput?) { self.output = output super.init(frame: .zero) self.configureUI() } required init?(coder: NSCoder) { nil } // MARK: - Private private func configureUI() { self.translatesAutoresizingMaskIntoConstraints = false self.textColor = Constants.Color.queryText self.sendsSearchStringImmediately = false self.sendsWholeSearchString = false self.usesSingleLineMode = false self.action = #selector(self.onQueryChange(sender:)) self.font = NSFont(name: Constants.Font.Name.query, size: Constants.Font.Size.query) self.focusRingType = .none // self.isBordered = false // creates bug (after tap cancel) self.wantsLayer = true self.layer?.cornerRadius = Constants.Geometry.cornerRadius self.layer?.backgroundColor = Constants.Color.background.cgColor } private func createCancelButton() -> NSButton { let button = NSButton() button.translatesAutoresizingMaskIntoConstraints = false button.isBordered = false button.wantsLayer = true button.layer?.backgroundColor = .clear button.image = NSImage(imageLiteralResourceName: Constants.Image.cancel) .imageWithTintColor(tintColor: Constants.Color.cancelButtonTint) .resize(to: Constants.Geometry.cancelButtonSize) button.action = #selector(self.onCancelTap) button.target = self return button } @objc private func onQueryChange(sender: NSSearchField) { self.output?.searchFieldQueryChange(text: sender.stringValue) } @objc private func onCancelTap() { self.output?.searchFieldCancel() } }