diff --git a/CarInspectorResizer.Example1/HarmonyPatches/CarInspectorPatches.cs b/CarInspectorResizer.Example1/HarmonyPatches/CarInspectorPatches.cs index b782a41..3b54744 100644 --- a/CarInspectorResizer.Example1/HarmonyPatches/CarInspectorPatches.cs +++ b/CarInspectorResizer.Example1/HarmonyPatches/CarInspectorPatches.cs @@ -1,7 +1,5 @@ namespace CarInspectorResizer.Example1.HarmonyPatches; -using System; -using System.Collections.Generic; using CarInspectorResizer.Behaviors; using Game.Messages; using HarmonyLib; @@ -22,21 +20,20 @@ internal static class CarInspectorPatches { public static void Populate(ref Window ____window) { var windowAutoHeight = ____window.gameObject!.GetComponent()!; windowAutoHeight.ExpandAlways(30); - windowAutoHeight.ExpandTab("equipment", 50); - windowAutoHeight.ExpandOrders(AutoEngineerMode.Road, 50); - windowAutoHeight.UpdateWindowHeight(); + windowAutoHeight.ExpandTab("equipment", 45); + windowAutoHeight.ExpandOrders(AutoEngineerMode.Road, 30); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(CarInspector), "PopulatePanel")] + public static void PopulatePanel(UIPanelBuilder builder) { + builder.AddField("Global Button", builder.ButtonStrip(strip => strip.AddButton("Example1", () => { }), 4)!); } [HarmonyPostfix] [HarmonyPatch(typeof(CarInspector), "PopulateEquipmentPanel")] public static void PopulateEquipmentPanel(UIPanelBuilder builder) { - builder.AddSection("Equipment Buttons", section => { - section.ButtonStrip(strip => { - strip.AddButton("Example1", () => { }); - strip.AddButton("Example1", () => { }); - strip.AddButton("Example1", () => { }); - }, 4); - }); + builder.AddSection("Equipment Buttons", section => section.ButtonStrip(strip => strip.AddButton("Example1", () => { }), 4)); } [HarmonyPostfix] @@ -45,13 +42,7 @@ public static void BuildContextualOrders(UIPanelBuilder builder, AutoEngineerPer var helper = new AutoEngineerOrdersHelper(____car, persistence); var mode = helper.Mode(); if (mode == AutoEngineerMode.Road) { - builder.AddSection("Road Buttons", section => { - section.ButtonStrip(strip => { - strip.AddButton("Example1", () => { }); - strip.AddButton("Example1", () => { }); - strip.AddButton("Example1", () => { }); - }, 4); - }); + builder.AddField("Road Buttons", builder.ButtonStrip(strip => strip.AddButton("Example1", () => { }), 4)!); } } diff --git a/CarInspectorResizer.Example2/HarmonyPatches/CarInspectorPatches.cs b/CarInspectorResizer.Example2/HarmonyPatches/CarInspectorPatches.cs index f611eeb..c1609ad 100644 --- a/CarInspectorResizer.Example2/HarmonyPatches/CarInspectorPatches.cs +++ b/CarInspectorResizer.Example2/HarmonyPatches/CarInspectorPatches.cs @@ -1,7 +1,5 @@ namespace CarInspectorResizer.Example2.HarmonyPatches; -using System; -using System.Collections.Generic; using CarInspectorResizer.Behaviors; using Game.Messages; using HarmonyLib; @@ -21,45 +19,22 @@ internal static class CarInspectorPatches { [HarmonyPatch(typeof(CarInspector), "Populate")] public static void Populate(ref Window ____window) { var windowAutoHeight = ____window.gameObject!.GetComponent()!; - windowAutoHeight.ExpandOrders(AutoEngineerMode.Road, 100); - windowAutoHeight.ExpandOrders(AutoEngineerMode.Yard, 50); - windowAutoHeight.UpdateWindowHeight(); + windowAutoHeight.ExpandOrders(AutoEngineerMode.Road, 30); + windowAutoHeight.ExpandOrders(AutoEngineerMode.Yard, 30); } [HarmonyPostfix] [HarmonyPatch(typeof(CarInspector), "BuildContextualOrders")] public static void BuildContextualOrders(UIPanelBuilder builder, AutoEngineerPersistence persistence, Car ____car) { - var helper = new AutoEngineerOrdersHelper(____car, persistence); var mode = helper.Mode(); switch (mode) { case AutoEngineerMode.Road: - builder.AddSection("Road Buttons", section => { - section.ButtonStrip(strip => { - strip.AddButton("Example2", () => { }); - strip.AddButton("Example2", () => { }); - strip.AddButton("Example2", () => { }); - }, 4); - }); - - builder.AddSection("More Road buttons", section => { - section.ButtonStrip(strip => { - strip.AddButton("Example2", () => { }); - strip.AddButton("Example2", () => { }); - strip.AddButton("Example2", () => { }); - }, 4); - }); + builder.AddField("Road Button", builder.ButtonStrip(strip => strip.AddButton("Example2", () => { }), 4)!); break; case AutoEngineerMode.Yard: - builder.AddSection("Yard Buttons", section => { - section.ButtonStrip(strip => { - strip.AddButton("Example2", () => { }); - strip.AddButton("Example2", () => { }); - strip.AddButton("Example2", () => { }); - }, 4); - }); - + builder.AddField("Yard Button", builder.ButtonStrip(strip => strip.AddButton("Example2", () => { }), 4)!); break; } } diff --git a/CarInspectorResizer/Behaviors/CarInspectorAutoHeightBehavior.cs b/CarInspectorResizer/Behaviors/CarInspectorAutoHeightBehavior.cs index 31573ff..8155261 100644 --- a/CarInspectorResizer/Behaviors/CarInspectorAutoHeightBehavior.cs +++ b/CarInspectorResizer/Behaviors/CarInspectorAutoHeightBehavior.cs @@ -24,24 +24,27 @@ public sealed class CarInspectorAutoHeightBehavior : MonoBehaviour { private readonly Dictionary _TabExpansions = new(); private readonly Dictionary _OrdersExpansions = new(); - private static Vector2? _OriginalWindowSize; - public float MinHeight { get; set; } = 330; public void Awake() { _Window = gameObject!.GetComponent()!; - SelectedTabState.ValueChanged = _ => UpdateWindowHeight(); + SelectedTabState.ValueChanged = value => { + CarInspectorResizerPlugin.ConsoleMessage($"SelectedTabState: {value}"); + UpdateWindowHeight(); + }; } internal void Populate(Car car) { + _ExpandAlways = 0; + _TabExpansions.Clear(); + _OrdersExpansions.Clear(); + if (_Car == car) { return; } _Car = car; - _OriginalWindowSize ??= _Window.GetContentSize(); - foreach (var observer in _Observers) { observer.Dispose(); } @@ -49,26 +52,34 @@ internal void Populate(Car car) { _Observers.Clear(); var persistence = new AutoEngineerPersistence(_Car.KeyValueObject!); - _Observers.Add(persistence.ObserveOrders(_ => UpdateWindowHeight())); - _Observers.Add(persistence.ObserveContextualOrdersChanged(UpdateWindowHeight)); + _Observers.Add(persistence.ObserveOrders(_ => { + UpdateWindowHeight(); + }, false)); + _Observers.Add(persistence.ObserveContextualOrdersChanged(() => { + UpdateWindowHeight(); + })); } public void ExpandAlways(float height) { _ExpandAlways += height; + CarInspectorResizerPlugin.ConsoleMessage($"expanded by {height} to {_ExpandAlways}"); } public void ExpandTab(string tabName, float height) { + _TabExpansions.TryGetValue(tabName, out var value); _TabExpansions[tabName] = value + height; + CarInspectorResizerPlugin.ConsoleMessage($"'{tabName}' expanded by {height} to {_TabExpansions[tabName]}"); } public void ExpandOrders(AutoEngineerMode mode, float height) { _OrdersExpansions.TryGetValue(mode, out var value); _OrdersExpansions[mode] = value + height; + CarInspectorResizerPlugin.ConsoleMessage($"'{mode}' expanded by {height} to {_OrdersExpansions[mode]}"); } public void UpdateWindowHeight() { - if (_Car == null || _OriginalWindowSize == null) { + if (_Car == null || SelectedTabState.Value == null) { return; } @@ -76,27 +87,40 @@ public void UpdateWindowHeight() { var helper = new AutoEngineerOrdersHelper(_Car, persistence); var mode = helper.Mode(); - var height = _OriginalWindowSize.Value.y + _ExpandAlways; + var height = MinHeight + _ExpandAlways; + if (_ExpandAlways > 0) { + CarInspectorResizerPlugin.ConsoleMessage($"+{_ExpandAlways}"); + } if (SelectedTabState.Value != null) { _TabExpansions.TryGetValue(SelectedTabState.Value, out var tabExpansion); height += tabExpansion; + if (tabExpansion > 0) { + CarInspectorResizerPlugin.ConsoleMessage($"+{tabExpansion} (tabExpansion)"); + } } if (SelectedTabState.Value == "orders") { _OrdersExpansions.TryGetValue(mode, out var ordersExpansion); height += ordersExpansion; + if (ordersExpansion > 0) { + CarInspectorResizerPlugin.ConsoleMessage($"+{ordersExpansion} (ordersExpansion)"); + } if (!string.IsNullOrEmpty(persistence.PassengerModeStatus!)) { height += 30; + CarInspectorResizerPlugin.ConsoleMessage("+30 (PassengerModeStatus)"); } if (persistence.ContextualOrders!.Count > 0) { height += 30; + CarInspectorResizerPlugin.ConsoleMessage("+30 (ContextualOrders)"); } } - _Window.SetContentSize(new Vector2(_OriginalWindowSize.Value.x, Mathf.Max(MinHeight, height))); + var size = _Window.GetContentSize(); + CarInspectorResizerPlugin.ConsoleMessage($"Updated window height {height}"); + _Window.SetContentSize(new Vector2(size.x, height)); } } \ No newline at end of file diff --git a/CarInspectorResizer/CarInspectorResizer.csproj b/CarInspectorResizer/CarInspectorResizer.csproj index c5eabe3..3857933 100644 --- a/CarInspectorResizer/CarInspectorResizer.csproj +++ b/CarInspectorResizer/CarInspectorResizer.csproj @@ -2,7 +2,7 @@ 1 - 1 + 2 true enable enable diff --git a/CarInspectorResizer/CarInspectorResizerPlugin.cs b/CarInspectorResizer/CarInspectorResizerPlugin.cs index 5ffd5af..2b20eb0 100644 --- a/CarInspectorResizer/CarInspectorResizerPlugin.cs +++ b/CarInspectorResizer/CarInspectorResizerPlugin.cs @@ -4,30 +4,53 @@ namespace CarInspectorResizer; using JetBrains.Annotations; using Railloader; using Serilog; +using UI.Builder; [UsedImplicitly] -public sealed class CarInspectorResizerPlugin : SingletonPluginBase { +public sealed class CarInspectorResizerPlugin : SingletonPluginBase, IModTabHandler { + + private const string ModIdentifier = "CarInspectorResizer"; public static IModdingContext Context { get; private set; } = null!; public static IUIHelper UiHelper { get; private set; } = null!; + public static Settings Settings { get; private set; } = null!; private readonly ILogger _Logger = Log.ForContext()!; public CarInspectorResizerPlugin(IModdingContext context, IUIHelper uiHelper) { Context = context; UiHelper = uiHelper; + Settings = Context.LoadSettingsData(ModIdentifier) ?? new Settings(); } public override void OnEnable() { _Logger.Information("OnEnable"); - var harmony = new Harmony("CarInspectorResizer"); + var harmony = new Harmony(ModIdentifier); harmony.PatchAll(); } public override void OnDisable() { _Logger.Information("OnDisable"); - var harmony = new Harmony("CarInspectorResizer"); + var harmony = new Harmony(ModIdentifier); harmony.UnpatchAll(); } + public void ModTabDidOpen(UIPanelBuilder builder) { + builder + .AddField("Debug messages", + builder.AddToggle(() => Settings.Debug, o => Settings.Debug = o)! + )! + .Tooltip("Debug messages", "Send debug messages to console"); + } + + public void ModTabDidClose() { + Context.SaveSettingsData(ModIdentifier, Settings); + } + + public static void ConsoleMessage(string message) { + if (Settings.Debug) { + UI.Console.Console.shared!.AddLine("[CIR]: " + message); + } + } + } \ No newline at end of file diff --git a/CarInspectorResizer/HarmonyPatches/CarInspectorPatches.cs b/CarInspectorResizer/HarmonyPatches/CarInspectorPatches.cs index 5e1d371..8d8e59d 100644 --- a/CarInspectorResizer/HarmonyPatches/CarInspectorPatches.cs +++ b/CarInspectorResizer/HarmonyPatches/CarInspectorPatches.cs @@ -22,11 +22,26 @@ public static void Awake(ref Window ____window, ref HashSet ____obs ____selectedTabState = windowAutoHeight.SelectedTabState; } - [HarmonyPrefix] + [HarmonyPostfix] [HarmonyPatch(typeof(CarInspector), "Populate")] public static void Populate(Car car, ref Window ____window) { var windowAutoHeight = ____window.gameObject!.GetComponent()!; windowAutoHeight.Populate(car); } + [HarmonyPostfix] + [HarmonyPatch(typeof(CarInspector), "Show")] + public static void Show(Car car) { + var instance = Traverse.Create()!.Field("_instance")!.GetValue(); + var windowAutoHeight = instance!.gameObject!.GetComponent()!; + windowAutoHeight.UpdateWindowHeight(); + } + + [HarmonyPostfix] + [HarmonyPatch(typeof(CarInspector), "Rebuild")] + public static void Rebuild(ref Window ____window) { + var windowAutoHeight = ____window.gameObject!.GetComponent()!; + windowAutoHeight.UpdateWindowHeight(); + } + } \ No newline at end of file diff --git a/CarInspectorResizer/Settings.cs b/CarInspectorResizer/Settings.cs new file mode 100644 index 0000000..72a4ce5 --- /dev/null +++ b/CarInspectorResizer/Settings.cs @@ -0,0 +1,6 @@ +namespace CarInspectorResizer; + +public sealed class Settings { + + public bool Debug { get; set; } +} \ No newline at end of file