145 lines
4.5 KiB
Swift
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() {}
|
|
}
|