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

View File

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