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)) - } }