From 4314f7dba109684940bfd2429b1b75f4cec522a4 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 02:17:17 +0100 Subject: [PATCH 01/17] highlight search query in 'Open Quickly' results --- CodeEdit.xcodeproj/project.pbxproj | 12 +++++ .../Commands/Views/QuickActionsView.swift | 48 +---------------- .../QuickOpen/Views/QuickOpenItem.swift | 8 +-- .../QuickOpen/Views/QuickOpenView.swift | 2 +- .../Search/Views/QuickSearchResultLabel.swift | 52 +++++++++++++++++++ 5 files changed, 72 insertions(+), 50 deletions(-) create mode 100644 CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index d51656b370..7599e20e76 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -325,6 +325,7 @@ 61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */; }; 661EF7B82BEE215300C3E577 /* ImageFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7B72BEE215300C3E577 /* ImageFileView.swift */; }; 661EF7BD2BEE215300C3E577 /* LoadingFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */; }; + 6653EE552C34817900B82DE2 /* QuickSearchResultLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */; }; 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669BC4072BED306400D1197C /* AnyFileView.swift */; }; 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */; }; @@ -943,6 +944,7 @@ 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Index.swift"; sourceTree = ""; }; 661EF7B72BEE215300C3E577 /* ImageFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFileView.swift; sourceTree = ""; }; 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingFileView.swift; sourceTree = ""; }; + 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSearchResultLabel.swift; sourceTree = ""; }; 669BC4072BED306400D1197C /* AnyFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyFileView.swift; sourceTree = ""; }; 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarFileInfoView.swift; sourceTree = ""; }; @@ -1807,6 +1809,7 @@ 58798210292D92370085B254 /* Search */ = { isa = PBXGroup; children = ( + 6653EE532C34816F00B82DE2 /* Views */, 613899AF2B6E6FB800A5CAF6 /* FuzzySearch */, 58798212292D92370085B254 /* Extensions */, 58798214292D92370085B254 /* Model */, @@ -2535,6 +2538,14 @@ path = ActivityViewer; sourceTree = ""; }; + 6653EE532C34816F00B82DE2 /* Views */ = { + isa = PBXGroup; + children = ( + 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */, + ); + path = Views; + sourceTree = ""; + }; 66AF6CE02BF17CB100D83C9D /* ViewModels */ = { isa = PBXGroup; children = ( @@ -3653,6 +3664,7 @@ 58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */, 0FD96BCE2BEF42530025A697 /* CodeEditWindowController+Toolbar.swift in Sources */, 6C7F37FE2A3EA6FA00217B83 /* View+focusedValue.swift in Sources */, + 6653EE552C34817900B82DE2 /* QuickSearchResultLabel.swift in Sources */, B6C4F2A12B3CA37500B2B140 /* SourceControlNavigatorHistoryView.swift in Sources */, 6CBE1CFB2B71DAA6003AC32E /* Loopable.swift in Sources */, 30B088092C0D53080063A882 /* LanguageServer+Formatting.swift in Sources */, diff --git a/CodeEdit/Features/Commands/Views/QuickActionsView.swift b/CodeEdit/Features/Commands/Views/QuickActionsView.swift index 4bb72f1438..c693670141 100644 --- a/CodeEdit/Features/Commands/Views/QuickActionsView.swift +++ b/CodeEdit/Features/Commands/Views/QuickActionsView.swift @@ -43,7 +43,7 @@ struct QuickActionsView: View { } var body: some View { - SearchPanelView( + SearchPanelView( title: "Commands", image: Image(systemName: "magnifyingglass"), options: $state.filteredCommands, @@ -51,7 +51,7 @@ struct QuickActionsView: View { alwaysShowOptions: true, optionRowHeight: 30 ) { command in - SearchResultLabel(labelName: command.title, textToMatch: state.commandQuery) + QuickSearchResultLabel(labelName: command.title, textToMatch: state.commandQuery) } onRowClick: { command in callHandler(command: command) } onClose: { @@ -62,47 +62,3 @@ struct QuickActionsView: View { } } } - -/// Implementation of command palette entity. While swiftui does not allow to use NSMutableAttributeStrings, -/// the only way to fallback to UIKit and have NSViewRepresentable to be a bridge between UIKit and SwiftUI. -/// Highlights currently entered text query - -struct SearchResultLabel: NSViewRepresentable { - - var labelName: String - var textToMatch: String - - public func makeNSView(context: Context) -> some NSTextField { - let label = NSTextField(wrappingLabelWithString: labelName) - label.translatesAutoresizingMaskIntoConstraints = false - label.drawsBackground = false - label.textColor = .labelColor - label.isEditable = false - label.isSelectable = false - label.font = .labelFont(ofSize: 13) - label.allowsDefaultTighteningForTruncation = false - label.cell?.truncatesLastVisibleLine = true - label.cell?.wraps = true - label.maximumNumberOfLines = 1 - label.attributedStringValue = highlight() - return label - } - - func highlight() -> NSAttributedString { - let attribText = NSMutableAttributedString(string: self.labelName) - let range: NSRange = attribText.mutableString.range( - of: self.textToMatch, - options: NSString.CompareOptions.caseInsensitive - ) - attribText.addAttribute(.foregroundColor, value: NSColor(Color(.labelColor)), range: range) - attribText.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize), range: range) - - return attribText - } - - func updateNSView(_ nsView: NSViewType, context: Context) { - nsView.textColor = textToMatch.isEmpty ? .labelColor : .secondaryLabelColor - nsView.attributedStringValue = highlight() - } - -} diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift index ad3aa8a12d..f85d048fad 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift @@ -10,13 +10,16 @@ import SwiftUI struct QuickOpenItem: View { private let baseDirectory: URL private let fileURL: URL + private let textToMatch: String init( baseDirectory: URL, - fileURL: URL + fileURL: URL, + textToMatch: String ) { self.baseDirectory = baseDirectory self.fileURL = fileURL + self.textToMatch = textToMatch } var relativePathComponents: ArraySlice { @@ -30,8 +33,7 @@ struct QuickOpenItem: View { .aspectRatio(contentMode: .fit) .frame(width: 24, height: 24) VStack(alignment: .leading, spacing: 0) { - Text(fileURL.lastPathComponent).font(.system(size: 13)) - .lineLimit(1) + QuickSearchResultLabel(labelName: fileURL.lastPathComponent, textToMatch: textToMatch) Text(relativePathComponents.joined(separator: " ▸ ")) .font(.system(size: 10.5)) .foregroundColor(.secondary) diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift index 34a04d0083..7159d12a78 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift @@ -41,7 +41,7 @@ struct QuickOpenView: View { text: $state.openQuicklyQuery, optionRowHeight: 40 ) { file in - QuickOpenItem(baseDirectory: state.fileURL, fileURL: file) + QuickOpenItem(baseDirectory: state.fileURL, fileURL: file, textToMatch: state.openQuicklyQuery) } preview: { fileURL in QuickOpenPreviewView(item: CEWorkspaceFile(url: fileURL)) } onRowClick: { fileURL in diff --git a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift new file mode 100644 index 0000000000..9200a3a22c --- /dev/null +++ b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift @@ -0,0 +1,52 @@ +// +// QuickSearchResultLabel.swift +// CodeEdit +// +// Created by Paul Ebose on 2024/7/2. +// + +import SwiftUI + +/// Implementation of command palette entity. While swiftui does not allow to use NSMutableAttributeStrings, +/// the only way to fallback to UIKit and have NSViewRepresentable to be a bridge between UIKit and SwiftUI. +/// Highlights currently entered text query + +struct QuickSearchResultLabel: NSViewRepresentable { + + var labelName: String + var textToMatch: String + + public func makeNSView(context: Context) -> some NSTextField { + let label = NSTextField(wrappingLabelWithString: labelName) + label.translatesAutoresizingMaskIntoConstraints = false + label.drawsBackground = false + label.textColor = .labelColor + label.isEditable = false + label.isSelectable = false + label.font = .labelFont(ofSize: 13) + label.allowsDefaultTighteningForTruncation = false + label.cell?.truncatesLastVisibleLine = true + label.cell?.wraps = true + label.maximumNumberOfLines = 1 + label.attributedStringValue = highlight() + return label + } + + func highlight() -> NSAttributedString { + let attribText = NSMutableAttributedString(string: self.labelName) + let range: NSRange = attribText.mutableString.range( + of: self.textToMatch, + options: NSString.CompareOptions.caseInsensitive + ) + attribText.addAttribute(.foregroundColor, value: NSColor(Color(.labelColor)), range: range) + attribText.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize), range: range) + + return attribText + } + + func updateNSView(_ nsView: NSViewType, context: Context) { + nsView.textColor = textToMatch.isEmpty ? .labelColor : .secondaryLabelColor + nsView.attributedStringValue = highlight() + } + +} From eff67e990b0ead0867929a020cade59abd884750 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 13:33:09 +0100 Subject: [PATCH 02/17] remove extra lines --- CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift index 9200a3a22c..517f6bb73d 100644 --- a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift +++ b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift @@ -10,9 +10,7 @@ import SwiftUI /// Implementation of command palette entity. While swiftui does not allow to use NSMutableAttributeStrings, /// the only way to fallback to UIKit and have NSViewRepresentable to be a bridge between UIKit and SwiftUI. /// Highlights currently entered text query - struct QuickSearchResultLabel: NSViewRepresentable { - var labelName: String var textToMatch: String @@ -48,5 +46,4 @@ struct QuickSearchResultLabel: NSViewRepresentable { nsView.textColor = textToMatch.isEmpty ? .labelColor : .secondaryLabelColor nsView.attributedStringValue = highlight() } - } From 0e28b382f59184b7ebe5a7c3295afa3655b7d4e7 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 15:54:41 +0100 Subject: [PATCH 03/17] highlight all matched characters in Open Quickly results - Created `OpenQuicklySearchResult` struct to store fuzzy search results (file urls and matched characters). This replaces the `openQuicklyFiles` variable which only stored the file urls. - Updated `QuickSearchResultLabel` to receive the matched characters to be highlighted instead of computing it within the struct. Also created `nsLabelName` property to help display `QuickActionsView` results. - Updated `QuickActionsViewModel` to compute its highlighted characters within the struct. --- .../ViewModels/QuickActionsViewModel.swift | 15 +++++++++- .../Commands/Views/QuickActionsView.swift | 6 +++- .../ViewModels/QuickOpenViewModel.swift | 28 ++++++++++++++----- .../QuickOpen/Views/QuickOpenItem.swift | 18 ++++++------ .../QuickOpen/Views/QuickOpenView.swift | 17 ++++++----- .../Search/Views/QuickSearchResultLabel.swift | 22 +++++++-------- 6 files changed, 69 insertions(+), 37 deletions(-) diff --git a/CodeEdit/Features/Commands/ViewModels/QuickActionsViewModel.swift b/CodeEdit/Features/Commands/ViewModels/QuickActionsViewModel.swift index ba53c043f5..a796c2aaa7 100644 --- a/CodeEdit/Features/Commands/ViewModels/QuickActionsViewModel.swift +++ b/CodeEdit/Features/Commands/ViewModels/QuickActionsViewModel.swift @@ -5,7 +5,7 @@ // Created by Alex on 25.05.2022. // -import Foundation +import SwiftUI /// Simple state class for command palette view. Contains currently selected command, /// query text and list of filtered commands @@ -35,4 +35,17 @@ final class QuickActionsViewModel: ObservableObject { self.filteredCommands = CommandManager.shared.commands.filter { $0.title.localizedCaseInsensitiveContains(val) } self.selected = self.filteredCommands.first } + + func highlight(_ commandTitle: String) -> NSAttributedString { + let attribText = NSMutableAttributedString(string: commandTitle) + let range: NSRange = attribText.mutableString.range( + of: self.commandQuery, + options: NSString.CompareOptions.caseInsensitive + ) + attribText.addAttribute(.foregroundColor, value: NSColor(Color(.labelColor)), range: range) + attribText.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize), range: range) + + return attribText + } + } diff --git a/CodeEdit/Features/Commands/Views/QuickActionsView.swift b/CodeEdit/Features/Commands/Views/QuickActionsView.swift index c693670141..bf8e465fe0 100644 --- a/CodeEdit/Features/Commands/Views/QuickActionsView.swift +++ b/CodeEdit/Features/Commands/Views/QuickActionsView.swift @@ -51,7 +51,11 @@ struct QuickActionsView: View { alwaysShowOptions: true, optionRowHeight: 30 ) { command in - QuickSearchResultLabel(labelName: command.title, textToMatch: state.commandQuery) + QuickSearchResultLabel( + labelName: command.title, + charactersToHighlight: [], + nsLabelName: state.highlight(command.title) + ) } onRowClick: { command in callHandler(command: command) } onClose: { diff --git a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift index 2c2e121608..27ee8677b4 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift @@ -11,7 +11,7 @@ import CollectionConcurrencyKit final class QuickOpenViewModel: ObservableObject { @Published var openQuicklyQuery: String = "" - @Published var openQuicklyFiles: [URL] = [] + @Published var openQuicklySearchResults: [OpenQuicklySearchResult] = [] @Published var isShowingOpenQuicklyFiles: Bool = false let fileURL: URL @@ -21,11 +21,20 @@ final class QuickOpenViewModel: ObservableObject { self.fileURL = fileURL } + /// This is used to populate the ``QuickOpenItem`` view which shows the search results to the user. + /// + /// ``QuickOpenPreviewView`` also uses this to load the `fileUrl` for preview. + struct OpenQuicklySearchResult: Identifiable, Hashable { + var id: String { fileURL.absoluteString } + let fileURL: URL + let matchedCharacters: [NSRange] + } + func fetchOpenQuickly() { let startTime = Date() guard openQuicklyQuery != "" else { - openQuicklyFiles = [] - self.isShowingOpenQuicklyFiles = !openQuicklyFiles.isEmpty + openQuicklySearchResults = [] + self.isShowingOpenQuicklyFiles = !openQuicklySearchResults.isEmpty return } @@ -52,14 +61,19 @@ final class QuickOpenViewModel: ObservableObject { } } - let files = await filteredFiles.fuzzySearch( + let fuzzySearchResults = await filteredFiles.fuzzySearch( query: self.openQuicklyQuery.trimmingCharacters(in: .whitespaces) - ).concurrentMap { $0.item } + ).concurrentMap { + OpenQuicklySearchResult( + fileURL: $0.item, + matchedCharacters: $0.result.matchedParts + ) + } guard !Task.isCancelled else { return } await MainActor.run { - self.openQuicklyFiles = files - self.isShowingOpenQuicklyFiles = !self.openQuicklyFiles.isEmpty + self.openQuicklySearchResults = fuzzySearchResults + self.isShowingOpenQuicklyFiles = !self.openQuicklySearchResults.isEmpty print("Duration: \(Date().timeIntervalSince(startTime))") } } diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift index f85d048fad..be70e5afb5 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift @@ -9,31 +9,31 @@ import SwiftUI struct QuickOpenItem: View { private let baseDirectory: URL - private let fileURL: URL - private let textToMatch: String + private let searchResult: QuickOpenViewModel.OpenQuicklySearchResult init( baseDirectory: URL, - fileURL: URL, - textToMatch: String + searchResult: QuickOpenViewModel.OpenQuicklySearchResult ) { self.baseDirectory = baseDirectory - self.fileURL = fileURL - self.textToMatch = textToMatch + self.searchResult = searchResult } var relativePathComponents: ArraySlice { - return fileURL.pathComponents.dropFirst(baseDirectory.pathComponents.count).dropLast() + return searchResult.fileURL.pathComponents.dropFirst(baseDirectory.pathComponents.count).dropLast() } var body: some View { HStack(spacing: 8) { - Image(nsImage: NSWorkspace.shared.icon(forFile: fileURL.path)) + Image(nsImage: NSWorkspace.shared.icon(forFile: searchResult.fileURL.path)) .resizable() .aspectRatio(contentMode: .fit) .frame(width: 24, height: 24) VStack(alignment: .leading, spacing: 0) { - QuickSearchResultLabel(labelName: fileURL.lastPathComponent, textToMatch: textToMatch) + QuickSearchResultLabel( + labelName: searchResult.fileURL.lastPathComponent, + charactersToHighlight: searchResult.matchedCharacters + ) Text(relativePathComponents.joined(separator: " ▸ ")) .font(.system(size: 10.5)) .foregroundColor(.secondary) diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift index 7159d12a78..fa94bacc64 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift @@ -37,16 +37,19 @@ struct QuickOpenView: View { SearchPanelView( title: "Open Quickly", image: Image(systemName: "magnifyingglass"), - options: $state.openQuicklyFiles, + options: $state.openQuicklySearchResults, text: $state.openQuicklyQuery, optionRowHeight: 40 - ) { file in - QuickOpenItem(baseDirectory: state.fileURL, fileURL: file, textToMatch: state.openQuicklyQuery) - } preview: { fileURL in - QuickOpenPreviewView(item: CEWorkspaceFile(url: fileURL)) - } onRowClick: { fileURL in + ) { searchResult in + QuickOpenItem( + baseDirectory: state.fileURL, + searchResult: searchResult + ) + } preview: { searchResult in + QuickOpenPreviewView(item: CEWorkspaceFile(url: searchResult.fileURL)) + } onRowClick: { searchResult in guard let file = workspace.workspaceFileManager?.getFile( - fileURL.relativePath, + searchResult.fileURL.relativePath, createIfNotFound: true ) else { return diff --git a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift index 517f6bb73d..05845a2c4d 100644 --- a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift +++ b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift @@ -11,8 +11,9 @@ import SwiftUI /// the only way to fallback to UIKit and have NSViewRepresentable to be a bridge between UIKit and SwiftUI. /// Highlights currently entered text query struct QuickSearchResultLabel: NSViewRepresentable { - var labelName: String - var textToMatch: String + let labelName: String + let charactersToHighlight: [NSRange] + var nsLabelName: NSAttributedString? public func makeNSView(context: Context) -> some NSTextField { let label = NSTextField(wrappingLabelWithString: labelName) @@ -26,24 +27,21 @@ struct QuickSearchResultLabel: NSViewRepresentable { label.cell?.truncatesLastVisibleLine = true label.cell?.wraps = true label.maximumNumberOfLines = 1 - label.attributedStringValue = highlight() + label.attributedStringValue = nsLabelName ?? highlight() return label } func highlight() -> NSAttributedString { let attribText = NSMutableAttributedString(string: self.labelName) - let range: NSRange = attribText.mutableString.range( - of: self.textToMatch, - options: NSString.CompareOptions.caseInsensitive - ) - attribText.addAttribute(.foregroundColor, value: NSColor(Color(.labelColor)), range: range) - attribText.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize), range: range) - + for range in charactersToHighlight { + attribText.addAttribute(.foregroundColor, value: NSColor(Color(.labelColor)), range: range) + attribText.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize), range: range) + } return attribText } func updateNSView(_ nsView: NSViewType, context: Context) { - nsView.textColor = textToMatch.isEmpty ? .labelColor : .secondaryLabelColor - nsView.attributedStringValue = highlight() + nsView.textColor = nsLabelName == nil && charactersToHighlight.isEmpty ? .labelColor : .secondaryLabelColor + nsView.attributedStringValue = nsLabelName ?? highlight() } } From 00f651c7c25c5bb2c7a98e6f65e19caffdde2fbc Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:08:37 +0100 Subject: [PATCH 04/17] refactor: rename `state` to `quickOpenViewModel` in QuickOpenView --- .../Features/QuickOpen/Views/QuickOpenView.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift index fa94bacc64..bafc99be56 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift @@ -19,7 +19,7 @@ struct QuickOpenView: View { private let onClose: () -> Void private let openFile: (CEWorkspaceFile) -> Void - @ObservedObject private var state: QuickOpenViewModel + @ObservedObject private var quickOpenViewModel: QuickOpenViewModel @State private var selectedItem: CEWorkspaceFile? @@ -28,7 +28,7 @@ struct QuickOpenView: View { onClose: @escaping () -> Void, openFile: @escaping (CEWorkspaceFile) -> Void ) { - self.state = state + self.quickOpenViewModel = state self.onClose = onClose self.openFile = openFile } @@ -37,12 +37,12 @@ struct QuickOpenView: View { SearchPanelView( title: "Open Quickly", image: Image(systemName: "magnifyingglass"), - options: $state.openQuicklySearchResults, - text: $state.openQuicklyQuery, + options: $quickOpenViewModel.openQuicklySearchResults, + text: $quickOpenViewModel.openQuicklyQuery, optionRowHeight: 40 ) { searchResult in QuickOpenItem( - baseDirectory: state.fileURL, + baseDirectory: quickOpenViewModel.fileURL, searchResult: searchResult ) } preview: { searchResult in @@ -55,13 +55,13 @@ struct QuickOpenView: View { return } openFile(file) - state.openQuicklyQuery = "" + quickOpenViewModel.openQuicklyQuery = "" onClose() } onClose: { onClose() } - .onReceive(state.$openQuicklyQuery.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in - state.fetchOpenQuickly() + .onReceive(quickOpenViewModel.$openQuicklyQuery.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in + quickOpenViewModel.fetchOpenQuickly() } } } From 63507bf5e533092487626d0ab0475e07f1b1972a Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:11:02 +0100 Subject: [PATCH 05/17] refactor: rename published properties in `QuickOpenViewModel` --- .../ViewModels/QuickOpenViewModel.swift | 18 +++++++++--------- .../QuickOpen/Views/QuickOpenView.swift | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift index 27ee8677b4..10c03aeeb3 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift @@ -10,9 +10,9 @@ import Foundation import CollectionConcurrencyKit final class QuickOpenViewModel: ObservableObject { - @Published var openQuicklyQuery: String = "" - @Published var openQuicklySearchResults: [OpenQuicklySearchResult] = [] - @Published var isShowingOpenQuicklyFiles: Bool = false + @Published var query: String = "" + @Published var searchResults: [OpenQuicklySearchResult] = [] + @Published var showingSearchResults: Bool = false let fileURL: URL var runningTask: Task? @@ -32,9 +32,9 @@ final class QuickOpenViewModel: ObservableObject { func fetchOpenQuickly() { let startTime = Date() - guard openQuicklyQuery != "" else { - openQuicklySearchResults = [] - self.isShowingOpenQuicklyFiles = !openQuicklySearchResults.isEmpty + guard query != "" else { + searchResults = [] + self.showingSearchResults = !searchResults.isEmpty return } @@ -62,7 +62,7 @@ final class QuickOpenViewModel: ObservableObject { } let fuzzySearchResults = await filteredFiles.fuzzySearch( - query: self.openQuicklyQuery.trimmingCharacters(in: .whitespaces) + query: self.query.trimmingCharacters(in: .whitespaces) ).concurrentMap { OpenQuicklySearchResult( fileURL: $0.item, @@ -72,8 +72,8 @@ final class QuickOpenViewModel: ObservableObject { guard !Task.isCancelled else { return } await MainActor.run { - self.openQuicklySearchResults = fuzzySearchResults - self.isShowingOpenQuicklyFiles = !self.openQuicklySearchResults.isEmpty + self.searchResults = fuzzySearchResults + self.showingSearchResults = !self.searchResults.isEmpty print("Duration: \(Date().timeIntervalSince(startTime))") } } diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift index bafc99be56..0592ca2ff7 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift @@ -37,8 +37,8 @@ struct QuickOpenView: View { SearchPanelView( title: "Open Quickly", image: Image(systemName: "magnifyingglass"), - options: $quickOpenViewModel.openQuicklySearchResults, - text: $quickOpenViewModel.openQuicklyQuery, + options: $quickOpenViewModel.searchResults, + text: $quickOpenViewModel.query, optionRowHeight: 40 ) { searchResult in QuickOpenItem( @@ -55,12 +55,12 @@ struct QuickOpenView: View { return } openFile(file) - quickOpenViewModel.openQuicklyQuery = "" + quickOpenViewModel.query = "" onClose() } onClose: { onClose() } - .onReceive(quickOpenViewModel.$openQuicklyQuery.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in + .onReceive(quickOpenViewModel.$query.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in quickOpenViewModel.fetchOpenQuickly() } } From cf763162f87a10a31144c8f78770aa6ba94efcfa Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:11:56 +0100 Subject: [PATCH 06/17] refactor: remove unused var `showingSearchResults` in QuickOpenViewModel --- .../Features/QuickOpen/ViewModels/QuickOpenViewModel.swift | 3 --- 1 file changed, 3 deletions(-) diff --git a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift index 10c03aeeb3..827c2342b4 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift @@ -12,7 +12,6 @@ import CollectionConcurrencyKit final class QuickOpenViewModel: ObservableObject { @Published var query: String = "" @Published var searchResults: [OpenQuicklySearchResult] = [] - @Published var showingSearchResults: Bool = false let fileURL: URL var runningTask: Task? @@ -34,7 +33,6 @@ final class QuickOpenViewModel: ObservableObject { let startTime = Date() guard query != "" else { searchResults = [] - self.showingSearchResults = !searchResults.isEmpty return } @@ -73,7 +71,6 @@ final class QuickOpenViewModel: ObservableObject { guard !Task.isCancelled else { return } await MainActor.run { self.searchResults = fuzzySearchResults - self.showingSearchResults = !self.searchResults.isEmpty print("Duration: \(Date().timeIntervalSince(startTime))") } } From 29e6d88d552b549282e92cdc75f3655bd433969f Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:13:48 +0100 Subject: [PATCH 07/17] refactor: rename `OpenQuicklySearchResult` to `SearchResult` --- .../Features/QuickOpen/ViewModels/QuickOpenViewModel.swift | 6 +++--- CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift index 827c2342b4..1a38c0cb6a 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift @@ -11,7 +11,7 @@ import CollectionConcurrencyKit final class QuickOpenViewModel: ObservableObject { @Published var query: String = "" - @Published var searchResults: [OpenQuicklySearchResult] = [] + @Published var searchResults: [SearchResult] = [] let fileURL: URL var runningTask: Task? @@ -23,7 +23,7 @@ final class QuickOpenViewModel: ObservableObject { /// This is used to populate the ``QuickOpenItem`` view which shows the search results to the user. /// /// ``QuickOpenPreviewView`` also uses this to load the `fileUrl` for preview. - struct OpenQuicklySearchResult: Identifiable, Hashable { + struct SearchResult: Identifiable, Hashable { var id: String { fileURL.absoluteString } let fileURL: URL let matchedCharacters: [NSRange] @@ -62,7 +62,7 @@ final class QuickOpenViewModel: ObservableObject { let fuzzySearchResults = await filteredFiles.fuzzySearch( query: self.query.trimmingCharacters(in: .whitespaces) ).concurrentMap { - OpenQuicklySearchResult( + SearchResult( fileURL: $0.item, matchedCharacters: $0.result.matchedParts ) diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift index be70e5afb5..26fbb8ead3 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift @@ -9,11 +9,11 @@ import SwiftUI struct QuickOpenItem: View { private let baseDirectory: URL - private let searchResult: QuickOpenViewModel.OpenQuicklySearchResult + private let searchResult: QuickOpenViewModel.SearchResult init( baseDirectory: URL, - searchResult: QuickOpenViewModel.OpenQuicklySearchResult + searchResult: QuickOpenViewModel.SearchResult ) { self.baseDirectory = baseDirectory self.searchResult = searchResult From c1dd928cbdd5ff63c19d8630d56bd3b17a941ebd Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:17:04 +0100 Subject: [PATCH 08/17] refactor: rename `QuickOpenViewModel` to `OpenQuicklyViewModel` --- CodeEdit.xcodeproj/project.pbxproj | 8 ++++---- .../Controllers/CodeEditWindowController.swift | 2 +- .../Features/Documents/WorkspaceDocument.swift | 4 ++-- ...wModel.swift => OpenQuicklyViewModel.swift} | 4 ++-- .../QuickOpen/Views/QuickOpenItem.swift | 4 ++-- .../QuickOpen/Views/QuickOpenView.swift | 18 +++++++++--------- Documentation.docc/Documentation.md | 2 +- 7 files changed, 21 insertions(+), 21 deletions(-) rename CodeEdit/Features/QuickOpen/ViewModels/{QuickOpenViewModel.swift => OpenQuicklyViewModel.swift} (96%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 7599e20e76..cb68332759 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -132,7 +132,7 @@ 5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */; }; 5878DAA5291AE76700DD95A3 /* QuickOpenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA1291AE76700DD95A3 /* QuickOpenView.swift */; }; 5878DAA6291AE76700DD95A3 /* QuickOpenPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */; }; - 5878DAA7291AE76700DD95A3 /* QuickOpenViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA3291AE76700DD95A3 /* QuickOpenViewModel.swift */; }; + 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */; }; 5878DAA8291AE76700DD95A3 /* QuickOpenItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */; }; 5878DAB0291D627C00DD95A3 /* EditorPathBarMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAD291D627C00DD95A3 /* EditorPathBarMenu.swift */; }; 5878DAB1291D627C00DD95A3 /* EditorPathBarComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAE291D627C00DD95A3 /* EditorPathBarComponent.swift */; }; @@ -751,7 +751,7 @@ 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgementsViewModel.swift; sourceTree = ""; }; 5878DAA1291AE76700DD95A3 /* QuickOpenView.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenView.swift; sourceTree = ""; wrapsLines = 1; }; 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenPreviewView.swift; sourceTree = ""; }; - 5878DAA3291AE76700DD95A3 /* QuickOpenViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenViewModel.swift; sourceTree = ""; }; + 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyViewModel.swift; sourceTree = ""; }; 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenItem.swift; sourceTree = ""; }; 5878DAAD291D627C00DD95A3 /* EditorPathBarMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorPathBarMenu.swift; sourceTree = ""; }; 5878DAAE291D627C00DD95A3 /* EditorPathBarComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorPathBarComponent.swift; sourceTree = ""; }; @@ -1782,7 +1782,7 @@ 5878DAAA291D5CAA00DD95A3 /* ViewModels */ = { isa = PBXGroup; children = ( - 5878DAA3291AE76700DD95A3 /* QuickOpenViewModel.swift */, + 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */, 613899BB2B6E709C00A5CAF6 /* URL+FuzzySearchable.swift */, ); path = ViewModels; @@ -3621,7 +3621,7 @@ 587B9E6B29301D8F00AC7927 /* GitLabAvatarURL.swift in Sources */, 58798233292E30B90085B254 /* FeedbackToolbar.swift in Sources */, 587B9E6829301D8F00AC7927 /* GitLabAccountModel.swift in Sources */, - 5878DAA7291AE76700DD95A3 /* QuickOpenViewModel.swift in Sources */, + 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */, 6CFF967429BEBCC300182D6F /* FindCommands.swift in Sources */, 587B9E6529301D8F00AC7927 /* GitLabGroupAccess.swift in Sources */, 6C91D57229B176FF0059A90D /* EditorManager.swift in Sources */, diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 0b4066585d..321ed15c4e 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -126,7 +126,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs } @IBAction func openQuickly(_ sender: Any) { - if let workspace, let state = workspace.quickOpenViewModel { + if let workspace, let state = workspace.openQuicklyViewModel { if let quickOpenPanel { if quickOpenPanel.isKeyWindow { quickOpenPanel.close() diff --git a/CodeEdit/Features/Documents/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument.swift index c7edd7bcc5..f813e9b550 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument.swift @@ -34,7 +34,7 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { var statusBarViewModel = StatusBarViewModel() var utilityAreaModel = UtilityAreaViewModel() var searchState: SearchState? - var quickOpenViewModel: QuickOpenViewModel? + var openQuicklyViewModel: OpenQuicklyViewModel? var commandsPaletteState: QuickActionsViewModel? var listenerModel: WorkspaceNotificationModel = .init() var sourceControlManager: SourceControlManager? @@ -123,7 +123,7 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { self.sourceControlManager = sourceControlManager sourceControlManager.fileManager = workspaceFileManager self.searchState = .init(self) - self.quickOpenViewModel = .init(fileURL: url) + self.openQuicklyViewModel = .init(fileURL: url) self.commandsPaletteState = .init() editorManager.restoreFromState(self) diff --git a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift similarity index 96% rename from CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift rename to CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift index 1a38c0cb6a..f33346a748 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/QuickOpenViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift @@ -1,5 +1,5 @@ // -// QuickOpenState.swift +// OpenQuicklyViewModel.swift // CodeEditModules/QuickOpen // // Created by Marco Carnevali on 05/04/22. @@ -9,7 +9,7 @@ import Combine import Foundation import CollectionConcurrencyKit -final class QuickOpenViewModel: ObservableObject { +final class OpenQuicklyViewModel: ObservableObject { @Published var query: String = "" @Published var searchResults: [SearchResult] = [] diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift index 26fbb8ead3..6257d111b1 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift @@ -9,11 +9,11 @@ import SwiftUI struct QuickOpenItem: View { private let baseDirectory: URL - private let searchResult: QuickOpenViewModel.SearchResult + private let searchResult: OpenQuicklyViewModel.SearchResult init( baseDirectory: URL, - searchResult: QuickOpenViewModel.SearchResult + searchResult: OpenQuicklyViewModel.SearchResult ) { self.baseDirectory = baseDirectory self.searchResult = searchResult diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift index 0592ca2ff7..0cfcd9308d 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift +++ b/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift @@ -19,16 +19,16 @@ struct QuickOpenView: View { private let onClose: () -> Void private let openFile: (CEWorkspaceFile) -> Void - @ObservedObject private var quickOpenViewModel: QuickOpenViewModel + @ObservedObject private var openQuicklyViewModel: OpenQuicklyViewModel @State private var selectedItem: CEWorkspaceFile? init( - state: QuickOpenViewModel, + state: OpenQuicklyViewModel, onClose: @escaping () -> Void, openFile: @escaping (CEWorkspaceFile) -> Void ) { - self.quickOpenViewModel = state + self.openQuicklyViewModel = state self.onClose = onClose self.openFile = openFile } @@ -37,12 +37,12 @@ struct QuickOpenView: View { SearchPanelView( title: "Open Quickly", image: Image(systemName: "magnifyingglass"), - options: $quickOpenViewModel.searchResults, - text: $quickOpenViewModel.query, + options: $openQuicklyViewModel.searchResults, + text: $openQuicklyViewModel.query, optionRowHeight: 40 ) { searchResult in QuickOpenItem( - baseDirectory: quickOpenViewModel.fileURL, + baseDirectory: openQuicklyViewModel.fileURL, searchResult: searchResult ) } preview: { searchResult in @@ -55,13 +55,13 @@ struct QuickOpenView: View { return } openFile(file) - quickOpenViewModel.query = "" + openQuicklyViewModel.query = "" onClose() } onClose: { onClose() } - .onReceive(quickOpenViewModel.$query.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in - quickOpenViewModel.fetchOpenQuickly() + .onReceive(openQuicklyViewModel.$query.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in + openQuicklyViewModel.fetchOpenQuickly() } } } diff --git a/Documentation.docc/Documentation.md b/Documentation.docc/Documentation.md index 5825064d5c..f9dadc8650 100644 --- a/Documentation.docc/Documentation.md +++ b/Documentation.docc/Documentation.md @@ -71,7 +71,7 @@ - ``QuickOpenView`` - ``QuickOpenItem`` -- ``QuickOpenViewModel`` +- ``OpenQuicklyViewModel`` - ``QuickOpenPreviewView`` ### Search From a267072aefdd6174cdddb80188fff0ac64a20284 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:20:34 +0100 Subject: [PATCH 09/17] refactor: rename `QuickOpenView` to `OpenQuicklyView` --- CodeEdit.xcodeproj/project.pbxproj | 8 ++++---- .../Features/CEWorkspace/Models/CEWorkspaceFile.swift | 2 +- .../Documents/Controllers/CodeEditWindowController.swift | 2 +- .../Views/{QuickOpenView.swift => OpenQuicklyView.swift} | 4 ++-- Documentation.docc/Documentation.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename CodeEdit/Features/QuickOpen/Views/{QuickOpenView.swift => OpenQuicklyView.swift} (97%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index cb68332759..293f8f926b 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -130,7 +130,7 @@ 5878DA82291863F900DD95A3 /* AcknowledgementsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA81291863F900DD95A3 /* AcknowledgementsView.swift */; }; 5878DA842918642000DD95A3 /* ParsePackagesResolved.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */; }; 5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */; }; - 5878DAA5291AE76700DD95A3 /* QuickOpenView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA1291AE76700DD95A3 /* QuickOpenView.swift */; }; + 5878DAA5291AE76700DD95A3 /* OpenQuicklyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */; }; 5878DAA6291AE76700DD95A3 /* QuickOpenPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */; }; 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */; }; 5878DAA8291AE76700DD95A3 /* QuickOpenItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */; }; @@ -749,7 +749,7 @@ 5878DA81291863F900DD95A3 /* AcknowledgementsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgementsView.swift; sourceTree = ""; }; 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParsePackagesResolved.swift; sourceTree = ""; }; 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgementsViewModel.swift; sourceTree = ""; }; - 5878DAA1291AE76700DD95A3 /* QuickOpenView.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenView.swift; sourceTree = ""; wrapsLines = 1; }; + 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyView.swift; sourceTree = ""; wrapsLines = 1; }; 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenPreviewView.swift; sourceTree = ""; }; 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyViewModel.swift; sourceTree = ""; }; 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenItem.swift; sourceTree = ""; }; @@ -1772,7 +1772,7 @@ isa = PBXGroup; children = ( 6CABB19C29C5591D00340467 /* NSTableViewWrapper.swift */, - 5878DAA1291AE76700DD95A3 /* QuickOpenView.swift */, + 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */, 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */, 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */, ); @@ -3937,7 +3937,7 @@ B62AEDC92A2704F3009A9F52 /* UtilityAreaTabView.swift in Sources */, 30B088052C0D53080063A882 /* LanguageServer+DocumentLink.swift in Sources */, 58798250292E78D80085B254 /* CodeFileDocument.swift in Sources */, - 5878DAA5291AE76700DD95A3 /* QuickOpenView.swift in Sources */, + 5878DAA5291AE76700DD95A3 /* OpenQuicklyView.swift in Sources */, 201169D72837B2E300F92B46 /* SourceControlNavigatorView.swift in Sources */, 30B088162C0D53080063A882 /* LSPCache.swift in Sources */, B6F0517929D9E3C900D72287 /* SourceControlGitView.swift in Sources */, diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift index 2264d777ba..96eaadbe9f 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift @@ -26,7 +26,7 @@ import Combine /// loading all intermediate subdirectories (from the nearest cached parent to the file) has not been done yet and doing /// so would be unnecessary. /// -/// An example of this is in the ``QuickOpenView``. This view finds a file URL via a search bar, and needs to display a +/// An example of this is in the ``OpenQuicklyView``. This view finds a file URL via a search bar, and needs to display a /// quick preview of the file. There's a good chance the file is deep in some subdirectory of the workspace, so fetching /// it from the ``CEWorkspaceFileManager`` may require loading and caching multiple directories. Instead, it just /// makes a disconnected object and uses it for the preview. Then, when opening the file in the workspace it forces the diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 321ed15c4e..ec9131dace 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -139,7 +139,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs let panel = SearchPanel() self.quickOpenPanel = panel - let contentView = QuickOpenView(state: state) { + let contentView = OpenQuicklyView(state: state) { panel.close() } openFile: { file in workspace.editorManager.openTab(item: file) diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift similarity index 97% rename from CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift rename to CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift index 0cfcd9308d..4990cba02b 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenView.swift +++ b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift @@ -1,5 +1,5 @@ // -// QuickOpenView.swift +// OpenQuicklyView.swift // CodeEditModules/QuickOpen // // Created by Pavel Kasila on 20.03.22. @@ -13,7 +13,7 @@ extension URL: Identifiable { } } -struct QuickOpenView: View { +struct OpenQuicklyView: View { @EnvironmentObject private var workspace: WorkspaceDocument private let onClose: () -> Void diff --git a/Documentation.docc/Documentation.md b/Documentation.docc/Documentation.md index f9dadc8650..b73ac7f22d 100644 --- a/Documentation.docc/Documentation.md +++ b/Documentation.docc/Documentation.md @@ -69,7 +69,7 @@ ### QuickOpen -- ``QuickOpenView`` +- ``OpenQuicklyView`` - ``QuickOpenItem`` - ``OpenQuicklyViewModel`` - ``QuickOpenPreviewView`` From 5490c565c60c4a35e402d1790bfc58184b0d9b28 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:21:51 +0100 Subject: [PATCH 10/17] refactor: rename `QuickOpenPreviewView` to `OpenQuicklyPreviewView` --- CodeEdit.xcodeproj/project.pbxproj | 8 ++++---- .../QuickOpen/ViewModels/OpenQuicklyViewModel.swift | 2 +- ...OpenPreviewView.swift => OpenQuicklyPreviewView.swift} | 4 ++-- CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift | 2 +- Documentation.docc/Documentation.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename CodeEdit/Features/QuickOpen/Views/{QuickOpenPreviewView.swift => OpenQuicklyPreviewView.swift} (91%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 293f8f926b..6cb2e723b7 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -131,7 +131,7 @@ 5878DA842918642000DD95A3 /* ParsePackagesResolved.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */; }; 5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */; }; 5878DAA5291AE76700DD95A3 /* OpenQuicklyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */; }; - 5878DAA6291AE76700DD95A3 /* QuickOpenPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */; }; + 5878DAA6291AE76700DD95A3 /* OpenQuicklyPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */; }; 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */; }; 5878DAA8291AE76700DD95A3 /* QuickOpenItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */; }; 5878DAB0291D627C00DD95A3 /* EditorPathBarMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAD291D627C00DD95A3 /* EditorPathBarMenu.swift */; }; @@ -750,7 +750,7 @@ 5878DA832918642000DD95A3 /* ParsePackagesResolved.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ParsePackagesResolved.swift; sourceTree = ""; }; 5878DA862918642F00DD95A3 /* AcknowledgementsViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AcknowledgementsViewModel.swift; sourceTree = ""; }; 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyView.swift; sourceTree = ""; wrapsLines = 1; }; - 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenPreviewView.swift; sourceTree = ""; }; + 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyPreviewView.swift; sourceTree = ""; }; 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyViewModel.swift; sourceTree = ""; }; 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenItem.swift; sourceTree = ""; }; 5878DAAD291D627C00DD95A3 /* EditorPathBarMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorPathBarMenu.swift; sourceTree = ""; }; @@ -1773,7 +1773,7 @@ children = ( 6CABB19C29C5591D00340467 /* NSTableViewWrapper.swift */, 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */, - 5878DAA2291AE76700DD95A3 /* QuickOpenPreviewView.swift */, + 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */, 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */, ); path = Views; @@ -3970,7 +3970,7 @@ 043BCF03281DA18A000AC47C /* WorkspaceDocument+SearchState.swift in Sources */, 58822527292C280D00E83CDE /* StatusBarIndentSelector.swift in Sources */, 587B9E9629301D8F00AC7927 /* BitBucketRepositories.swift in Sources */, - 5878DAA6291AE76700DD95A3 /* QuickOpenPreviewView.swift in Sources */, + 5878DAA6291AE76700DD95A3 /* OpenQuicklyPreviewView.swift in Sources */, 58798286292ED0FB0085B254 /* SwiftTerm+Color+Init.swift in Sources */, 30B087FC2C0D53080063A882 /* LanguageServer+CallHierarchy.swift in Sources */, 6CFF967C29BEBD5200182D6F /* WindowCommands.swift in Sources */, diff --git a/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift index f33346a748..bfba0ddc15 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift @@ -22,7 +22,7 @@ final class OpenQuicklyViewModel: ObservableObject { /// This is used to populate the ``QuickOpenItem`` view which shows the search results to the user. /// - /// ``QuickOpenPreviewView`` also uses this to load the `fileUrl` for preview. + /// ``OpenQuicklyPreviewView`` also uses this to load the `fileUrl` for preview. struct SearchResult: Identifiable, Hashable { var id: String { fileURL.absoluteString } let fileURL: URL diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenPreviewView.swift b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyPreviewView.swift similarity index 91% rename from CodeEdit/Features/QuickOpen/Views/QuickOpenPreviewView.swift rename to CodeEdit/Features/QuickOpen/Views/OpenQuicklyPreviewView.swift index caaf72806a..78edae4d3e 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenPreviewView.swift +++ b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyPreviewView.swift @@ -1,5 +1,5 @@ // -// QuickOpenPreviewView.swift +// OpenQuicklyPreviewView.swift // CodeEditModules/QuickOpen // // Created by Pavel Kasila on 20.03.22. @@ -7,7 +7,7 @@ import SwiftUI -struct QuickOpenPreviewView: View { +struct OpenQuicklyPreviewView: View { private let queue = DispatchQueue(label: "app.codeedit.CodeEdit.quickOpen.preview") private let item: CEWorkspaceFile diff --git a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift index 4990cba02b..3f860859b1 100644 --- a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift +++ b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift @@ -46,7 +46,7 @@ struct OpenQuicklyView: View { searchResult: searchResult ) } preview: { searchResult in - QuickOpenPreviewView(item: CEWorkspaceFile(url: searchResult.fileURL)) + OpenQuicklyPreviewView(item: CEWorkspaceFile(url: searchResult.fileURL)) } onRowClick: { searchResult in guard let file = workspace.workspaceFileManager?.getFile( searchResult.fileURL.relativePath, diff --git a/Documentation.docc/Documentation.md b/Documentation.docc/Documentation.md index b73ac7f22d..a841991bc2 100644 --- a/Documentation.docc/Documentation.md +++ b/Documentation.docc/Documentation.md @@ -72,7 +72,7 @@ - ``OpenQuicklyView`` - ``QuickOpenItem`` - ``OpenQuicklyViewModel`` -- ``QuickOpenPreviewView`` +- ``OpenQuicklyPreviewView`` ### Search From 9a28fa2f5ba1dbe3215033d7320e14b028a5eb3a Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:24:41 +0100 Subject: [PATCH 11/17] refactor: rename `QuickOpenItem` to `OpenQuicklyListItemView` --- CodeEdit.xcodeproj/project.pbxproj | 8 ++++---- .../QuickOpen/ViewModels/OpenQuicklyViewModel.swift | 2 +- ...{QuickOpenItem.swift => OpenQuicklyListItemView.swift} | 4 ++-- CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift | 2 +- Documentation.docc/Documentation.md | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) rename CodeEdit/Features/QuickOpen/Views/{QuickOpenItem.swift => OpenQuicklyListItemView.swift} (95%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 6cb2e723b7..3a0bd8f84a 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -133,7 +133,7 @@ 5878DAA5291AE76700DD95A3 /* OpenQuicklyView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */; }; 5878DAA6291AE76700DD95A3 /* OpenQuicklyPreviewView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */; }; 5878DAA7291AE76700DD95A3 /* OpenQuicklyViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */; }; - 5878DAA8291AE76700DD95A3 /* QuickOpenItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */; }; + 5878DAA8291AE76700DD95A3 /* OpenQuicklyListItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */; }; 5878DAB0291D627C00DD95A3 /* EditorPathBarMenu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAD291D627C00DD95A3 /* EditorPathBarMenu.swift */; }; 5878DAB1291D627C00DD95A3 /* EditorPathBarComponent.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAE291D627C00DD95A3 /* EditorPathBarComponent.swift */; }; 5878DAB2291D627C00DD95A3 /* EditorPathBarView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5878DAAF291D627C00DD95A3 /* EditorPathBarView.swift */; }; @@ -752,7 +752,7 @@ 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyView.swift; sourceTree = ""; wrapsLines = 1; }; 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyPreviewView.swift; sourceTree = ""; }; 5878DAA3291AE76700DD95A3 /* OpenQuicklyViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyViewModel.swift; sourceTree = ""; }; - 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QuickOpenItem.swift; sourceTree = ""; }; + 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenQuicklyListItemView.swift; sourceTree = ""; }; 5878DAAD291D627C00DD95A3 /* EditorPathBarMenu.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorPathBarMenu.swift; sourceTree = ""; }; 5878DAAE291D627C00DD95A3 /* EditorPathBarComponent.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorPathBarComponent.swift; sourceTree = ""; }; 5878DAAF291D627C00DD95A3 /* EditorPathBarView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EditorPathBarView.swift; sourceTree = ""; }; @@ -1774,7 +1774,7 @@ 6CABB19C29C5591D00340467 /* NSTableViewWrapper.swift */, 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */, 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */, - 5878DAA4291AE76700DD95A3 /* QuickOpenItem.swift */, + 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */, ); path = Views; sourceTree = ""; @@ -3869,7 +3869,7 @@ B6E41C9429DEAE260088F9F4 /* SourceControlAccount.swift in Sources */, 2806E9022979588B000040F4 /* Contributor.swift in Sources */, 58D01C98293167DC00C5B6B4 /* String+RemoveOccurrences.swift in Sources */, - 5878DAA8291AE76700DD95A3 /* QuickOpenItem.swift in Sources */, + 5878DAA8291AE76700DD95A3 /* OpenQuicklyListItemView.swift in Sources */, 58FD7608291EA1CB0051D6E4 /* QuickActionsViewModel.swift in Sources */, B65B11042B09DB1C002852CF /* GitClient+Fetch.swift in Sources */, 5878DA872918642F00DD95A3 /* AcknowledgementsViewModel.swift in Sources */, diff --git a/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift b/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift index bfba0ddc15..29144d6d89 100644 --- a/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift +++ b/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift @@ -20,7 +20,7 @@ final class OpenQuicklyViewModel: ObservableObject { self.fileURL = fileURL } - /// This is used to populate the ``QuickOpenItem`` view which shows the search results to the user. + /// This is used to populate the ``OpenQuicklyListItemView`` view which shows the search results to the user. /// /// ``OpenQuicklyPreviewView`` also uses this to load the `fileUrl` for preview. struct SearchResult: Identifiable, Hashable { diff --git a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyListItemView.swift similarity index 95% rename from CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift rename to CodeEdit/Features/QuickOpen/Views/OpenQuicklyListItemView.swift index 6257d111b1..6acd23e381 100644 --- a/CodeEdit/Features/QuickOpen/Views/QuickOpenItem.swift +++ b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyListItemView.swift @@ -1,5 +1,5 @@ // -// QuickOpenItem.swift +// OpenQuicklyListItemView.swift // CodeEditModules/QuickOpen // // Created by Pavel Kasila on 20.03.22. @@ -7,7 +7,7 @@ import SwiftUI -struct QuickOpenItem: View { +struct OpenQuicklyListItemView: View { private let baseDirectory: URL private let searchResult: OpenQuicklyViewModel.SearchResult diff --git a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift index 3f860859b1..853a3ba92a 100644 --- a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift +++ b/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift @@ -41,7 +41,7 @@ struct OpenQuicklyView: View { text: $openQuicklyViewModel.query, optionRowHeight: 40 ) { searchResult in - QuickOpenItem( + OpenQuicklyListItemView( baseDirectory: openQuicklyViewModel.fileURL, searchResult: searchResult ) diff --git a/Documentation.docc/Documentation.md b/Documentation.docc/Documentation.md index a841991bc2..3e4fc8b965 100644 --- a/Documentation.docc/Documentation.md +++ b/Documentation.docc/Documentation.md @@ -70,7 +70,7 @@ ### QuickOpen - ``OpenQuicklyView`` -- ``QuickOpenItem`` +- ``OpenQuicklyListItemView`` - ``OpenQuicklyViewModel`` - ``OpenQuicklyPreviewView`` From 4d66417edde122be11bf04208f574a16f3405e1c Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:33:01 +0100 Subject: [PATCH 12/17] refactor: rename `QuickOpen` group to `OpenQuickly` --- CodeEdit.xcodeproj/project.pbxproj | 14 +++++++------- .../ViewModels/OpenQuicklyViewModel.swift | 0 .../ViewModels/URL+FuzzySearchable.swift | 0 .../Views/NSTableViewWrapper.swift | 0 .../Views/OpenQuicklyListItemView.swift | 0 .../Views/OpenQuicklyPreviewView.swift | 0 .../Views/OpenQuicklyView.swift | 0 Documentation.docc/Documentation.md | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) rename CodeEdit/Features/{QuickOpen => OpenQuickly}/ViewModels/OpenQuicklyViewModel.swift (100%) rename CodeEdit/Features/{QuickOpen => OpenQuickly}/ViewModels/URL+FuzzySearchable.swift (100%) rename CodeEdit/Features/{QuickOpen => OpenQuickly}/Views/NSTableViewWrapper.swift (100%) rename CodeEdit/Features/{QuickOpen => OpenQuickly}/Views/OpenQuicklyListItemView.swift (100%) rename CodeEdit/Features/{QuickOpen => OpenQuickly}/Views/OpenQuicklyPreviewView.swift (100%) rename CodeEdit/Features/{QuickOpen => OpenQuickly}/Views/OpenQuicklyView.swift (100%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 3a0bd8f84a..fac9c5c7de 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -325,6 +325,7 @@ 61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */ = {isa = PBXBuildFile; fileRef = 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */; }; 661EF7B82BEE215300C3E577 /* ImageFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7B72BEE215300C3E577 /* ImageFileView.swift */; }; 661EF7BD2BEE215300C3E577 /* LoadingFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */; }; + 664935422C35A5BC00461C35 /* NSTableViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664935412C35A5BC00461C35 /* NSTableViewWrapper.swift */; }; 6653EE552C34817900B82DE2 /* QuickSearchResultLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */; }; 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669BC4072BED306400D1197C /* AnyFileView.swift */; }; 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; @@ -407,7 +408,6 @@ 6CAAF68A29BC9C2300A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CAAF69229BCC71C00A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; 6CAAF69429BCD78600A1F48A /* (null) in Sources */ = {isa = PBXBuildFile; }; - 6CABB19E29C5591D00340467 /* NSTableViewWrapper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CABB19C29C5591D00340467 /* NSTableViewWrapper.swift */; }; 6CABB1A129C5593800340467 /* SearchPanelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CABB1A029C5593800340467 /* SearchPanelView.swift */; }; 6CB446402B6DFF3A00539ED0 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6CB4463F2B6DFF3A00539ED0 /* CodeEditSourceEditor */; }; 6CB52DC92AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6CB52DC82AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift */; }; @@ -944,6 +944,7 @@ 61A53A802B4449F00093BF8A /* WorkspaceDocument+Index.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WorkspaceDocument+Index.swift"; sourceTree = ""; }; 661EF7B72BEE215300C3E577 /* ImageFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFileView.swift; sourceTree = ""; }; 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingFileView.swift; sourceTree = ""; }; + 664935412C35A5BC00461C35 /* NSTableViewWrapper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSTableViewWrapper.swift; sourceTree = ""; }; 6653EE542C34817900B82DE2 /* QuickSearchResultLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = QuickSearchResultLabel.swift; sourceTree = ""; }; 669BC4072BED306400D1197C /* AnyFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyFileView.swift; sourceTree = ""; }; 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; @@ -1012,7 +1013,6 @@ 6C91D57129B176FF0059A90D /* EditorManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorManager.swift; sourceTree = ""; }; 6C97EBCB2978760400302F95 /* AcknowledgementsWindowController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AcknowledgementsWindowController.swift; sourceTree = ""; }; 6CA1AE942B46950000378EAB /* EditorInstance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EditorInstance.swift; sourceTree = ""; }; - 6CABB19C29C5591D00340467 /* NSTableViewWrapper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NSTableViewWrapper.swift; path = CodeEdit/Features/QuickOpen/Views/NSTableViewWrapper.swift; sourceTree = SOURCE_ROOT; }; 6CABB1A029C5593800340467 /* SearchPanelView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchPanelView.swift; sourceTree = ""; }; 6CB52DC82AC8DC3E002E75B3 /* CEWorkspaceFileManager+FileManagement.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFileManager+FileManagement.swift"; sourceTree = ""; }; 6CBA0D502A1BF524002C6FAA /* SegmentedControlImproved.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegmentedControlImproved.swift; sourceTree = ""; }; @@ -1595,7 +1595,7 @@ 58A5DF9D29339F6400D1BD5D /* Keybindings */, 30B087FB2C0D53080063A882 /* LSP */, 287776EA27E350A100D46668 /* NavigatorArea */, - 5878DAA0291AE76700DD95A3 /* QuickOpen */, + 5878DAA0291AE76700DD95A3 /* OpenQuickly */, 58798210292D92370085B254 /* Search */, B67B270029D7868000FB9301 /* Settings */, 6C147C4729A329E50089B630 /* SplitView */, @@ -1759,19 +1759,19 @@ path = ViewModels; sourceTree = ""; }; - 5878DAA0291AE76700DD95A3 /* QuickOpen */ = { + 5878DAA0291AE76700DD95A3 /* OpenQuickly */ = { isa = PBXGroup; children = ( 5878DAAA291D5CAA00DD95A3 /* ViewModels */, 5878DAA9291D5CA100DD95A3 /* Views */, ); - path = QuickOpen; + path = OpenQuickly; sourceTree = ""; }; 5878DAA9291D5CA100DD95A3 /* Views */ = { isa = PBXGroup; children = ( - 6CABB19C29C5591D00340467 /* NSTableViewWrapper.swift */, + 664935412C35A5BC00461C35 /* NSTableViewWrapper.swift */, 5878DAA1291AE76700DD95A3 /* OpenQuicklyView.swift */, 5878DAA2291AE76700DD95A3 /* OpenQuicklyPreviewView.swift */, 5878DAA4291AE76700DD95A3 /* OpenQuicklyListItemView.swift */, @@ -3889,7 +3889,6 @@ 587B9E6229301D8F00AC7927 /* GitLabConfiguration.swift in Sources */, 61A53A7E2B4449870093BF8A /* WorkspaceDocument+Find.swift in Sources */, 30B0880A2C0D53080063A882 /* LanguageServer+Hover.swift in Sources */, - 6CABB19E29C5591D00340467 /* NSTableViewWrapper.swift in Sources */, 5879821B292D92370085B254 /* SearchResultMatchModel.swift in Sources */, 6C48B5DA2C0D5FC5001E9955 /* CurrentUser.swift in Sources */, 04BA7C1E2AE2D8A000584E1C /* GitClient+Clone.swift in Sources */, @@ -3954,6 +3953,7 @@ 58D01C99293167DC00C5B6B4 /* String+MD5.swift in Sources */, 20EBB505280C329800F3A5DA /* CommitListItemView.swift in Sources */, 5878DAB2291D627C00DD95A3 /* EditorPathBarView.swift in Sources */, + 664935422C35A5BC00461C35 /* NSTableViewWrapper.swift in Sources */, 04BC1CDE2AD9B4B000A83EA5 /* EditorFileTabCloseButton.swift in Sources */, 6C6BD70129CD172700235D17 /* ExtensionsListView.swift in Sources */, 77A01E362BB428EE00F0EA38 /* CEWorkspaceSettingsPageView.swift in Sources */, diff --git a/CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift similarity index 100% rename from CodeEdit/Features/QuickOpen/ViewModels/OpenQuicklyViewModel.swift rename to CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift diff --git a/CodeEdit/Features/QuickOpen/ViewModels/URL+FuzzySearchable.swift b/CodeEdit/Features/OpenQuickly/ViewModels/URL+FuzzySearchable.swift similarity index 100% rename from CodeEdit/Features/QuickOpen/ViewModels/URL+FuzzySearchable.swift rename to CodeEdit/Features/OpenQuickly/ViewModels/URL+FuzzySearchable.swift diff --git a/CodeEdit/Features/QuickOpen/Views/NSTableViewWrapper.swift b/CodeEdit/Features/OpenQuickly/Views/NSTableViewWrapper.swift similarity index 100% rename from CodeEdit/Features/QuickOpen/Views/NSTableViewWrapper.swift rename to CodeEdit/Features/OpenQuickly/Views/NSTableViewWrapper.swift diff --git a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyListItemView.swift b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyListItemView.swift similarity index 100% rename from CodeEdit/Features/QuickOpen/Views/OpenQuicklyListItemView.swift rename to CodeEdit/Features/OpenQuickly/Views/OpenQuicklyListItemView.swift diff --git a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyPreviewView.swift b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyPreviewView.swift similarity index 100% rename from CodeEdit/Features/QuickOpen/Views/OpenQuicklyPreviewView.swift rename to CodeEdit/Features/OpenQuickly/Views/OpenQuicklyPreviewView.swift diff --git a/CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift similarity index 100% rename from CodeEdit/Features/QuickOpen/Views/OpenQuicklyView.swift rename to CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift diff --git a/Documentation.docc/Documentation.md b/Documentation.docc/Documentation.md index 3e4fc8b965..bdc91525fc 100644 --- a/Documentation.docc/Documentation.md +++ b/Documentation.docc/Documentation.md @@ -67,7 +67,7 @@ - ``LSPClient`` -### QuickOpen +### OpenQuickly - ``OpenQuicklyView`` - ``OpenQuicklyListItemView`` From 758fa7ae1d6b6c057ec0247154eb46dc9108f744 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 16:37:54 +0100 Subject: [PATCH 13/17] refactor: rename `fetchOpenQuickly` to `fetchResults` in OpenQuicklyViewModel --- .../Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift | 2 +- CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift index 29144d6d89..148407cd65 100644 --- a/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift +++ b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift @@ -29,7 +29,7 @@ final class OpenQuicklyViewModel: ObservableObject { let matchedCharacters: [NSRange] } - func fetchOpenQuickly() { + func fetchResults() { let startTime = Date() guard query != "" else { searchResults = [] diff --git a/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift index 853a3ba92a..5bbbbd09c8 100644 --- a/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift +++ b/CodeEdit/Features/OpenQuickly/Views/OpenQuicklyView.swift @@ -61,7 +61,7 @@ struct OpenQuicklyView: View { onClose() } .onReceive(openQuicklyViewModel.$query.debounce(for: 0.2, scheduler: DispatchQueue.main)) { _ in - openQuicklyViewModel.fetchOpenQuickly() + openQuicklyViewModel.fetchResults() } } } From a88a4164449cf6e241da59faf49187ac83fd0956 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 17:17:50 +0100 Subject: [PATCH 14/17] update `SearchResult.id` in OpenQuicklyViewModel --- .../Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift index 148407cd65..358200e63e 100644 --- a/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift +++ b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift @@ -24,7 +24,7 @@ final class OpenQuicklyViewModel: ObservableObject { /// /// ``OpenQuicklyPreviewView`` also uses this to load the `fileUrl` for preview. struct SearchResult: Identifiable, Hashable { - var id: String { fileURL.absoluteString } + var id: String { fileURL.id } let fileURL: URL let matchedCharacters: [NSRange] } From 125d76aa1b583a6acafb4a6a7663563f1793b417 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Wed, 3 Jul 2024 18:15:41 +0100 Subject: [PATCH 15/17] stop highlighted selection from flickering when searching --- .../ViewModels/OpenQuicklyViewModel.swift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift index 358200e63e..9f54bb58e8 100644 --- a/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift +++ b/CodeEdit/Features/OpenQuickly/ViewModels/OpenQuicklyViewModel.swift @@ -27,6 +27,18 @@ final class OpenQuicklyViewModel: ObservableObject { var id: String { fileURL.id } let fileURL: URL let matchedCharacters: [NSRange] + + // This custom Hashable implementation prevents the highlighted + // selection from flickering when searching in 'Open Quickly'. + // + // See https://github.com/CodeEditApp/CodeEdit/pull/1790#issuecomment-2206832901 + // for flickering visuals. + // + // Before commit 0e28b382f59184b7ebe5a7c3295afa3655b7d4e7, only the fileURL + // was retrieved from the search results and it worked as expected. + // + static func == (lhs: Self, rhs: Self) -> Bool { lhs.fileURL == rhs.fileURL } + func hash(into hasher: inout Hasher) { hasher.combine(fileURL) } } func fetchResults() { From da86068bdde7af2cab4dd5fe4e1e1e8d70c061eb Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Thu, 4 Jul 2024 01:03:33 +0100 Subject: [PATCH 16/17] fix SwiftLint violation --- .../Features/CEWorkspace/Models/CEWorkspaceFile.swift | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift index 96eaadbe9f..d6f0fec287 100644 --- a/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift +++ b/CodeEdit/Features/CEWorkspace/Models/CEWorkspaceFile.swift @@ -26,11 +26,11 @@ import Combine /// loading all intermediate subdirectories (from the nearest cached parent to the file) has not been done yet and doing /// so would be unnecessary. /// -/// An example of this is in the ``OpenQuicklyView``. This view finds a file URL via a search bar, and needs to display a -/// quick preview of the file. There's a good chance the file is deep in some subdirectory of the workspace, so fetching -/// it from the ``CEWorkspaceFileManager`` may require loading and caching multiple directories. Instead, it just -/// makes a disconnected object and uses it for the preview. Then, when opening the file in the workspace it forces the -/// file to be loaded and cached. +/// An example of this is in the ``OpenQuicklyView``. This view finds a file URL via a search bar, and needs to display +/// a quick preview of the file. There's a good chance the file is deep in some subdirectory of the workspace, so +/// fetching it from the ``CEWorkspaceFileManager`` may require loading and caching multiple directories. Instead, it +/// just makes a disconnected object and uses it for the preview. Then, when opening the file in the workspace it +/// forces the file to be loaded and cached. final class CEWorkspaceFile: Codable, Comparable, Hashable, Identifiable, EditorTabRepresentable { /// The id of the ``CEWorkspaceFile``. From 443485e66db2bd51ba9979bd55750229ff59a645 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Thu, 4 Jul 2024 14:56:09 +0100 Subject: [PATCH 17/17] change selected row's highlighted text color to white for more contrast See: https://github.com/CodeEditApp/CodeEdit/pull/1790#pullrequestreview-2157695517 --- .../Features/Search/Views/QuickSearchResultLabel.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift index 05845a2c4d..3ed438ac5f 100644 --- a/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift +++ b/CodeEdit/Features/Search/Views/QuickSearchResultLabel.swift @@ -34,14 +34,18 @@ struct QuickSearchResultLabel: NSViewRepresentable { func highlight() -> NSAttributedString { let attribText = NSMutableAttributedString(string: self.labelName) for range in charactersToHighlight { - attribText.addAttribute(.foregroundColor, value: NSColor(Color(.labelColor)), range: range) + attribText.addAttribute(.foregroundColor, value: NSColor.controlTextColor, range: range) attribText.addAttribute(.font, value: NSFont.boldSystemFont(ofSize: NSFont.systemFontSize), range: range) } return attribText } func updateNSView(_ nsView: NSViewType, context: Context) { - nsView.textColor = nsLabelName == nil && charactersToHighlight.isEmpty ? .labelColor : .secondaryLabelColor + nsView.textColor = if nsLabelName == nil && charactersToHighlight.isEmpty { + .controlTextColor + } else { + .secondaryLabelColor + } nsView.attributedStringValue = nsLabelName ?? highlight() } }