74 lines
2.1 KiB
C#
74 lines
2.1 KiB
C#
|
using System;
|
||
|
using System.Collections.Generic;
|
||
|
|
||
|
namespace Unity.VisualScripting
|
||
|
{
|
||
|
/// <summary>
|
||
|
/// Selects a value from a set by switching over an enum.
|
||
|
/// </summary>
|
||
|
[UnitCategory("Control")]
|
||
|
[UnitTitle("Select On Enum")]
|
||
|
[UnitShortTitle("Select")]
|
||
|
[UnitSubtitle("On Enum")]
|
||
|
[UnitOrder(7)]
|
||
|
[TypeIcon(typeof(ISelectUnit))]
|
||
|
public sealed class SelectOnEnum : Unit, ISelectUnit
|
||
|
{
|
||
|
[DoNotSerialize]
|
||
|
public Dictionary<object, ValueInput> branches { get; private set; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// The value on which to select.
|
||
|
/// </summary>
|
||
|
[DoNotSerialize]
|
||
|
[PortLabelHidden]
|
||
|
public ValueInput selector { get; private set; }
|
||
|
|
||
|
/// <summary>
|
||
|
/// The selected value.
|
||
|
/// </summary>
|
||
|
[DoNotSerialize]
|
||
|
[PortLabelHidden]
|
||
|
public ValueOutput selection { get; private set; }
|
||
|
|
||
|
[Serialize]
|
||
|
[Inspectable, UnitHeaderInspectable]
|
||
|
[TypeFilter(Enums = true, Classes = false, Interfaces = false, Structs = false, Primitives = false)]
|
||
|
public Type enumType { get; set; }
|
||
|
|
||
|
public override bool canDefine => enumType != null && enumType.IsEnum;
|
||
|
|
||
|
protected override void Definition()
|
||
|
{
|
||
|
branches = new Dictionary<object, ValueInput>();
|
||
|
|
||
|
selection = ValueOutput(nameof(selection), Branch).Predictable();
|
||
|
|
||
|
selector = ValueInput(enumType, nameof(selector));
|
||
|
|
||
|
Requirement(selector, selection);
|
||
|
|
||
|
foreach (var valueByName in EnumUtility.ValuesByNames(enumType))
|
||
|
{
|
||
|
var enumValue = valueByName.Value;
|
||
|
|
||
|
if (branches.ContainsKey(enumValue))
|
||
|
continue;
|
||
|
|
||
|
var branch = ValueInput<object>("%" + valueByName.Key).AllowsNull();
|
||
|
|
||
|
branches.Add(enumValue, branch);
|
||
|
|
||
|
Requirement(branch, selection);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public object Branch(Flow flow)
|
||
|
{
|
||
|
var selector = flow.GetValue(this.selector, enumType);
|
||
|
|
||
|
return flow.GetValue(branches[selector]);
|
||
|
}
|
||
|
}
|
||
|
}
|