Skip to content

Commit 5291807

Browse files
authored
Merge pull request #369 from synth-inc/refactor/move-pending-input-code-to-panel-state
Move pendingInput code to OnitPanelState
2 parents 49d662b + 8cf268a commit 5291807

8 files changed

Lines changed: 87 additions & 12 deletions

File tree

macos/Onit/PanelStateManager/PanelStateBaseManager.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,9 @@ class PanelStateBaseManager: PanelStateManagerLogic {
7373
}
7474
closePanels()
7575
hideTetherWindow()
76+
for state in states {
77+
state.unsubscribeAsHighlightedTextDelegate()
78+
}
7679

7780
state = defaultState
7881
tetherButtonPanelState = nil

macos/Onit/PanelStateManager/Pinned/PanelStatePinnedManager.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ class PanelStatePinnedManager: PanelStateBaseManager, ObservableObject {
5454

5555
self.state = state
5656
states = [state]
57+
state.subscribeAsHighlightedTextDelegate()
5758

5859
globalMouseMonitor = NSEvent.addGlobalMonitorForEvents(matching: .mouseMoved) { [weak self] event in
5960
guard let self = self else { return }
@@ -114,7 +115,7 @@ class PanelStatePinnedManager: PanelStateBaseManager, ObservableObject {
114115
dragManager.stopMonitoring()
115116
dragManagerCancellable?.cancel()
116117
draggingWindow = nil
117-
118+
state.unsubscribeAsHighlightedTextDelegate()
118119
state.removeDelegate(self)
119120

120121
hintYRelativePosition = nil

macos/Onit/PanelStateManager/Tethered/PanelStateTetheredManager.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,9 @@ class PanelStateTetheredManager: PanelStateBaseManager, ObservableObject {
8080
dragManager.stopMonitoring()
8181
dragManagerCancellable?.cancel()
8282
draggingState = nil
83-
83+
for (_, state) in statesByWindow {
84+
state.unsubscribeAsHighlightedTextDelegate()
85+
}
8486
super.stop()
8587

8688
statesByWindow = [:]
@@ -240,7 +242,7 @@ class PanelStateTetheredManager: PanelStateBaseManager, ObservableObject {
240242
panelState = activeState
241243
} else {
242244
panelState = OnitPanelState(trackedWindow: trackedWindow)
243-
245+
panelState.subscribeAsHighlightedTextDelegate()
244246
statesByWindow[trackedWindow] = panelState
245247
}
246248

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 highlightedTextManager(_ manager: HighlightedTextManager, didChange selectedText: String?, application: String?)
17+
}

macos/Onit/StateManagers/HighlightedText/HighlightedTextManager.swift

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

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

3236
private init() {
@@ -40,6 +44,22 @@ class HighlightedTextManager: ObservableObject {
4044

4145
// MARK: - Functions
4246

47+
// MARK: - Delegate Management
48+
49+
func addDelegate(_ delegate: HighlightedTextDelegate) {
50+
delegates.add(delegate)
51+
}
52+
53+
func removeDelegate(_ delegate: HighlightedTextDelegate) {
54+
delegates.remove(delegate)
55+
}
56+
57+
private func notifyDelegates(_ notification: (HighlightedTextDelegate) -> Void) {
58+
for case let delegate as HighlightedTextDelegate in delegates.allObjects {
59+
notification(delegate)
60+
}
61+
}
62+
4363
func setCurrentSource(_ source: String?) {
4464
currentSource = source
4565
}
@@ -98,21 +118,22 @@ class HighlightedTextManager: ObservableObject {
98118
let selectedText = text,
99119
HighlightedTextValidator.isValid(text: selectedText) else {
100120

101-
PanelStateCoordinator.shared.state.pendingInput = nil
102-
PanelStateCoordinator.shared.state.trackedPendingInput = nil
121+
// Update the published selectedText property
103122
self.selectedText = nil
123+
124+
// Notify delegates that text was deselected
125+
notifyDelegates {
126+
$0.highlightedTextManager(self, didChange: nil, application: currentSource)
127+
}
104128
return
105129
}
106130

107131
// Update the published selectedText property
108132
self.selectedText = selectedText
109133

110-
let input = Input(selectedText: selectedText, application: currentSource ?? "")
111-
112-
if Defaults[.autoAddHighlightedTextToContext] {
113-
PanelStateCoordinator.shared.state.pendingInput = input
114-
} else {
115-
PanelStateCoordinator.shared.state.trackedPendingInput = input
134+
// Notify delegates about the text change
135+
notifyDelegates {
136+
$0.highlightedTextManager(self, didChange: selectedText, application: currentSource)
116137
}
117138
}
118139

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

Lines changed: 20 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,22 @@ extension OnitPanelState: NSWindowDelegate {
2930
}
3031
}
3132
}
33+
34+
extension OnitPanelState: HighlightedTextDelegate {
35+
36+
func highlightedTextManager(_ manager: HighlightedTextManager, didChange selectedText: String?, application: String?) {
37+
if let selectedText = selectedText {
38+
let input = Input(selectedText: selectedText, application: application ?? "")
39+
40+
if Defaults[.autoAddHighlightedTextToContext] {
41+
pendingInput = input
42+
} else {
43+
trackedPendingInput = input
44+
}
45+
} else {
46+
// Text was deselected
47+
pendingInput = nil
48+
trackedPendingInput = nil
49+
}
50+
}
51+
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,17 @@ class OnitPanelState: NSObject {
202202
currentAnimationTask = nil
203203
}
204204

205+
// MARK: - Setup
206+
207+
public func subscribeAsHighlightedTextDelegate() {
208+
HighlightedTextManager.shared.addDelegate(self)
209+
}
210+
211+
public func unsubscribeAsHighlightedTextDelegate() {
212+
HighlightedTextManager.shared.removeDelegate(self)
213+
}
214+
215+
205216
// MARK: - Delegates
206217

207218
func addDelegate(_ delegate: OnitPanelStateDelegate) {

macos/Onit/UI/QuickEdit/QuickEditManager.swift

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

286286
func caretDidDisappear() {
287-
if !hasTextSelection(PanelStateCoordinator.shared.state.pendingInput?.selectedText ?? PanelStateCoordinator.shared.state.trackedPendingInput?.selectedText) {
287+
if !hasTextSelection(highlightedTextManager.selectedText) {
288288
hideHint()
289289
}
290290
}

0 commit comments

Comments
 (0)