- Moved description panel code
- Description panel now gets hidden when hiding the context menu - Cleanup when hiding description panel
This commit is contained in:
@@ -646,169 +646,6 @@ namespace FlaxEditor.Surface.ContextMenu
|
|||||||
_groups[i].Open(animate);
|
_groups[i].Open(animate);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Updates the description panel and shows information about the set archetype
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="archetype">The node archetype</param>
|
|
||||||
public void SetDescriptionPanelArchetype(NodeArchetype archetype)
|
|
||||||
{
|
|
||||||
if(!_useDescriptionPanel)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (archetype == null)
|
|
||||||
{
|
|
||||||
HideDescriptionPanel();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Profiler.BeginEvent("VisjectCM.SetDescriptionPanelArchetype");
|
|
||||||
|
|
||||||
_descriptionInputPanel.RemoveChildren();
|
|
||||||
_descriptionOutputPanel.RemoveChildren();
|
|
||||||
|
|
||||||
ScriptType declaringType;
|
|
||||||
if (archetype.Tag is ScriptMemberInfo memberInfo)
|
|
||||||
{
|
|
||||||
var name = memberInfo.Name;
|
|
||||||
if (memberInfo.IsMethod && memberInfo.Name.StartsWith("get_") || memberInfo.Name.StartsWith("set_"))
|
|
||||||
{
|
|
||||||
name = memberInfo.Name.Substring(4);
|
|
||||||
}
|
|
||||||
|
|
||||||
declaringType = memberInfo.DeclaringType;
|
|
||||||
_descriptionSignatureLabel.Text = memberInfo.DeclaringType + "." + name;
|
|
||||||
|
|
||||||
if (!memberInfo.IsStatic)
|
|
||||||
AddInputOutputElement(archetype, declaringType, false, $">Instance ({memberInfo.DeclaringType.Name})");
|
|
||||||
|
|
||||||
if (memberInfo.ValueType != ScriptType.Null && memberInfo.ValueType != ScriptType.Void)
|
|
||||||
{
|
|
||||||
if (memberInfo.IsField && archetype.Title.StartsWith("Set "))
|
|
||||||
AddInputOutputElement(archetype, memberInfo.ValueType, false, $"({memberInfo.ValueType.Name})");
|
|
||||||
else
|
|
||||||
AddInputOutputElement(archetype, memberInfo.ValueType, true, $"Return ({memberInfo.ValueType.Name})");
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = 0; i < memberInfo.ParametersCount; i++)
|
|
||||||
{
|
|
||||||
var param = memberInfo.GetParameters()[i];
|
|
||||||
if (param.IsOut)
|
|
||||||
{
|
|
||||||
AddInputOutputElement(archetype, param.Type, true, $">{param.Name} ({param.Type.Name})");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
AddInputOutputElement(archetype, param.Type, false, $">{param.Name} ({param.Type.Name})");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_descriptionSignatureLabel.Text = archetype.Signature;
|
|
||||||
declaringType = archetype.DefaultType;
|
|
||||||
|
|
||||||
// Special handling for Pack nodes
|
|
||||||
if (archetype.GetInputOutputDescription != null)
|
|
||||||
{
|
|
||||||
archetype.GetInputOutputDescription.Invoke(archetype, out (string, ScriptType)[] inputs, out (string, ScriptType)[] outputs);
|
|
||||||
|
|
||||||
if (inputs != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < inputs.Length; i++)
|
|
||||||
{
|
|
||||||
AddInputOutputElement(archetype, inputs[i].Item2, false, $"{inputs[i].Item1} ({inputs[i].Item2.Name})");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (outputs != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < outputs.Length; i++)
|
|
||||||
{
|
|
||||||
AddInputOutputElement(archetype, outputs[i].Item2, true, $"{outputs[i].Item1} ({outputs[i].Item2.Name})");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
foreach (var element in archetype.Elements)
|
|
||||||
{
|
|
||||||
if (element.Type is NodeElementType.Input or NodeElementType.Output)
|
|
||||||
{
|
|
||||||
bool isOutput = element.Type == NodeElementType.Output;
|
|
||||||
if (element.ConnectionsType == null)
|
|
||||||
AddInputOutputElement(archetype, element.ConnectionsType, isOutput, $"-{element.Text} ({archetype.ConnectionsHints.ToString()})");
|
|
||||||
else
|
|
||||||
AddInputOutputElement(archetype, element.ConnectionsType, isOutput, $"-{element.Text} ({element.ConnectionsType.Name})");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
_surfaceStyle.GetConnectionColor(declaringType, archetype.ConnectionsHints, out var declaringTypeColor);
|
|
||||||
_descriptionClassImage.Color = declaringTypeColor;
|
|
||||||
_descriptionClassImage.MouseOverColor = declaringTypeColor;
|
|
||||||
|
|
||||||
float panelHeight = _descriptionSignatureLabel.Height;
|
|
||||||
|
|
||||||
_descriptionLabel.Y = _descriptionSignatureLabel.Bounds.Bottom + 6f;
|
|
||||||
_descriptionLabel.Text = archetype.Description;
|
|
||||||
|
|
||||||
panelHeight += _descriptionLabel.Height + 6f + 18f;
|
|
||||||
|
|
||||||
_descriptionInputPanel.Y = panelHeight;
|
|
||||||
_descriptionOutputPanel.Y = panelHeight;
|
|
||||||
|
|
||||||
panelHeight += Mathf.Max(_descriptionInputPanel.Height, _descriptionOutputPanel.Height);
|
|
||||||
_descriptionPanel.Height = panelHeight;
|
|
||||||
Height = 400 + Mathf.RoundToInt(_descriptionPanel.Height);
|
|
||||||
UpdateWindowSize();
|
|
||||||
|
|
||||||
PerformLayout();
|
|
||||||
|
|
||||||
Profiler.EndEvent();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void AddInputOutputElement(NodeArchetype nodeArchetype, ScriptType type, bool isOutput, string text)
|
|
||||||
{
|
|
||||||
var elementPanel = new Panel()
|
|
||||||
{
|
|
||||||
Parent = isOutput ? _descriptionOutputPanel : _descriptionInputPanel,
|
|
||||||
Width = Width * 0.5f,
|
|
||||||
Height = 16,
|
|
||||||
AnchorPreset = AnchorPresets.TopLeft
|
|
||||||
};
|
|
||||||
|
|
||||||
var sprite = _surfaceStyle.Icons.BoxOpen;
|
|
||||||
_surfaceStyle.GetConnectionColor(type, nodeArchetype.ConnectionsHints, out var typeColor);
|
|
||||||
elementPanel.AddChild(new Image(2, 0, 12, 12)
|
|
||||||
{
|
|
||||||
Brush = new SpriteBrush(sprite),
|
|
||||||
Color = typeColor,
|
|
||||||
MouseOverColor = typeColor,
|
|
||||||
AutoFocus = false,
|
|
||||||
}).SetAnchorPreset(AnchorPresets.TopLeft, true);
|
|
||||||
|
|
||||||
var elementText = new Label(16, 0, Width * 0.5f - 32, 16)
|
|
||||||
{
|
|
||||||
Text = text,
|
|
||||||
HorizontalAlignment = TextAlignment.Near,
|
|
||||||
VerticalAlignment = TextAlignment.Near,
|
|
||||||
Wrapping = TextWrapping.WrapWords,
|
|
||||||
AutoHeight = true,
|
|
||||||
};
|
|
||||||
elementText.SetAnchorPreset(AnchorPresets.TopLeft, true);
|
|
||||||
elementPanel.AddChild(elementText);
|
|
||||||
elementPanel.Height = elementText.Height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Hides the description panel and resets the context menu to its original size
|
|
||||||
/// </summary>
|
|
||||||
public void HideDescriptionPanel()
|
|
||||||
{
|
|
||||||
Height = 400;
|
|
||||||
UpdateWindowSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Resets the view.
|
/// Resets the view.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -953,9 +790,175 @@ namespace FlaxEditor.Surface.ContextMenu
|
|||||||
{
|
{
|
||||||
Focus(null);
|
Focus(null);
|
||||||
|
|
||||||
|
if(_useDescriptionPanel)
|
||||||
|
HideDescriptionPanel();
|
||||||
|
|
||||||
base.Hide();
|
base.Hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the description panel and shows information about the set archetype
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="archetype">The node archetype</param>
|
||||||
|
public void SetDescriptionPanelArchetype(NodeArchetype archetype)
|
||||||
|
{
|
||||||
|
if(!_useDescriptionPanel)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (archetype == null)
|
||||||
|
{
|
||||||
|
HideDescriptionPanel();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Profiler.BeginEvent("VisjectCM.SetDescriptionPanelArchetype");
|
||||||
|
|
||||||
|
_descriptionInputPanel.RemoveChildren();
|
||||||
|
_descriptionOutputPanel.RemoveChildren();
|
||||||
|
|
||||||
|
ScriptType declaringType;
|
||||||
|
if (archetype.Tag is ScriptMemberInfo memberInfo)
|
||||||
|
{
|
||||||
|
var name = memberInfo.Name;
|
||||||
|
if (memberInfo.IsMethod && memberInfo.Name.StartsWith("get_") || memberInfo.Name.StartsWith("set_"))
|
||||||
|
{
|
||||||
|
name = memberInfo.Name.Substring(4);
|
||||||
|
}
|
||||||
|
|
||||||
|
declaringType = memberInfo.DeclaringType;
|
||||||
|
_descriptionSignatureLabel.Text = memberInfo.DeclaringType + "." + name;
|
||||||
|
|
||||||
|
if (!memberInfo.IsStatic)
|
||||||
|
AddInputOutputElement(archetype, declaringType, false, $">Instance ({memberInfo.DeclaringType.Name})");
|
||||||
|
|
||||||
|
if (memberInfo.ValueType != ScriptType.Null && memberInfo.ValueType != ScriptType.Void)
|
||||||
|
{
|
||||||
|
if (memberInfo.IsField && archetype.Title.StartsWith("Set "))
|
||||||
|
AddInputOutputElement(archetype, memberInfo.ValueType, false, $"({memberInfo.ValueType.Name})");
|
||||||
|
else
|
||||||
|
AddInputOutputElement(archetype, memberInfo.ValueType, true, $"Return ({memberInfo.ValueType.Name})");
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < memberInfo.ParametersCount; i++)
|
||||||
|
{
|
||||||
|
var param = memberInfo.GetParameters()[i];
|
||||||
|
if (param.IsOut)
|
||||||
|
{
|
||||||
|
AddInputOutputElement(archetype, param.Type, true, $">{param.Name} ({param.Type.Name})");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
AddInputOutputElement(archetype, param.Type, false, $">{param.Name} ({param.Type.Name})");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
_descriptionSignatureLabel.Text = string.IsNullOrEmpty(archetype.Signature) ? archetype.Title : archetype.Signature;
|
||||||
|
declaringType = archetype.DefaultType;
|
||||||
|
|
||||||
|
// Special handling for Pack nodes
|
||||||
|
if (archetype.GetInputOutputDescription != null)
|
||||||
|
{
|
||||||
|
archetype.GetInputOutputDescription.Invoke(archetype, out (string, ScriptType)[] inputs, out (string, ScriptType)[] outputs);
|
||||||
|
|
||||||
|
if (inputs != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < inputs.Length; i++)
|
||||||
|
{
|
||||||
|
AddInputOutputElement(archetype, inputs[i].Item2, false, $"{inputs[i].Item1} ({inputs[i].Item2.Name})");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (outputs != null)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < outputs.Length; i++)
|
||||||
|
{
|
||||||
|
AddInputOutputElement(archetype, outputs[i].Item2, true, $"{outputs[i].Item1} ({outputs[i].Item2.Name})");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
foreach (var element in archetype.Elements)
|
||||||
|
{
|
||||||
|
if (element.Type is NodeElementType.Input or NodeElementType.Output)
|
||||||
|
{
|
||||||
|
bool isOutput = element.Type == NodeElementType.Output;
|
||||||
|
if (element.ConnectionsType == null)
|
||||||
|
AddInputOutputElement(archetype, element.ConnectionsType, isOutput, $"-{element.Text} ({archetype.ConnectionsHints.ToString()})");
|
||||||
|
else
|
||||||
|
AddInputOutputElement(archetype, element.ConnectionsType, isOutput, $"-{element.Text} ({element.ConnectionsType.Name})");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_surfaceStyle.GetConnectionColor(declaringType, archetype.ConnectionsHints, out var declaringTypeColor);
|
||||||
|
_descriptionClassImage.Color = declaringTypeColor;
|
||||||
|
_descriptionClassImage.MouseOverColor = declaringTypeColor;
|
||||||
|
|
||||||
|
float panelHeight = _descriptionSignatureLabel.Height;
|
||||||
|
|
||||||
|
_descriptionLabel.Y = _descriptionSignatureLabel.Bounds.Bottom + 6f;
|
||||||
|
_descriptionLabel.Text = archetype.Description;
|
||||||
|
|
||||||
|
panelHeight += _descriptionLabel.Height + 6f + 18f;
|
||||||
|
|
||||||
|
_descriptionInputPanel.Y = panelHeight;
|
||||||
|
_descriptionOutputPanel.Y = panelHeight;
|
||||||
|
|
||||||
|
panelHeight += Mathf.Max(_descriptionInputPanel.Height, _descriptionOutputPanel.Height);
|
||||||
|
_descriptionPanel.Height = panelHeight;
|
||||||
|
Height = 400 + Mathf.RoundToInt(_descriptionPanel.Height);
|
||||||
|
UpdateWindowSize();
|
||||||
|
|
||||||
|
Profiler.EndEvent();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void AddInputOutputElement(NodeArchetype nodeArchetype, ScriptType type, bool isOutput, string text)
|
||||||
|
{
|
||||||
|
var elementPanel = new Panel()
|
||||||
|
{
|
||||||
|
Parent = isOutput ? _descriptionOutputPanel : _descriptionInputPanel,
|
||||||
|
Width = Width * 0.5f,
|
||||||
|
Height = 16,
|
||||||
|
AnchorPreset = AnchorPresets.TopLeft
|
||||||
|
};
|
||||||
|
|
||||||
|
var sprite = _surfaceStyle.Icons.BoxOpen;
|
||||||
|
_surfaceStyle.GetConnectionColor(type, nodeArchetype.ConnectionsHints, out var typeColor);
|
||||||
|
elementPanel.AddChild(new Image(2, 0, 12, 12)
|
||||||
|
{
|
||||||
|
Brush = new SpriteBrush(sprite),
|
||||||
|
Color = typeColor,
|
||||||
|
MouseOverColor = typeColor,
|
||||||
|
AutoFocus = false,
|
||||||
|
}).SetAnchorPreset(AnchorPresets.TopLeft, true);
|
||||||
|
|
||||||
|
var elementText = new Label(16, 0, Width * 0.5f - 32, 16)
|
||||||
|
{
|
||||||
|
Text = text,
|
||||||
|
HorizontalAlignment = TextAlignment.Near,
|
||||||
|
VerticalAlignment = TextAlignment.Near,
|
||||||
|
Wrapping = TextWrapping.WrapWords,
|
||||||
|
AutoHeight = true,
|
||||||
|
};
|
||||||
|
elementText.SetAnchorPreset(AnchorPresets.TopLeft, true);
|
||||||
|
elementPanel.AddChild(elementText);
|
||||||
|
elementPanel.Height = elementText.Height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Hides the description panel and resets the context menu to its original size
|
||||||
|
/// </summary>
|
||||||
|
public void HideDescriptionPanel()
|
||||||
|
{
|
||||||
|
_descriptionInputPanel.RemoveChildren();
|
||||||
|
_descriptionOutputPanel.RemoveChildren();
|
||||||
|
Height = 400;
|
||||||
|
UpdateWindowSize();
|
||||||
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public override bool OnKeyDown(KeyboardKeys key)
|
public override bool OnKeyDown(KeyboardKeys key)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user