mirror of
https://github.com/Toxblh/MTMR.git
synced 2026-01-10 00:58:37 +00:00
* Updated README Added explanation for missing parameters (background, title and image) * Implemented changable icons for AppleScriptTouchBarItem AppleScriptTouchBarItem now allow to specify any number of icons which can be changed from the script. You cannot change icon from touch event. To change icon, you need to return array from your script with 2 values - title and icn name. More info in readme * Fixed #312 Fixed bug that margin is lost on all elements Co-authored-by: Fedor Zaitsev <lobster@Fedors-MacBook-Pro.local>
108 lines
4.3 KiB
Swift
108 lines
4.3 KiB
Swift
//
|
|
// BasicView.swift
|
|
// MTMR
|
|
//
|
|
// Created by Fedor Zaitsev on 3/29/20.
|
|
// Copyright © 2020 Anton Palgunov. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
|
|
class BasicView: NSCustomTouchBarItem, NSGestureRecognizerDelegate {
|
|
var twofingers: NSPanGestureRecognizer!
|
|
var threefingers: NSPanGestureRecognizer!
|
|
var fourfingers: NSPanGestureRecognizer!
|
|
var swipeItems: [SwipeItem] = []
|
|
var prevPositions: [Int: CGFloat] = [2:0, 3:0, 4:0]
|
|
|
|
// legacy gesture positions
|
|
// by legacy I mean gestures to increse/decrease volume/brigtness which can be checked from app menu
|
|
var legacyPrevPositions: [Int: CGFloat] = [2:0, 3:0, 4:0]
|
|
var legacyGesturesEnabled = false
|
|
|
|
init(identifier: NSTouchBarItem.Identifier, items: [NSTouchBarItem], swipeItems: [SwipeItem]) {
|
|
super.init(identifier: identifier)
|
|
self.swipeItems = swipeItems
|
|
let views = items.compactMap { $0.view }
|
|
let stackView = NSStackView(views: views)
|
|
stackView.spacing = 8
|
|
stackView.orientation = .horizontal
|
|
view = stackView
|
|
|
|
twofingers = NSPanGestureRecognizer(target: self, action: #selector(twofingersHandler(_:)))
|
|
twofingers.numberOfTouchesRequired = 2
|
|
twofingers.allowedTouchTypes = .direct
|
|
view.addGestureRecognizer(twofingers)
|
|
|
|
threefingers = NSPanGestureRecognizer(target: self, action: #selector(threefingersHandler(_:)))
|
|
threefingers.numberOfTouchesRequired = 3
|
|
threefingers.allowedTouchTypes = .direct
|
|
view.addGestureRecognizer(threefingers)
|
|
|
|
fourfingers = NSPanGestureRecognizer(target: self, action: #selector(fourfingersHandler(_:)))
|
|
fourfingers.numberOfTouchesRequired = 4
|
|
fourfingers.allowedTouchTypes = .direct
|
|
view.addGestureRecognizer(fourfingers)
|
|
}
|
|
|
|
required init?(coder _: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
func gestureHandler(position: CGFloat, fingers: Int, state: NSGestureRecognizer.State) {
|
|
switch state {
|
|
case .began:
|
|
prevPositions[fingers] = position
|
|
legacyPrevPositions[fingers] = position
|
|
case .changed:
|
|
if self.legacyGesturesEnabled {
|
|
if fingers == 2 {
|
|
let prevPos = legacyPrevPositions[fingers]!
|
|
if ((position - prevPos) > 10) || ((prevPos - position) > 10) {
|
|
if position > prevPos {
|
|
HIDPostAuxKey(NX_KEYTYPE_SOUND_UP)
|
|
} else if position < prevPos {
|
|
HIDPostAuxKey(NX_KEYTYPE_SOUND_DOWN)
|
|
}
|
|
legacyPrevPositions[fingers] = position
|
|
}
|
|
}
|
|
if fingers == 3 {
|
|
let prevPos = legacyPrevPositions[fingers]!
|
|
if ((position - prevPos) > 15) || ((prevPos - position) > 15) {
|
|
if position > prevPos {
|
|
GenericKeyPress(keyCode: CGKeyCode(144)).send()
|
|
} else if position < prevPos {
|
|
GenericKeyPress(keyCode: CGKeyCode(145)).send()
|
|
}
|
|
legacyPrevPositions[fingers] = position
|
|
}
|
|
}
|
|
}
|
|
case .ended:
|
|
print("gesture ended \(position - prevPositions[fingers]!) \(fingers)")
|
|
for item in swipeItems {
|
|
item.processEvent(offset: position - prevPositions[fingers]!, fingers: fingers)
|
|
}
|
|
default:
|
|
break
|
|
}
|
|
}
|
|
|
|
@objc func twofingersHandler(_ sender: NSGestureRecognizer?) {
|
|
let position = (sender?.location(in: sender?.view).x)!
|
|
self.gestureHandler(position: position, fingers: 2, state: sender!.state)
|
|
}
|
|
|
|
@objc func threefingersHandler(_ sender: NSGestureRecognizer?) {
|
|
let position = (sender?.location(in: sender?.view).x)!
|
|
self.gestureHandler(position: position, fingers: 3, state: sender!.state)
|
|
}
|
|
|
|
@objc func fourfingersHandler(_ sender: NSGestureRecognizer?) {
|
|
let position = (sender?.location(in: sender?.view).x)!
|
|
self.gestureHandler(position: position, fingers: 4, state: sender!.state)
|
|
}
|
|
}
|