@@ -9,43 +9,53 @@ import SwiftUI
9
9
import RegexBuilder
10
10
import Grape
11
11
import simd
12
+ import Observation
12
13
13
- struct MermaidVisualization : View {
14
+ @Observable
15
+ final class MermaidModel {
16
+ var graphSyntax : String = """
17
+ Alice → Bob
18
+ Bob → Cindy
19
+ Cindy → David
20
+ David → Emily
21
+ Emily → Frank
22
+ Frank → Grace
23
+ Grace → Henry
24
+ Henry → Isabella
25
+ Isabella → Jack
26
+ Jack → Karen
27
+ Karen → Liam
28
+ Liam → Monica
29
+ Monica → Nathan
30
+ Nathan → Olivia
31
+ Olivia → Peter
32
+ Peter → Quinn
33
+ Quinn → Rachel
34
+ Rachel → Steve
35
+ Steve → Tiffany
36
+ Tiffany → Umar
37
+ Umar → Violet
38
+ Violet → William
39
+ William → Xavier
40
+ Xavier → Yolanda
41
+ Yolanda → Zack
42
+ Zack → Alice
43
+ Jack -> Rachel
44
+ Xavier -> José
45
+ José -> アキラ
46
+ アキラ -> Liam
47
+ """
48
+
49
+ var tappedNode : String ? = nil
14
50
15
- @State private var text : String = """
16
- Alice → Bob
17
- Bob → Cindy
18
- Cindy → David
19
- David → Emily
20
- Emily → Frank
21
- Frank → Grace
22
- Grace → Henry
23
- Henry → Isabella
24
- Isabella → Jack
25
- Jack → Karen
26
- Karen → Liam
27
- Liam → Monica
28
- Monica → Nathan
29
- Nathan → Olivia
30
- Olivia → Peter
31
- Peter → Quinn
32
- Quinn → Rachel
33
- Rachel → Steve
34
- Steve → Tiffany
35
- Tiffany → Umar
36
- Umar → Violet
37
- Violet → William
38
- William → Xavier
39
- Xavier → Yolanda
40
- Yolanda → Zack
41
- Zack → Alice
42
- Jack -> Rachel
43
- Xavier -> José
44
- José -> アキラ
45
- アキラ -> Liam
46
- """
51
+ var parsedGraph : ( [ String ] , [ ( String , String ) ] ) {
52
+ parseMermaid ( graphSyntax)
53
+ }
54
+ }
55
+
56
+ struct MermaidVisualization : View {
47
57
48
- @State private var tappedNode : String ? = nil
58
+ @State private var model : MermaidModel = . init ( )
49
59
50
60
// the view for label
51
61
@ViewBuilder
@@ -70,13 +80,9 @@ struct MermaidVisualization: View {
70
80
. padding ( )
71
81
}
72
82
73
- var parsedGraph : ( [ String ] , [ ( String , String ) ] ) {
74
- parseMermaid ( text)
75
- }
76
-
77
83
var body : some View {
84
+ let parsedGraph = model. parsedGraph
78
85
ForceDirectedGraph {
79
-
80
86
Series ( parsedGraph. 0 ) { node in
81
87
NodeMark ( id: node)
82
88
. symbol ( . circle)
@@ -105,29 +111,40 @@ struct MermaidVisualization: View {
105
111
if let nodeID = proxy. locateNode ( at: . init( x: value. x, y: value. y) ) {
106
112
guard let nodeID = nodeID as? String else { return }
107
113
print ( nodeID)
108
- tappedNode = nodeID
114
+ model . tappedNode = nodeID
109
115
}
110
116
}
111
117
} )
112
118
. ignoresSafeArea ( )
113
119
#if !os(visionOS)
114
120
. inspector( isPresented: . constant( true ) ) {
115
- VStack {
116
- Text ( " Tapped: \( tappedNode ?? " nil " ) " )
117
- . font ( . title2)
118
-
119
- Divider ( )
120
-
121
- Text ( " Edit the mermaid syntaxes to update the graph " )
122
- . font ( . title2)
123
- TextEditor ( text: $text)
124
- . fontDesign ( . monospaced)
125
-
126
- } . padding ( . top)
121
+ MermaidInspector ( model: model)
127
122
}
128
123
#endif
124
+ }
125
+ }
129
126
127
+ struct MermaidInspector : View {
128
+
129
+ @State var model : MermaidModel
130
+
131
+ init ( model: MermaidModel ) {
132
+ self . model = model
133
+ }
134
+
135
+ var body : some View {
136
+ VStack {
137
+ Text ( " Tapped: \( model. tappedNode ?? " nil " ) " )
138
+ . font ( . title2)
139
+
140
+ Divider ( )
141
+
142
+ Text ( " Edit the mermaid syntaxes to update the graph " )
143
+ . font ( . title2)
144
+ TextEditor ( text: $model. graphSyntax)
145
+ . fontDesign ( . monospaced)
130
146
147
+ } . padding ( . top)
131
148
}
132
149
}
133
150
0 commit comments