471 lines
15 KiB
C#
471 lines
15 KiB
C#
// Copyright (c) 2012-2021 Wojciech Figat. All rights reserved.
|
|
|
|
using System.Linq;
|
|
using FlaxEditor.CustomEditors.Elements;
|
|
using FlaxEngine;
|
|
|
|
namespace FlaxEditor.CustomEditors.Editors
|
|
{
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit integer value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(int)), DefaultEditor]
|
|
public sealed class IntegerEditor : CustomEditor
|
|
{
|
|
private IIntegerValueEditor _element;
|
|
|
|
/// <inheritdoc />
|
|
public override DisplayStyle Style => DisplayStyle.Inline;
|
|
|
|
/// <inheritdoc />
|
|
public override void Initialize(LayoutElementsContainer layout)
|
|
{
|
|
_element = null;
|
|
|
|
// Try get limit attribute for value min/max range setting and slider speed
|
|
var attributes = Values.GetAttributes();
|
|
if (attributes != null)
|
|
{
|
|
var range = attributes.FirstOrDefault(x => x is RangeAttribute);
|
|
if (range != null)
|
|
{
|
|
// Use slider
|
|
var element = layout.Slider();
|
|
element.SetLimits((RangeAttribute)range);
|
|
element.Slider.ValueChanged += OnValueChanged;
|
|
element.Slider.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
return;
|
|
}
|
|
var limit = attributes.FirstOrDefault(x => x is LimitAttribute);
|
|
if (limit != null)
|
|
{
|
|
// Use int value editor with limit
|
|
var element = layout.IntegerValue();
|
|
element.SetLimits((LimitAttribute)limit);
|
|
element.IntValue.ValueChanged += OnValueChanged;
|
|
element.IntValue.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
return;
|
|
}
|
|
}
|
|
if (_element == null)
|
|
{
|
|
// Use int value editor
|
|
var element = layout.IntegerValue();
|
|
element.IntValue.ValueChanged += OnValueChanged;
|
|
element.IntValue.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
}
|
|
}
|
|
|
|
private void OnValueChanged()
|
|
{
|
|
var isSliding = _element.IsSliding;
|
|
var token = isSliding ? this : null;
|
|
SetValue(_element.Value, token);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void Refresh()
|
|
{
|
|
base.Refresh();
|
|
|
|
if (HasDifferentValues)
|
|
{
|
|
// TODO: support different values for ValueBox<T>
|
|
}
|
|
else
|
|
{
|
|
_element.Value = (int)Values[0];
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit signed integer value type properties (maps to the full range of long type).
|
|
/// </summary>
|
|
public abstract class SignedIntegerValueEditor : CustomEditor
|
|
{
|
|
private SignedIntegerValueElement _element;
|
|
|
|
/// <inheritdoc />
|
|
public override DisplayStyle Style => DisplayStyle.Inline;
|
|
|
|
/// <inheritdoc />
|
|
public override void Initialize(LayoutElementsContainer layout)
|
|
{
|
|
_element = null;
|
|
|
|
GetLimits(out var min, out var max);
|
|
|
|
// Try get limit attribute for value min/max range setting and slider speed
|
|
var attributes = Values.GetAttributes();
|
|
if (attributes != null)
|
|
{
|
|
var limit = attributes.FirstOrDefault(x => x is LimitAttribute);
|
|
if (limit != null)
|
|
{
|
|
// Use int value editor with limit
|
|
var element = layout.SignedIntegerValue();
|
|
element.LongValue.SetLimits((LimitAttribute)limit);
|
|
element.LongValue.SetLimits(Mathf.Max(element.LongValue.MinValue, min), Mathf.Min(element.LongValue.MaxValue, max));
|
|
element.LongValue.ValueChanged += OnValueChanged;
|
|
element.LongValue.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
return;
|
|
}
|
|
}
|
|
if (_element == null)
|
|
{
|
|
// Use int value editor
|
|
var element = layout.SignedIntegerValue();
|
|
element.LongValue.SetLimits(Mathf.Max(element.LongValue.MinValue, min), Mathf.Min(element.LongValue.MaxValue, max));
|
|
element.LongValue.ValueChanged += OnValueChanged;
|
|
element.LongValue.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
}
|
|
}
|
|
|
|
private void OnValueChanged()
|
|
{
|
|
var isSliding = _element.IsSliding;
|
|
var token = isSliding ? this : null;
|
|
SetValue(SetValue(_element.Value), token);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void Refresh()
|
|
{
|
|
base.Refresh();
|
|
|
|
if (HasDifferentValues)
|
|
{
|
|
// TODO: support different values for ValueBox<T>
|
|
}
|
|
else
|
|
{
|
|
_element.Value = GetValue(Values[0]);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the value limits.
|
|
/// </summary>
|
|
/// <param name="min">The minimum value.</param>
|
|
/// <param name="max">The maximum value.</param>
|
|
protected abstract void GetLimits(out long min, out long max);
|
|
|
|
/// <summary>
|
|
/// Gets the value as long.
|
|
/// </summary>
|
|
/// <param name="value">The value from object.</param>
|
|
/// <returns>The value for editor.</returns>
|
|
protected abstract long GetValue(object value);
|
|
|
|
/// <summary>
|
|
/// Gets the value from long.
|
|
/// </summary>
|
|
/// <param name="value">The value from editor.</param>
|
|
/// <returns>The value to object.</returns>
|
|
protected abstract object SetValue(long value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit sbyte value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(sbyte)), DefaultEditor]
|
|
public sealed class SByteEditor : SignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out long min, out long max)
|
|
{
|
|
min = sbyte.MinValue;
|
|
max = sbyte.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override long GetValue(object value)
|
|
{
|
|
return (sbyte)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(long value)
|
|
{
|
|
return (sbyte)value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit short value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(short)), DefaultEditor]
|
|
public sealed class ShortEditor : SignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out long min, out long max)
|
|
{
|
|
min = short.MinValue;
|
|
max = short.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override long GetValue(object value)
|
|
{
|
|
return (short)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(long value)
|
|
{
|
|
return (short)value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit long value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(long)), DefaultEditor]
|
|
public sealed class LongEditor : SignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out long min, out long max)
|
|
{
|
|
min = long.MinValue;
|
|
max = long.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override long GetValue(object value)
|
|
{
|
|
return (long)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(long value)
|
|
{
|
|
return value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit unsigned integer value type properties (maps to the full range of ulong type).
|
|
/// </summary>
|
|
public abstract class UnsignedIntegerValueEditor : CustomEditor
|
|
{
|
|
private UnsignedIntegerValueElement _element;
|
|
|
|
/// <inheritdoc />
|
|
public override DisplayStyle Style => DisplayStyle.Inline;
|
|
|
|
/// <inheritdoc />
|
|
public override void Initialize(LayoutElementsContainer layout)
|
|
{
|
|
_element = null;
|
|
|
|
GetLimits(out var min, out var max);
|
|
|
|
// Try get limit attribute for value min/max range setting and slider speed
|
|
var attributes = Values.GetAttributes();
|
|
if (attributes != null)
|
|
{
|
|
var limit = attributes.FirstOrDefault(x => x is LimitAttribute);
|
|
if (limit != null)
|
|
{
|
|
// Use int value editor with limit
|
|
var element = layout.UnsignedIntegerValue();
|
|
element.ULongValue.SetLimits((LimitAttribute)limit);
|
|
element.ULongValue.SetLimits(Mathf.Max(element.ULongValue.MinValue, min), Mathf.Min(element.ULongValue.MaxValue, max));
|
|
element.ULongValue.ValueChanged += OnValueChanged;
|
|
element.ULongValue.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
return;
|
|
}
|
|
}
|
|
if (_element == null)
|
|
{
|
|
// Use int value editor
|
|
var element = layout.UnsignedIntegerValue();
|
|
element.ULongValue.SetLimits(Mathf.Max(element.ULongValue.MinValue, min), Mathf.Min(element.ULongValue.MaxValue, max));
|
|
element.ULongValue.ValueChanged += OnValueChanged;
|
|
element.ULongValue.SlidingEnd += ClearToken;
|
|
_element = element;
|
|
}
|
|
}
|
|
|
|
private void OnValueChanged()
|
|
{
|
|
var isSliding = _element.IsSliding;
|
|
var token = isSliding ? this : null;
|
|
SetValue(SetValue(_element.Value), token);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void Refresh()
|
|
{
|
|
base.Refresh();
|
|
|
|
if (HasDifferentValues)
|
|
{
|
|
// TODO: support different values for ValueBox<T>
|
|
}
|
|
else
|
|
{
|
|
_element.Value = GetValue(Values[0]);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gets the value limits.
|
|
/// </summary>
|
|
/// <param name="min">The minimum value.</param>
|
|
/// <param name="max">The maximum value.</param>
|
|
protected abstract void GetLimits(out ulong min, out ulong max);
|
|
|
|
/// <summary>
|
|
/// Gets the value as long.
|
|
/// </summary>
|
|
/// <param name="value">The value from object.</param>
|
|
/// <returns>The value for editor.</returns>
|
|
protected abstract ulong GetValue(object value);
|
|
|
|
/// <summary>
|
|
/// Gets the value from long.
|
|
/// </summary>
|
|
/// <param name="value">The value from editor.</param>
|
|
/// <returns>The value to object.</returns>
|
|
protected abstract object SetValue(ulong value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit byte value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(byte)), DefaultEditor]
|
|
public sealed class ByteEditor : UnsignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out ulong min, out ulong max)
|
|
{
|
|
min = byte.MinValue;
|
|
max = byte.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override ulong GetValue(object value)
|
|
{
|
|
return (byte)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(ulong value)
|
|
{
|
|
return (byte)value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit char value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(char)), DefaultEditor]
|
|
public sealed class CharEditor : UnsignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out ulong min, out ulong max)
|
|
{
|
|
min = char.MinValue;
|
|
max = char.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override ulong GetValue(object value)
|
|
{
|
|
return (char)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(ulong value)
|
|
{
|
|
return (char)value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit ushort value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(ushort)), DefaultEditor]
|
|
public sealed class UShortEditor : UnsignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out ulong min, out ulong max)
|
|
{
|
|
min = ushort.MinValue;
|
|
max = ushort.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override ulong GetValue(object value)
|
|
{
|
|
return (ushort)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(ulong value)
|
|
{
|
|
return (ushort)value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit uint value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(uint)), DefaultEditor]
|
|
public sealed class UintEditor : UnsignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out ulong min, out ulong max)
|
|
{
|
|
min = uint.MinValue;
|
|
max = uint.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override ulong GetValue(object value)
|
|
{
|
|
return (uint)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(ulong value)
|
|
{
|
|
return (uint)value;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Default implementation of the inspector used to edit ulong value type properties.
|
|
/// </summary>
|
|
[CustomEditor(typeof(ulong)), DefaultEditor]
|
|
public sealed class ULongEditor : UnsignedIntegerValueEditor
|
|
{
|
|
/// <inheritdoc />
|
|
protected override void GetLimits(out ulong min, out ulong max)
|
|
{
|
|
min = ulong.MinValue;
|
|
max = ulong.MaxValue;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override ulong GetValue(object value)
|
|
{
|
|
return (ulong)value;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
protected override object SetValue(ulong value)
|
|
{
|
|
return (ulong)value;
|
|
}
|
|
}
|
|
}
|