mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-19 15:51:48 +00:00
71 lines
2.4 KiB
C#
71 lines
2.4 KiB
C#
using System;
|
|
using System.Reflection;
|
|
using MiraAPI.GameOptions.OptionTypes;
|
|
|
|
namespace MiraAPI.GameOptions.Attributes;
|
|
|
|
/// <summary>
|
|
/// Attribute for creating a <see cref="ModdedEnumOption"/>.
|
|
/// </summary>
|
|
/// <param name="title">The title of the option.</param>
|
|
/// <param name="enumType">The <see cref="Enum"/> type.</param>
|
|
/// <param name="values">An option list of string values to use in place of the <see langword="enum"/> name.</param>
|
|
[AttributeUsage(AttributeTargets.Property)]
|
|
public class ModdedEnumOptionAttribute(string title, Type enumType, string[]? values = null)
|
|
: ModdedOptionAttribute(title)
|
|
{
|
|
internal override IModdedOption CreateOption(object? value, PropertyInfo property)
|
|
{
|
|
var opt = new ModdedEnumOption(Title, (int)(value ?? 0), enumType, values);
|
|
return opt;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void SetValue(object value)
|
|
{
|
|
var opt = HolderOption as ModdedEnumOption;
|
|
opt?.SetValue((int)value);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override object GetValue()
|
|
{
|
|
return HolderOption is ModdedEnumOption opt
|
|
? Enum.ToObject(enumType, opt.Value)
|
|
: throw new InvalidOperationException($"HolderOption for option \"{Title}\" with EnumType ${enumType.FullName} is not a ModdedEnumOption");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Attribute for creating an enum option.
|
|
/// </summary>
|
|
/// <typeparam name="T">The enum type.</typeparam>
|
|
/// <param name="title">The title of the option.</param>
|
|
/// <param name="values">An option list of string values to use in place of the <see langword="enum"/> name.</param>
|
|
[AttributeUsage(AttributeTargets.Property)]
|
|
public class ModdedEnumOptionAttribute<T>(string title, string[]? values = null)
|
|
: ModdedOptionAttribute(title)
|
|
where T : struct, Enum
|
|
{
|
|
internal override IModdedOption CreateOption(object? value, PropertyInfo property)
|
|
{
|
|
var opt = new ModdedEnumOption<T>(Title, (T)(value ?? 0), values);
|
|
return opt;
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override void SetValue(object value)
|
|
{
|
|
var opt = HolderOption as ModdedEnumOption<T>;
|
|
opt?.SetValue((T)value);
|
|
}
|
|
|
|
/// <inheritdoc />
|
|
public override object GetValue()
|
|
{
|
|
return HolderOption is ModdedEnumOption<T> opt
|
|
? opt.Value
|
|
: throw new InvalidOperationException($"HolderOption for option \"{Title}\" with EnumType ${typeof(T).FullName} is not a ModdedEnumOption");
|
|
}
|
|
}
|