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:
parent
3e707e9bca
commit
7db9931d3b
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user