Skip to content

Commit 088eecb

Browse files
committed
feat: add cmFoldGutter decorator.
1 parent b8aee19 commit 088eecb

File tree

7 files changed

+59
-11
lines changed

7 files changed

+59
-11
lines changed

Example/Example/ContentView.swift

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ struct ContentView: View {
3737
@State var value: String = jsonString
3838
@State var lineWrapping = false
3939
@State var lineNumber = true
40+
@State var foldGutter = false
4041
@State var readOnly = false
4142
@State var language: Language = .json
4243
@State var theme: Themes = .vscodedark
@@ -50,6 +51,7 @@ struct ContentView: View {
5051
CodeMirror(value: $value)
5152
.cmLineNumber($lineNumber)
5253
.cmLineWrapping($lineWrapping)
54+
.cmFoldGutter($foldGutter)
5355
.cmReadOnly($readOnly)
5456
.cmLanguage($language)
5557
.cmTheme($theme)
@@ -65,18 +67,28 @@ struct ContentView: View {
6567
.frame(maxWidth: .infinity, maxHeight: .infinity)
6668
.safeAreaInset(edge: .bottom, spacing: 0) {
6769
HStack {
68-
Toggle(isOn: $lineNumber, label: { Text("Line Number") })
69-
.toggleStyle(.checkbox)
70-
Toggle(isOn: $lineWrapping, label: { Text("Line Wrapping") })
71-
.toggleStyle(.checkbox)
70+
Menu {
71+
Toggle(isOn: $lineNumber, label: { Text("Line Number") })
72+
.toggleStyle(.checkbox)
73+
Toggle(isOn: $lineWrapping, label: { Text("Line Wrapping") })
74+
.toggleStyle(.checkbox)
75+
Toggle(isOn: $foldGutter, label: { Text("Fold Gutter") })
76+
.toggleStyle(.checkbox)
77+
Toggle(isOn: $readOnly, label: { Text("Read Only") })
78+
.toggleStyle(.checkbox)
79+
} label: {
80+
Image(systemName: "gearshape.fill")
81+
.font(.system(size: 18))
82+
.foregroundColor(.secondary)
83+
}
84+
.menuIndicator(.hidden)
85+
.buttonStyle(.plain)
7286
Button {
7387
count += 1
7488
value = "Hello World! \(count)"
7589
} label: {
7690
Text("SET")
7791
}
78-
Toggle(isOn: $readOnly, label: { Text("Read Only") })
79-
.toggleStyle(.checkbox)
8092
Spacer()
8193
Picker("Lang", selection: $language) {
8294
ForEach(Language.allCases, id: \.rawValue) {

README.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,19 @@ struct ContentView: View {
114114
}
115115
```
116116

117+
**Show Fold Gutter**
118+
119+
```swift
120+
struct ContentView: View {
121+
@State var foldGutter = false
122+
@State var value: String = ""
123+
var body: some View {
124+
CodeMirror(value: $value)
125+
.cmFoldGutter($foldGutter)
126+
}
127+
}
128+
```
129+
117130
**Set Editor Read-Only**
118131

119132
```swift

Sources/CodeMirror/CodeMirror.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,11 @@ public struct CodeMirror: View {
3636
vm.language = value.wrappedValue
3737
return self as CodeMirror
3838
}
39+
/// Set Programming Language
40+
public func cmFoldGutter(_ value: Binding<Bool>) -> CodeMirror {
41+
vm.foldGutter = value.wrappedValue
42+
return self as CodeMirror
43+
}
3944
/// Set Theme
4045
public func cmTheme(_ value: Binding<Themes>) -> CodeMirror {
4146
vm.theme = value.wrappedValue

Sources/CodeMirror/CodeMirrorVM.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ public enum Themes: String, CaseIterable, Hashable {
8686
public class CodeMirrorVM: ObservableObject {
8787
@Published public var lineWrapping = false
8888
@Published public var lineNumber = true
89+
@Published public var foldGutter = false
8990
@Published public var readOnly = false
9091
@Published public var language: Language = .json
9192
@Published public var theme: Themes = .vscodelight
@@ -99,11 +100,13 @@ public class CodeMirrorVM: ObservableObject {
99100
public init(
100101
lineWrapping: Bool = false,
101102
lineNumber: Bool = false,
103+
foldGutter: Bool = false,
102104
language: Language = .json,
103105
theme: Themes = .vscodedark
104106
) {
105107
self.lineWrapping = lineWrapping
106108
self.lineNumber = lineNumber
109+
self.foldGutter = foldGutter
107110
self.readOnly = readOnly
108111
self.language = language
109112
self.theme = theme

Sources/CodeMirror/CodeMirrorView.swift

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,16 @@ public struct CodeMirrorView: NativeView {
8585
)
8686
context.coordinator.queueJavascriptFunction(
8787
JavascriptFunction(
88-
functionString: "CodeMirror.setlineNumber(value)",
88+
functionString: "CodeMirror.setLineNumber(value)",
8989
args: ["value": vm.lineNumber]
9090
)
9191
)
92+
context.coordinator.queueJavascriptFunction(
93+
JavascriptFunction(
94+
functionString: "CodeMirror.setFoldGutter(value)",
95+
args: ["value": vm.foldGutter]
96+
)
97+
)
9298
context.coordinator.queueJavascriptFunction(
9399
JavascriptFunction(
94100
functionString: "CodeMirror.setReadOnly(value)",

Sources/CodeMirror/html/codemirror.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ const listener = new Compartment();
9797
const readOnly = new Compartment();
9898
const lineWrapping = new Compartment();
9999
const lineNumber = new Compartment();
100+
const foldGutterComp = new Compartment();
101+
100102
const SUPPORTED_LANGUAGES_MAP = {
101103
javascript,
102104
jsx: () => javascript({ jsx: true }),
@@ -187,7 +189,6 @@ const editorView = new CodeMirror.EditorView({
187189
highlightActiveLineGutter(),
188190
highlightSpecialChars(),
189191
history(),
190-
foldGutter(),
191192
drawSelection(),
192193
dropCursor(),
193194
indentOnInput(),
@@ -208,6 +209,7 @@ const editorView = new CodeMirror.EditorView({
208209
...completionKeymap,
209210
indentWithTab,
210211
]),
212+
foldGutterComp.of([]),
211213
readOnly.of([]),
212214
lineWrapping.of([]),
213215
lineNumber.of([]),
@@ -275,12 +277,18 @@ function setLineWrapping(enabled) {
275277
});
276278
}
277279

278-
function setlineNumber(enabled) {
280+
function setLineNumber(enabled) {
279281
editorView.dispatch({
280282
effects: lineNumber.reconfigure(enabled ? lineNumbers() : []),
281283
});
282284
}
283285

286+
function setFoldGutter(enabled) {
287+
editorView.dispatch({
288+
effects: foldGutterComp.reconfigure(enabled ? foldGutter() : []),
289+
});
290+
}
291+
284292
export {
285293
setLanguage,
286294
getSupportedLanguages,
@@ -290,6 +298,7 @@ export {
290298
setReadOnly,
291299
setTheme,
292300
setLineWrapping,
293-
setlineNumber,
301+
setLineNumber,
302+
setFoldGutter,
294303
editorView,
295304
};

Sources/CodeMirror/html/web.bundle/codemirror.bundle.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)