mirror of
https://github.com/All-Of-Us-Mods/MiraAPI.git
synced 2026-10-19 15:51:48 +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);
|
||||
}
|
||||
|
||||
_settingsPages = GuideOptionPages.BuildPages(guide.GetBoolString);
|
||||
if (_settingsPage > _settingsPages.Count)
|
||||
{
|
||||
@@ -1979,7 +1980,13 @@ public static class RoleGuidePatches
|
||||
}
|
||||
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);
|
||||
RepurposeSortButtons(true);
|
||||
}
|
||||
@@ -2029,7 +2036,12 @@ public static class RoleGuidePatches
|
||||
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
|
||||
? entries.GroupBy(entry => entry.Group).SelectMany(group => group)
|
||||
@@ -2037,7 +2049,7 @@ public static class RoleGuidePatches
|
||||
var rows = orderedEntries
|
||||
.Select(entry => new AdvancedSettingsRow(entry.Title, entry.Value, showGroup ? entry.Group : null))
|
||||
.ToList();
|
||||
ShowSettingsRows(rows, scrollToTop);
|
||||
ShowSettingsRows(rows, scrollToTop, columns, groupsAsColumns);
|
||||
_settingsNoResults?.SetActive(_settingsSearching && entries.Count == 0);
|
||||
}
|
||||
|
||||
@@ -2049,7 +2061,11 @@ public static class RoleGuidePatches
|
||||
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;
|
||||
if (_settingsScroller == null || !guide || !guide.MatchInfoRolePanelPrefab)
|
||||
@@ -2067,7 +2083,12 @@ public static class RoleGuidePatches
|
||||
}
|
||||
|
||||
_settingsScroller.gameObject.SetActive(true);
|
||||
_settingsPageObject = Helpers.CreateAdvancedSettingsPage(guide, _settingsScroller, rows);
|
||||
_settingsPageObject = Helpers.CreateAdvancedSettingsPage(
|
||||
guide,
|
||||
_settingsScroller,
|
||||
rows,
|
||||
columns,
|
||||
groupsAsColumns);
|
||||
_settingsNoResults?.SetActive(false);
|
||||
if (scrollToTop)
|
||||
{
|
||||
|
||||
+101
-10
@@ -926,18 +926,23 @@ public static class Helpers
|
||||
return CreateAdvancedSettingsPage(
|
||||
guide,
|
||||
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(
|
||||
MatchInfoGuide guide,
|
||||
Scroller parent,
|
||||
List<AdvancedSettingsRow> settings)
|
||||
List<AdvancedSettingsRow> settings,
|
||||
int columns = 2,
|
||||
bool groupsAsColumns = false)
|
||||
{
|
||||
const float contentTop = 0.95f;
|
||||
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 layout = inner.GetComponent<GridLayoutGroup>();
|
||||
if (layout)
|
||||
@@ -945,8 +950,14 @@ public static class Helpers
|
||||
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;
|
||||
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 page = new GameObject("AdvancedSettingsPage") { layer = layer };
|
||||
page.transform.SetParent(inner, false);
|
||||
@@ -988,6 +999,50 @@ public static class Helpers
|
||||
var rowScale = (columnWidth / prefabBounds.size.x) * 1.22f;
|
||||
var rowHeight = prefabBounds.size.y * 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 previousGroup = (AbstractOptionGroup?)null;
|
||||
var rowIndex = 0;
|
||||
@@ -997,6 +1052,12 @@ public static class Helpers
|
||||
for (var i = 0; i < settings.Count; i++)
|
||||
{
|
||||
if (settings[i].Group != previousGroup && settings[i].Group is { } group)
|
||||
{
|
||||
if (groupsAsColumns)
|
||||
{
|
||||
column = groupColumns[group];
|
||||
}
|
||||
else
|
||||
{
|
||||
if (previousGroup != null)
|
||||
{
|
||||
@@ -1008,6 +1069,7 @@ public static class Helpers
|
||||
rowIndex++;
|
||||
column = 0;
|
||||
}
|
||||
}
|
||||
|
||||
var headerSource = group.Header;
|
||||
if (!headerSource && gameSettingsMenu && gameSettingsMenu.GameSettingsTab)
|
||||
@@ -1030,14 +1092,31 @@ public static class Helpers
|
||||
|
||||
if (headerSource)
|
||||
{
|
||||
const float headerScale = 0.5f;
|
||||
var headerWidth = (columns * columnWidth + (columns - 1) * columnGap) / headerScale;
|
||||
const float headerScale = 0.46f;
|
||||
var headerWidth = groupsAsColumns
|
||||
? columnWidth / headerScale
|
||||
: (columns * columnWidth + (columns - 1) * columnGap) / headerScale;
|
||||
var header = Object.Instantiate(headerSource!, page.transform, false);
|
||||
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(
|
||||
horizontalOffset - 0.5f,
|
||||
contentTop - (rowIndex * rowPitch) - groupSpacing,
|
||||
-1f);
|
||||
}
|
||||
|
||||
header.SetHeader(MiraLocaleManager.GetOrCreateLocaleString(group.GroupName), 20);
|
||||
if (header.Title)
|
||||
{
|
||||
@@ -1063,14 +1142,14 @@ public static class Helpers
|
||||
{
|
||||
header.Background.sprite = MiraAssets.CategoryHeader.LoadAsset();
|
||||
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.size = new Vector2(headerWidth, header.Background.size.y);
|
||||
}
|
||||
|
||||
if (header.Divider)
|
||||
{
|
||||
header.Divider.color = MiraApiPlugin.DefaultHeaderColor;
|
||||
header.Divider.color = group.GroupColor;
|
||||
}
|
||||
|
||||
header.gameObject.SetActive(true);
|
||||
@@ -1099,8 +1178,11 @@ public static class Helpers
|
||||
}
|
||||
}
|
||||
|
||||
if (!groupsAsColumns)
|
||||
{
|
||||
rowIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
previousGroup = group;
|
||||
}
|
||||
@@ -1108,8 +1190,10 @@ public static class Helpers
|
||||
var originX = -((columns * columnWidth) + ((columns - 1) * columnGap)) / 2f +
|
||||
(column * (columnWidth + columnGap)) +
|
||||
horizontalOffset;
|
||||
var centerY = contentTop - (rowHeight / 2f) - (rowIndex * rowPitch);
|
||||
centerY -= groupSpacing;
|
||||
var centerY = groupsAsColumns && settings[i].Group is { } rowGroup
|
||||
? contentTop - groupTopOffsets[rowGroup] -
|
||||
(rowPitch * (groupRows[rowGroup] + 1)) - headerContentGap - (rowHeight / 2f)
|
||||
: contentTop - (rowHeight / 2f) - (rowIndex * rowPitch) - groupSpacing;
|
||||
var row = Object.Instantiate(rowPrefab, page.transform);
|
||||
row.enabled = false;
|
||||
row.PlusBtn.gameObject.SetActive(false);
|
||||
@@ -1177,6 +1261,12 @@ public static class Helpers
|
||||
}
|
||||
|
||||
row.gameObject.SetActive(true);
|
||||
if (groupsAsColumns && settings[i].Group is { } renderedGroup)
|
||||
{
|
||||
groupRows[renderedGroup]++;
|
||||
}
|
||||
else
|
||||
{
|
||||
column++;
|
||||
if (column == columns)
|
||||
{
|
||||
@@ -1184,6 +1274,7 @@ public static class Helpers
|
||||
rowIndex++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var maskArea = parent.transform.FindChild("MaskArea")?.GetComponent<SpriteRenderer>();
|
||||
var maskBottom = maskArea
|
||||
|
||||
Reference in new issue
Block a user