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