Skip to content

Commit cb9d1e6

Browse files
committed
Improved Config Flexibility
1 parent fe67e0f commit cb9d1e6

File tree

4 files changed

+142
-30
lines changed

4 files changed

+142
-30
lines changed

CodeEdit/Features/Editor/Views/CodeFileView.swift

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,7 @@ struct CodeFileView: View {
144144
showMinimap: showMinimap,
145145
reformatAtColumn: reformatAtColumn,
146146
showReformattingGuide: showReformattingGuide,
147-
invisibleCharactersConfig: .init(
148-
showSpaces: invisibleCharactersConfig.showSpaces,
149-
showTabs: invisibleCharactersConfig.showTabs,
150-
showLineEndings: invisibleCharactersConfig.showLineEndings,
151-
warningCharacters: Set(invisibleCharactersConfig.warningCharacters.keys)
152-
)
147+
invisibleCharactersConfig: invisibleCharactersConfig.textViewOption()
153148
)
154149
.id(codeFile.fileURL)
155150
.background {
@@ -211,3 +206,25 @@ private extension SettingsData.TextEditingSettings.IndentOption {
211206
}
212207
}
213208
}
209+
210+
private extension SettingsData.TextEditingSettings.InvisibleCharactersConfig {
211+
func textViewOption() -> InvisibleCharactersConfig {
212+
guard self.enabled else {
213+
return .empty
214+
}
215+
216+
var config = InvisibleCharactersConfig(
217+
showSpaces: self.showSpaces,
218+
showTabs: self.showTabs,
219+
showLineEndings: self.showLineEndings,
220+
warningCharacters: Set(self.warningCharacters.keys)
221+
)
222+
config.spaceReplacement = self.spaceReplacement
223+
config.tabReplacement = self.tabReplacement
224+
config.lineFeedReplacement = self.lineFeedReplacement
225+
config.carriageReturnReplacement = self.carriageReturnReplacement
226+
config.paragraphSeparatorReplacement = self.paragraphSeparatorReplacement
227+
config.lineSeparatorReplacement = self.lineSeparatorReplacement
228+
return config
229+
}
230+
}

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

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
import SwiftUI
99

1010
struct InvisiblesSettingsView: View {
11-
@AppSettings(\.textEditing)
12-
var textEditing
11+
typealias Config = SettingsData.TextEditingSettings.InvisibleCharactersConfig
12+
13+
@Binding var invisibleCharacters: Config
1314

1415
@Environment(\.dismiss)
1516
private var dismiss
@@ -19,18 +20,87 @@ struct InvisiblesSettingsView: View {
1920
VStack(spacing: 0) {
2021
Form {
2122
Section {
22-
Toggle(isOn: $textEditing.invisibleCharacters.showSpaces) {
23-
Text("Show Spaces")
23+
VStack {
24+
Toggle(isOn: $invisibleCharacters.showSpaces) { Text("Show Spaces") }
25+
if invisibleCharacters.showSpaces {
26+
TextField(
27+
text: $invisibleCharacters.spaceReplacement,
28+
prompt: Text("Default: \(Config.default.spaceReplacement)")
29+
) {
30+
Text("Character used to render spaces")
31+
.foregroundStyle(.secondary)
32+
.font(.caption)
33+
}
34+
.autocorrectionDisabled()
35+
}
2436
}
25-
Toggle(isOn: $textEditing.invisibleCharacters.showTabs) {
26-
Text("Show Tabs")
37+
38+
VStack {
39+
Toggle(isOn: $invisibleCharacters.showTabs) { Text("Show Tabs") }
40+
if invisibleCharacters.showTabs {
41+
TextField(
42+
text: $invisibleCharacters.tabReplacement,
43+
prompt: Text("Default: \(Config.default.tabReplacement)")
44+
) {
45+
Text("Character used to render tabs")
46+
.foregroundStyle(.secondary)
47+
.font(.caption)
48+
}
49+
.autocorrectionDisabled()
50+
}
2751
}
28-
Toggle(isOn: $textEditing.invisibleCharacters.showLineEndings) {
29-
Text("Show Line Endings")
52+
53+
VStack {
54+
Toggle(isOn: $invisibleCharacters.showLineEndings) { Text("Show Line Endings") }
55+
if invisibleCharacters.showLineEndings {
56+
TextField(
57+
text: $invisibleCharacters.lineFeedReplacement,
58+
prompt: Text("Default: \(Config.default.lineFeedReplacement)")
59+
) {
60+
Text("Character used to render line feeds (\\n)")
61+
.foregroundStyle(.secondary)
62+
.font(.caption)
63+
}
64+
.autocorrectionDisabled()
65+
66+
TextField(
67+
text: $invisibleCharacters.carriageReturnReplacement,
68+
prompt: Text("Default: \(Config.default.carriageReturnReplacement)")
69+
) {
70+
Text("Character used to render carriage returns (Microsoft-style line endings)")
71+
.foregroundStyle(.secondary)
72+
.font(.caption)
73+
}
74+
.autocorrectionDisabled()
75+
76+
TextField(
77+
text: $invisibleCharacters.paragraphSeparatorReplacement,
78+
prompt: Text("Default: \(Config.default.paragraphSeparatorReplacement)")
79+
) {
80+
Text("Character used to render paragraph separators")
81+
.foregroundStyle(.secondary)
82+
.font(.caption)
83+
}
84+
.autocorrectionDisabled()
85+
86+
TextField(
87+
text: $invisibleCharacters.lineSeparatorReplacement,
88+
prompt: Text("Default: \(Config.default.lineSeparatorReplacement)")
89+
) {
90+
Text("Character used to render line separators")
91+
.foregroundStyle(.secondary)
92+
.font(.caption)
93+
}
94+
.autocorrectionDisabled()
95+
}
3096
}
97+
} header: {
98+
Text("Invisible Characters")
99+
Text("Toggle whitespace symbols CodeEdit will render with replacement characters.")
31100
}
101+
.textFieldStyle(.roundedBorder)
32102
Section {
33-
InvisibleCharacterWarningList(items: $textEditing.invisibleCharacters.warningCharacters)
103+
InvisibleCharacterWarningList(items: $invisibleCharacters.warningCharacters)
34104
} header: {
35105
Text("Warning Characters")
36106
Text(

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

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,10 @@ extension SettingsData {
234234
struct InvisibleCharactersConfig: Equatable, Hashable, Codable {
235235
static var `default`: InvisibleCharactersConfig = {
236236
InvisibleCharactersConfig(
237-
showSpaces: false,
238-
showTabs: false,
239-
showLineEndings: false,
237+
enabled: false,
238+
showSpaces: true,
239+
showTabs: true,
240+
showLineEndings: true,
240241
warningCharacters: [
241242
0x0003: "End of text",
242243

@@ -257,9 +258,21 @@ extension SettingsData {
257258
)
258259
}()
259260

261+
var enabled: Bool
262+
260263
var showSpaces: Bool
261264
var showTabs: Bool
262265
var showLineEndings: Bool
266+
267+
var spaceReplacement: String = "·"
268+
var tabReplacement: String = ""
269+
270+
// Controlled by `showLineEndings`
271+
var carriageReturnReplacement: String = ""
272+
var lineFeedReplacement: String = "¬"
273+
var paragraphSeparatorReplacement: String = ""
274+
var lineSeparatorReplacement: String = ""
275+
263276
// Map of unicode character codes to a note about them
264277
var warningCharacters: [UInt16: String]
265278
}

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

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -40,18 +40,7 @@ struct TextEditingSettingsView: View {
4040
bracketPairHighlight
4141
}
4242
Section {
43-
HStack {
44-
Text("Invisible Characters")
45-
Spacer()
46-
_DisclosureIndicator()
47-
}
48-
.contentShape(Rectangle())
49-
.onTapGesture {
50-
isShowingInvisibleCharacterSettings = true
51-
}
52-
.sheet(isPresented: $isShowingInvisibleCharacterSettings) {
53-
InvisiblesSettingsView()
54-
}
43+
invisibles
5544
}
5645
}
5746
}
@@ -240,4 +229,27 @@ private extension TextEditingSettingsView {
240229
Toggle("Show Reformatting Guide", isOn: $textEditing.showReformattingGuide)
241230
.help("Shows a vertical guide at the reformat column")
242231
}
232+
233+
@ViewBuilder private var invisibles: some View {
234+
HStack {
235+
Text("Show Invisible Characters")
236+
Spacer()
237+
Toggle(isOn: $textEditing.invisibleCharacters.enabled, label: { EmptyView() })
238+
Button {
239+
isShowingInvisibleCharacterSettings = true
240+
} label: {
241+
Text("Configure...")
242+
}
243+
.disabled(textEditing.invisibleCharacters.enabled == false)
244+
}
245+
.contentShape(Rectangle())
246+
.onTapGesture {
247+
if textEditing.invisibleCharacters.enabled {
248+
isShowingInvisibleCharacterSettings = true
249+
}
250+
}
251+
.sheet(isPresented: $isShowingInvisibleCharacterSettings) {
252+
InvisiblesSettingsView(invisibleCharacters: $textEditing.invisibleCharacters)
253+
}
254+
}
243255
}

0 commit comments

Comments
 (0)