From 300fcee7acc76f79edd3829e4c4cebdbf1539a59 Mon Sep 17 00:00:00 2001 From: Zeffuro Date: Tue, 30 Dec 2025 01:45:28 +0100 Subject: [PATCH] More fixes --- .../AddonCategoryConfigurationWindow.cs | 6 +-- AetherBags/Addons/InventoryAddonBase.cs | 37 +++++++++++++++---- AetherBags/Commands/CommandHandler.cs | 8 ++-- AetherBags/Helpers/InventoryMoveHelper.cs | 2 +- .../CategoryDefinitionConfigurationNode.cs | 2 +- .../General/FunctionalConfigurationNode.cs | 2 +- .../General/GeneralScrollingAreaNode.cs | 2 +- .../Layout/CompactLookaheadNode.cs | 2 +- .../Layout/LayoutConfigurationNode.cs | 8 ++-- .../Nodes/Inventory/InventoryCategoryNode.cs | 4 +- 10 files changed, 47 insertions(+), 26 deletions(-) diff --git a/AetherBags/Addons/AddonCategoryConfigurationWindow.cs b/AetherBags/Addons/AddonCategoryConfigurationWindow.cs index 4d46049..3585dab 100644 --- a/AetherBags/Addons/AddonCategoryConfigurationWindow.cs +++ b/AetherBags/Addons/AddonCategoryConfigurationWindow.cs @@ -77,7 +77,7 @@ public class AddonCategoryConfigurationWindow : NativeAddon .ToList(); } - private void OnOptionChanged(CategoryWrapper? newOption) + private void OnOptionChanged(CategoryWrapper? newOption) { if (_configNode is null) return; @@ -118,7 +118,7 @@ public class AddonCategoryConfigurationWindow : NativeAddon listNode.AddOption(newWrapper); RefreshSelectionList(); - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } private void OnRemoveCategory(CategoryWrapper categoryWrapper) @@ -134,7 +134,7 @@ public class AddonCategoryConfigurationWindow : NativeAddon { OnOptionChanged(null); } - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } private void RefreshSelectionList() diff --git a/AetherBags/Addons/InventoryAddonBase.cs b/AetherBags/Addons/InventoryAddonBase.cs index 9dd1f35..3ab3810 100644 --- a/AetherBags/Addons/InventoryAddonBase.cs +++ b/AetherBags/Addons/InventoryAddonBase.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; using System.Numerics; -using AetherBags; -using AetherBags.Inventory; using AetherBags.Inventory.Categories; using AetherBags.Inventory.State; using AetherBags.Nodes.Input; @@ -12,6 +10,8 @@ using FFXIVClientStructs.FFXIV.Component.GUI; using KamiToolKit; using KamiToolKit.Nodes; +namespace AetherBags.Addons; + public abstract unsafe class InventoryAddonBase : NativeAddon { protected readonly InventoryCategoryHoverCoordinator HoverCoordinator = new(); @@ -21,7 +21,7 @@ public abstract unsafe class InventoryAddonBase : NativeAddon protected WrappingGridNode CategoriesNode = null!; protected TextInputWithHintNode SearchInputNode = null!; protected InventoryFooterNode FooterNode = null!; - protected TextNode? SlotCounterNode { get; set; } + protected TextNode? SlotCounterNode { get; set; } protected CircleButtonNode SettingsButtonNode = null!; protected virtual float MinWindowWidth => 600; @@ -37,6 +37,7 @@ public abstract unsafe class InventoryAddonBase : NativeAddon protected bool RefreshQueued; protected bool RefreshAutosizeQueued; + private bool _isRefreshing; protected abstract InventoryStateBase InventoryState { get; } @@ -44,11 +45,30 @@ public abstract unsafe class InventoryAddonBase : NativeAddon protected virtual bool HasPinning => true; protected virtual bool HasSlotCounter => false; - public void ManualInventoryRefresh() + public void ManualRefresh() { if (!Services.ClientState.IsLoggedIn) return; - InventoryState.RefreshFromGame(); - RefreshCategoriesCore(autosize: true); + if (_isRefreshing) return; + try + { + _isRefreshing = true; + InventoryState.RefreshFromGame(); + RefreshCategoriesCore(autosize: true); + } + finally + { + _isRefreshing = false; + } + } + + protected virtual void RefreshAllInventoryWindows() + { + Services.Framework.RunOnTick(() => + { + System.AddonInventoryWindow?.ManualRefresh(); + System.AddonSaddleBagWindow?.ManualRefresh(); + //AetherBags.System.AddonRetainerWindow?.ManualRefresh(); + }, delayTicks: 2); } protected virtual void RefreshCategoriesCore(bool autosize) @@ -79,8 +99,7 @@ public abstract unsafe class InventoryAddonBase : NativeAddon if (HasPinning) { bool pinsChanged = PinCoordinator.ApplyPinnedStates(CategoriesNode); - if (pinsChanged) - HoverCoordinator.ResetAll(CategoriesNode); + if (pinsChanged) HoverCoordinator.ResetAll(CategoriesNode); } WireHoverHandlers(); @@ -99,6 +118,8 @@ public abstract unsafe class InventoryAddonBase : NativeAddon return new InventoryCategoryNode { Size = ContentSize with { Y = 120 }, + OnRefreshRequested = ManualRefresh, + OnDragEnd = RefreshAllInventoryWindows, }; } diff --git a/AetherBags/Commands/CommandHandler.cs b/AetherBags/Commands/CommandHandler.cs index e93a3ea..e3971a2 100644 --- a/AetherBags/Commands/CommandHandler.cs +++ b/AetherBags/Commands/CommandHandler.cs @@ -58,7 +58,7 @@ public class CommandHandler : IDisposable break; case "refresh": - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); PrintChat("Inventory refreshed."); break; @@ -68,7 +68,7 @@ public class CommandHandler : IDisposable case "import-sk": ImportExportResetHelper.TryImportSortaKindaFromClipboard(true); - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); break; case "export": @@ -77,12 +77,12 @@ public class CommandHandler : IDisposable case "import": ImportExportResetHelper.TryImportConfigFromClipboard(); - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); break; case "reset": ImportExportResetHelper.TryResetConfig(); - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); break; case "count": diff --git a/AetherBags/Helpers/InventoryMoveHelper.cs b/AetherBags/Helpers/InventoryMoveHelper.cs index 41e5434..8a568f1 100644 --- a/AetherBags/Helpers/InventoryMoveHelper.cs +++ b/AetherBags/Helpers/InventoryMoveHelper.cs @@ -9,7 +9,7 @@ public static unsafe class InventoryMoveHelper Services.Logger.Debug($"[MoveItem] {sourceContainer}@{sourceSlot} -> {destContainer}@{destSlot}"); InventoryManager.Instance()->MoveItemSlot(sourceContainer, sourceSlot, destContainer, destSlot, true); Services.Framework.DelayTicks(2); - Services.Framework.RunOnFrameworkThread(System.AddonInventoryWindow.ManualInventoryRefresh); + Services.Framework.RunOnFrameworkThread(System.AddonInventoryWindow.ManualRefresh); } /* diff --git a/AetherBags/Nodes/Configuration/Category/CategoryDefinitionConfigurationNode.cs b/AetherBags/Nodes/Configuration/Category/CategoryDefinitionConfigurationNode.cs index 4e54bc8..a05ceca 100644 --- a/AetherBags/Nodes/Configuration/Category/CategoryDefinitionConfigurationNode.cs +++ b/AetherBags/Nodes/Configuration/Category/CategoryDefinitionConfigurationNode.cs @@ -342,7 +342,7 @@ public sealed class CategoryDefinitionConfigurationNode : VerticalListNode private static void NotifyChanged() { - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } private void NotifyCategoryPropertyChanged() diff --git a/AetherBags/Nodes/Configuration/General/FunctionalConfigurationNode.cs b/AetherBags/Nodes/Configuration/General/FunctionalConfigurationNode.cs index 19fc24f..7124ce1 100644 --- a/AetherBags/Nodes/Configuration/General/FunctionalConfigurationNode.cs +++ b/AetherBags/Nodes/Configuration/General/FunctionalConfigurationNode.cs @@ -81,7 +81,7 @@ internal sealed class FunctionalConfigurationNode : TabbedVerticalListNode if (Enum.TryParse(selected, out var parsed)) { config.StackMode = parsed; - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } } }; diff --git a/AetherBags/Nodes/Configuration/General/GeneralScrollingAreaNode.cs b/AetherBags/Nodes/Configuration/General/GeneralScrollingAreaNode.cs index 253f864..f7f40b9 100644 --- a/AetherBags/Nodes/Configuration/General/GeneralScrollingAreaNode.cs +++ b/AetherBags/Nodes/Configuration/General/GeneralScrollingAreaNode.cs @@ -30,5 +30,5 @@ public sealed class GeneralScrollingAreaNode : ScrollingAreaNode System.AddonInventoryWindow.ManualInventoryRefresh(); + private void RefreshInventory() => System.AddonInventoryWindow.ManualRefresh(); } \ No newline at end of file diff --git a/AetherBags/Nodes/Configuration/Layout/CompactLookaheadNode.cs b/AetherBags/Nodes/Configuration/Layout/CompactLookaheadNode.cs index b01c560..97d7ed6 100644 --- a/AetherBags/Nodes/Configuration/Layout/CompactLookaheadNode.cs +++ b/AetherBags/Nodes/Configuration/Layout/CompactLookaheadNode.cs @@ -33,7 +33,7 @@ internal sealed class CompactLookaheadNode : SimpleComponentNode OnValueUpdate = value => { config.CompactLookahead = value; - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } }; CompactLookahead.AttachNode(this); diff --git a/AetherBags/Nodes/Configuration/Layout/LayoutConfigurationNode.cs b/AetherBags/Nodes/Configuration/Layout/LayoutConfigurationNode.cs index 93db895..7640501 100644 --- a/AetherBags/Nodes/Configuration/Layout/LayoutConfigurationNode.cs +++ b/AetherBags/Nodes/Configuration/Layout/LayoutConfigurationNode.cs @@ -32,7 +32,7 @@ internal class LayoutConfigurationNode : TabbedVerticalListNode OnClick = isChecked => { config.ShowCategoryItemCount = isChecked; - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } }; AddNode(showCategoryItemAmountCheckboxNode); @@ -49,7 +49,7 @@ internal class LayoutConfigurationNode : TabbedVerticalListNode _preferLargestFitCheckboxNode.IsEnabled = isChecked; _useStableInsertCheckboxNode.IsEnabled = isChecked; _compactLookaheadNode.CompactLookahead.IsEnabled = isChecked; - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } }; AddNode(compactPackingCheckboxNode); @@ -65,7 +65,7 @@ internal class LayoutConfigurationNode : TabbedVerticalListNode OnClick = isChecked => { config.CompactPreferLargestFit = isChecked; - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } }; AddNode(_preferLargestFitCheckboxNode); @@ -80,7 +80,7 @@ internal class LayoutConfigurationNode : TabbedVerticalListNode OnClick = isChecked => { config.CompactStableInsert = isChecked; - System.AddonInventoryWindow.ManualInventoryRefresh(); + System.AddonInventoryWindow.ManualRefresh(); } }; AddNode(_useStableInsertCheckboxNode); diff --git a/AetherBags/Nodes/Inventory/InventoryCategoryNode.cs b/AetherBags/Nodes/Inventory/InventoryCategoryNode.cs index 79321ff..b1a62fa 100644 --- a/AetherBags/Nodes/Inventory/InventoryCategoryNode.cs +++ b/AetherBags/Nodes/Inventory/InventoryCategoryNode.cs @@ -36,6 +36,7 @@ public class InventoryCategoryNode : SimpleComponentNode public event Action? HeaderHoverChanged; public Action? OnRefreshRequested { get; set; } + public Action? OnDragEnd { get; set; } public InventoryCategoryNode() { @@ -239,7 +240,7 @@ public class InventoryCategoryNode : SimpleComponentNode }, IsClickable = true, OnDiscard = node => OnDiscard(node, data), - OnEnd = _ => System.AddonInventoryWindow.ManualInventoryRefresh(), + OnEnd = _ => OnDragEnd?.Invoke(), OnPayloadAccepted = (node, payload) => OnPayloadAccepted(node, payload, data), OnRollOver = node => { @@ -292,7 +293,6 @@ public class InventoryCategoryNode : SimpleComponentNode Services.Logger.Debug($"[OnPayload] Source: {sourceLocation. Container} @ {sourceLocation. Slot}"); Services.Logger.Debug($"[OnPayload] Target: {targetLocation.Container} @ {targetLocation.Slot}"); - if (sourceLocation.Container.IsSameContainerGroup(targetLocation.Container)) { Services.Logger.Debug($"[OnPayload] Source and target are in the same container group; no move performed");