Skip to content

Commit f181739

Browse files
committed
Merge branch 'main' into itembox
2 parents 2aaadb9 + f6f2b80 commit f181739

File tree

15 files changed

+233
-65
lines changed

15 files changed

+233
-65
lines changed

.github/scripts/test_app.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,13 @@ echo "SwiftLint Version: $(swiftlint --version)"
1414

1515
export LC_CTYPE=en_US.UTF-8
1616

17+
# xcbeautify flags:
18+
# - renderer: render to gh actions
19+
# - q: quiet output
20+
# - is-ci: include test results in output
21+
1722
set -o pipefail && arch -"${ARCH}" xcodebuild \
1823
-scheme CodeEdit \
1924
-destination "platform=OS X,arch=${ARCH}" \
2025
-skipPackagePluginValidation \
21-
clean test | xcbeautify --renderer github-actions
26+
clean test | xcbeautify --renderer github-actions -q --is-ci

CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,21 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs
143143
}
144144
}
145145

146+
/// Opens the search navigator and focuses the search field
147+
@IBAction func openSearchNavigator(_ sender: Any? = nil) {
148+
if navigatorCollapsed {
149+
toggleFirstPanel()
150+
}
151+
152+
if let navigatorViewModel = navigatorSidebarViewModel,
153+
let searchTab = navigatorViewModel.tabItems.first(where: { $0 == .search }) {
154+
DispatchQueue.main.async {
155+
self.workspace?.searchState?.shouldFocusSearchField = true
156+
navigatorViewModel.setNavigatorTab(tab: searchTab)
157+
}
158+
}
159+
}
160+
146161
@IBAction func openQuickly(_ sender: Any?) {
147162
if let workspace, let state = workspace.openQuicklyViewModel {
148163
if let quickOpenPanel {

CodeEdit/Features/Documents/WorkspaceDocument/WorkspaceDocument+SearchState.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ extension WorkspaceDocument {
3535

3636
@Published var findNavigatorStatus: FindNavigatorStatus = .none
3737

38+
@Published var shouldFocusSearchField: Bool = false
39+
3840
unowned var workspace: WorkspaceDocument
3941
var tempSearchResults = [SearchResultModel]()
4042
var caseSensitive: Bool = false

CodeEdit/Features/LSP/Features/SemanticTokens/SemanticTokenHighlightProvider.swift

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,20 @@ final class SemanticTokenHighlightProvider<
166166
let rawTokens = storage.getTokensFor(range: lspRange)
167167
let highlights = tokenMap
168168
.decode(tokens: rawTokens, using: textView)
169-
.filter({ $0.capture != nil || !$0.modifiers.isEmpty })
169+
.compactMap { highlightRange -> HighlightRange? in
170+
// Filter out empty ranges
171+
guard highlightRange.capture != nil || !highlightRange.modifiers.isEmpty,
172+
// Clamp the highlight range to the queried range.
173+
let intersection = highlightRange.range.intersection(range),
174+
intersection.isEmpty == false else {
175+
return nil
176+
}
177+
return HighlightRange(
178+
range: intersection,
179+
capture: highlightRange.capture,
180+
modifiers: highlightRange.modifiers
181+
)
182+
}
170183
completion(.success(highlights))
171184
}
172185
}

CodeEdit/Features/NavigatorArea/FindNavigator/FindNavigatorForm.swift

Lines changed: 56 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -25,63 +25,13 @@ struct FindNavigatorForm: View {
2525
@State private var preserveCase: Bool = false
2626
@State private var scopedToOpenEditors: Bool = false
2727
@State private var excludeSettings: Bool = true
28+
@FocusState private var isSearchFieldFocused: Bool
2829

2930
init(state: WorkspaceDocument.SearchState) {
3031
self.state = state
3132
selectedMode = state.selectedMode
3233
}
3334

34-
private func getMenuList(_ index: Int) -> [SearchModeModel] {
35-
index == 0 ? SearchModeModel.SearchModes : selectedMode[index - 1].children
36-
}
37-
38-
private func onSelectMenuItem(_ index: Int, searchMode: SearchModeModel) {
39-
var newSelectedMode: [SearchModeModel] = []
40-
41-
switch index {
42-
case 0:
43-
newSelectedMode.append(searchMode)
44-
self.updateSelectedMode(searchMode, searchModel: &newSelectedMode)
45-
self.selectedMode = newSelectedMode
46-
case 1:
47-
if let firstMode = selectedMode.first {
48-
newSelectedMode.append(contentsOf: [firstMode, searchMode])
49-
if let thirdMode = searchMode.children.first {
50-
if let selectedThirdMode = selectedMode.third, searchMode.children.contains(selectedThirdMode) {
51-
newSelectedMode.append(selectedThirdMode)
52-
} else {
53-
newSelectedMode.append(thirdMode)
54-
}
55-
}
56-
}
57-
self.selectedMode = newSelectedMode
58-
case 2:
59-
if let firstMode = selectedMode.first, let secondMode = selectedMode.second {
60-
newSelectedMode.append(contentsOf: [firstMode, secondMode, searchMode])
61-
}
62-
self.selectedMode = newSelectedMode
63-
default:
64-
return
65-
}
66-
}
67-
68-
private func updateSelectedMode(_ searchMode: SearchModeModel, searchModel: inout [SearchModeModel]) {
69-
if let secondMode = searchMode.children.first {
70-
if let selectedSecondMode = selectedMode.second, searchMode.children.contains(selectedSecondMode) {
71-
searchModel.append(contentsOf: selectedMode.dropFirst())
72-
} else {
73-
searchModel.append(secondMode)
74-
if let thirdMode = secondMode.children.first, let selectedThirdMode = selectedMode.third {
75-
if secondMode.children.contains(selectedThirdMode) {
76-
searchModel.append(selectedThirdMode)
77-
} else {
78-
searchModel.append(thirdMode)
79-
}
80-
}
81-
}
82-
}
83-
}
84-
8535
private var chevron: some View {
8636
Image(systemName: "chevron.compact.right")
8737
.foregroundStyle(.tertiary)
@@ -152,6 +102,7 @@ struct FindNavigatorForm: View {
152102
},
153103
hasValue: caseSensitive
154104
)
105+
.focused($isSearchFieldFocused)
155106
.onSubmit {
156107
if !state.searchQuery.isEmpty {
157108
Task {
@@ -262,16 +213,65 @@ struct FindNavigatorForm: View {
262213
}
263214
}
264215
}
216+
.onReceive(state.$shouldFocusSearchField) { shouldFocus in
217+
if shouldFocus {
218+
isSearchFieldFocused = true
219+
state.shouldFocusSearchField = false
220+
}
221+
}
265222
.lineLimit(1...5)
266223
}
267224
}
268225

269-
extension Array {
270-
var second: Element? {
271-
self.count > 1 ? self[1] : nil
226+
extension FindNavigatorForm {
227+
private func getMenuList(_ index: Int) -> [SearchModeModel] {
228+
index == 0 ? SearchModeModel.SearchModes : selectedMode[index - 1].children
229+
}
230+
231+
private func onSelectMenuItem(_ index: Int, searchMode: SearchModeModel) {
232+
var newSelectedMode: [SearchModeModel] = []
233+
234+
switch index {
235+
case 0:
236+
newSelectedMode.append(searchMode)
237+
self.updateSelectedMode(searchMode, searchModel: &newSelectedMode)
238+
self.selectedMode = newSelectedMode
239+
case 1:
240+
if let firstMode = selectedMode.first {
241+
newSelectedMode.append(contentsOf: [firstMode, searchMode])
242+
if let thirdMode = searchMode.children.first {
243+
if let selectedThirdMode = selectedMode.third, searchMode.children.contains(selectedThirdMode) {
244+
newSelectedMode.append(selectedThirdMode)
245+
} else {
246+
newSelectedMode.append(thirdMode)
247+
}
248+
}
249+
}
250+
self.selectedMode = newSelectedMode
251+
case 2:
252+
if let firstMode = selectedMode.first, let secondMode = selectedMode.second {
253+
newSelectedMode.append(contentsOf: [firstMode, secondMode, searchMode])
254+
}
255+
self.selectedMode = newSelectedMode
256+
default:
257+
return
258+
}
272259
}
273260

274-
var third: Element? {
275-
self.count > 2 ? self[2] : nil
261+
private func updateSelectedMode(_ searchMode: SearchModeModel, searchModel: inout [SearchModeModel]) {
262+
if let secondMode = searchMode.children.first {
263+
if let selectedSecondMode = selectedMode.second, searchMode.children.contains(selectedSecondMode) {
264+
searchModel.append(contentsOf: selectedMode.dropFirst())
265+
} else {
266+
searchModel.append(secondMode)
267+
if let thirdMode = secondMode.children.first, let selectedThirdMode = selectedMode.third {
268+
if secondMode.children.contains(selectedThirdMode) {
269+
searchModel.append(selectedThirdMode)
270+
} else {
271+
searchModel.append(thirdMode)
272+
}
273+
}
274+
}
275+
}
276276
}
277277
}

CodeEdit/Features/TerminalEmulator/Model/ShellIntegration.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,21 +65,21 @@ enum ShellIntegration {
6565
// Enable injection in our scripts.
6666
environment.append("\(Variables.ceInjection)=1")
6767

68-
if let execArgs = shell.execArguments(interactive: interactive, login: useLogin) {
69-
args.append(execArgs)
70-
}
71-
7268
switch shell {
7369
case .bash:
7470
try bash(&args)
7571
case .zsh:
76-
try zsh(&args, &environment)
72+
try zsh(&environment)
7773
}
7874

7975
if useLogin {
8076
environment.append("\(Variables.shellLogin)=1")
8177
}
8278

79+
if let execArgs = shell.execArguments(interactive: interactive, login: useLogin) {
80+
args.append(execArgs)
81+
}
82+
8383
return args
8484
} catch {
8585
// catch so we can log this here
@@ -125,7 +125,6 @@ enum ShellIntegration {
125125
/// - useLogin: Whether to use a login shell.
126126
/// - interactive: Whether to use an interactive shell.
127127
private static func zsh(
128-
_ args: inout [String],
129128
_ environment: inout [String]
130129
) throws {
131130
// All injection script URLs

CodeEdit/Features/TerminalEmulator/Views/CETerminalView.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@ class CETerminalView: TerminalView {
1717
}
1818
}
1919

20+
override open var frame: CGRect {
21+
get {
22+
super.frame
23+
}
24+
set {
25+
if newValue.size != .zero {
26+
super.frame = newValue
27+
}
28+
}
29+
}
30+
2031
@objc
2132
override open func copy(_ sender: Any) {
2233
let range = selectedPositions()
@@ -25,4 +36,34 @@ class CETerminalView: TerminalView {
2536
pasteboard.clearContents()
2637
pasteboard.setString(text, forType: .string)
2738
}
39+
40+
override open func isAccessibilityElement() -> Bool {
41+
true
42+
}
43+
44+
override open func isAccessibilityEnabled() -> Bool {
45+
true
46+
}
47+
48+
override open func accessibilityLabel() -> String? {
49+
"Terminal Emulator"
50+
}
51+
52+
override open func accessibilityRole() -> NSAccessibility.Role? {
53+
.textArea
54+
}
55+
56+
override open func accessibilityValue() -> Any? {
57+
terminal.getText(
58+
start: Position(col: 0, row: 0),
59+
end: Position(col: terminal.buffer.x, row: terminal.getTopVisibleRow() + terminal.rows)
60+
)
61+
}
62+
63+
override open func accessibilitySelectedText() -> String? {
64+
let range = selectedPositions()
65+
let text = terminal.getText(start: range.start, end: range.end)
66+
return text
67+
}
68+
2869
}

CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalSidebar.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ struct UtilityAreaTerminalSidebar: View {
7272
}
7373
.accessibilityElement(children: .contain)
7474
.accessibilityLabel("Terminals")
75+
.accessibilityIdentifier("terminalsList")
7576
}
7677
}
7778

CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalTab.swift

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,6 @@ struct UtilityAreaTerminalTab: View {
4646
}
4747
} icon: {
4848
Image(systemName: "terminal")
49-
.accessibilityHidden(true)
5049
}
5150
.contextMenu {
5251
Button("Rename...") {
@@ -63,5 +62,8 @@ struct UtilityAreaTerminalTab: View {
6362
}
6463
}
6564
}
65+
.accessibilityElement(children: .contain)
66+
.accessibilityLabel(terminalTitle.wrappedValue)
67+
.accessibilityIdentifier("terminalTab")
6668
}
6769
}

CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ struct UtilityAreaTerminalView: View {
117117
)
118118
.frame(height: max(0, constrainedHeight - 1))
119119
.id(selectedTerminal.id)
120+
.accessibilityIdentifier("terminal")
120121
}
121122
}
122123
} else {
@@ -167,6 +168,7 @@ struct UtilityAreaTerminalView: View {
167168
}
168169
utilityAreaViewModel.initializeTerminals(workspaceURL: workspaceURL)
169170
}
171+
.accessibilityIdentifier("terminal-area")
170172
}
171173

172174
@ViewBuilder var backgroundEffectView: some View {

0 commit comments

Comments
 (0)