Files

145 lines
4.5 KiB
Swift

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