diff --git a/MiraAPI/GameOptions/Attributes/OptionList/ModdedEnumOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/OptionList/ModdedEnumOptionListAttribute.cs index c8ec447..dde2cfb 100644 --- a/MiraAPI/GameOptions/Attributes/OptionList/ModdedEnumOptionListAttribute.cs +++ b/MiraAPI/GameOptions/Attributes/OptionList/ModdedEnumOptionListAttribute.cs @@ -9,13 +9,13 @@ namespace MiraAPI.GameOptions.Attributes; /// Attribute for creating a list of enum options. /// [AttributeUsage(AttributeTargets.Property)] -public class ModdedEnumOptionListAttribute(Func titler, Type enumType, string[]? values = null) - : ModdedOptionListAttribute(titler) +public class ModdedEnumOptionListAttribute(string title, Type enumType, string[]? values = null) + : ModdedOptionListAttribute(title) { internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property) { var optList = new ModdedOptionList( - value.Count, idx => new(Titler(idx), (int)(value[idx] ?? 0), enumType, values)); + value.Count, idx => new(GetFormattedTitle(idx), (int)(value[idx] ?? 0), enumType, values)); return optList; } @@ -31,7 +31,7 @@ public class ModdedEnumOptionListAttribute(Func titler, Type enumTy { return HolderOptionList?[idx] is ModdedEnumOption opt ? Enum.ToObject(enumType, opt.Value) - : throw new InvalidOperationException($"HolderOption for option \"{Titler(idx)}\" with EnumType ${enumType.FullName} is not a ModdedEnumOption"); + : throw new InvalidOperationException($"HolderOption for option \"{GetFormattedTitle(idx)}\" with EnumType ${enumType.FullName} is not a ModdedEnumOption"); } } @@ -40,13 +40,13 @@ public class ModdedEnumOptionListAttribute(Func titler, Type enumTy /// /// The enum type. [AttributeUsage(AttributeTargets.Property)] -public class ModdedEnumOptionListAttribute(Func titler, string[]? values = null) - : ModdedOptionListAttribute(titler) where T : Enum +public class ModdedEnumOptionListAttribute(string title, string[]? values = null) + : ModdedOptionListAttribute(title) where T : Enum { internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property) { var optList = new ModdedOptionList>( - value.Count, idx => new(Titler(idx), (T)(value[idx] ?? 0), values)); + value.Count, idx => new(GetFormattedTitle(idx), (T)(value[idx] ?? 0), values)); return optList; } @@ -62,6 +62,6 @@ public class ModdedEnumOptionListAttribute(Func titler, string[] { return HolderOptionList?[idx] is ModdedEnumOption opt ? opt.Value - : throw new InvalidOperationException($"HolderOption for option \"{Titler(idx)}\" with EnumType ${typeof(T).FullName} is not a ModdedEnumOption"); + : throw new InvalidOperationException($"HolderOption for option \"{GetFormattedTitle(idx)}\" with EnumType ${typeof(T).FullName} is not a ModdedEnumOption"); } } diff --git a/MiraAPI/GameOptions/Attributes/OptionList/ModdedNumberOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/OptionList/ModdedNumberOptionListAttribute.cs index 18d7f37..96e9729 100644 --- a/MiraAPI/GameOptions/Attributes/OptionList/ModdedNumberOptionListAttribute.cs +++ b/MiraAPI/GameOptions/Attributes/OptionList/ModdedNumberOptionListAttribute.cs @@ -11,21 +11,21 @@ namespace MiraAPI.GameOptions.Attributes; /// [AttributeUsage(AttributeTargets.Property)] public class ModdedNumberOptionListAttribute( - Func titler, + string title, float min, float max, float increment = 1, MiraNumberSuffixes suffixType = MiraNumberSuffixes.None, string? formatString = null, bool zeroInfinity = false) - : ModdedOptionListAttribute(titler) + : ModdedOptionListAttribute(title) { internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property) { return new ModdedOptionList(value.Count, idx => { return new( - Titler(idx), + GetFormattedTitle(idx), (float)(value[idx] ?? min + increment), min, max, @@ -50,6 +50,6 @@ public class ModdedNumberOptionListAttribute( { return opt.Value; } - throw new InvalidOperationException($"HolderOption for option \"{Titler(idx)}\" is not a ModdedNumberOption"); + throw new InvalidOperationException($"HolderOption for option \"{GetFormattedTitle(idx)}\" is not a ModdedNumberOption"); } } diff --git a/MiraAPI/GameOptions/Attributes/OptionList/ModdedOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/OptionList/ModdedOptionListAttribute.cs index 74615dd..f109ffc 100644 --- a/MiraAPI/GameOptions/Attributes/OptionList/ModdedOptionListAttribute.cs +++ b/MiraAPI/GameOptions/Attributes/OptionList/ModdedOptionListAttribute.cs @@ -1,24 +1,28 @@ using System; using System.Collections; using System.Reflection; +using System.Text.RegularExpressions; namespace MiraAPI.GameOptions.Attributes; /// /// Represents an attribute that is used to define a list of modded options. /// -/// A function to title of the options. +/// The title of the options. [AttributeUsage(AttributeTargets.Property)] -public abstract class ModdedOptionListAttribute(Func titler) : PropertyOptionAttribute +public abstract class ModdedOptionListAttribute(string title) : PropertyOptionAttribute { internal IModdedOptionList? HolderOptionList { get; set; } internal object? Value { get; set; } /// - /// Gets the function to title of the options. + /// Gets the title of the options. + /// If the string contains a format parameter, e.g., {0}, then the option's index will be given to it. + /// The string cannot contain more than one parameter. + /// If no parameter is given, the title will simply append the index to the end of it. /// - public Func Titler => titler; + public string Title => title; /// /// Sets the value of all the options. @@ -63,4 +67,25 @@ public abstract class ModdedOptionListAttribute(Func titler) : Prop public abstract object GetValue(int idx); internal abstract IModdedOptionList? CreateOptionList(IList value, PropertyInfo property); + + /// + /// Gets the formatted with the option's index. + /// + /// The option's index. + /// The formatted option's title. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Globalization", "CA1305:Specify IFormatProvider", Justification = "I don't even know if this is worth it.")] + protected string GetFormattedTitle(int index) + { + Match match = Regex.Match(Title, @"\{(\d+)(?::[^}]+)?\}"); + + if (match.Success) + { + if (match.Groups.Count == 1 && match.Groups[0].Value == "0") + { + return string.Format(Title, index); + } + Error("ModdedOptionList Title cannot contain more than the first parameter for formatting."); + } + return Title + index; + } } diff --git a/MiraAPI/GameOptions/Attributes/OptionList/ModdedToggleOptionListAttribute.cs b/MiraAPI/GameOptions/Attributes/OptionList/ModdedToggleOptionListAttribute.cs index 7e34080..5209bcc 100644 --- a/MiraAPI/GameOptions/Attributes/OptionList/ModdedToggleOptionListAttribute.cs +++ b/MiraAPI/GameOptions/Attributes/OptionList/ModdedToggleOptionListAttribute.cs @@ -8,14 +8,14 @@ namespace MiraAPI.GameOptions.Attributes; /// /// Attribute for a list of toggle options. /// -/// The function to get each option's title. +/// The option's title. [AttributeUsage(AttributeTargets.Property)] -public class ModdedToggleOptionListAttribute(Func titler) : ModdedOptionListAttribute(titler) +public class ModdedToggleOptionListAttribute(string title) : ModdedOptionListAttribute(title) { internal override IModdedOptionList CreateOptionList(IList value, PropertyInfo property) { var optList = new ModdedOptionList( - value.Count, idx => new(Titler(idx), (bool)(value[idx] ?? false))); + value.Count, idx => new(GetFormattedTitle(idx), (bool)(value[idx] ?? false))); return optList; } @@ -33,6 +33,6 @@ public class ModdedToggleOptionListAttribute(Func titler) : ModdedO { return opt.Value; } - throw new InvalidOperationException($"Holder option for {Titler(idx)} is not a ModdedToggleOption."); + throw new InvalidOperationException($"Holder option for {GetFormattedTitle(idx)} is not a ModdedToggleOption."); } }