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)); } } }