diff --git a/MTMR/AppDelegate.swift b/MTMR/AppDelegate.swift
index d6adfe5..08932de 100644
--- a/MTMR/AppDelegate.swift
+++ b/MTMR/AppDelegate.swift
@@ -25,6 +25,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
AXIsProcessTrustedWithOptions([kAXTrustedCheckOptionPrompt.takeRetainedValue() as NSString: true] as NSDictionary)
TouchBarController.shared.setupControlStripPresence()
+ HapticFeedbackUpdate()
if let button = statusItem.button {
button.image = #imageLiteral(resourceName: "StatusImage")
@@ -40,6 +41,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
func applicationWillTerminate(_: Notification) {}
+ func HapticFeedbackUpdate() {
+ HapticFeedback.shared = TouchBarController.shared.hapticFeedbackState ? HapticFeedback() : nil
+ }
+
@objc func updateIsBlockedApp() {
var blacklistAppIdentifiers: [String] = []
if let blackListed = UserDefaults.standard.stringArray(forKey: "com.toxblh.mtmr.blackListedApps") {
@@ -90,6 +95,12 @@ class AppDelegate: NSObject, NSApplicationDelegate {
}
}
+ @objc func toggleHapticFeedback(_: Any?) {
+ TouchBarController.shared.hapticFeedbackState = !TouchBarController.shared.hapticFeedbackState
+ HapticFeedbackUpdate()
+ createMenu()
+ }
+
@objc func openPreset(_: Any?) {
let dialog = NSOpenPanel()
@@ -124,6 +135,9 @@ class AppDelegate: NSObject, NSApplicationDelegate {
let hideControlStrip = NSMenuItem(title: "Hide Control Strip", action: #selector(toggleControlStrip(_:)), keyEquivalent: "T")
hideControlStrip.state = TouchBarController.shared.showControlStripState ? .off : .on
+ let hapticFeedback = NSMenuItem(title: "Haptic Feedback", action: #selector(toggleHapticFeedback(_:)), keyEquivalent: "H")
+ hapticFeedback.state = TouchBarController.shared.hapticFeedbackState ? .on : .off
+
let settingSeparator = NSMenuItem(title: "Settings", action: nil, keyEquivalent: "")
settingSeparator.isEnabled = false
@@ -133,6 +147,7 @@ class AppDelegate: NSObject, NSApplicationDelegate {
menu.addItem(NSMenuItem.separator())
menu.addItem(settingSeparator)
+ menu.addItem(hapticFeedback)
menu.addItem(hideControlStrip)
menu.addItem(toggleBlackList)
menu.addItem(startAtLogin)
diff --git a/MTMR/Info.plist b/MTMR/Info.plist
index 6a68148..2fef6e1 100644
--- a/MTMR/Info.plist
+++ b/MTMR/Info.plist
@@ -19,7 +19,7 @@
CFBundleShortVersionString
0.23.1
CFBundleVersion
- 278
+ 294
LSApplicationCategoryType
public.app-category.utilities
LSMinimumSystemVersion
diff --git a/MTMR/ItemsParsing.swift b/MTMR/ItemsParsing.swift
index d62ae98..ac888da 100644
--- a/MTMR/ItemsParsing.swift
+++ b/MTMR/ItemsParsing.swift
@@ -2,27 +2,11 @@ import AppKit
import Foundation
extension Data {
- 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
+ func barItemDefinitions() -> [BarItemDefinition]? {
+ return try? JSONDecoder().decode([BarItemDefinition].self, from: utf8string!.stripComments().data(using: .utf8)!)
}
}
-struct Preset: Decodable {
- let settings: GlobalSettings?
- let barItems: [BarItemDefinition]
-}
-
-struct GlobalSettings: Decodable {
- let hapticFeedback: Bool?
-}
-
struct BarItemDefinition: Decodable {
let type: ItemType
let action: ActionType
diff --git a/MTMR/TouchBarController.swift b/MTMR/TouchBarController.swift
index 118f0fd..7e38e39 100644
--- a/MTMR/TouchBarController.swift
+++ b/MTMR/TouchBarController.swift
@@ -89,6 +89,15 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
UserDefaults.standard.set(newValue, forKey: "com.toxblh.mtmr.settings.showControlStrip")
}
}
+
+ var hapticFeedbackState: Bool {
+ get {
+ return UserDefaults.standard.bool(forKey: "com.toxblh.mtmr.settings.hapticFeedback")
+ }
+ set {
+ UserDefaults.standard.set(newValue, forKey: "com.toxblh.mtmr.settings.hapticFeedback")
+ }
+ }
var blacklistAppIdentifiers: [String] = []
var frontmostApplicationIdentifier: String? {
@@ -172,18 +181,8 @@ class TouchBarController: NSObject, NSTouchBarDelegate {
func reloadPreset(path: String) {
lastPresetPath = path
- 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
+ let items = path.fileData?.barItemDefinitions() ?? [BarItemDefinition(type: .staticButton(title: "bad preset"), action: .none, longAction: .none, additionalParameters: [:])]
+ createAndUpdatePreset(newJsonItems: items)
}
func loadItemDefinitions(jsonItems: [BarItemDefinition]) {
diff --git a/MTMRTests/ParseConfigTests.swift b/MTMRTests/ParseConfigTests.swift
index 5e674f4..a3321cc 100644
--- a/MTMRTests/ParseConfigTests.swift
+++ b/MTMRTests/ParseConfigTests.swift
@@ -64,32 +64,4 @@ 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))
- }
}