mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-20 01:46:15 +00:00
wire up headers to pages with more than 2 columns
This commit is contained in:
1 parent
39d77a301b
commit
602665079c
2 files changed
+127
-15
No files matched your search
@@ -1957,6 +1957,7 @@ public static class RoleGuidePatches
|
|||||||
{
|
{
|
||||||
vanillaEntries = BuildVanillaSettingsEntries(guide);
|
vanillaEntries = BuildVanillaSettingsEntries(guide);
|
||||||
}
|
}
|
||||||
|
|
||||||
_settingsPages = GuideOptionPages.BuildPages(guide.GetBoolString);
|
_settingsPages = GuideOptionPages.BuildPages(guide.GetBoolString);
|
||||||
if (_settingsPage > _settingsPages.Count)
|
if (_settingsPage > _settingsPages.Count)
|
||||||
{
|
{
|
||||||
@@ -1979,7 +1980,13 @@ public static class RoleGuidePatches
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ShowSettingsEntries(_settingsPages[_settingsPage - 1].Entries, false, scrollToTop);
|
var page = _settingsPages[_settingsPage - 1];
|
||||||
|
ShowSettingsEntries(
|
||||||
|
page.Entries,
|
||||||
|
page.Groups.Count > 1,
|
||||||
|
scrollToTop,
|
||||||
|
page.Columns,
|
||||||
|
page.Groups.Count > 1);
|
||||||
vanillaTab.SetActive(false);
|
vanillaTab.SetActive(false);
|
||||||
RepurposeSortButtons(true);
|
RepurposeSortButtons(true);
|
||||||
}
|
}
|
||||||
@@ -2029,7 +2036,12 @@ public static class RoleGuidePatches
|
|||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ShowSettingsEntries(IReadOnlyList<GuideOptionEntry> entries, bool showGroup, bool scrollToTop)
|
private static void ShowSettingsEntries(
|
||||||
|
List<GuideOptionEntry> entries,
|
||||||
|
bool showGroup,
|
||||||
|
bool scrollToTop,
|
||||||
|
int columns = 2,
|
||||||
|
bool groupsAsColumns = false)
|
||||||
{
|
{
|
||||||
var orderedEntries = showGroup
|
var orderedEntries = showGroup
|
||||||
? entries.GroupBy(entry => entry.Group).SelectMany(group => group)
|
? entries.GroupBy(entry => entry.Group).SelectMany(group => group)
|
||||||
@@ -2037,7 +2049,7 @@ public static class RoleGuidePatches
|
|||||||
var rows = orderedEntries
|
var rows = orderedEntries
|
||||||
.Select(entry => new AdvancedSettingsRow(entry.Title, entry.Value, showGroup ? entry.Group : null))
|
.Select(entry => new AdvancedSettingsRow(entry.Title, entry.Value, showGroup ? entry.Group : null))
|
||||||
.ToList();
|
.ToList();
|
||||||
ShowSettingsRows(rows, scrollToTop);
|
ShowSettingsRows(rows, scrollToTop, columns, groupsAsColumns);
|
||||||
_settingsNoResults?.SetActive(_settingsSearching && entries.Count == 0);
|
_settingsNoResults?.SetActive(_settingsSearching && entries.Count == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2049,7 +2061,11 @@ public static class RoleGuidePatches
|
|||||||
ShowSettingsRows(advancedRows, scrollToTop);
|
ShowSettingsRows(advancedRows, scrollToTop);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ShowSettingsRows(List<AdvancedSettingsRow> rows, bool scrollToTop)
|
private static void ShowSettingsRows(
|
||||||
|
List<AdvancedSettingsRow> rows,
|
||||||
|
bool scrollToTop,
|
||||||
|
int columns = 2,
|
||||||
|
bool groupsAsColumns = false)
|
||||||
{
|
{
|
||||||
var guide = MatchInfoGuide.Instance;
|
var guide = MatchInfoGuide.Instance;
|
||||||
if (_settingsScroller == null || !guide || !guide.MatchInfoRolePanelPrefab)
|
if (_settingsScroller == null || !guide || !guide.MatchInfoRolePanelPrefab)
|
||||||
@@ -2067,7 +2083,12 @@ public static class RoleGuidePatches
|
|||||||
}
|
}
|
||||||
|
|
||||||
_settingsScroller.gameObject.SetActive(true);
|
_settingsScroller.gameObject.SetActive(true);
|
||||||
_settingsPageObject = Helpers.CreateAdvancedSettingsPage(guide, _settingsScroller, rows);
|
_settingsPageObject = Helpers.CreateAdvancedSettingsPage(
|
||||||
|
guide,
|
||||||
|
_settingsScroller,
|
||||||
|
rows,
|
||||||
|
columns,
|
||||||
|
groupsAsColumns);
|
||||||
_settingsNoResults?.SetActive(false);
|
_settingsNoResults?.SetActive(false);
|
||||||
if (scrollToTop)
|
if (scrollToTop)
|
||||||
{
|
{
|
||||||
|
|||||||
+101
-10
@@ -926,18 +926,23 @@ public static class Helpers
|
|||||||
return CreateAdvancedSettingsPage(
|
return CreateAdvancedSettingsPage(
|
||||||
guide,
|
guide,
|
||||||
parent,
|
parent,
|
||||||
settings.Select(setting => new AdvancedSettingsRow(setting.Key, setting.Value, null)).ToList());
|
settings.Select(setting => new AdvancedSettingsRow(setting.Key, setting.Value, null)).ToList(),
|
||||||
|
2,
|
||||||
|
false);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static GameObject CreateAdvancedSettingsPage(
|
internal static GameObject CreateAdvancedSettingsPage(
|
||||||
MatchInfoGuide guide,
|
MatchInfoGuide guide,
|
||||||
Scroller parent,
|
Scroller parent,
|
||||||
List<AdvancedSettingsRow> settings)
|
List<AdvancedSettingsRow> settings,
|
||||||
|
int columns = 2,
|
||||||
|
bool groupsAsColumns = false)
|
||||||
{
|
{
|
||||||
const float contentTop = 0.95f;
|
const float contentTop = 0.95f;
|
||||||
const float horizontalOffset = -0.2f;
|
const float horizontalOffset = -0.2f;
|
||||||
const int columns = 2;
|
const float headerContentGap = 0.2f;
|
||||||
|
|
||||||
|
columns = Mathf.Clamp(columns, 1, 6);
|
||||||
var inner = parent.Inner;
|
var inner = parent.Inner;
|
||||||
var layout = inner.GetComponent<GridLayoutGroup>();
|
var layout = inner.GetComponent<GridLayoutGroup>();
|
||||||
if (layout)
|
if (layout)
|
||||||
@@ -945,8 +950,14 @@ public static class Helpers
|
|||||||
layout.enabled = false;
|
layout.enabled = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var columnWidth = layout ? Mathf.Clamp(layout.cellSize.x, 2f, 3.2f) : 2.7f;
|
|
||||||
var columnGap = layout ? Mathf.Clamp(layout.spacing.x, 0.1f, 0.6f) : 0.3f;
|
var columnGap = layout ? Mathf.Clamp(layout.spacing.x, 0.1f, 0.6f) : 0.3f;
|
||||||
|
const int baseColumnCount = 2;
|
||||||
|
var baseColumnWidth = layout ? Mathf.Clamp(layout.cellSize.x, 2f, 3.2f) : 2.7f;
|
||||||
|
var availableWidth = baseColumnWidth * baseColumnCount + columnGap * (baseColumnCount - 1);
|
||||||
|
var columnWidth = Mathf.Clamp(
|
||||||
|
(availableWidth - (columns - 1) * columnGap) / columns,
|
||||||
|
1f,
|
||||||
|
3.2f);
|
||||||
var layer = inner.gameObject.layer;
|
var layer = inner.gameObject.layer;
|
||||||
var page = new GameObject("AdvancedSettingsPage") { layer = layer };
|
var page = new GameObject("AdvancedSettingsPage") { layer = layer };
|
||||||
page.transform.SetParent(inner, false);
|
page.transform.SetParent(inner, false);
|
||||||
@@ -988,6 +999,50 @@ public static class Helpers
|
|||||||
var rowScale = (columnWidth / prefabBounds.size.x) * 1.22f;
|
var rowScale = (columnWidth / prefabBounds.size.x) * 1.22f;
|
||||||
var rowHeight = prefabBounds.size.y * rowScale;
|
var rowHeight = prefabBounds.size.y * rowScale;
|
||||||
var rowPitch = 0.45f * rowScale;
|
var rowPitch = 0.45f * rowScale;
|
||||||
|
var groupedSettings = groupsAsColumns
|
||||||
|
? settings
|
||||||
|
.Where(setting => setting.Group != null)
|
||||||
|
.GroupBy(setting => setting.Group!)
|
||||||
|
.ToList()
|
||||||
|
: [];
|
||||||
|
groupsAsColumns = groupedSettings.Count > 1;
|
||||||
|
if (groupsAsColumns)
|
||||||
|
{
|
||||||
|
rowScale = columnWidth / prefabBounds.size.x;
|
||||||
|
rowHeight = prefabBounds.size.y * rowScale;
|
||||||
|
rowPitch = 0.45f * rowScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
var groupColumns = new Dictionary<AbstractOptionGroup, int>();
|
||||||
|
var groupTopOffsets = new Dictionary<AbstractOptionGroup, float>();
|
||||||
|
var groupRows = new Dictionary<AbstractOptionGroup, int>();
|
||||||
|
if (groupsAsColumns)
|
||||||
|
{
|
||||||
|
var bandCount = Mathf.CeilToInt(groupedSettings.Count / (float)columns);
|
||||||
|
var bandHeights = new float[bandCount];
|
||||||
|
for (var i = 0; i < groupedSettings.Count; i++)
|
||||||
|
{
|
||||||
|
var group = groupedSettings[i].Key;
|
||||||
|
var band = i / columns;
|
||||||
|
groupColumns[group] = i % columns;
|
||||||
|
bandHeights[band] = Mathf.Max(
|
||||||
|
bandHeights[band],
|
||||||
|
rowPitch * (groupedSettings[i].Count() + 1) + headerContentGap + 0.25f);
|
||||||
|
}
|
||||||
|
|
||||||
|
var bandOffset = 0f;
|
||||||
|
for (var band = 0; band < bandCount; band++)
|
||||||
|
{
|
||||||
|
for (var i = band * columns; i < Mathf.Min((band + 1) * columns, groupedSettings.Count); i++)
|
||||||
|
{
|
||||||
|
groupTopOffsets[groupedSettings[i].Key] = bandOffset;
|
||||||
|
groupRows[groupedSettings[i].Key] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bandOffset += bandHeights[band];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var contentBottom = float.PositiveInfinity;
|
var contentBottom = float.PositiveInfinity;
|
||||||
var previousGroup = (AbstractOptionGroup?)null;
|
var previousGroup = (AbstractOptionGroup?)null;
|
||||||
var rowIndex = 0;
|
var rowIndex = 0;
|
||||||
@@ -997,6 +1052,12 @@ public static class Helpers
|
|||||||
for (var i = 0; i < settings.Count; i++)
|
for (var i = 0; i < settings.Count; i++)
|
||||||
{
|
{
|
||||||
if (settings[i].Group != previousGroup && settings[i].Group is { } group)
|
if (settings[i].Group != previousGroup && settings[i].Group is { } group)
|
||||||
|
{
|
||||||
|
if (groupsAsColumns)
|
||||||
|
{
|
||||||
|
column = groupColumns[group];
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
if (previousGroup != null)
|
if (previousGroup != null)
|
||||||
{
|
{
|
||||||
@@ -1008,6 +1069,7 @@ public static class Helpers
|
|||||||
rowIndex++;
|
rowIndex++;
|
||||||
column = 0;
|
column = 0;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var headerSource = group.Header;
|
var headerSource = group.Header;
|
||||||
if (!headerSource && gameSettingsMenu && gameSettingsMenu.GameSettingsTab)
|
if (!headerSource && gameSettingsMenu && gameSettingsMenu.GameSettingsTab)
|
||||||
@@ -1030,14 +1092,31 @@ public static class Helpers
|
|||||||
|
|
||||||
if (headerSource)
|
if (headerSource)
|
||||||
{
|
{
|
||||||
const float headerScale = 0.5f;
|
const float headerScale = 0.46f;
|
||||||
var headerWidth = (columns * columnWidth + (columns - 1) * columnGap) / headerScale;
|
var headerWidth = groupsAsColumns
|
||||||
|
? columnWidth / headerScale
|
||||||
|
: (columns * columnWidth + (columns - 1) * columnGap) / headerScale;
|
||||||
var header = Object.Instantiate(headerSource!, page.transform, false);
|
var header = Object.Instantiate(headerSource!, page.transform, false);
|
||||||
header.transform.localScale = Vector3.one * headerScale;
|
header.transform.localScale = Vector3.one * headerScale;
|
||||||
|
if (groupsAsColumns)
|
||||||
|
{
|
||||||
|
var totalWidth = columns * columnWidth + (columns - 1) * columnGap;
|
||||||
|
var groupColumn = groupColumns[group];
|
||||||
|
var groupLeft = -totalWidth / 2f + horizontalOffset +
|
||||||
|
groupColumn * (columnWidth + columnGap);
|
||||||
|
header.transform.localPosition = new Vector3(
|
||||||
|
groupLeft + (columnWidth / 2f) - 0.25f,
|
||||||
|
contentTop - groupTopOffsets[group],
|
||||||
|
-1f);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
header.transform.localPosition = new Vector3(
|
header.transform.localPosition = new Vector3(
|
||||||
horizontalOffset - 0.5f,
|
horizontalOffset - 0.5f,
|
||||||
contentTop - (rowIndex * rowPitch) - groupSpacing,
|
contentTop - (rowIndex * rowPitch) - groupSpacing,
|
||||||
-1f);
|
-1f);
|
||||||
|
}
|
||||||
|
|
||||||
header.SetHeader(MiraLocaleManager.GetOrCreateLocaleString(group.GroupName), 20);
|
header.SetHeader(MiraLocaleManager.GetOrCreateLocaleString(group.GroupName), 20);
|
||||||
if (header.Title)
|
if (header.Title)
|
||||||
{
|
{
|
||||||
@@ -1063,14 +1142,14 @@ public static class Helpers
|
|||||||
{
|
{
|
||||||
header.Background.sprite = MiraAssets.CategoryHeader.LoadAsset();
|
header.Background.sprite = MiraAssets.CategoryHeader.LoadAsset();
|
||||||
header.Background.drawMode = SpriteDrawMode.Sliced;
|
header.Background.drawMode = SpriteDrawMode.Sliced;
|
||||||
header.Background.color = MiraApiPlugin.DefaultHeaderColor;
|
header.Background.color = group.GroupColor;
|
||||||
header.Background.transform.localPosition = new Vector3(0.5f, -0.1833f, 0f);
|
header.Background.transform.localPosition = new Vector3(0.5f, -0.1833f, 0f);
|
||||||
header.Background.size = new Vector2(headerWidth, header.Background.size.y);
|
header.Background.size = new Vector2(headerWidth, header.Background.size.y);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (header.Divider)
|
if (header.Divider)
|
||||||
{
|
{
|
||||||
header.Divider.color = MiraApiPlugin.DefaultHeaderColor;
|
header.Divider.color = group.GroupColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
header.gameObject.SetActive(true);
|
header.gameObject.SetActive(true);
|
||||||
@@ -1099,8 +1178,11 @@ public static class Helpers
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!groupsAsColumns)
|
||||||
|
{
|
||||||
rowIndex++;
|
rowIndex++;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
previousGroup = group;
|
previousGroup = group;
|
||||||
}
|
}
|
||||||
@@ -1108,8 +1190,10 @@ public static class Helpers
|
|||||||
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 = groupsAsColumns && settings[i].Group is { } rowGroup
|
||||||
centerY -= groupSpacing;
|
? contentTop - groupTopOffsets[rowGroup] -
|
||||||
|
(rowPitch * (groupRows[rowGroup] + 1)) - headerContentGap - (rowHeight / 2f)
|
||||||
|
: contentTop - (rowHeight / 2f) - (rowIndex * rowPitch) - 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);
|
||||||
@@ -1177,6 +1261,12 @@ public static class Helpers
|
|||||||
}
|
}
|
||||||
|
|
||||||
row.gameObject.SetActive(true);
|
row.gameObject.SetActive(true);
|
||||||
|
if (groupsAsColumns && settings[i].Group is { } renderedGroup)
|
||||||
|
{
|
||||||
|
groupRows[renderedGroup]++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
column++;
|
column++;
|
||||||
if (column == columns)
|
if (column == columns)
|
||||||
{
|
{
|
||||||
@@ -1184,6 +1274,7 @@ public static class Helpers
|
|||||||
rowIndex++;
|
rowIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var maskArea = parent.transform.FindChild("MaskArea")?.GetComponent<SpriteRenderer>();
|
var maskArea = parent.transform.FindChild("MaskArea")?.GetComponent<SpriteRenderer>();
|
||||||
var maskBottom = maskArea
|
var maskBottom = maskArea
|
||||||
|
|||||||
Reference in new issue
Block a user