Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions REPOConfig/ConfigEntryStore.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System.Collections.Generic;
using BepInEx.Configuration;

namespace REPOConfig
{
public class ConfigEntryStore
{
internal Dictionary<ConfigEntryBase, object> ChangedEntryValues { get; } = [];
internal Dictionary<ConfigEntryBase, object> OriginalEntryValues { get; } = [];
}
}
329 changes: 84 additions & 245 deletions REPOConfig/ConfigMenu.cs

Large diffs are not rendered by default.

16 changes: 16 additions & 0 deletions REPOConfig/Extensions/FloatExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using System.Globalization;

namespace REPOConfig.Extensions
{
internal static class FloatExtensions
{
internal static int GetDecimalPlaces(this float value)
{
var valueAsString = value.ToString(CultureInfo.InvariantCulture);

var decimalPoint = valueAsString.IndexOf('.');

return decimalPoint == -1 ? 0 : valueAsString[(decimalPoint + 1)..].Length;
}
}
}
27 changes: 27 additions & 0 deletions REPOConfig/Strategies/BooleanConfigEntryStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
using System;
using BepInEx.Configuration;
using MenuLib;
using TMPro;
using UnityEngine;

namespace REPOConfig.Strategies
{
public class BooleanConfigEntryStrategy : ConfigEntryStrategy<bool>
{
protected override RectTransform Execute(Transform scrollView, ConfigEntry<bool> entry, EntryParameters parameters)
{
var repoToggle = MenuAPI.CreateREPOToggle(parameters.ModName, b =>
{
if (parameters.Store.OriginalEntryValues.TryGetValue(entry, out var originalValue) && b == (bool) originalValue)
{
parameters.Store.ChangedEntryValues.Remove(entry);
return;
}

parameters.Store.ChangedEntryValues[entry] = b;
}, scrollView, defaultValue: (bool)entry.BoxedValue);
repoToggle.labelTMP.fontStyle = FontStyles.Normal;
return repoToggle.rectTransform;
}
}
}
25 changes: 25 additions & 0 deletions REPOConfig/Strategies/ConfigEntryStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;
using BepInEx.Configuration;
using UnityEngine;

namespace REPOConfig.Strategies
{
public abstract class ConfigEntryStrategy<T> : IConfigEntryStrategy
{
public Type TargetType { get; } = typeof(T);

public RectTransform Execute(Transform scrollView, ConfigEntryBase entry, EntryParameters parameters)
{
return Execute(scrollView, (ConfigEntry<T>)entry, parameters);
}

protected abstract RectTransform Execute(Transform scrollView, ConfigEntry<T> entry, EntryParameters parameters);
}

internal interface IConfigEntryStrategy
{
Type TargetType { get; }

RectTransform Execute(Transform scrollView, ConfigEntryBase entry, EntryParameters parameters);
}
}
8 changes: 8 additions & 0 deletions REPOConfig/Strategies/EntryParameters.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace REPOConfig.Strategies
{
public sealed record EntryParameters(string ModName, ConfigEntryStore Store)
{
public string ModName { get; } = ModName;
public ConfigEntryStore Store { get; } = Store;
}
}
70 changes: 70 additions & 0 deletions REPOConfig/Strategies/FloatConfigEntryStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
using System;
using BepInEx.Configuration;
using MenuLib;
using REPOConfig.Extensions;
using TMPro;
using UnityEngine;

namespace REPOConfig.Strategies
{
public class FloatConfigEntryStrategy : ConfigEntryStrategy<float>
{
protected override RectTransform Execute(Transform scrollView, ConfigEntry<float> entry, EntryParameters parameters)
{
float min, max;
var precision = 2;

if (entry.Description.AcceptableValues is AcceptableValueRange<float> acceptableValueRange)
{
min = acceptableValueRange.MinValue;
max = acceptableValueRange.MaxValue;

precision = Mathf.Max(min.GetDecimalPlaces(), max.GetDecimalPlaces(),
((float)entry.DefaultValue).GetDecimalPlaces(), 2);
}
else
{
var absoluteDefaultValue = Math.Abs((float)entry.BoxedValue);

if (absoluteDefaultValue == 0)
min = -(max = 100);
else if (absoluteDefaultValue <= .001)
min = -(max = 10f);
else if (absoluteDefaultValue <= .01)
min = -(max = 50f);
else if (absoluteDefaultValue <= 100)
min = -(max = absoluteDefaultValue * 3f);
else
min = -(max = absoluteDefaultValue * 2);
}

var repoSlider = MenuAPI.CreateREPOSlider(parameters.ModName, string.Empty, f => //description
{
if (parameters.Store.OriginalEntryValues.TryGetValue(entry, out var originalValue) &&
Math.Abs(f - (float)originalValue) < float.Epsilon)
{
parameters.Store.ChangedEntryValues.Remove(entry);
return;
}

parameters.Store.ChangedEntryValues[entry] = f;
}, scrollView, defaultValue: (float)entry.BoxedValue, min: min, max: max, precision: precision);
repoSlider.descriptionTMP.fontStyle = repoSlider.labelTMP.fontStyle = FontStyles.Normal;

/*if (description.Length <= 43)
return repoSlider.rectTransform;*/

//repoSlider.descriptionTMP.maxVisibleCharacters = repoSlider.repoTextScroller.maxCharacters = 43;
//repoSlider.repoTextScroller.scrollingSpeedInSecondsPerCharacter = Entry.descriptionScrollSpeed.Value;

/*repoSlider.repoTextScroller.endWaitTime = repoSlider.repoTextScroller.initialWaitTime = 5f;
repoSlider.repoTextScroller.startWaitTime = 3f;

repoSlider.descriptionTMP.alignment = TextAlignmentOptions.Left;
modPage.StartCoroutine(repoSlider.repoTextScroller.Animate());*/


return repoSlider.rectTransform;
}
}
}
61 changes: 61 additions & 0 deletions REPOConfig/Strategies/IntConfigEntryStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System;
using BepInEx.Configuration;
using MenuLib;
using TMPro;
using UnityEngine;

namespace REPOConfig.Strategies
{
public class IntConfigEntryStrategy : ConfigEntryStrategy<int>
{
protected override RectTransform Execute(Transform scrollView, ConfigEntry<int> entry, EntryParameters parameters)
{
int min;
int max;

if (entry.Description.AcceptableValues is AcceptableValueRange<int> acceptableValueRange)
{
min = acceptableValueRange.MinValue;
max = acceptableValueRange.MaxValue;
}
else
{
var absoluteDefaultValue = Math.Abs((int)entry.BoxedValue);

min = absoluteDefaultValue switch
{
0 => -(max = 100),
<= 100 => -(max = absoluteDefaultValue * 3),
_ => -(max = absoluteDefaultValue * 2)
};
}

var repoSlider = MenuAPI.CreateREPOSlider(parameters.ModName, string.Empty, i => //description
{
if (parameters.Store.OriginalEntryValues.TryGetValue(entry, out var originalValue) &&
i == (int)originalValue)
{
parameters.Store.ChangedEntryValues.Remove(entry);
return;
}

parameters.Store.ChangedEntryValues[entry] = i;
}, scrollView, defaultValue: (int)entry.BoxedValue, min: min, max: max);
repoSlider.descriptionTMP.fontStyle = repoSlider.labelTMP.fontStyle = FontStyles.Normal;

/*if (description.Length <= 43)
return repoSlider.rectTransform;*/

/*repoSlider.descriptionTMP.maxVisibleCharacters = repoSlider.repoTextScroller.maxCharacters = 43;
repoSlider.repoTextScroller.scrollingSpeedInSecondsPerCharacter = Entry.descriptionScrollSpeed.Value;

repoSlider.repoTextScroller.endWaitTime = repoSlider.repoTextScroller.initialWaitTime = 5f;
repoSlider.repoTextScroller.startWaitTime = 3f;

repoSlider.descriptionTMP.alignment = TextAlignmentOptions.Left;
modPage.StartCoroutine(repoSlider.repoTextScroller.Animate());*/

return repoSlider.rectTransform;
}
}
}
66 changes: 66 additions & 0 deletions REPOConfig/Strategies/StringConfigEntryStrategy.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
using System;
using BepInEx.Configuration;
using MenuLib;
using TMPro;
using UnityEngine;

namespace REPOConfig.Strategies
{
public class StringConfigEntryStrategy : ConfigEntryStrategy<string>
{
protected override RectTransform Execute(Transform scrollView, ConfigEntry<string> entry, EntryParameters parameters)
{
return entry.Description.AcceptableValues is AcceptableValueList<string> acceptableValueList
? HandleListEntry(scrollView, entry, parameters, acceptableValueList)
: HandleStringEntry(scrollView, entry, parameters);
}

private RectTransform HandleStringEntry(Transform scrollView, ConfigEntry<string> entry, EntryParameters parameters)
{
var defaultValue = (string) entry.DefaultValue;

var repoInputField = MenuAPI.CreateREPOInputField(parameters.ModName, s =>
{
if (parameters.Store.OriginalEntryValues.TryGetValue(entry, out var originalValue) && s == (string) originalValue)
{
parameters.Store.ChangedEntryValues.Remove(entry);
return;
}

parameters.Store.ChangedEntryValues[entry] = s;
}, scrollView, Vector2.zero, false, !string.IsNullOrEmpty(defaultValue) ? defaultValue : "<NONE>", (string) entry.BoxedValue);
repoInputField.labelTMP.fontStyle = repoInputField.inputStringSystem.inputTMP.fontStyle = FontStyles.Normal;

return repoInputField.rectTransform;
}

private RectTransform HandleListEntry(Transform scrollView, ConfigEntry<string> entry, EntryParameters parameters, AcceptableValueList<string> acceptableValueList)
{
var repoSlider = MenuAPI.CreateREPOSlider(parameters.ModName, string.Empty, s => //description
{
if (parameters.Store.OriginalEntryValues.TryGetValue(entry, out var originalValue) && s == (string) originalValue)
{
parameters.Store.ChangedEntryValues.Remove(entry);
return;
}

parameters.Store.ChangedEntryValues[entry] = s;
}, scrollView, acceptableValueList.AcceptableValues, (string)entry.BoxedValue);
repoSlider.descriptionTMP.fontStyle = repoSlider.labelTMP.fontStyle = FontStyles.Normal;

/*if (description.Length <= 43)
return repoSlider.rectTransform;

repoSlider.descriptionTMP.maxVisibleCharacters = repoSlider.repoTextScroller.maxCharacters = 43;
repoSlider.repoTextScroller.scrollingSpeedInSecondsPerCharacter = Entry.descriptionScrollSpeed.Value;

repoSlider.repoTextScroller.endWaitTime = repoSlider.repoTextScroller.initialWaitTime = 5f;
repoSlider.repoTextScroller.startWaitTime = 3f;

repoSlider.descriptionTMP.alignment = TextAlignmentOptions.Left;
modPage.StartCoroutine(repoSlider.repoTextScroller.Animate());*/

return repoSlider.rectTransform;
}
}
}