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

support for global settings. haptic feedback as the first one

resolves #185
This commit is contained in:
Serg 2019-10-12 12:54:48 +07:00
parent f378de675e
commit e44ff00f3b
6 changed files with 66 additions and 12 deletions

View File

@ -176,12 +176,12 @@ class CustomButtonCell: NSButtonCell {
class HapticClickGestureRecognizer: NSClickGestureRecognizer { class HapticClickGestureRecognizer: NSClickGestureRecognizer {
override func touchesBegan(with event: NSEvent) { override func touchesBegan(with event: NSEvent) {
HapticFeedback.shared.tap(strong: 2) HapticFeedback.shared?.tap(strong: 2)
super.touchesBegan(with: event) super.touchesBegan(with: event)
} }
override func touchesEnded(with event: NSEvent) { override func touchesEnded(with event: NSEvent) {
HapticFeedback.shared.tap(strong: 1) HapticFeedback.shared?.tap(strong: 1)
super.touchesEnded(with: event) super.touchesEnded(with: event)
} }
} }
@ -226,7 +226,7 @@ class LongPressGestureRecognizer: NSPressGestureRecognizer {
@objc private func onTimer() { @objc private func onTimer() {
if let target = self.target, let action = self.action { if let target = self.target, let action = self.action {
target.performSelector(onMainThread: action, with: self, waitUntilDone: false) target.performSelector(onMainThread: action, with: self, waitUntilDone: false)
HapticFeedback.shared.tap(strong: 6) HapticFeedback.shared?.tap(strong: 6)
} }
} }

View File

@ -9,7 +9,7 @@
import IOKit import IOKit
class HapticFeedback { class HapticFeedback {
static let shared = HapticFeedback() static var shared: HapticFeedback?
// Here we have list of possible IDs for Haptic Generator Device. They are not constant // Here we have list of possible IDs for Haptic Generator Device. They are not constant
// To find deviceID, you will need IORegistryExplorer app from Additional Tools for Xcode dmg // To find deviceID, you will need IORegistryExplorer app from Additional Tools for Xcode dmg

View File

@ -2,9 +2,25 @@ import AppKit
import Foundation import Foundation
extension Data { extension Data {
func barItemDefinitions() -> [BarItemDefinition]? { func mtmrPreset() -> Preset? {
return try? JSONDecoder().decode([BarItemDefinition].self, from: utf8string!.stripComments().data(using: .utf8)!) let data = self.utf8string!.stripComments().data(using: .utf8)!
guard let preset = try? JSONDecoder().decode(Preset.self, from: data) else {
if let oldFormat = try? JSONDecoder().decode([BarItemDefinition].self, from: data) {
return Preset(settings: nil, barItems: oldFormat)
} }
return nil
}
return preset
}
}
struct Preset: Decodable {
let settings: GlobalSettings?
let barItems: [BarItemDefinition]
}
struct GlobalSettings: Decodable {
let hapticFeedback: Bool?
} }
struct BarItemDefinition: Decodable { struct BarItemDefinition: Decodable {

View File

@ -172,8 +172,18 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
func reloadPreset(path: String) { func reloadPreset(path: String) {
lastPresetPath = path lastPresetPath = path
let items = path.fileData?.barItemDefinitions() ?? [BarItemDefinition(type: .staticButton(title: "bad preset"), action: .none, longAction: .none, additionalParameters: [:])] let preset = path.fileData?.mtmrPreset() ?? fallbackPreset()
createAndUpdatePreset(newJsonItems: items) applySettings(preset.settings ?? GlobalSettings(hapticFeedback: true))
createAndUpdatePreset(newJsonItems: preset.barItems)
}
func fallbackPreset() -> Preset {
let items = [BarItemDefinition(type: .staticButton(title: "bad preset"), action: .none, longAction: .none, additionalParameters: [:])]
return Preset(settings: nil, barItems: items)
}
func applySettings(_ settings: GlobalSettings) {
HapticFeedback.shared = settings.hapticFeedback ?? true ? HapticFeedback() : nil
} }
func loadItemDefinitions(jsonItems: [BarItemDefinition]) { func loadItemDefinitions(jsonItems: [BarItemDefinition]) {

View File

@ -146,12 +146,12 @@ class AppScrubberTouchBarItem: NSCustomTouchBarItem, NSScrubberDelegate, NSScrub
ticks += 1 ticks += 1
if ticks == minTicks { if ticks == minTicks {
HapticFeedback.shared.tap(strong: 2) HapticFeedback.shared?.tap(strong: 2)
} }
if ticks > maxTicks { if ticks > maxTicks {
stopTimer() stopTimer()
HapticFeedback.shared.tap(strong: 6) HapticFeedback.shared?.tap(strong: 6)
} }
} }
@ -182,7 +182,7 @@ class AppScrubberTouchBarItem: NSCustomTouchBarItem, NSScrubberDelegate, NSScrub
NSWorkspace.shared.openFile(bundleIdentifier!.replacingOccurrences(of: "file://", with: "")) NSWorkspace.shared.openFile(bundleIdentifier!.replacingOccurrences(of: "file://", with: ""))
} else { } else {
NSWorkspace.shared.launchApplication(withBundleIdentifier: bundleIdentifier!, options: [.default], additionalEventParamDescriptor: nil, launchIdentifier: nil) NSWorkspace.shared.launchApplication(withBundleIdentifier: bundleIdentifier!, options: [.default], additionalEventParamDescriptor: nil, launchIdentifier: nil)
HapticFeedback.shared.tap(strong: 6) HapticFeedback.shared?.tap(strong: 6)
} }
updateRunningApplication() updateRunningApplication()
@ -201,7 +201,7 @@ class AppScrubberTouchBarItem: NSCustomTouchBarItem, NSScrubberDelegate, NSScrub
} }
} }
} else { } else {
HapticFeedback.shared.tap(strong: 6) HapticFeedback.shared?.tap(strong: 6)
if let index = self.persistentAppIdentifiers.index(of: bundleIdentifier!) { if let index = self.persistentAppIdentifiers.index(of: bundleIdentifier!) {
persistentAppIdentifiers.remove(at: index) persistentAppIdentifiers.remove(at: index)
} else { } else {

View File

@ -64,4 +64,32 @@ class ParseConfig: XCTestCase {
return return
} }
} }
func testParsesOldFormat() {
let fixture = """
[ { "type": "escape" } ]
""".data(using: .utf8)!
let result = fixture.mtmrPreset()
XCTAssertEqual(result?.barItems.count, 1)
guard case .staticButton("esc")? = result?.barItems.first?.type else {
XCTFail()
return
}
}
func testParsesHapticFeedbackSettings() {
let fixture = """
{
"settings": { "hapticFeedback": false },
"barItems": [ { "type": "escape" } ]
}
""".data(using: .utf8)!
let result = fixture.mtmrPreset()
XCTAssertEqual(result?.barItems.count, 1)
guard case .staticButton("esc")? = result?.barItems.first?.type else {
XCTFail()
return
}
XCTAssertEqual(result?.settings?.hapticFeedback, .some(false))
}
} }