Skip to content

Commit e9e6f01

Browse files
author
Miguel Cartier
committed
fix the intial value of the ui sets
1 parent 73cea90 commit e9e6f01

File tree

1 file changed

+56
-51
lines changed

1 file changed

+56
-51
lines changed

Editor/UiConfigsEditor.cs

Lines changed: 56 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)