/// <summary>The method invoked when the active menu changes.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void MenuEvents_MenuChanged(object sender, EventArgsClickableMenuChanged e) { // remove overlay if (e.PriorMenu is ItemGrabMenu) { this.ManageChestOverlay?.Dispose(); this.ManageChestOverlay = null; } // add overlay if (e.NewMenu is ItemGrabMenu chestMenu) { // get open chest ManagedChest chest = this.ChestFactory.GetChestFromMenu(chestMenu); if (chest == null) { return; } // reopen shipping box in standard chest UI if (chest.Container is ShippingBinContainer && !chestMenu.showReceivingMenu) { Game1.activeClickableMenu = chest.OpenMenu(); } // add overlay ManagedChest[] chests = this.ChestFactory.GetChestsForDisplay(selected: chest.Container).ToArray(); this.ManageChestOverlay = new ManageChestOverlay(chestMenu, chest, chests, this.Config, this.Helper.Translation); this.ManageChestOverlay.OnChestSelected += selected => { this.SelectedInventory = selected.Container.Inventory; Game1.activeClickableMenu = selected.OpenMenu(); }; } }
/// <summary>The method invoked when the active menu changes.</summary> /// <param name="previousMenu">The previous menu (if any)</param> /// <param name="newMenu">The new menu (if any).</param> private void ReceiveMenuChanged(IClickableMenu previousMenu, IClickableMenu newMenu) { // remove overlay if (previousMenu is ItemGrabMenu) { this.ManageChestOverlay?.Dispose(); this.ManageChestOverlay = null; } // add overlay if (newMenu is ItemGrabMenu chestMenu) { // get open chest ManagedChest chest = this.ChestFactory.GetChestFromMenu(chestMenu); if (chest == null) { return; } // add overlay ManagedChest[] chests = this.ChestFactory.GetChestsForDisplay(selectedChest: chest.Chest).ToArray(); this.ManageChestOverlay = new ManageChestOverlay(chestMenu, chest, chests, this.Config, this.Helper.Translation); this.ManageChestOverlay.OnChestSelected += selected => { this.SelectedChest = selected.Chest; Game1.activeClickableMenu = selected.OpenMenu(); }; } }
/// <summary>Change the chest UI overlay if needed to match the current menu.</summary> /// <remarks>Since the menu gets reopened whenever the chest inventory changes, this method needs to be called before/after tick to avoid a visible UI flicker.</remarks> private void ChangeOverlayIfNeeded() { // already matches menu if (this.ManageChestOverlay?.ForMenuInstance == Game1.activeClickableMenu) { return; } // remove old overlay if (this.ManageChestOverlay != null) { this.ManageChestOverlay?.Dispose(); this.ManageChestOverlay = null; } // add new overlay if (Game1.activeClickableMenu is ItemGrabMenu chestMenu) { // get open chest ManagedChest chest = this.ChestFactory.GetChestFromMenu(chestMenu); if (chest == null) { return; } // reopen shipping box in standard chest UI if needed // This is called in two cases: // - When the player opens the shipping bin directly, it opens the shipping bin view instead of the full chest view. // - When the player changes the items in the chest view, it reopens itself but loses the constructor args (e.g. highlight function). if (this.Config.EnableShippingBin && chest.Container is ShippingBinContainer && (!chestMenu.showReceivingMenu || !(chestMenu.inventory.highlightMethod?.Target is ShippingBinContainer))) { chestMenu = chest.OpenMenu(); Game1.activeClickableMenu = chestMenu; } // add overlay RangeHandler range = this.GetCurrentRange(); ManagedChest[] chests = this.ChestFactory.GetChests(range, excludeHidden: true, alwaysIncludeContainer: chest.Container).ToArray(); bool isAutomateInstalled = this.Helper.ModRegistry.IsLoaded("Pathoschild.Automate"); this.ManageChestOverlay = new ManageChestOverlay(chestMenu, chest, chests, this.Config, this.Keys, this.Helper.Events, this.Helper.Input, this.Helper.Translation, showAutomateOptions: isAutomateInstalled && chest.CanConfigureAutomate); this.ManageChestOverlay.OnChestSelected += selected => { this.SelectedInventory = selected.Container.Inventory; Game1.activeClickableMenu = selected.OpenMenu(); }; } }
/// <summary>The method invoked when the active menu changes.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event arguments.</param> private void MenuEvents_MenuChanged(object sender, EventArgsClickableMenuChanged e) { // remove overlay if (e.PriorMenu is ItemGrabMenu) { this.ManageChestOverlay?.Dispose(); this.ManageChestOverlay = null; } // add overlay if (e.NewMenu is ItemGrabMenu chestMenu) { // get open chest ManagedChest chest = this.ChestFactory.GetChestFromMenu(chestMenu); if (chest == null) { return; } // reopen shipping box in standard chest UI if needed // This is called in two cases: // - When the player opens the shipping bin directly, it opens the shipping bin view instead of the full chest view. // - When the player changes the items in the chest view, it reopens itself but loses the constructor args (e.g. highlight function). if (this.Config.EnableShippingBin && chest.Container is ShippingBinContainer && (!chestMenu.showReceivingMenu || !(chestMenu.inventory.highlightMethod?.Target is ShippingBinContainer))) { chestMenu = chest.OpenMenu(); Game1.activeClickableMenu = chestMenu; } // add overlay RangeHandler range = this.GetCurrentRange(); ManagedChest[] chests = this.ChestFactory.GetChests(range, excludeHidden: true, alwaysIncludeContainer: chest.Container).ToArray(); this.ManageChestOverlay = new ManageChestOverlay(chestMenu, chest, chests, this.Config, this.Helper.Translation); this.ManageChestOverlay.OnChestSelected += selected => { this.SelectedInventory = selected.Container.Inventory; Game1.activeClickableMenu = selected.OpenMenu(); }; } }