@@ -31,8 +31,20 @@ public string ToFieldDeclaration(UnityFieldDetails fieldDetails)
31
31
}
32
32
33
33
return $ "private readonly { uiType } { fieldDetails . CamelCaseName } Field;";
34
+ case OptionFieldType optionFieldType :
35
+ var innerUiType = GetUiFieldType ( optionFieldType . ContainedType ) ;
36
+
37
+ if ( innerUiType == "" )
38
+ {
39
+ // TODO: Eliminate this case by supporting 'Entity'.
40
+ return "" ;
41
+ }
42
+
43
+ var element = optionFieldType . IsNullable ? "NullableVisualElement" : "OptionVisualElement" ;
44
+
45
+ return $ "private readonly { element } <{ innerUiType } , { optionFieldType . ContainedType . FqnType } > { fieldDetails . CamelCaseName } Field;";
34
46
default :
35
- // TODO: Lists, maps, and options
47
+ // TODO: Lists and maps.
36
48
return "" ;
37
49
}
38
50
}
@@ -66,8 +78,35 @@ public IEnumerable<string> ToFieldInitialisation(UnityFieldDetails fieldDetails,
66
78
67
79
yield return $ "{ parentContainer } .Add({ fieldDetails . CamelCaseName } Field);";
68
80
break ;
81
+ case OptionFieldType optionFieldType :
82
+ var innerUiType = GetUiFieldType ( optionFieldType . ContainedType ) ;
83
+
84
+ if ( innerUiType == "" )
85
+ {
86
+ // TODO: Eliminate this case by supporting 'Entity'.
87
+ yield break ;
88
+ }
89
+
90
+ yield return $ "var { fieldDetails . CamelCaseName } InnerField = new { innerUiType } (\" Value\" );";
91
+
92
+ if ( optionFieldType . ContainedType . Category != ValueType . Type )
93
+ {
94
+ yield return $ "{ fieldDetails . CamelCaseName } InnerField.SetEnabled(false);";
95
+ }
96
+
97
+ if ( optionFieldType . ContainedType . Category == ValueType . Enum )
98
+ {
99
+ yield return $ "{ fieldDetails . CamelCaseName } InnerField.Init(default({ optionFieldType . ContainedType . FqnType } ));";
100
+ }
101
+
102
+ var element = optionFieldType . IsNullable ? "NullableVisualElement" : "OptionVisualElement" ;
103
+
104
+ yield return
105
+ $ "{ fieldDetails . CamelCaseName } Field = new { element } <{ innerUiType } , { optionFieldType . ContainedType . FqnType } >(\" { Formatting . SnakeCaseToHumanReadable ( fieldDetails . Name ) } \" , { fieldDetails . CamelCaseName } InnerField, (element, data) => {{ { ContainedTypeToUiFieldUpdate ( optionFieldType . ContainedType , "element" , "data" ) } }});";
106
+ yield return $ "{ parentContainer } .Add({ fieldDetails . CamelCaseName } Field);";
107
+ break ;
69
108
default :
70
- // TODO: Lists, maps, and options
109
+ // TODO: Lists and maps.
71
110
yield break ;
72
111
}
73
112
}
@@ -78,51 +117,63 @@ public string ToUiFieldUpdate(UnityFieldDetails fieldDetails, string fieldParent
78
117
switch ( fieldDetails . FieldType )
79
118
{
80
119
case SingularFieldType singularFieldType :
81
- switch ( singularFieldType . ContainedType . Category )
120
+ return ContainedTypeToUiFieldUpdate ( singularFieldType . ContainedType , uiElementName , $ "{ fieldParent } .{ fieldDetails . PascalCaseName } ") ;
121
+ case OptionFieldType optionFieldType :
122
+ if ( GetUiFieldType ( optionFieldType . ContainedType ) == "" )
82
123
{
83
- case ValueType . Enum :
84
- return $ "{ uiElementName } .value = { fieldParent } .{ fieldDetails . PascalCaseName } ;";
85
- case ValueType . Primitive :
86
- var primitiveType = singularFieldType . ContainedType . PrimitiveType . Value ;
87
-
88
- switch ( primitiveType )
89
- {
90
- case PrimitiveType . Int32 :
91
- case PrimitiveType . Int64 :
92
- case PrimitiveType . Uint32 :
93
- case PrimitiveType . Uint64 :
94
- case PrimitiveType . Sint32 :
95
- case PrimitiveType . Sint64 :
96
- case PrimitiveType . Fixed32 :
97
- case PrimitiveType . Fixed64 :
98
- case PrimitiveType . Sfixed32 :
99
- case PrimitiveType . Sfixed64 :
100
- case PrimitiveType . Float :
101
- case PrimitiveType . Double :
102
- case PrimitiveType . String :
103
- case PrimitiveType . EntityId :
104
- return $ "{ uiElementName } .value = { fieldParent } .{ fieldDetails . PascalCaseName } .ToString();";
105
- case PrimitiveType . Bytes :
106
- return $ "{ uiElementName } .value = global::System.Text.Encoding.Default.GetString({ fieldParent } .{ fieldDetails . PascalCaseName } );";
107
- case PrimitiveType . Bool :
108
- return $ "{ uiElementName } .value = { fieldParent } .{ fieldDetails . PascalCaseName } ;";
109
- break ;
110
- case PrimitiveType . Entity :
111
- // TODO: Entity type.
112
- return "" ;
113
- case PrimitiveType . Invalid :
114
- throw new ArgumentException ( "Unknown primitive type encountered" ) ;
115
- default :
116
- throw new ArgumentOutOfRangeException ( ) ;
117
- }
118
- case ValueType . Type :
119
- return $ "{ uiElementName } .Update({ fieldParent } .{ fieldDetails . PascalCaseName } );";
124
+ // TODO: Eliminate this case by supporting 'Entity'.
125
+ return "" ;
126
+ }
127
+
128
+ return $ "{ uiElementName } .Update({ fieldParent } .{ fieldDetails . PascalCaseName } );";
129
+ default :
130
+ // TODO: Lists and maps.
131
+ return "" ;
132
+ }
133
+ }
134
+
135
+ private string ContainedTypeToUiFieldUpdate ( ContainedType containedType , string uiElementName , string fieldAccessor )
136
+ {
137
+ switch ( containedType . Category )
138
+ {
139
+ case ValueType . Enum :
140
+ return $ "{ uiElementName } .value = { fieldAccessor } ;";
141
+ case ValueType . Primitive :
142
+ var primitiveType = containedType . PrimitiveType . Value ;
143
+ switch ( primitiveType )
144
+ {
145
+ case PrimitiveType . Int32 :
146
+ case PrimitiveType . Int64 :
147
+ case PrimitiveType . Uint32 :
148
+ case PrimitiveType . Uint64 :
149
+ case PrimitiveType . Sint32 :
150
+ case PrimitiveType . Sint64 :
151
+ case PrimitiveType . Fixed32 :
152
+ case PrimitiveType . Fixed64 :
153
+ case PrimitiveType . Sfixed32 :
154
+ case PrimitiveType . Sfixed64 :
155
+ case PrimitiveType . Float :
156
+ case PrimitiveType . Double :
157
+ case PrimitiveType . String :
158
+ case PrimitiveType . EntityId :
159
+ return $ "{ uiElementName } .value = { fieldAccessor } .ToString();";
160
+ case PrimitiveType . Bytes :
161
+ return $ "{ uiElementName } .value = global::System.Text.Encoding.Default.GetString({ fieldAccessor } );";
162
+ case PrimitiveType . Bool :
163
+ return $ "{ uiElementName } .value = { fieldAccessor } ;";
164
+ break ;
165
+ case PrimitiveType . Entity :
166
+ // TODO: Entity type.
167
+ return "" ;
168
+ case PrimitiveType . Invalid :
169
+ throw new ArgumentException ( "Unknown primitive type encountered" ) ;
120
170
default :
121
171
throw new ArgumentOutOfRangeException ( ) ;
122
172
}
173
+ case ValueType . Type :
174
+ return $ "{ uiElementName } .Update({ fieldAccessor } );";
123
175
default :
124
- // TODO: Lists, maps, and options
125
- return "" ;
176
+ throw new ArgumentOutOfRangeException ( ) ;
126
177
}
127
178
}
128
179
0 commit comments