Skip to content

Commit ce8d702

Browse files
committed
Merge branch 'main' into feat/invisible-config
2 parents bb6915e + bcd5f11 commit ce8d702

File tree

6 files changed

+96
-87
lines changed

6 files changed

+96
-87
lines changed

CodeEdit.xcodeproj/project.pbxproj

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6C0824A02C5C0C9700A0751E /* SwiftTerm */; };
2323
6C147C4529A329350089B630 /* OrderedCollections in Frameworks */ = {isa = PBXBuildFile; productRef = 6C147C4429A329350089B630 /* OrderedCollections */; };
2424
6C4E37FC2C73E00700AEE7B5 /* SwiftTerm in Frameworks */ = {isa = PBXBuildFile; productRef = 6C4E37FB2C73E00700AEE7B5 /* SwiftTerm */; };
25-
6C50EF3B2DFC83E4007FE626 /* CodeEditSourceEditor in Frameworks */ = {isa = PBXBuildFile; productRef = 6C50EF3A2DFC83E4007FE626 /* CodeEditSourceEditor */; };
2625
6C66C31329D05CDC00DE9ED2 /* GRDB in Frameworks */ = {isa = PBXBuildFile; productRef = 6C66C31229D05CDC00DE9ED2 /* GRDB */; };
2726
6C6BD6F429CD142C00235D17 /* CollectionConcurrencyKit in Frameworks */ = {isa = PBXBuildFile; productRef = 6C6BD6F329CD142C00235D17 /* CollectionConcurrencyKit */; };
2827
6C6BD6F829CD14D100235D17 /* CodeEditKit in Frameworks */ = {isa = PBXBuildFile; productRef = 6C6BD6F729CD14D100235D17 /* CodeEditKit */; };
@@ -189,7 +188,6 @@
189188
6C0824A12C5C0C9700A0751E /* SwiftTerm in Frameworks */,
190189
6C81916B29B41DD300B75C92 /* DequeModule in Frameworks */,
191190
6CB94D032CA1205100E8651C /* AsyncAlgorithms in Frameworks */,
192-
6C50EF3B2DFC83E4007FE626 /* CodeEditSourceEditor in Frameworks */,
193191
);
194192
runOnlyForDeploymentPostprocessing = 0;
195193
};
@@ -1636,13 +1634,6 @@
16361634
};
16371635
/* End XCConfigurationList section */
16381636

1639-
/* Begin XCLocalSwiftPackageReference section */
1640-
6C50EF392DFC83E4007FE626 /* XCLocalSwiftPackageReference "../CodeEditSourceEditor" */ = {
1641-
isa = XCLocalSwiftPackageReference;
1642-
relativePath = ../CodeEditSourceEditor;
1643-
};
1644-
/* End XCLocalSwiftPackageReference section */
1645-
16461637
/* Begin XCRemoteSwiftPackageReference section */
16471638
2816F592280CF50500DD548B /* XCRemoteSwiftPackageReference "CodeEditSymbols" */ = {
16481639
isa = XCRemoteSwiftPackageReference;
@@ -1788,6 +1779,14 @@
17881779
version = 1.0.1;
17891780
};
17901781
};
1782+
6CF368562DBBD274006A77FD /* XCRemoteSwiftPackageReference "CodeEditSourceEditor" */ = {
1783+
isa = XCRemoteSwiftPackageReference;
1784+
repositoryURL = "https://github.com/CodeEditApp/CodeEditSourceEditor";
1785+
requirement = {
1786+
kind = exactVersion;
1787+
version = 0.14.0;
1788+
};
1789+
};
17911790
/* End XCRemoteSwiftPackageReference section */
17921791

17931792
/* Begin XCSwiftPackageProductDependency section */
@@ -1845,10 +1844,6 @@
18451844
package = 6C4E37FA2C73E00700AEE7B5 /* XCRemoteSwiftPackageReference "SwiftTerm" */;
18461845
productName = SwiftTerm;
18471846
};
1848-
6C50EF3A2DFC83E4007FE626 /* CodeEditSourceEditor */ = {
1849-
isa = XCSwiftPackageProductDependency;
1850-
productName = CodeEditSourceEditor;
1851-
};
18521847
6C66C31229D05CDC00DE9ED2 /* GRDB */ = {
18531848
isa = XCSwiftPackageProductDependency;
18541849
package = 6C66C31129D05CC800DE9ED2 /* XCRemoteSwiftPackageReference "GRDB.swift" */;

CodeEdit.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

CodeEdit/Features/Editor/Views/CodeFileView.swift

Lines changed: 43 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ import Combine
1616
struct CodeFileView: View {
1717
@ObservedObject private var codeFile: CodeFileDocument
1818

19-
/// The current cursor positions in the view
20-
@State private var cursorPositions: [CursorPosition] = []
19+
@State private var editorState: SourceEditorState
2120

2221
@State private var treeSitterClient: TreeSitterClient = TreeSitterClient()
2322

@@ -48,16 +47,16 @@ struct CodeFileView: View {
4847
var bracketEmphasis
4948
@AppSettings(\.textEditing.useSystemCursor)
5049
var useSystemCursor
50+
@AppSettings(\.textEditing.showGutter)
51+
var showGutter
5152
@AppSettings(\.textEditing.showMinimap)
5253
var showMinimap
54+
@AppSettings(\.textEditing.showFoldingRibbon)
55+
var showFoldingRibbon
5356
@AppSettings(\.textEditing.reformatAtColumn)
5457
var reformatAtColumn
5558
@AppSettings(\.textEditing.showReformattingGuide)
5659
var showReformattingGuide
57-
@AppSettings(\.textEditing.invisibleCharacters)
58-
var invisibleCharactersConfig
59-
@AppSettings(\.textEditing.warningCharacters)
60-
var warningCharacters
6160

6261
@Environment(\.colorScheme)
6362
private var colorScheme
@@ -82,7 +81,9 @@ struct CodeFileView: View {
8281

8382
if let openOptions = codeFile.openOptions {
8483
codeFile.openOptions = nil
85-
self.cursorPositions = openOptions.cursorPositions
84+
self.editorState = SourceEditorState(cursorPositions: openOptions.cursorPositions)
85+
} else {
86+
self.editorState = SourceEditorState()
8687
}
8788

8889
updateHighlightProviders()
@@ -95,7 +96,7 @@ struct CodeFileView: View {
9596
}
9697
.store(in: &cancellables)
9798

98-
codeFile.undoManager = self.undoManager.manager
99+
codeFile.undoManager = self.undoManager
99100
}
100101

101102
private var currentTheme: Theme {
@@ -108,32 +109,44 @@ struct CodeFileView: View {
108109
private var edgeInsets
109110

110111
var body: some View {
111-
CodeEditSourceEditor(
112+
SourceEditor(
112113
codeFile.content ?? NSTextStorage(),
113114
language: codeFile.getLanguage(),
114-
theme: currentTheme.editor.editorTheme,
115-
font: font,
116-
tabWidth: codeFile.defaultTabWidth ?? defaultTabWidth,
117-
indentOption: (codeFile.indentOption ?? indentOption).textViewOption(),
118-
lineHeight: lineHeightMultiple,
119-
wrapLines: codeFile.wrapLines ?? wrapLinesToEditorWidth,
120-
editorOverscroll: overscroll.overscrollPercentage,
121-
cursorPositions: $cursorPositions,
122-
useThemeBackground: useThemeBackground,
115+
configuration: SourceEditorConfiguration(
116+
appearance: .init(
117+
theme: currentTheme.editor.editorTheme,
118+
useThemeBackground: useThemeBackground,
119+
font: font,
120+
lineHeightMultiple: lineHeightMultiple,
121+
letterSpacing: letterSpacing,
122+
wrapLines: wrapLinesToEditorWidth,
123+
useSystemCursor: useSystemCursor,
124+
tabWidth: defaultTabWidth,
125+
bracketPairEmphasis: getBracketPairEmphasis()
126+
),
127+
behavior: .init(
128+
isEditable: isEditable,
129+
indentOption: indentOption.textViewOption(),
130+
reformatAtColumn: reformatAtColumn
131+
),
132+
layout: .init(
133+
editorOverscroll: overscroll.overscrollPercentage,
134+
contentInsets: edgeInsets.nsEdgeInsets,
135+
additionalTextInsets: NSEdgeInsets(top: 2, left: 0, bottom: 0, right: 0)
136+
),
137+
peripherals: .init(
138+
showGutter: showGutter,
139+
showMinimap: showMinimap,
140+
showReformattingGuide: showReformattingGuide,
141+
showFoldingRibbon: showFoldingRibbon,
142+
invisibleCharactersConfiguration: .empty,
143+
warningCharacters: []
144+
)
145+
),
146+
state: $editorState,
123147
highlightProviders: highlightProviders,
124-
contentInsets: edgeInsets.nsEdgeInsets,
125-
additionalTextInsets: NSEdgeInsets(top: 2, left: 0, bottom: 0, right: 0),
126-
isEditable: isEditable,
127-
letterSpacing: letterSpacing,
128-
bracketPairEmphasis: getBracketPairEmphasis(),
129-
useSystemCursor: useSystemCursor,
130148
undoManager: undoManager,
131-
coordinators: textViewCoordinators,
132-
showMinimap: showMinimap,
133-
reformatAtColumn: reformatAtColumn,
134-
showReformattingGuide: showReformattingGuide,
135-
invisibleCharactersConfig: invisibleCharactersConfig.textViewOption(),
136-
warningCharacters: warningCharacters.textViewOption()
149+
coordinators: textViewCoordinators
137150
)
138151
.id(codeFile.fileURL)
139152
.background {
@@ -195,31 +208,3 @@ private extension SettingsData.TextEditingSettings.IndentOption {
195208
}
196209
}
197210
}
198-
199-
private extension SettingsData.TextEditingSettings.InvisibleCharactersConfig {
200-
func textViewOption() -> InvisibleCharactersConfig {
201-
guard self.enabled else {
202-
return .empty
203-
}
204-
205-
var config = InvisibleCharactersConfig(
206-
showSpaces: self.showSpaces,
207-
showTabs: self.showTabs,
208-
showLineEndings: self.showLineEndings
209-
)
210-
config.spaceReplacement = self.spaceReplacement
211-
config.tabReplacement = self.tabReplacement
212-
config.lineFeedReplacement = self.lineFeedReplacement
213-
config.carriageReturnReplacement = self.carriageReturnReplacement
214-
config.paragraphSeparatorReplacement = self.paragraphSeparatorReplacement
215-
config.lineSeparatorReplacement = self.lineSeparatorReplacement
216-
return config
217-
}
218-
}
219-
220-
private extension SettingsData.TextEditingSettings.WarningCharacters {
221-
func textViewOption() -> Set<UInt16> {
222-
guard self.enabled else { return [] }
223-
return Set(self.characters.keys)
224-
}
225-
}

CodeEdit/Features/Settings/Pages/TextEditingSettings/Models/TextEditingSettings.swift

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extension SettingsData {
2828
"Enable type-over completion",
2929
"Bracket Pair Emphasis",
3030
"Bracket Pair Highlight",
31+
"Show Gutter",
3132
"Show Minimap",
3233
"Reformat at Column",
3334
"Show Reformatting Guide",
@@ -75,9 +76,15 @@ extension SettingsData {
7576
/// Use the system cursor for the source editor.
7677
var useSystemCursor: Bool = true
7778

79+
/// Toggle the gutter in the editor.
80+
var showGutter: Bool = true
81+
7882
/// Toggle the minimap in the editor.
7983
var showMinimap: Bool = true
8084

85+
/// Toggle the code folding ribbon.
86+
var showFoldingRibbon: Bool = true
87+
8188
/// The column at which to reformat text
8289
var reformatAtColumn: Int = 80
8390

@@ -137,7 +144,9 @@ extension SettingsData {
137144
self.useSystemCursor = false
138145
}
139146

147+
self.showGutter = try container.decodeIfPresent(Bool.self, forKey: .showGutter) ?? true
140148
self.showMinimap = try container.decodeIfPresent(Bool.self, forKey: .showMinimap) ?? true
149+
self.showFoldingRibbon = try container.decodeIfPresent(Bool.self, forKey: .showFoldingRibbon) ?? true
141150
self.reformatAtColumn = try container.decodeIfPresent(Int.self, forKey: .reformatAtColumn) ?? 80
142151
self.showReformattingGuide = try container.decodeIfPresent(
143152
Bool.self,
@@ -186,12 +195,20 @@ extension SettingsData {
186195
}
187196
)
188197

198+
mgr.addCommand(name: "Toggle Minimap", title: "Toggle Minimap", id: "prefs.text_editing.toggle_minimap") {
199+
Settings[\.textEditing].showMinimap.toggle()
200+
}
201+
202+
mgr.addCommand(name: "Toggle Gutter", title: "Toggle Gutter", id: "prefs.text_editing.toggle_gutter") {
203+
Settings[\.textEditing].showGutter.toggle()
204+
}
205+
189206
mgr.addCommand(
190-
name: "Toggle Minimap",
191-
title: "Toggle Minimap",
192-
id: "prefs.text_editing.toggle_minimap"
207+
name: "Toggle Folding Ribbon",
208+
title: "Toggle Folding Ribbon",
209+
id: "prefs.text_editing.toggle_folding_ribbon"
193210
) {
194-
Settings[\.textEditing].showMinimap.toggle()
211+
Settings[\.textEditing].showFoldingRibbon.toggle()
195212
}
196213
}
197214

CodeEdit/Features/Settings/Pages/TextEditingSettings/TextEditingSettingsView.swift

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ struct TextEditingSettingsView: View {
2323
wrapLinesToEditorWidth
2424
useSystemCursor
2525
overscroll
26+
}
27+
Section {
28+
showGutter
2629
showMinimap
30+
showFoldingRibbon
2731
reformatSettings
2832
}
2933
Section {
@@ -209,13 +213,28 @@ private extension TextEditingSettingsView {
209213
}
210214
}
211215

216+
@ViewBuilder private var showGutter: some View {
217+
Toggle("Show Gutter", isOn: $textEditing.showGutter)
218+
.help("The gutter displays line numbers and code folding regions.")
219+
}
220+
212221
@ViewBuilder private var showMinimap: some View {
213222
Toggle("Show Minimap", isOn: $textEditing.showMinimap)
214223
// swiftlint:disable:next line_length
215224
.help("The minimap gives you a high-level summary of your source code, with controls to quickly navigate your document.")
216225
}
217226

227+
@ViewBuilder private var showFoldingRibbon: some View {
228+
Toggle("Show Code Folding Ribbon", isOn: $textEditing.showFoldingRibbon)
229+
.disabled(!textEditing.showGutter) // Disabled when the gutter is disabled
230+
// swiftlint:disable:next line_length
231+
.help("The code folding ribbon lets you fold regions of code. When the gutter is disabled, the folding ribbon is disabled.")
232+
}
233+
218234
@ViewBuilder private var reformatSettings: some View {
235+
Toggle("Show Reformatting Guide", isOn: $textEditing.showReformattingGuide)
236+
.help("Shows a vertical guide at the reformat column.")
237+
219238
Stepper(
220239
"Reformat at Column",
221240
value: Binding<Double>(
@@ -226,10 +245,7 @@ private extension TextEditingSettingsView {
226245
step: 1,
227246
format: .number
228247
)
229-
.help("The column at which text should be reformatted")
230-
231-
Toggle("Show Reformatting Guide", isOn: $textEditing.showReformattingGuide)
232-
.help("Shows a vertical guide at the reformat column")
248+
.help("The column at which text should be reformatted.")
233249
}
234250

235251
@ViewBuilder private var invisibles: some View {

CodeEdit/Features/SplitView/Views/SplitViewControllerView.swift

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,10 +131,6 @@ final class SplitViewController: NSSplitViewController {
131131
}
132132
}
133133

134-
override func splitView(_ splitView: NSSplitView, canCollapseSubview subview: NSView) -> Bool {
135-
false
136-
}
137-
138134
override func splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool {
139135
// For some reason, AppKit _really_ wants to hide dividers when there's only one item (and no dividers)
140136
// so we do this check for them.

0 commit comments

Comments
 (0)