diff --git a/MiraAPI.Example/ExampleLocalSetings.cs b/MiraAPI.Example/ExampleLocalSetings.cs index 21b68f0..e7c292f 100644 --- a/MiraAPI.Example/ExampleLocalSetings.cs +++ b/MiraAPI.Example/ExampleLocalSetings.cs @@ -36,9 +36,9 @@ public class ExampleLocalSettings(ConfigFile config) : LocalSettingsTab(config) [LocalEnumSetting] public ConfigEntry ExampleEnum { get; private set; } = config.Bind("General", "Example Enum", ExampleEnumSetting.Fries); - private static void OnExampleButtonClick(LocalSettingsTab instance) + private static void OnExampleButtonClick() { - Logger.Warning("Button clicked"); + LocalSettingsTabSingleton.Instance.Open(); } } diff --git a/MiraAPI/LocalSettings/LocalSettingsButton.cs b/MiraAPI/LocalSettings/LocalSettingsButton.cs index 2876dac..fa0c0bf 100644 --- a/MiraAPI/LocalSettings/LocalSettingsButton.cs +++ b/MiraAPI/LocalSettings/LocalSettingsButton.cs @@ -12,7 +12,7 @@ namespace MiraAPI.LocalSettings; /// /// Represents a local settings button. /// -public class LocalSettingsButton(string text, Action onClick) +public class LocalSettingsButton(string text, Action onClick) { /// /// Gets or sets the button text. @@ -22,12 +22,12 @@ public class LocalSettingsButton(string text, Action onClick) /// /// Gets or sets the button on-click action. /// - public Action OnClick { get; set; } = onClick; + public Action OnClick { get; set; } = onClick; /// /// Gets the tab instance this button belongs to. /// - public LocalSettingsTab Tab { get; internal set; } + public LocalSettingsTab? Tab { get; internal set; } internal GameObject CreateButton(ToggleButtonBehaviour toggle, Transform parent, ref float offset, ref int order, bool last) { @@ -59,11 +59,9 @@ public class LocalSettingsButton(string text, Action onClick) rollover.OverColor = Tab!.TabAppearance.ButtonHoverColor; rollover.Target = background; background.color = Tab!.TabAppearance.ButtonColor; + button.OnClick.AddListener((UnityAction)OnClick); - var tab = Tab; - var click = OnClick; - button.OnClick.AddListener((UnityAction)(() => click(tab))); - + background.transform.localScale = new Vector3(1, 1.25f, 1); Helpers.DivideSize(button.gameObject, 1.1f); order++; diff --git a/MiraAPI/LocalSettings/LocalSettingsTab.cs b/MiraAPI/LocalSettings/LocalSettingsTab.cs index 7f30306..a04830d 100644 --- a/MiraAPI/LocalSettings/LocalSettingsTab.cs +++ b/MiraAPI/LocalSettings/LocalSettingsTab.cs @@ -57,6 +57,11 @@ public abstract class LocalSettingsTab(ConfigFile config) /// public List Buttons { get; } = []; + /// + /// Gets the index of this tab. + /// + protected int TabIndex => LocalSettingsManager.Tabs.IndexOf(this) + 10; + private Scroller? Scroller { get; set; } /// @@ -67,6 +72,20 @@ public abstract class LocalSettingsTab(ConfigFile config) { } + /// + /// Attempts to open the tab. + /// Override for custom behavior. + /// + public virtual void Open() + { + OptionsMenuPatches.Instance?.OpenTabGroup(TabIndex); + } + + /// + /// Creates the tab and it's content. + /// + /// The instace. + /// The created tab . public virtual GameObject CreateTab(OptionsMenuBehaviour instance) { var tab = Object.Instantiate(instance.transform.FindChild("GeneralTab").gameObject, instance.transform); @@ -141,7 +160,7 @@ public abstract class LocalSettingsTab(ConfigFile config) contentOrder = 1; } - contentIndex = 0; + contentIndex = 1; contentOrder = 1; foreach (var button in Buttons) { @@ -174,6 +193,13 @@ public abstract class LocalSettingsTab(ConfigFile config) return tab; } + /// + /// Creates the tab button. + /// + /// The instance. + /// The tab index. + /// The current button offset. + /// The created button . public virtual GameObject CreateTabButton(OptionsMenuBehaviour instance, ref int tabIdx, ref float offset) { var tabButtonObject = Object.Instantiate(instance.Tabs[0], instance.transform); diff --git a/MiraAPI/Patches/LocalSettings/OptionsMenuPatches.cs b/MiraAPI/Patches/LocalSettings/OptionsMenuPatches.cs index 3c73e1a..574070f 100644 --- a/MiraAPI/Patches/LocalSettings/OptionsMenuPatches.cs +++ b/MiraAPI/Patches/LocalSettings/OptionsMenuPatches.cs @@ -14,6 +14,7 @@ namespace MiraAPI.Patches.LocalSettings; [HarmonyPatch(typeof(OptionsMenuBehaviour))] public static class OptionsMenuPatches { + internal static OptionsMenuBehaviour? Instance { get; private set; } internal static BoxCollider2D MaskCollider; private static SpriteRenderer? background; @@ -27,6 +28,7 @@ public static class OptionsMenuPatches [HarmonyPatch(nameof(OptionsMenuBehaviour.Start))] public static void StartPostfix(OptionsMenuBehaviour __instance) { + Instance = __instance; // Fix for tabs not being clickable in the main menu if (!AmongUsClient.Instance.IsInGame) { @@ -176,7 +178,7 @@ public static class OptionsMenuPatches } /// - /// Makes the custom tabs close when opening the options menu and reset pages. + /// Makes the custom tabs close when opening the options menu and resets pages. /// [HarmonyPostfix] [HarmonyPatch(nameof(OptionsMenuBehaviour.Open))] @@ -191,7 +193,11 @@ public static class OptionsMenuPatches { foreach (var pages in tabButtons) { - pages.Value.Do(x => x.SetActive(pages.Key == currentPage)); + pages.Value? + .Where(x => x != null) + .Do( + x => x?.SetActive( + pages.Key == currentPage)); } }