mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-19 15:51:48 +00:00
use Option Headers as Dividers to Search Options Results
This commit is contained in:
1 parent
901503f762
commit
7b77d0d102
2 files changed
+148
-11
No files matched your search
@@ -11,7 +11,12 @@ using Reactor.Utilities;
|
|||||||
|
|
||||||
namespace MiraAPI.Utilities;
|
namespace MiraAPI.Utilities;
|
||||||
|
|
||||||
internal sealed record GuideOptionEntry(string Title, string Value, string GroupName, string ModAbbreviation);
|
internal sealed record GuideOptionEntry(
|
||||||
|
string Title,
|
||||||
|
string Value,
|
||||||
|
AbstractOptionGroup Group,
|
||||||
|
string GroupName,
|
||||||
|
string ModAbbreviation);
|
||||||
|
|
||||||
internal sealed class GuideOptionPage(AbstractOptionGroup group, string modAbbreviation, IReadOnlyList<GuideOptionEntry> entries)
|
internal sealed class GuideOptionPage(AbstractOptionGroup group, string modAbbreviation, IReadOnlyList<GuideOptionEntry> entries)
|
||||||
{
|
{
|
||||||
@@ -53,7 +58,7 @@ internal static class GuideOptionPages
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var entry = TryCreateEntry(option, groupName, item.ModAbbreviation, formatBool);
|
var entry = TryCreateEntry(option, item.Group, groupName, item.ModAbbreviation, formatBool);
|
||||||
if (entry != null)
|
if (entry != null)
|
||||||
{
|
{
|
||||||
entries.Add(entry);
|
entries.Add(entry);
|
||||||
@@ -90,11 +95,11 @@ internal static class GuideOptionPages
|
|||||||
|
|
||||||
const StringComparison cmp = StringComparison.OrdinalIgnoreCase;
|
const StringComparison cmp = StringComparison.OrdinalIgnoreCase;
|
||||||
return pages
|
return pages
|
||||||
.SelectMany(p => p.Entries)
|
.SelectMany(page => page.Entries
|
||||||
.Select(e => (Entry: e, Rank: Rank(e, query, cmp)))
|
.Select(entry => (Entry: entry, Rank: Rank(entry, query, cmp)))
|
||||||
.Where(x => x.Rank < int.MaxValue)
|
.Where(result => result.Rank < int.MaxValue)
|
||||||
.OrderBy(x => x.Rank)
|
.OrderBy(result => result.Rank)
|
||||||
.Select(x => x.Entry)
|
.Select(result => result.Entry))
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,6 +166,7 @@ internal static class GuideOptionPages
|
|||||||
|
|
||||||
private static GuideOptionEntry? TryCreateEntry(
|
private static GuideOptionEntry? TryCreateEntry(
|
||||||
IModdedOption option,
|
IModdedOption option,
|
||||||
|
AbstractOptionGroup group,
|
||||||
string groupName,
|
string groupName,
|
||||||
string modAbbreviation,
|
string modAbbreviation,
|
||||||
Func<bool, string> formatBool)
|
Func<bool, string> formatBool)
|
||||||
@@ -169,7 +175,7 @@ internal static class GuideOptionPages
|
|||||||
{
|
{
|
||||||
var title = TranslationController.Instance.GetString(option.StringName);
|
var title = TranslationController.Instance.GetString(option.StringName);
|
||||||
var value = FormatValue(option, formatBool);
|
var value = FormatValue(option, formatBool);
|
||||||
return new GuideOptionEntry(title, value, groupName, modAbbreviation);
|
return new GuideOptionEntry(title, value, group, groupName, modAbbreviation);
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ using Random = UnityEngine.Random;
|
|||||||
|
|
||||||
namespace MiraAPI.Utilities;
|
namespace MiraAPI.Utilities;
|
||||||
|
|
||||||
|
internal readonly record struct AdvancedSettingsRow(string Title, string Value, AbstractOptionGroup? Group);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// A class that contains helper methods.
|
/// A class that contains helper methods.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -920,6 +922,17 @@ public static class Helpers
|
|||||||
MatchInfoGuide guide,
|
MatchInfoGuide guide,
|
||||||
Scroller parent,
|
Scroller parent,
|
||||||
IReadOnlyList<KeyValuePair<string, string>> settings)
|
IReadOnlyList<KeyValuePair<string, string>> settings)
|
||||||
|
{
|
||||||
|
return CreateAdvancedSettingsPage(
|
||||||
|
guide,
|
||||||
|
parent,
|
||||||
|
settings.Select(setting => new AdvancedSettingsRow(setting.Key, setting.Value, null)).ToList());
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static GameObject CreateAdvancedSettingsPage(
|
||||||
|
MatchInfoGuide guide,
|
||||||
|
Scroller parent,
|
||||||
|
List<AdvancedSettingsRow> settings)
|
||||||
{
|
{
|
||||||
const float contentTop = 0.95f;
|
const float contentTop = 0.95f;
|
||||||
const float horizontalOffset = -0.2f;
|
const float horizontalOffset = -0.2f;
|
||||||
@@ -976,15 +989,127 @@ public static class Helpers
|
|||||||
var rowHeight = prefabBounds.size.y * rowScale;
|
var rowHeight = prefabBounds.size.y * rowScale;
|
||||||
var rowPitch = 0.45f * rowScale;
|
var rowPitch = 0.45f * rowScale;
|
||||||
var contentBottom = float.PositiveInfinity;
|
var contentBottom = float.PositiveInfinity;
|
||||||
|
var previousGroup = (AbstractOptionGroup?)null;
|
||||||
|
var rowIndex = 0;
|
||||||
|
var column = 0;
|
||||||
|
var groupSpacing = 0f;
|
||||||
|
|
||||||
for (var i = 0; i < settings.Count; i++)
|
for (var i = 0; i < settings.Count; i++)
|
||||||
{
|
{
|
||||||
var column = i % columns;
|
if (settings[i].Group != previousGroup && settings[i].Group is { } group)
|
||||||
var rowIndex = i / columns;
|
{
|
||||||
|
if (previousGroup != null)
|
||||||
|
{
|
||||||
|
groupSpacing += 0.2f;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (column != 0)
|
||||||
|
{
|
||||||
|
rowIndex++;
|
||||||
|
column = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
var headerSource = group.Header;
|
||||||
|
if (!headerSource && gameSettingsMenu && gameSettingsMenu.GameSettingsTab)
|
||||||
|
{
|
||||||
|
headerSource = gameSettingsMenu.GameSettingsTab.categoryHeaderOrigin;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!headerSource)
|
||||||
|
{
|
||||||
|
foreach (var candidate in Resources.FindObjectsOfTypeAll(Il2CppType.Of<CategoryHeaderMasked>()))
|
||||||
|
{
|
||||||
|
var candidateHeader = candidate.TryCast<CategoryHeaderMasked>();
|
||||||
|
if (candidateHeader && candidateHeader!.Background && candidateHeader.Title)
|
||||||
|
{
|
||||||
|
headerSource = candidateHeader;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (headerSource)
|
||||||
|
{
|
||||||
|
const float headerScale = 0.5f;
|
||||||
|
var headerWidth = (columns * columnWidth + (columns - 1) * columnGap) / headerScale;
|
||||||
|
var header = Object.Instantiate(headerSource!, page.transform, false);
|
||||||
|
header.transform.localScale = Vector3.one * headerScale;
|
||||||
|
header.transform.localPosition = new Vector3(
|
||||||
|
horizontalOffset - 0.4f,
|
||||||
|
contentTop - (rowIndex * rowPitch) - groupSpacing,
|
||||||
|
-1f);
|
||||||
|
header.SetHeader(MiraLocaleManager.GetOrCreateLocaleString(group.GroupName), 20);
|
||||||
|
if (header.Title)
|
||||||
|
{
|
||||||
|
var titleTranslator = header.Title.GetComponent<TextTranslatorTMP>();
|
||||||
|
if (titleTranslator)
|
||||||
|
{
|
||||||
|
Object.Destroy(titleTranslator);
|
||||||
|
}
|
||||||
|
|
||||||
|
header.Title.text = group.GroupName.Translate();
|
||||||
|
header.Title.color = Color.white;
|
||||||
|
header.Title.horizontalAlignment = HorizontalAlignmentOptions.Left;
|
||||||
|
var titleTransform = header.Title.rectTransform;
|
||||||
|
var titlePosition = titleTransform.localPosition;
|
||||||
|
titlePosition.x = 0.5f;
|
||||||
|
titleTransform.localPosition = titlePosition;
|
||||||
|
titleTransform.SetSizeWithCurrentAnchors(
|
||||||
|
RectTransform.Axis.Horizontal,
|
||||||
|
headerWidth - 0.3f);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.Background)
|
||||||
|
{
|
||||||
|
header.Background.sprite = MiraAssets.CategoryHeader.LoadAsset();
|
||||||
|
header.Background.drawMode = SpriteDrawMode.Sliced;
|
||||||
|
header.Background.color = MiraApiPlugin.DefaultHeaderColor;
|
||||||
|
header.Background.transform.localPosition = new Vector3(0.5f, -0.1833f, 0f);
|
||||||
|
header.Background.size = new Vector2(headerWidth, header.Background.size.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (header.Divider)
|
||||||
|
{
|
||||||
|
header.Divider.color = MiraApiPlugin.DefaultHeaderColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
header.gameObject.SetActive(true);
|
||||||
|
foreach (var renderer in header.GetComponentsInChildren<SpriteRenderer>(true))
|
||||||
|
{
|
||||||
|
renderer.maskInteraction = SpriteMaskInteraction.VisibleInsideMask;
|
||||||
|
renderer.material.SetInt(PlayerMaterial.MaskLayer, 50);
|
||||||
|
if (renderer.enabled && renderer.sprite)
|
||||||
|
{
|
||||||
|
contentBottom = Mathf.Min(
|
||||||
|
contentBottom,
|
||||||
|
inner.InverseTransformPoint(renderer.bounds.min).y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var text in header.GetComponentsInChildren<TextMeshPro>(true))
|
||||||
|
{
|
||||||
|
text.fontMaterial.SetFloat(ShaderID.StencilComp, 3f);
|
||||||
|
text.fontMaterial.SetFloat(ShaderID.Stencil, 50f);
|
||||||
|
if (text.enabled)
|
||||||
|
{
|
||||||
|
text.ForceMeshUpdate();
|
||||||
|
contentBottom = Mathf.Min(
|
||||||
|
contentBottom,
|
||||||
|
inner.InverseTransformPoint(text.bounds.min).y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
|
|
||||||
|
previousGroup = group;
|
||||||
|
}
|
||||||
|
|
||||||
var originX = -((columns * columnWidth) + ((columns - 1) * columnGap)) / 2f +
|
var originX = -((columns * columnWidth) + ((columns - 1) * columnGap)) / 2f +
|
||||||
(column * (columnWidth + columnGap)) +
|
(column * (columnWidth + columnGap)) +
|
||||||
horizontalOffset;
|
horizontalOffset;
|
||||||
var centerY = contentTop - (rowHeight / 2f) - (rowIndex * rowPitch);
|
var centerY = contentTop - (rowHeight / 2f) - (rowIndex * rowPitch);
|
||||||
|
centerY -= groupSpacing;
|
||||||
var row = Object.Instantiate(rowPrefab, page.transform);
|
var row = Object.Instantiate(rowPrefab, page.transform);
|
||||||
row.enabled = false;
|
row.enabled = false;
|
||||||
row.PlusBtn.gameObject.SetActive(false);
|
row.PlusBtn.gameObject.SetActive(false);
|
||||||
@@ -1005,7 +1130,7 @@ public static class Helpers
|
|||||||
originX + (columnWidth / 2f) - (prefabBounds.center.x * rowScale),
|
originX + (columnWidth / 2f) - (prefabBounds.center.x * rowScale),
|
||||||
centerY - (prefabBounds.center.y * rowScale),
|
centerY - (prefabBounds.center.y * rowScale),
|
||||||
0f);
|
0f);
|
||||||
row.TitleText.text = settings[i].Key;
|
row.TitleText.text = settings[i].Title;
|
||||||
row.ValueText.text = settings[i].Value;
|
row.ValueText.text = settings[i].Value;
|
||||||
|
|
||||||
foreach (var text in row.GetComponentsInChildren<TextMeshPro>(true))
|
foreach (var text in row.GetComponentsInChildren<TextMeshPro>(true))
|
||||||
@@ -1048,6 +1173,12 @@ public static class Helpers
|
|||||||
}
|
}
|
||||||
|
|
||||||
row.gameObject.SetActive(true);
|
row.gameObject.SetActive(true);
|
||||||
|
column++;
|
||||||
|
if (column == columns)
|
||||||
|
{
|
||||||
|
column = 0;
|
||||||
|
rowIndex++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var maskArea = parent.transform.FindChild("MaskArea")?.GetComponent<SpriteRenderer>();
|
var maskArea = parent.transform.FindChild("MaskArea")?.GetComponent<SpriteRenderer>();
|
||||||
|
|||||||
Reference in new issue
Block a user