97 lines
2.7 KiB
Swift
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)
|
|
}
|
|
}
|