Skip to content

Commit

Permalink
support for global settings. haptic feedback as the first one
Browse files Browse the repository at this point in the history
resolves #185
  • Loading branch information
ReDetection committed Oct 12, 2019
1 parent f378de6 commit e44ff00
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 12 deletions.
6 changes: 3 additions & 3 deletions MTMR/CustomButtonTouchBarItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -176,12 +176,12 @@ class CustomButtonCell: NSButtonCell {

class HapticClickGestureRecognizer: NSClickGestureRecognizer {
override func touchesBegan(with event: NSEvent) {
HapticFeedback.shared.tap(strong: 2)
HapticFeedback.shared?.tap(strong: 2)
super.touchesBegan(with: event)
}

override func touchesEnded(with event: NSEvent) {
HapticFeedback.shared.tap(strong: 1)
HapticFeedback.shared?.tap(strong: 1)
super.touchesEnded(with: event)
}
}
Expand Down Expand Up @@ -226,7 +226,7 @@ class LongPressGestureRecognizer: NSPressGestureRecognizer {
@objc private func onTimer() {
if let target = self.target, let action = self.action {
target.performSelector(onMainThread: action, with: self, waitUntilDone: false)
HapticFeedback.shared.tap(strong: 6)
HapticFeedback.shared?.tap(strong: 6)
}
}

Expand Down
2 changes: 1 addition & 1 deletion MTMR/HapticFeedback.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import IOKit

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
// To find deviceID, you will need IORegistryExplorer app from Additional Tools for Xcode dmg
Expand Down
20 changes: 18 additions & 2 deletions MTMR/ItemsParsing.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,27 @@ import AppKit
import Foundation

extension Data {
func barItemDefinitions() -> [BarItemDefinition]? {
return try? JSONDecoder().decode([BarItemDefinition].self, from: utf8string!.stripComments().data(using: .utf8)!)
func mtmrPreset() -> Preset? {
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 {
let type: ItemType
let action: ActionType
Expand Down
14 changes: 12 additions & 2 deletions MTMR/TouchBarController.swift
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,18 @@ class TouchBarController: NSObject, NSTouchBarDelegate {

func reloadPreset(path: String) {
lastPresetPath = path
let items = path.fileData?.barItemDefinitions() ?? [BarItemDefinition(type: .staticButton(title: "bad preset"), action: .none, longAction: .none, additionalParameters: [:])]
createAndUpdatePreset(newJsonItems: items)
let preset = path.fileData?.mtmrPreset() ?? fallbackPreset()
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]) {
Expand Down
8 changes: 4 additions & 4 deletions MTMR/Widgets/AppScrubberTouchBarItem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,12 @@ class AppScrubberTouchBarItem: NSCustomTouchBarItem, NSScrubberDelegate, NSScrub
ticks += 1

if ticks == minTicks {
HapticFeedback.shared.tap(strong: 2)
HapticFeedback.shared?.tap(strong: 2)
}

if ticks > maxTicks {
stopTimer()
HapticFeedback.shared.tap(strong: 6)
HapticFeedback.shared?.tap(strong: 6)
}
}

Expand Down Expand Up @@ -182,7 +182,7 @@ class AppScrubberTouchBarItem: NSCustomTouchBarItem, NSScrubberDelegate, NSScrub
NSWorkspace.shared.openFile(bundleIdentifier!.replacingOccurrences(of: "file://", with: ""))
} else {
NSWorkspace.shared.launchApplication(withBundleIdentifier: bundleIdentifier!, options: [.default], additionalEventParamDescriptor: nil, launchIdentifier: nil)
HapticFeedback.shared.tap(strong: 6)
HapticFeedback.shared?.tap(strong: 6)
}
updateRunningApplication()

Expand All @@ -201,7 +201,7 @@ class AppScrubberTouchBarItem: NSCustomTouchBarItem, NSScrubberDelegate, NSScrub
}
}
} else {
HapticFeedback.shared.tap(strong: 6)
HapticFeedback.shared?.tap(strong: 6)
if let index = self.persistentAppIdentifiers.index(of: bundleIdentifier!) {
persistentAppIdentifiers.remove(at: index)
} else {
Expand Down
28 changes: 28 additions & 0 deletions MTMRTests/ParseConfigTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -64,4 +64,32 @@ class ParseConfig: XCTestCase {
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))
}
}

0 comments on commit e44ff00

Please sign in to comment.