You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
CrowdControl/Assets/3rd/StompyRobot/SRDebugger/Scripts/Internal/OptionDefinition.cs

94 lines
3.4 KiB
C#

3 months ago
using System;
using SRF.Helpers;
namespace SRDebugger
{
/// <summary>
/// Class describing how an option should be presented within the options panel.
/// </summary>
public sealed class OptionDefinition
{
/// <summary>
/// Display-name for the option.
/// </summary>
public string Name { get; private set; }
/// <summary>
/// The category that this option should be placed within.
/// </summary>
public string Category { get; private set; }
/// <summary>
/// Sort order within the category. Order is low to high, (options with lower SortPriority will appear before
/// options with higher SortPriority).
/// </summary>
public int SortPriority { get; private set; }
/// <summary>
/// Whether this option is a method that should be invoked.
/// </summary>
public bool IsMethod
{
get { return Method != null; }
}
/// <summary>
/// Whether this option is a property that has a value.
/// </summary>
public bool IsProperty
{
get { return Property != null; }
}
/// <summary>
/// The underlying method for this OptionDefinition.
/// Can be null if <see cref="IsMethod"/> is false.
/// </summary>
public SRF.Helpers.MethodReference Method { get; private set; }
/// <summary>
/// The underlying property for this OptionDefinition.
/// Can be null if <see cref="IsProperty"/> is false.
/// </summary>
public SRF.Helpers.PropertyReference Property { get; private set; }
private OptionDefinition(string name, string category, int sortPriority)
{
Name = name;
Category = category;
SortPriority = sortPriority;
}
public OptionDefinition(string name, string category, int sortPriority, SRF.Helpers.MethodReference method)
: this(name, category, sortPriority)
{
Method = method;
}
public OptionDefinition(string name, string category, int sortPriority, SRF.Helpers.PropertyReference property)
: this(name, category, sortPriority)
{
Property = property;
}
public static OptionDefinition FromMethod(string name, Action callback, string category = "Default", int sortPriority = 0)
{
return new OptionDefinition(name, category, sortPriority, callback);;
}
/// <summary>
/// Create an option definition from a setter and getter lambda.
/// </summary>
/// <param name="name">Name to display in options menu.</param>
/// <param name="getter">Method to get the current value of the property.</param>
/// <param name="setter">Method to set the value of the property (can be null if read-only)</param>
/// <param name="category">Category to display the option in.</param>
/// <param name="sortPriority">Sort priority to arrange the option within the category.</param>
/// <returns>The created option definition.</returns>
public static OptionDefinition Create<T>(string name, Func<T> getter, Action<T> setter = null, string category = "Default", int sortPriority = 0)
{
return new OptionDefinition(name, category, sortPriority, PropertyReference.FromLambda(getter, setter));
}
}
}