deselect items that go into mags, allow partial moves when all items are the same and stackable

This commit is contained in:
Tyfon
2024-06-22 17:12:23 -07:00
parent df1803c385
commit cd0266a2a9
3 changed files with 30 additions and 22 deletions

View File

@@ -213,25 +213,19 @@ namespace UIFixes
public static int InteractionCount(EItemInfoButton interaction, ItemUiContext itemUiContext) public static int InteractionCount(EItemInfoButton interaction, ItemUiContext itemUiContext)
{ {
int count = 0; return ItemContexts.Count(ic => InteractionAvailable(ic, interaction, itemUiContext));
foreach (ItemContextClass selectedItemContext in SortedItemContexts()) }
private static bool InteractionAvailable(ItemContextClass itemContext, EItemInfoButton interaction, ItemUiContext itemUiContext)
{
ItemContextAbstractClass innerContext = itemContext.GClass2813_0;
if (innerContext == null)
{ {
ItemContextAbstractClass innerContext = selectedItemContext.GClass2813_0; return false;
if (innerContext == null)
{
continue;
}
var contextInteractions = itemUiContext.GetItemContextInteractions(innerContext, null);
if (!contextInteractions.IsInteractionAvailable(interaction))
{
continue;
}
++count;
} }
return count; var contextInteractions = itemUiContext.GetItemContextInteractions(innerContext, null);
return contextInteractions.IsInteractionAvailable(interaction);
} }
public static void EquipAll(ItemUiContext itemUiContext, bool allOrNothing) public static void EquipAll(ItemUiContext itemUiContext, bool allOrNothing)
@@ -239,7 +233,9 @@ namespace UIFixes
if (!allOrNothing || InteractionCount(EItemInfoButton.Equip, itemUiContext) == Count) if (!allOrNothing || InteractionCount(EItemInfoButton.Equip, itemUiContext) == Count)
{ {
var taskSerializer = itemUiContext.gameObject.AddComponent<ItemContextTaskSerializer>(); var taskSerializer = itemUiContext.gameObject.AddComponent<ItemContextTaskSerializer>();
taskSerializer.Initialize(SortedItemContexts(), itemContext => itemUiContext.QuickEquip(itemContext.Item)); taskSerializer.Initialize(
SortedItemContexts().Where(ic => InteractionAvailable(ic, EItemInfoButton.Equip, itemUiContext)),
itemContext => itemUiContext.QuickEquip(itemContext.Item));
itemUiContext.Tooltip?.Close(); itemUiContext.Tooltip?.Close();
} }
} }
@@ -249,7 +245,9 @@ namespace UIFixes
if (!allOrNothing || InteractionCount(EItemInfoButton.Unequip, itemUiContext) == Count) if (!allOrNothing || InteractionCount(EItemInfoButton.Unequip, itemUiContext) == Count)
{ {
var taskSerializer = itemUiContext.gameObject.AddComponent<ItemContextTaskSerializer>(); var taskSerializer = itemUiContext.gameObject.AddComponent<ItemContextTaskSerializer>();
taskSerializer.Initialize(SortedItemContexts(), itemContext => itemUiContext.Uninstall(itemContext.GClass2813_0)); taskSerializer.Initialize(
SortedItemContexts().Where(ic => InteractionAvailable(ic, EItemInfoButton.Unequip, itemUiContext)),
itemContext => itemUiContext.Uninstall(itemContext.GClass2813_0));
itemUiContext.Tooltip?.Close(); itemUiContext.Tooltip?.Close();
} }
} }
@@ -261,7 +259,9 @@ namespace UIFixes
{ {
// Call Initialize() before setting UnloadSerializer so that the initial synchronous call to StopProcesses()->StopUnloading() doesn't immediately cancel this // Call Initialize() before setting UnloadSerializer so that the initial synchronous call to StopProcesses()->StopUnloading() doesn't immediately cancel this
var taskSerializer = itemUiContext.gameObject.AddComponent<ItemContextTaskSerializer>(); var taskSerializer = itemUiContext.gameObject.AddComponent<ItemContextTaskSerializer>();
taskSerializer.Initialize(SortedItemContexts(), itemContext => itemUiContext.UnloadAmmo(itemContext.Item)); taskSerializer.Initialize(
SortedItemContexts().Where(ic => InteractionAvailable(ic, EItemInfoButton.UnloadAmmo, itemUiContext)),
itemContext => itemUiContext.UnloadAmmo(itemContext.Item));
UnloadSerializer = taskSerializer; UnloadSerializer = taskSerializer;
itemUiContext.Tooltip?.Close(); itemUiContext.Tooltip?.Close();
@@ -341,9 +341,9 @@ namespace UIFixes
private void OnParentDispose() private void OnParentDispose()
{ {
if (Item.CurrentAddress == null) if (Item.CurrentAddress == null || Item.CurrentAddress.Container.ParentItem is MagazineClass)
{ {
// This item is gone! // This item was entirely merged away, or went into a magazine
MultiSelect.Deselect(this); MultiSelect.Deselect(this);
} }
} }

View File

@@ -19,7 +19,7 @@ namespace UIFixes
public static void Postfix(GridWindow __instance) public static void Postfix(GridWindow __instance)
{ {
var wrappedInstance = __instance.R(); var wrappedInstance = __instance.R();
if (Settings.AddContainerButtons.Value && wrappedInstance.LootItem.Int32_0 > 2) // Greater than 2 cells wide if (Settings.AddContainerButtons.Value && wrappedInstance.LootItem.Int32_0 > 3) // Greater than 3 cells wide
{ {
Transform closeButton = __instance.transform.Find("Caption Panel/Close Button"); Transform closeButton = __instance.transform.Find("Caption Panel/Close Button");
Image sortBackground = __instance.transform.Find("Caption Panel/Sort Button")?.GetComponent<Image>(); Image sortBackground = __instance.transform.Find("Caption Panel/Sort Button")?.GetComponent<Image>();

View File

@@ -478,6 +478,9 @@ namespace UIFixes
DisableMerge = targetItem == null; DisableMerge = targetItem == null;
bool isGridPlacement = targetItem == null; bool isGridPlacement = targetItem == null;
// If everything selected is the same type and is a stackable type, allow partial success
bool allowPartialSuccess = targetItem != null && itemContext.Item is GClass2735 && MultiSelect.ItemContexts.All(ic => ic.Item.TemplateId == itemContext.Item.TemplateId);
Stack<GStruct413> operations = new(); Stack<GStruct413> operations = new();
foreach (ItemContextClass selectedItemContext in MultiSelect.SortedItemContexts(itemContext)) foreach (ItemContextClass selectedItemContext in MultiSelect.SortedItemContexts(itemContext))
{ {
@@ -583,6 +586,11 @@ namespace UIFixes
DisableMerge = false; DisableMerge = false;
if (allowPartialSuccess && operations.Any())
{
__result = true;
}
if (!__result) if (!__result)
{ {
HidePreviews(); HidePreviews();