You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

195 lines
5.8 KiB

using UnityEngine;
using UnityEngine.VFX;
using UnityEngine.UIElements;
using System;
namespace UnityEditor.VFX.UI
{
class SpaceablePropertyRM<T> : PropertyRM<T>
{
static readonly bool s_UseDropDownMenu = true;
Label m_Button;
public SpaceablePropertyRM(IPropertyRMProvider controller, float labelWidth) : base(controller, labelWidth)
{
if (!string.IsNullOrEmpty(controller.name))
{
var label = new Label(ObjectNames.NicifyVariableName(controller.name));
label.AddToClassList("label");
Add(label);
}
m_Button = new Label("\u25bc") { name = "spacebutton" };
m_Button.AddManipulator(new Clickable(OnButtonClick));
Add(m_Button);
AddToClassList("spaceablepropertyrm");
}
public override float GetPreferredControlWidth() => 40;
private VFXSpace space
{
get => m_Provider.space;
set => m_Provider.space = value;
}
void ChangeSpace(object val)
{
space = (VFXSpace)val;
}
void OnButtonClick()
{
var values = (VFXSpace[])Enum.GetValues(space.GetType());
if (s_UseDropDownMenu)
{
var menu = new GenericMenu();
foreach (var spaceOption in values)
{
menu.AddItem(
new GUIContent(ObjectNames.NicifyVariableName(spaceOption.ToString())),
spaceOption == space,
ChangeSpace,
spaceOption);
}
menu.DropDown(m_Button.worldBound);
}
else
{
var spaceCount = values.Length;
var index = Array.IndexOf(values, space);
var nextIndex = (index + 1) % spaceCount;
space = values[nextIndex];
}
}
public override void UpdateGUI(bool force)
{
m_Button.RemoveFromClassList(VFXSpace.World.ToString());
m_Button.RemoveFromClassList(VFXSpace.Local.ToString());
m_Button.RemoveFromClassList(VFXSpace.None.ToString());
m_Button.AddToClassList(space.ToString());
m_Button.tooltip = $"{space.ToString()} Space";
}
protected override void UpdateEnabled()
{
m_Button.SetEnabled(!m_Provider.IsSpaceInherited());
}
protected override void UpdateIndeterminate()
{
}
public override bool showsEverything => false;
}
abstract class Vector3SpaceablePropertyRM<T> : SpaceablePropertyRM<T>
{
public Vector3SpaceablePropertyRM(IPropertyRMProvider controller, float labelWidth) : base(controller, labelWidth)
{
m_VectorField = new VFXVector3Field();
m_VectorField.RegisterCallback<ChangeEvent<Vector3>>(OnValueChanged);
m_VectorField.AddToClassList("fieldContainer");
m_VectorField.onValueDragFinished += ValueDragFinished;
m_VectorField.onValueDragStarted += ValueDragStarted;
Add(m_VectorField);
}
public override float GetPreferredControlWidth()
{
return 200;
}
public abstract void OnValueChanged(ChangeEvent<Vector3> e);
protected VFXVector3Field m_VectorField;
protected override void UpdateEnabled()
{
base.UpdateEnabled();
m_VectorField.SetEnabled(propertyEnabled);
}
protected override void UpdateIndeterminate()
{
base.UpdateEnabled();
m_VectorField.indeterminate = indeterminate;
}
public override bool showsEverything { get { return true; } }
}
class VectorPropertyRM : Vector3SpaceablePropertyRM<Vector>
{
public VectorPropertyRM(IPropertyRMProvider controller, float labelWidth) : base(controller, labelWidth)
{
}
public override void OnValueChanged(ChangeEvent<Vector3> e)
{
Vector3 newValue = m_VectorField.value;
if (newValue != m_Value.vector)
{
m_Value.vector = newValue;
NotifyValueChanged();
}
}
public override void UpdateGUI(bool force)
{
base.UpdateGUI(force);
m_VectorField.SetValueWithoutNotify(m_Value.vector);
}
}
class PositionPropertyRM : Vector3SpaceablePropertyRM<Position>
{
public PositionPropertyRM(IPropertyRMProvider controller, float labelWidth) : base(controller, labelWidth)
{
}
public override void OnValueChanged(ChangeEvent<Vector3> e)
{
Vector3 newValue = m_VectorField.value;
if (newValue != m_Value.position)
{
m_Value.position = newValue;
NotifyValueChanged();
}
}
public override void UpdateGUI(bool force)
{
base.UpdateGUI(force);
m_VectorField.SetValueWithoutNotify(m_Value.position);
}
}
class DirectionPropertyRM : Vector3SpaceablePropertyRM<DirectionType>
{
public DirectionPropertyRM(IPropertyRMProvider controller, float labelWidth) : base(controller, labelWidth)
{
}
public override void OnValueChanged(ChangeEvent<Vector3> e)
{
Vector3 newValue = m_VectorField.value;
if (newValue != m_Value.direction)
{
m_Value.direction = newValue;
NotifyValueChanged();
}
}
public override void UpdateGUI(bool force)
{
base.UpdateGUI(force);
m_VectorField.SetValueWithoutNotify(m_Value.direction);
}
}
}