Skip to content

Commit 4f44d03

Browse files
committed
Move pendingInput code to OnitPanelState
1 parent d6ed0bb commit 4f44d03

5 files changed

Lines changed: 72 additions & 10 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// HighlightedTextDelegate.swift
3+
// Onit
4+
//
5+
// Created by TimL on 07/29/2025.
6+
//
7+
8+
import Foundation
9+
10+
@MainActor
11+
protocol HighlightedTextDelegate: AnyObject {
12+
/// Called when highlighted text has changed
13+
/// - Parameters:
14+
/// - selectedText: The newly selected text, or nil if text was deselected
15+
/// - application: The name of the application where the text was selected
16+
func highlightedTextDidChange(selectedText: String?, application: String?)
17+
}

macos/Onit/StateManagers/HighlightedText/HighlightedTextManager.swift

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ class HighlightedTextManager: ObservableObject {
2626
// Published property for selected text that QuickEditManager can observe
2727
@Published var selectedText: String?
2828

29+
// MARK: - Delegates
30+
31+
private var delegates = NSHashTable<AnyObject>.weakObjects()
32+
2933
// MARK: - Private initializer
3034

3135
private init() {
@@ -39,6 +43,22 @@ class HighlightedTextManager: ObservableObject {
3943

4044
// MARK: - Functions
4145

46+
// MARK: - Delegate Management
47+
48+
func addDelegate(_ delegate: HighlightedTextDelegate) {
49+
delegates.add(delegate)
50+
}
51+
52+
func removeDelegate(_ delegate: HighlightedTextDelegate) {
53+
delegates.remove(delegate)
54+
}
55+
56+
private func notifyDelegates(selectedText: String?, application: String?) {
57+
for case let delegate as HighlightedTextDelegate in delegates.allObjects {
58+
delegate.highlightedTextDidChange(selectedText: selectedText, application: application)
59+
}
60+
}
61+
4262
func setCurrentSource(_ source: String?) {
4363
currentSource = source
4464
}
@@ -97,22 +117,19 @@ class HighlightedTextManager: ObservableObject {
97117
let selectedText = text,
98118
HighlightedTextValidator.isValid(text: selectedText) else {
99119

100-
PanelStateCoordinator.shared.state.pendingInput = nil
101-
PanelStateCoordinator.shared.state.trackedPendingInput = nil
120+
// Update the published selectedText property
102121
self.selectedText = nil
122+
123+
// Notify delegates that text was deselected
124+
notifyDelegates(selectedText: nil, application: currentSource)
103125
return
104126
}
105127

106128
// Update the published selectedText property
107129
self.selectedText = selectedText
108130

109-
let input = Input(selectedText: selectedText, application: currentSource ?? "")
110-
111-
if Defaults[.autoAddHighlightedTextToContext] {
112-
PanelStateCoordinator.shared.state.pendingInput = input
113-
} else {
114-
PanelStateCoordinator.shared.state.trackedPendingInput = input
115-
}
131+
// Notify delegates about the text change
132+
notifyDelegates(selectedText: selectedText, application: currentSource)
116133
}
117134

118135
func handleCaretPositionChange(for element: AXUIElement) {

macos/Onit/UI/Panels/State/OnitPanelState+NSWindowDelegate.swift renamed to macos/Onit/UI/Panels/State/OnitPanelState+Delegates.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
//
77

88
import AppKit
9+
import Defaults
910

1011
extension OnitPanelState: NSWindowDelegate {
1112

@@ -29,3 +30,21 @@ extension OnitPanelState: NSWindowDelegate {
2930
}
3031
}
3132
}
33+
34+
extension OnitPanelState: HighlightedTextDelegate {
35+
func highlightedTextDidChange(selectedText: String?, application: String?) {
36+
if let selectedText = selectedText {
37+
let input = Input(selectedText: selectedText, application: application ?? "")
38+
39+
if Defaults[.autoAddHighlightedTextToContext] {
40+
pendingInput = input
41+
} else {
42+
trackedPendingInput = input
43+
}
44+
} else {
45+
// Text was deselected
46+
pendingInput = nil
47+
trackedPendingInput = nil
48+
}
49+
}
50+
}

macos/Onit/UI/Panels/State/OnitPanelState.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,7 @@ class OnitPanelState: NSObject {
173173
override init() {
174174
self.panelWidth = Defaults[.panelWidth]
175175
super.init()
176+
setupHighlightedTextDelegate()
176177
}
177178

178179
init(trackedWindow: TrackedWindow) {
@@ -181,6 +182,7 @@ class OnitPanelState: NSObject {
181182
super.init()
182183

183184
self.promptSuggestionService = SystemPromptSuggestionService(state: self)
185+
setupHighlightedTextDelegate()
184186
}
185187

186188
init(screen: NSScreen) {
@@ -189,6 +191,7 @@ class OnitPanelState: NSObject {
189191
super.init()
190192

191193
self.promptSuggestionService = SystemPromptSuggestionService(state: self)
194+
setupHighlightedTextDelegate()
192195
}
193196

194197
// MARK: - Functions
@@ -198,6 +201,12 @@ class OnitPanelState: NSObject {
198201
currentAnimationTask = nil
199202
}
200203

204+
// MARK: - Setup
205+
206+
private func setupHighlightedTextDelegate() {
207+
HighlightedTextManager.shared.addDelegate(self)
208+
}
209+
201210
// MARK: - Delegates
202211

203212
func addDelegate(_ delegate: OnitPanelStateDelegate) {

macos/Onit/UI/QuickEdit/QuickEditManager.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ extension QuickEditManager {
285285
}
286286

287287
func caretDidDisappear() {
288-
if !hasTextSelection(PanelStateCoordinator.shared.state.pendingInput?.selectedText ?? PanelStateCoordinator.shared.state.trackedPendingInput?.selectedText) {
288+
if !hasTextSelection(highlightedTextManager.selectedText) {
289289
hideHint()
290290
}
291291
}

0 commit comments

Comments
 (0)