.../Source/App/Services/HotKeyService.swift
Line | Count | Source (jump to first uncovered line) |
1 | | // |
2 | | // HotKeyService.swift |
3 | | // CutBox |
4 | | // |
5 | | // Created by Jason Milkins on 3/4/18. |
6 | | // Copyright © 2018-2023 ocodo. All rights reserved. |
7 | | // |
8 | | |
9 | | import Magnet |
10 | | import RxSwift |
11 | | |
12 | | enum HotKeyEvents { |
13 | | case search |
14 | | } |
15 | | |
16 | | class CutBoxHotkeyProvider: NSObject { |
17 | | var testing: Bool = false |
18 | | var createWasCalled: Bool = false |
19 | | |
20 | | func create(identifier: String, |
21 | | keyCombo: KeyCombo, |
22 | | target: AnyObject, |
23 | | action: Selector |
24 | 3 | ) -> HotKey? { |
25 | 3 | self.createWasCalled = true |
26 | 3 | guard !self.testing else { return nil } |
27 | 1 | return HotKey( |
28 | 1 | identifier: identifier, |
29 | 1 | keyCombo: keyCombo, |
30 | 1 | target: target, |
31 | 1 | action: action |
32 | 1 | ) |
33 | 3 | } |
34 | | } |
35 | | |
36 | | class HotKeyService: NSObject { |
37 | | static let shared = HotKeyService(hotkeyProvider: CutBoxHotkeyProvider()) |
38 | | var hotkeyProvider: CutBoxHotkeyProvider |
39 | 26 | var searchKeyCombo = PublishSubject<KeyCombo>() |
40 | 26 | var events = PublishSubject<HotKeyEvents>() |
41 | | |
42 | 26 | private let disposeBag = DisposeBag() |
43 | | |
44 | 26 | init(hotkeyProvider: CutBoxHotkeyProvider) { |
45 | 26 | self.hotkeyProvider = hotkeyProvider |
46 | 26 | } |
47 | | |
48 | 1 | func configure() { |
49 | 1 | self.searchKeyCombo |
50 | 1 | .distinctUntilChanged { $0 == $1 } |
51 | 1 | .subscribe(onNext: { |
52 | 1 | self.changeGlobalToggle(keyCombo: $0) |
53 | 1 | }) |
54 | 1 | .disposed(by: disposeBag) |
55 | 1 | |
56 | 1 | self.resetDefaultGlobalToggle() |
57 | 1 | } |
58 | | |
59 | 2 | func resetDefaultGlobalToggle() { |
60 | 2 | if let savedKeyCombo = KeyCombo.loadUserDefaults(identifier: Constants.cutBoxToggleKeyCombo) { |
61 | 0 | self.searchKeyCombo |
62 | 0 | .onNext(savedKeyCombo) |
63 | 2 | } else { |
64 | 2 | self.searchKeyCombo |
65 | 2 | .onNext(Constants.defaultCutBoxToggleKeyCombo) |
66 | 2 | } |
67 | 2 | } |
68 | | |
69 | 1 | @objc func search(_ sender: Any) { |
70 | 1 | self.events.onNext(.search) |
71 | 1 | } |
72 | | |
73 | 1 | fileprivate func changeGlobalToggle(keyCombo: KeyCombo) { |
74 | 1 | if let hotKey = hotkeyProvider.create( |
75 | 1 | identifier: Constants.cutBoxToggleKeyCombo, |
76 | 1 | keyCombo: keyCombo, |
77 | 1 | target: self, |
78 | 1 | action: #selector(search(_:)) |
79 | 1 | ) { |
80 | 0 | hotKey.register() |
81 | 0 | keyCombo.saveUserDefaults(identifier: Constants.cutBoxToggleKeyCombo) |
82 | 1 | } |
83 | 1 | } |
84 | | } |