Skip to content
20 changes: 20 additions & 0 deletions MiraAPI/GameOptions/IModdedOption.cs
Original file line number Diff line number Diff line change
Expand Up @@ -121,4 +121,24 @@ public interface IModdedOption
/// </summary>
public interface IModdedOptionList : IReadOnlyList<IModdedOption>
{
/// <summary>
/// Gets the function to name the keys of the individual options in the configuration file.
/// <para/>
/// Return <see langword="null"/> to use the default of the property's name with its index appended.
/// </summary>
Func<int, string>? ConfigName { get; init; }
}

/// <summary>
/// Interface for list of <typeparamref name="T"/> options.
/// </summary>
/// <typeparam name="T">The type of <see cref="IModdedOption"/>.</typeparam>
public interface IModdedOptionList<out T> : IModdedOptionList
where T : IModdedOption
{
/// <inheritdoc cref="IReadOnlyList{T}.this[int]"/>
new T this[int index] { get; }

/// <inheritdoc cref="IEnumerable{T}.GetEnumerator"/>
new IEnumerator<T> GetEnumerator();
}
6 changes: 4 additions & 2 deletions MiraAPI/GameOptions/ModdedOptionsManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -198,9 +198,11 @@ internal static void RegisterPropertyOptionList(Type type, PropertyInfo property
return;
}

Func<int, string> configName = optionList.ConfigName ?? (i => property.Name + (i + 1));

for (int i = 0; i < optionList.Count; i++)
{
RegisterOption(optionList[i], group, property.Name + i, pluginInfo);
RegisterOption(optionList[i], group, configName(i), pluginInfo);
}
}

Expand Down Expand Up @@ -277,7 +279,7 @@ internal static void RegisterAttributeOptionList(
option.Visible = () => visibilityFunc(i);
}

RegisterOption(option, group, property.Name + i, pluginInfo);
RegisterOption(option, group, property.Name + (i + 1), pluginInfo);
}
}

Expand Down
16 changes: 12 additions & 4 deletions MiraAPI/GameOptions/OptionTypes/ModdedOptionList.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ namespace MiraAPI.GameOptions.OptionTypes;
/// Represents a modded option list.
/// </summary>
/// <typeparam name="T">The type of options.</typeparam>
public class ModdedOptionList<T> : IModdedOptionList
public class ModdedOptionList<T> : IModdedOptionList<T>
where T : IModdedOption
{
/// <inheritdoc/>
Expand All @@ -20,6 +20,9 @@ public class ModdedOptionList<T> : IModdedOptionList
/// </summary>
public IReadOnlyList<T> Options { get; }

/// <inheritdoc/>
public Func<int, string>? ConfigName { get; init; }

/// <summary>
/// Initializes a new instance of the <see cref="ModdedOptionList{T}"/> class.
/// </summary>
Expand All @@ -41,17 +44,22 @@ public ModdedOptionList(IEnumerable<T> options)
Options = [.. options];
}

/// <inheritdoc/>
public IEnumerator<IModdedOption> GetEnumerator()
/// <inheritdoc cref="IEnumerable{T}.GetEnumerator"/>
public IEnumerator<T> GetEnumerator()
{
return ((IEnumerable<IModdedOption>)Options).GetEnumerator();
return Options.GetEnumerator();
}

IEnumerator IEnumerable.GetEnumerator()
{
return Options.GetEnumerator();
}

IEnumerator<IModdedOption> IEnumerable<IModdedOption>.GetEnumerator()
{
return ((IEnumerable<IModdedOption>)Options).GetEnumerator();
}

/// <summary>
/// Indexes the option of type <typeparamref name="T"/>.
/// </summary>
Expand Down
Loading