From 51a24cd566bbbb17202e0e2f1beb01ba37a3f2bc Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Sat, 24 Feb 2024 15:41:44 -0600 Subject: [PATCH 1/3] Highlight on Editing, Changing Language, Font Change --- .../CodeEditSourceEditor.swift | 10 +++++++++- .../Highlighting/Highlighter.swift | 14 ++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/Sources/CodeEditSourceEditor/CodeEditSourceEditor.swift b/Sources/CodeEditSourceEditor/CodeEditSourceEditor.swift index 446ec7a8b..99221d9b1 100644 --- a/Sources/CodeEditSourceEditor/CodeEditSourceEditor.swift +++ b/Sources/CodeEditSourceEditor/CodeEditSourceEditor.swift @@ -156,12 +156,16 @@ public struct CodeEditSourceEditor: NSViewControllerRepresentable { return } - controller.font = font + if controller.font != font { + controller.font = font + } + controller.wrapLines = wrapLines controller.useThemeBackground = useThemeBackground controller.lineHeightMultiple = lineHeight controller.editorOverscroll = editorOverscroll controller.contentInsets = contentInsets + if controller.isEditable != isEditable { controller.isEditable = isEditable } @@ -173,15 +177,19 @@ public struct CodeEditSourceEditor: NSViewControllerRepresentable { if controller.language.id != language.id { controller.language = language } + if controller.theme != theme { controller.theme = theme } + if controller.indentOption != indentOption { controller.indentOption = indentOption } + if controller.tabWidth != tabWidth { controller.tabWidth = tabWidth } + if controller.letterSpacing != letterSpacing { controller.letterSpacing = letterSpacing } diff --git a/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift b/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift index 8beebf067..b08646aed 100644 --- a/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift +++ b/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift @@ -36,10 +36,6 @@ class Highlighter: NSObject { return IndexSet(integersIn: textView?.visibleTextRange ?? NSRange()) }() - // MARK: - Tasks - - private var runningTasks: [UUID: Task] = [:] - // MARK: - UI /// The text view to highlight @@ -114,7 +110,15 @@ class Highlighter: NSObject { /// - Parameter language: The language to update to. public func setLanguage(language: CodeLanguage) { guard let textView = self.textView else { return } + // Remove all current highlights. Makes the language setting feel snappier and tells the user we're doing + // something immediately. + validSet.removeAll() + pendingSet.removeAll() highlightProvider?.setUp(textView: textView, codeLanguage: language) + textView.textStorage.setAttributes( + attributeProvider.attributesFor(nil), + range: NSRange(location: 0, length: textView.textStorage.length) + ) invalidate() } @@ -307,8 +311,6 @@ extension Highlighter { highlightProvider?.applyEdit(textView: textView, range: range, delta: delta) { [weak self] invalidIndexSet in let indexSet = invalidIndexSet .union(IndexSet(integersIn: editedRange)) - // Only invalidate indices that are visible. - .intersection(self?.visibleSet ?? IndexSet()) for range in indexSet.rangeView { self?.invalidate(range: NSRange(range)) From b5c70065f616db87160ed82c6a7ded73ee2e42cb Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Wed, 28 Feb 2024 22:56:36 -0600 Subject: [PATCH 2/3] Reorder some invalidations --- .../CodeEditSourceEditor/Highlighting/Highlighter.swift | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift b/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift index b08646aed..c6d0fcfda 100644 --- a/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift +++ b/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift @@ -112,13 +112,14 @@ class Highlighter: NSObject { guard let textView = self.textView else { return } // Remove all current highlights. Makes the language setting feel snappier and tells the user we're doing // something immediately. - validSet.removeAll() - pendingSet.removeAll() - highlightProvider?.setUp(textView: textView, codeLanguage: language) textView.textStorage.setAttributes( attributeProvider.attributesFor(nil), range: NSRange(location: 0, length: textView.textStorage.length) ) + textView.layoutManager.invalidateLayoutForRect(textView.visibleRect) + validSet.removeAll() + pendingSet.removeAll() + highlightProvider?.setUp(textView: textView, codeLanguage: language) invalidate() } From 1127507821a02268fc3f57690256c447ac2e55a9 Mon Sep 17 00:00:00 2001 From: Khan Winter <35942988+thecoolwinter@users.noreply.github.com> Date: Wed, 28 Feb 2024 23:09:03 -0600 Subject: [PATCH 3/3] Update visible set --- Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift | 2 ++ Sources/CodeEditSourceEditor/TreeSitter/TreeSitterClient.swift | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift b/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift index c6d0fcfda..b617b98d0 100644 --- a/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift +++ b/Sources/CodeEditSourceEditor/Highlighting/Highlighter.swift @@ -309,6 +309,8 @@ extension Highlighter { visibleSet.insert(range: editedRange) } + updateVisibleSet(textView: textView) + highlightProvider?.applyEdit(textView: textView, range: range, delta: delta) { [weak self] invalidIndexSet in let indexSet = invalidIndexSet .union(IndexSet(integersIn: editedRange)) diff --git a/Sources/CodeEditSourceEditor/TreeSitter/TreeSitterClient.swift b/Sources/CodeEditSourceEditor/TreeSitter/TreeSitterClient.swift index 42ce2263b..cb5ea1f31 100644 --- a/Sources/CodeEditSourceEditor/TreeSitter/TreeSitterClient.swift +++ b/Sources/CodeEditSourceEditor/TreeSitter/TreeSitterClient.swift @@ -218,7 +218,7 @@ public final class TreeSitterClient: HighlightProviding { let longDocument = textView.documentRange.length > Constants.maxSyncContentLength if longEdit || longDocument { - + throw Error.syncUnavailable } try performSync(operation) } catch {