1
0
mirror of https://github.com/Toxblh/MTMR.git synced 2026-01-10 17:08:39 +00:00

Implement triple tap

This commit is contained in:
Matteo Piccina 2020-08-01 19:29:58 +02:00
parent 3e707e9bca
commit 7db9931d3b
2 changed files with 46 additions and 17 deletions

View File

@ -12,7 +12,8 @@ class CustomButtonTouchBarItem: NSCustomTouchBarItem, NSGestureRecognizerDelegat
typealias TriggerClosure = (() -> Void)?
var actions: [Action.Trigger: TriggerClosure] = [:] {
didSet {
singleAndDoubleClick.isDoubleClickEnabled = actions[.doubleTap] != nil
multiClick.isDoubleClickEnabled = actions[.doubleTap] != nil
multiClick.isTripleClickEnabled = actions[.tripleTap] != nil
longClick.isEnabled = actions[.longTap] != nil
}
}
@ -20,7 +21,7 @@ class CustomButtonTouchBarItem: NSCustomTouchBarItem, NSGestureRecognizerDelegat
private var button: NSButton!
private var longClick: LongPressGestureRecognizer!
private var singleAndDoubleClick: DoubleClickGestureRecognizer!
private var multiClick: MultiClickGestureRecognizer!
init(identifier: NSTouchBarItem.Identifier, title: String) {
attributedTitle = title.defaultTouchbarAttributedString
@ -33,10 +34,16 @@ class CustomButtonTouchBarItem: NSCustomTouchBarItem, NSGestureRecognizerDelegat
longClick.allowedTouchTypes = .direct
longClick.delegate = self
singleAndDoubleClick = DoubleClickGestureRecognizer(target: self, action: #selector(handleGestureSingleTap), doubleAction: #selector(handleGestureDoubleTap))
singleAndDoubleClick.allowedTouchTypes = .direct
singleAndDoubleClick.delegate = self
singleAndDoubleClick.isDoubleClickEnabled = false
multiClick = MultiClickGestureRecognizer(
target: self,
action: #selector(handleGestureSingleTap),
doubleAction: #selector(handleGestureDoubleTap),
tripleAction: #selector(handleGestureTripleTap)
)
multiClick.allowedTouchTypes = .direct
multiClick.delegate = self
multiClick.isDoubleClickEnabled = false
multiClick.isTripleClickEnabled = false
reinstallButton()
button.attributedTitle = attributedTitle
@ -103,13 +110,13 @@ class CustomButtonTouchBarItem: NSCustomTouchBarItem, NSGestureRecognizerDelegat
view.addGestureRecognizer(longClick)
// view.addGestureRecognizer(singleClick)
view.addGestureRecognizer(singleAndDoubleClick)
view.addGestureRecognizer(multiClick)
finishViewConfiguration()
}
func gestureRecognizer(_ gestureRecognizer: NSGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: NSGestureRecognizer) -> Bool {
if gestureRecognizer == singleAndDoubleClick && otherGestureRecognizer == longClick
|| gestureRecognizer == longClick && otherGestureRecognizer == singleAndDoubleClick // need it
if gestureRecognizer == multiClick && otherGestureRecognizer == longClick
|| gestureRecognizer == longClick && otherGestureRecognizer == multiClick // need it
{
return false
}
@ -126,6 +133,11 @@ class CustomButtonTouchBarItem: NSCustomTouchBarItem, NSGestureRecognizerDelegat
doubleTap?()
}
@objc func handleGestureTripleTap() {
guard let tripleTap = self.actions[.tripleTap] else { return }
tripleTap?()
}
@objc func handleGestureLong(gr: NSPressGestureRecognizer) {
switch gr.state {
case .possible: // tiny hack because we're calling action manually
@ -181,13 +193,15 @@ class CustomButtonCell: NSButtonCell {
}
// Thanks to https://stackoverflow.com/a/49843893
final class DoubleClickGestureRecognizer: NSClickGestureRecognizer {
final class MultiClickGestureRecognizer: NSClickGestureRecognizer {
private let _action: Selector
private let _doubleAction: Selector
private let _tripleAction: Selector
private var _clickCount: Int = 0
public var isDoubleClickEnabled = true
public var isTripleClickEnabled = true
override var action: Selector? {
get {
@ -199,14 +213,15 @@ final class DoubleClickGestureRecognizer: NSClickGestureRecognizer {
}
}
required init(target: AnyObject, action: Selector, doubleAction: Selector) {
required init(target: AnyObject, action: Selector, doubleAction: Selector, tripleAction: Selector) {
_action = action
_doubleAction = doubleAction
_tripleAction = tripleAction
super.init(target: target, action: nil)
}
required init?(coder: NSCoder) {
fatalError("init(target:action:doubleAction) is only support atm")
fatalError("init(target:action:doubleAction:tripleAction) is only support atm")
}
override func touchesBegan(with event: NSEvent) {
@ -219,15 +234,25 @@ final class DoubleClickGestureRecognizer: NSClickGestureRecognizer {
super.touchesEnded(with: event)
_clickCount += 1
guard isDoubleClickEnabled else {
var delayThreshold: TimeInterval // fine tune this as needed
guard isDoubleClickEnabled || isTripleClickEnabled else {
_ = target?.perform(_action)
return
}
let delayThreshold = 0.20 // fine tune this as needed
perform(#selector(_resetAndPerformActionIfNecessary), with: nil, afterDelay: delayThreshold)
if _clickCount == 2 {
_ = target?.perform(_doubleAction)
if (isTripleClickEnabled) {
delayThreshold = 0.4
perform(#selector(_resetAndPerformActionIfNecessary), with: nil, afterDelay: delayThreshold)
if _clickCount == 3 {
_ = target?.perform(_tripleAction)
}
} else {
delayThreshold = 0.3
perform(#selector(_resetAndPerformActionIfNecessary), with: nil, afterDelay: delayThreshold)
if _clickCount == 2 {
_ = target?.perform(_doubleAction)
}
}
}
@ -235,6 +260,9 @@ final class DoubleClickGestureRecognizer: NSClickGestureRecognizer {
if _clickCount == 1 {
_ = target?.perform(_action)
}
if isTripleClickEnabled && _clickCount == 2 {
_ = target?.perform(_doubleAction)
}
_clickCount = 0
}
}

View File

@ -456,6 +456,7 @@ struct Action: Decodable {
enum Trigger: String, Decodable {
case singleTap
case doubleTap
case tripleTap
case longTap
}