Skip to content

Commit 8dbb5eb

Browse files
committed
Add global hotkey to show/hide widget
1 parent f71eb47 commit 8dbb5eb

5 files changed

Lines changed: 38 additions & 11 deletions

File tree

Core/Package.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ let isProIncluded: Bool = {
3838
return false
3939
}
4040
do {
41-
if let content = String(
42-
data: try Data(contentsOf: confURL),
41+
if let content = try String(
42+
data: Data(contentsOf: confURL),
4343
encoding: .utf8
4444
) {
4545
if content.hasPrefix("YES") {
@@ -98,6 +98,9 @@ let package = Package(
9898
url: "https://github.com/pointfreeco/swift-composable-architecture",
9999
from: "0.55.0"
100100
),
101+
// quick hack to support custom UserDefaults
102+
// https://github.com/sindresorhus/KeyboardShortcuts
103+
.package(url: "https://github.com/intitni/KeyboardShortcuts", branch: "main"),
101104
].pro,
102105
targets: [
103106
// MARK: - Main
@@ -134,6 +137,7 @@ let package = Package(
134137
.product(name: "AsyncAlgorithms", package: "swift-async-algorithms"),
135138
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
136139
.product(name: "Dependencies", package: "swift-dependencies"),
140+
.product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
137141
].pro([
138142
"ProService",
139143
])
@@ -168,6 +172,7 @@ let package = Package(
168172
.product(name: "OpenAIService", package: "Tool"),
169173
.product(name: "Preferences", package: "Tool"),
170174
.product(name: "ComposableArchitecture", package: "swift-composable-architecture"),
175+
.product(name: "KeyboardShortcuts", package: "KeyboardShortcuts"),
171176
].pro([
172177
"ProHostApp",
173178
])

Core/Sources/HostApp/GeneralView.swift

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Client
22
import ComposableArchitecture
3+
import KeyboardShortcuts
34
import LaunchAgentManager
45
import Preferences
56
import SwiftUI
@@ -285,6 +286,8 @@ struct GeneralSettingsView: View {
285286

286287
Text("pt")
287288
}
289+
290+
KeyboardShortcuts.Recorder("Global Shortcut to Toggle Widgets", name: .showHideWidget)
288291

289292
Toggle(isOn: $settings.hideCircularWidget) {
290293
Text("Hide circular widget")
@@ -342,7 +345,7 @@ struct LargeIconPicker<
342345
}
343346
}
344347
}
345-
348+
346349
var body: some View {
347350
if #available(macOS 13.0, *) {
348351
LabeledContent {

Core/Sources/HostApp/HostApp.swift

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
import Client
22
import ComposableArchitecture
33
import Foundation
4+
import KeyboardShortcuts
45

56
#if canImport(LicenseManagement)
67
import LicenseManagement
78
#endif
89

10+
extension KeyboardShortcuts.Name {
11+
static let showHideWidget = Self("ShowHideWidget")
12+
}
13+
914
struct HostApp: ReducerProtocol {
1015
struct State: Equatable {
1116
var general = General.State()
@@ -27,20 +32,21 @@ struct HostApp: ReducerProtocol {
2732
Scope(state: \.general, action: /Action.general) {
2833
General()
2934
}
30-
35+
3136
Scope(state: \.chatModelManagement, action: /Action.chatModelManagement) {
3237
ChatModelManagement()
3338
}
34-
39+
3540
Scope(state: \.embeddingModelManagement, action: /Action.embeddingModelManagement) {
3641
EmbeddingModelManagement()
3742
}
3843

3944
Reduce { _, action in
4045
switch action {
4146
case .appear:
47+
KeyboardShortcuts.userDefaults = .shared
4248
return .none
43-
49+
4450
case .informExtensionServiceAboutLicenseKeyChange:
4551
#if canImport(LicenseManagement)
4652
return .run { _ in
@@ -55,13 +61,13 @@ struct HostApp: ReducerProtocol {
5561
#else
5662
return .none
5763
#endif
58-
64+
5965
case .general:
6066
return .none
61-
67+
6268
case .chatModelManagement:
6369
return .none
64-
70+
6571
case .embeddingModelManagement:
6672
return .none
6773
}
@@ -70,8 +76,8 @@ struct HostApp: ReducerProtocol {
7076
}
7177

7278
import Dependencies
73-
import Preferences
7479
import Keychain
80+
import Preferences
7581

7682
struct UserDefaultsDependencyKey: DependencyKey {
7783
static var liveValue: UserDefaultsType = UserDefaults.shared
@@ -80,6 +86,7 @@ struct UserDefaultsDependencyKey: DependencyKey {
8086
it.removePersistentDomain(forName: "HostAppPreview")
8187
return it
8288
}()
89+
8390
static var testValue: UserDefaultsType = {
8491
let it = UserDefaults(suiteName: "HostAppTest")!
8592
it.removePersistentDomain(forName: "HostAppTest")
@@ -106,3 +113,4 @@ extension DependencyValues {
106113
set { self[APIKeyKeychainDependencyKey.self] = newValue }
107114
}
108115
}
116+

Core/Sources/Service/Service.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import Dependencies
22
import Foundation
3+
import KeyboardShortcuts
34
import Workspace
45
import WorkspaceSuggestionService
56

@@ -12,6 +13,10 @@ import ProService
1213
public static let shared = TheActor()
1314
}
1415

16+
extension KeyboardShortcuts.Name {
17+
static let showHideWidget = Self("ShowHideWidget")
18+
}
19+
1520
/// The running extension service.
1621
public final class Service {
1722
public static let shared = Service()
@@ -43,6 +48,8 @@ public final class Service {
4348
ProService()
4449
}
4550
#endif
51+
52+
KeyboardShortcuts.userDefaults = .shared
4653
}
4754

4855
@MainActor
@@ -54,6 +61,10 @@ public final class Service {
5461
proService.start()
5562
#endif
5663
DependencyUpdater().update()
64+
65+
KeyboardShortcuts.onKeyUp(for: .showHideWidget) { [guiController] in
66+
guiController.viewStore.send(.suggestionWidget(.circularWidget(.widgetClicked)))
67+
}
5768
}
5869
}
5970

Pro

Submodule Pro updated from 53eaa38 to 0a2dc97

0 commit comments

Comments
 (0)