diff --git a/Source/Editor/Surface/Archetypes/Parameters.cs b/Source/Editor/Surface/Archetypes/Parameters.cs index d3dbd8e5f..c2000bbab 100644 --- a/Source/Editor/Surface/Archetypes/Parameters.cs +++ b/Source/Editor/Surface/Archetypes/Parameters.cs @@ -24,6 +24,7 @@ namespace FlaxEditor.Surface.Archetypes private ComboBoxElement _combobox; private readonly List _dynamicChildren = new List(); private bool _isUpdateLocked; + private ScriptType _layoutType; private NodeElementArchetype[] _layoutElements; /// @@ -178,9 +179,8 @@ namespace FlaxEditor.Surface.Archetypes { } - private NodeElementArchetype[] GetElementArchetypes() + private NodeElementArchetype[] GetElementArchetypes(SurfaceParameter selected) { - var selected = GetSelected(); if (selected != null && selected.Type.Type != null) { if (Prototypes != null && Prototypes.TryGetValue(selected.Type.Type, out var elements)) @@ -208,24 +208,25 @@ namespace FlaxEditor.Surface.Archetypes private void UpdateLayout() { // Add elements and calculate node size if type changes - var elements = GetElementArchetypes(); - if (elements != _layoutElements) + var selected = GetSelected(); + var type = selected.Type; + if (type != _layoutType || type.Type == typeof(Texture)) { - // Clean - ClearDynamicElements(); - - // Build layout - if (elements != null) + var elements = GetElementArchetypes(selected); + if (elements != _layoutElements) { - for (var i = 0; i < elements.Length; i++) + ClearDynamicElements(); + if (elements != null) { - var element = AddElement(elements[i]); - _dynamicChildren.Add(element); + for (var i = 0; i < elements.Length; i++) + { + var element = AddElement(elements[i]); + _dynamicChildren.Add(element); + } } + _layoutElements = elements; } - - // Cache state - _layoutElements = elements; + _layoutType = type; } UpdateTitle(); @@ -244,14 +245,12 @@ namespace FlaxEditor.Surface.Archetypes int toSelect = -1; Guid loadedSelected = (Guid)Values[0]; _combobox.ClearItems(); - int index = 0; for (int i = 0; i < Surface.Parameters.Count; i++) { var param = Surface.Parameters[i]; _combobox.AddItem(param.Name); if (param.ID == loadedSelected) - toSelect = index; - index++; + toSelect = i; } _combobox.SelectedIndex = toSelect; _isUpdateLocked = false; @@ -262,29 +261,14 @@ namespace FlaxEditor.Surface.Archetypes if (_isUpdateLocked) return; var selected = GetSelected(); - Guid selectedID = selected?.ID ?? Guid.Empty; - if (selectedID != (Guid)Values[0]) - { - SetValue(0, selectedID); - UpdateLayout(); - } + var selectedID = selected?.ID ?? Guid.Empty; + SetValue(0, selectedID); } private SurfaceParameter GetSelected() { - SurfaceParameter result = null; - int index = 0; - for (int i = 0; i < Surface.Parameters.Count; i++) - { - var param = Surface.Parameters[i]; - if (index == _combobox.SelectedIndex) - { - result = param; - break; - } - index++; - } - return result; + var selectedIndex = _combobox.SelectedIndex; + return selectedIndex >= 0 && selectedIndex < Surface.Parameters.Count ? Surface.Parameters[selectedIndex] : null; } private void ClearDynamicElements() @@ -339,10 +323,36 @@ namespace FlaxEditor.Surface.Archetypes { base.OnValuesChanged(); - UpdateCombo(); + if (_combobox == null) + { + UpdateCombo(); + } + else if (!_isUpdateLocked) + { + _isUpdateLocked = true; + int toSelect = -1; + Guid loadedSelected = (Guid)Values[0]; + for (int i = 0; i < Surface.Parameters.Count; i++) + { + var param = Surface.Parameters[i]; + if (param.ID == loadedSelected) + toSelect = i; + } + _combobox.SelectedIndex = toSelect; + _isUpdateLocked = false; + } UpdateLayout(); } + /// + public override void OnDestroy() + { + _layoutElements = null; + _layoutType = ScriptType.Null; + + base.OnDestroy(); + } + private void UpdateTitle() { var selected = GetSelected(); @@ -515,14 +525,12 @@ namespace FlaxEditor.Surface.Archetypes int toSelect = -1; Guid loadedSelected = (Guid)Values[0]; _combobox.ClearItems(); - int index = 0; for (int i = 0; i < Surface.Parameters.Count; i++) { var param = Surface.Parameters[i]; _combobox.AddItem(param.Name); if (param.ID == loadedSelected) - toSelect = index; - index++; + toSelect = i; } _combobox.SelectedIndex = toSelect; _isUpdateLocked = false; @@ -547,19 +555,8 @@ namespace FlaxEditor.Surface.Archetypes private SurfaceParameter GetSelected() { - SurfaceParameter result = null; - int index = 0; - for (int i = 0; i < Surface.Parameters.Count; i++) - { - var param = Surface.Parameters[i]; - if (index == _combobox.SelectedIndex) - { - result = param; - break; - } - index++; - } - return result; + var selectedIndex = _combobox.SelectedIndex; + return selectedIndex >= 0 && selectedIndex < Surface.Parameters.Count ? Surface.Parameters[selectedIndex] : null; } ///