Files
2021-08-27 08:34:50 +00:00

97 lines
2.7 KiB
Swift

//
// AdvancedTextField.swift
// PrivadoVPN
//
// Created by Juraldinio on 8/16/21.
// Copyright © 2021 Privado LLC. All rights reserved.
//
import Foundation
import AppKit
protocol AdvancedTextFieldDelegate: AnyObject {
func advancedTextFieldClick(on target: AdvancedTextField)
func advancedTextFieldHover(on target: AdvancedTextField, isHover: Bool)
}
final class AdvancedTextField: NSTextField {
weak var advancedDelegate: AdvancedTextFieldDelegate?
var useHandCursor = false {
didSet {
self.window?.invalidateCursorRects(for: self)
}
}
override var frame: NSRect {
didSet {
self.setupTrackingArea(enable: true)
}
}
private var trackingArea: NSTrackingArea?
// MARK: - Initializers
override init(frame frameRect: NSRect) {
super.init(frame: frameRect)
self.setup()
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// MARK: - Private
private func setup() {
self.translatesAutoresizingMaskIntoConstraints = false
self.isBezeled = false
self.drawsBackground = false
// self.backgroundColor = .clear
self.isEditable = false
self.isSelectable = false
self.focusRingType = .none
self.usesSingleLineMode = false
}
private func setupTrackingArea(enable: Bool) {
if let trackingArea = self.trackingArea {
self.removeTrackingArea(trackingArea)
}
guard enable else { return }
let area = NSTrackingArea.init(rect: self.bounds,
options: [NSTrackingArea.Options.mouseEnteredAndExited, NSTrackingArea.Options.activeAlways],
owner: self,
userInfo: nil)
self.trackingArea = area
self.addTrackingArea(area)
}
/// Always display a pointing-hand cursor
override func resetCursorRects() {
super.resetCursorRects()
guard self.useHandCursor else { return }
self.addCursorRect(self.bounds, cursor: NSCursor.pointingHand)
}
override func mouseDown(with event: NSEvent) {
guard self.useHandCursor else { return }
self.advancedDelegate?.advancedTextFieldClick(on: self)
}
override func mouseEntered(with event: NSEvent) {
super.mouseEntered(with: event)
self.advancedDelegate?.advancedTextFieldHover(on: self, isHover: true)
}
override func mouseExited(with event: NSEvent) {
super.mouseExited(with: event)
self.advancedDelegate?.advancedTextFieldHover(on: self, isHover: false)
}
}