Fix Visject param node getter breaking connection on param change to the same type

This commit is contained in:
2021-11-06 13:23:05 +01:00
parent 214e626ac5
commit 84f78e9a15
+51 -54
View File
@@ -24,6 +24,7 @@ namespace FlaxEditor.Surface.Archetypes
private ComboBoxElement _combobox;
private readonly List<ISurfaceNodeElement> _dynamicChildren = new List<ISurfaceNodeElement>();
private bool _isUpdateLocked;
private ScriptType _layoutType;
private NodeElementArchetype[] _layoutElements;
/// <summary>
@@ -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();
}
/// <inheritdoc />
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;
}
/// <inheritdoc />