@@ -165,22 +165,29 @@ private void BindConfigElement(VisualElement element, int index)
165165 var layerField = element . Q < IntegerField > ( ) ;
166166
167167 label . text = addressProperty . stringValue ;
168- layerField . value = layerProperty . intValue ;
169-
170- // Handle layer changes
171- layerField . RegisterValueChangedCallback ( evt => OnLayerChanged ( evt , addressProperty , layerProperty ) ) ;
168+
169+ // Unbind to remove previous event handlers
170+ layerField . Unbind ( ) ;
171+
172+ // Bind to property for automatic serialization
173+ layerField . BindProperty ( layerProperty ) ;
174+
175+ // Register custom callback for prefab sync (using userData to store address for later)
176+ layerField . userData = addressProperty . stringValue ;
177+ layerField . RegisterValueChangedCallback ( OnLayerChanged ) ;
172178 }
173179
174- private void OnLayerChanged ( ChangeEvent < int > evt , SerializedProperty addressProperty , SerializedProperty layerProperty )
180+ private void OnLayerChanged ( ChangeEvent < int > evt )
175181 {
176182 if ( evt . newValue == evt . previousValue )
177183 return ;
178184
179- layerProperty . intValue = evt . newValue ;
180- layerProperty . serializedObject . ApplyModifiedProperties ( ) ;
181-
182- // Sync with Canvas/UIDocument sorting order
183- SyncLayerToPrefab ( addressProperty . stringValue , evt . newValue ) ;
185+ var layerField = evt . target as IntegerField ;
186+ if ( layerField ? . userData is string address )
187+ {
188+ // Sync with Canvas/UIDocument sorting order
189+ SyncLayerToPrefab ( address , evt . newValue ) ;
190+ }
184191 }
185192
186193 private VisualElement CreateSetsContainer ( )
@@ -228,53 +235,15 @@ private VisualElement CreateSetPresenterElement()
228235 dropdown . style . paddingBottom = 3 ;
229236 dropdown . style . marginLeft = 3 ;
230237 dropdown . style . marginRight = 3 ;
231- return dropdown ;
232- }
233-
234- private void BindSetPresenterElement ( VisualElement element , int index , SerializedProperty uiConfigsTypeProperty )
235- {
236- if ( index >= uiConfigsTypeProperty . arraySize )
237- return ;
238-
239- var dropdown = element as DropdownField ;
240- if ( dropdown == null )
241- return ;
242-
243- var itemProperty = uiConfigsTypeProperty . GetArrayElementAtIndex ( index ) ;
244238
245- // Find the index in our type list
246- var currentType = itemProperty . stringValue ;
247- var selectedIndex = string . IsNullOrEmpty ( currentType ) ? 0 :
248- _uiConfigsType . FindIndex ( type => type == currentType ) ;
249-
250- if ( selectedIndex < 0 )
251- selectedIndex = 0 ;
252-
253- if ( _uiConfigsAddress != null && _uiConfigsAddress . Length > 0 )
254- {
255- dropdown . index = selectedIndex ;
256- dropdown . RegisterValueChangedCallback ( evt => OnPresenterSelectionChanged ( evt , itemProperty ) ) ;
257- }
258- }
259-
260- private void OnPresenterSelectionChanged ( ChangeEvent < string > evt , SerializedProperty itemProperty )
261- {
262- var newIndex = Array . IndexOf ( _uiConfigsAddress , evt . newValue ) ;
263- if ( newIndex >= 0 && newIndex < _uiConfigsType . Count )
264- {
265- itemProperty . stringValue = _uiConfigsType [ newIndex ] ;
266- itemProperty . serializedObject . ApplyModifiedProperties ( ) ;
267- }
239+ return dropdown ;
268240 }
269241
270242 private VisualElement CreateSetElement ( string setName , int setIndex )
271243 {
272244 var setContainer = new VisualElement ( ) ;
273- setContainer . style . marginBottom = 15 ;
274245 setContainer . style . paddingLeft = 5 ;
275246 setContainer . style . paddingRight = 5 ;
276- setContainer . style . paddingTop = 5 ;
277- setContainer . style . paddingBottom = 5 ;
278247 setContainer . style . backgroundColor = new Color ( 0.2f , 0.2f , 0.2f , 0.2f ) ;
279248 setContainer . style . borderBottomLeftRadius = 4 ;
280249 setContainer . style . borderBottomRightRadius = 4 ;
@@ -300,19 +269,55 @@ private VisualElement CreateSetElement(string setName, int setIndex)
300269 reorderable = true ,
301270 showBoundCollectionSize = false ,
302271 virtualizationMethod = CollectionVirtualizationMethod . DynamicHeight ,
303- fixedItemHeight = 22
272+ fixedItemHeight = 25
304273 } ;
305274
306275 presenterListView . BindProperty ( uiConfigsTypeProperty ) ;
307276
308277 presenterListView . makeItem = CreateSetPresenterElement ;
309- presenterListView . bindItem = ( element , index ) => BindSetPresenterElement ( element , index , uiConfigsTypeProperty ) ;
278+
279+ // Register callbacks to save changes when items are added, removed, or reordered
280+ presenterListView . itemsAdded += indices => OnPresenterItemsAdded ( indices , uiConfigsTypeProperty ) ;
281+ presenterListView . itemsRemoved += _ => SaveSetChanges ( ) ;
282+ presenterListView . itemIndexChanged += ( _ , _ ) => SaveSetChanges ( ) ;
310283
311284 setContainer . Add ( presenterListView ) ;
312285
313286 return setContainer ;
314287 }
315288
289+ private void OnPresenterItemsAdded ( IEnumerable < int > indices , SerializedProperty uiConfigsTypeProperty )
290+ {
291+ if ( _uiConfigsAddress == null || _uiConfigsAddress . Length == 0 )
292+ {
293+ return ;
294+ }
295+
296+ var defaultType = _uiConfigsAddress [ 0 ] ;
297+
298+ foreach ( var index in indices )
299+ {
300+ if ( index < uiConfigsTypeProperty . arraySize )
301+ {
302+ var itemProperty = uiConfigsTypeProperty . GetArrayElementAtIndex ( index ) ;
303+ itemProperty . stringValue = defaultType ;
304+ }
305+ }
306+
307+ SaveSetChanges ( ) ;
308+ }
309+
310+ private void SaveSetChanges ( )
311+ {
312+ serializedObject . ApplyModifiedProperties ( ) ;
313+
314+ if ( _scriptableObject != null )
315+ {
316+ EditorUtility . SetDirty ( _scriptableObject ) ;
317+ AssetDatabase . SaveAssets ( ) ;
318+ }
319+ }
320+
316321 private void SyncConfigsWithAddressables ( )
317322 {
318323 var assetList = GetAssetList ( ) ;
0 commit comments