block partial merges, keep ammo from merging on gridview accept

This commit is contained in:
Tyfon
2024-06-18 14:52:35 -07:00
parent 9289e736eb
commit 62bfdd6042
2 changed files with 55 additions and 5 deletions

View File

@@ -61,7 +61,7 @@ namespace UIFixes
if (itemView.IsSelectable() && !SelectedItemViews.ContainsKey(itemView) && !SecondaryItemViews.ContainsKey(itemView))
{
ItemContextClass itemContext = new(itemView.ItemContext, itemView.ItemRotation);
ItemContextClass itemContext = new MultiSelectItemContext(itemView.ItemContext, itemView.ItemRotation);
itemContext.GClass2813_0.OnDisposed += RugPull;
itemContext.OnDisposed += RugPull;
@@ -194,6 +194,12 @@ namespace UIFixes
}
}
public class MultiSelectItemContext(ItemContextAbstractClass itemContext, ItemRotation rotation) : ItemContextClass(itemContext, rotation)
{
public override bool MergeAvailable => false;
public override bool SplitAvailable => false;
}
public static class MultiSelectExtensions
{
public static bool IsSelectable(this ItemView itemView)

View File

@@ -24,8 +24,11 @@ namespace UIFixes
private static readonly List<Image> Previews = [];
// Point that various QuickFindPlace overrides should start at
public static GClass2769 FindOrigin = null;
public static bool FindVerticalFirst = false;
private static GClass2769 FindOrigin = null;
private static bool FindVerticalFirst = false;
// Prevents QuickFind from attempting a merge
private static bool DisableMerge = false;
public static void Enable()
{
@@ -58,6 +61,7 @@ namespace UIFixes
new FindSpotKeepRotationPatch().Enable();
new FindLocationForItemPatch().Enable();
new FindPlaceToPutPatch().Enable();
new AdjustQuickFindFlagsPatch().Enable();
}
public class InitializeCommonUIPatch : ModulePatch
@@ -259,6 +263,8 @@ namespace UIFixes
operation = default;
__result = false;
HidePreviews();
if (__instance.Grid == null || wrappedInstance.NonInteractable)
{
return false;
@@ -289,8 +295,8 @@ namespace UIFixes
return false;
}
HidePreviews();
Item targetItem = __instance.method_8(targetItemContext);
DisableMerge = targetItem == null;
bool showHighlights = targetItem == null;
Stack<GStruct413> operations = new();
@@ -329,6 +335,8 @@ namespace UIFixes
targetItem ??= __instance.Grid.ParentItem;
}
DisableMerge = false;
if (!__result)
{
HidePreviews();
@@ -376,6 +384,7 @@ namespace UIFixes
}
InPatch = true;
DisableMerge = targetItemContext == null;
LocationInGrid hoveredLocation = __instance.CalculateItemLocation(itemContext);
GClass2769 hoveredAddress = new(__instance.Grid, hoveredLocation);
@@ -396,6 +405,7 @@ namespace UIFixes
InPatch = false;
FindOrigin = null;
FindVerticalFirst = false;
DisableMerge = false;
GridViewPickTargetPatch.FallbackResult = null;
});
@@ -403,6 +413,35 @@ namespace UIFixes
}
}
public class AdjustQuickFindFlagsPatch : ModulePatch
{
// For reasons (???), BSG doesn't even define the second bit of this flags enum
private static InteractionsHandlerClass.EMoveItemOrder PartialMerge = (InteractionsHandlerClass.EMoveItemOrder)2;
protected override MethodBase GetTargetMethod()
{
return AccessTools.Method(typeof(InteractionsHandlerClass), nameof(InteractionsHandlerClass.QuickFindAppropriatePlace));
}
[PatchPrefix]
public static void Prefix(ref InteractionsHandlerClass.EMoveItemOrder order)
{
if (!MultiSelect.Active)
{
return;
}
// Multiselect always disables "Transfer", which is a partial merge
// It leaves things behind and that's not intuitive when multi-selecting
order &= ~PartialMerge;
if (DisableMerge)
{
order &= ~InteractionsHandlerClass.EMoveItemOrder.TryMerge;
}
}
}
public class SelectMovedItemViewPatch : ModulePatch
{
protected override MethodBase GetTargetMethod()
@@ -525,9 +564,14 @@ namespace UIFixes
private static IEnumerable<ItemContextClass> SortSelectedContexts(
IEnumerable<ItemContextClass> selectedContexts, ItemContextClass itemContext, bool prepend = true)
{
static int gridOrder(LocationInGrid loc, StashGridClass grid) => grid.GridWidth.Value * loc.y + loc.x;
var result = selectedContexts
.Where(ic => ic.Item != itemContext.Item)
.OrderByDescending(ic => itemContext.ItemAddress is GClass2769 originalDraggedAddress && ic.ItemAddress is GClass2769 selectedGridAddress && selectedGridAddress.Grid == originalDraggedAddress.Grid);
.OrderByDescending(ic => ic.ItemAddress is GClass2769)
.ThenByDescending(ic => itemContext.ItemAddress is GClass2769 originalDraggedAddress && ic.ItemAddress is GClass2769 selectedGridAddress && selectedGridAddress.Grid == originalDraggedAddress.Grid)
.ThenByDescending(ic => ic.ItemAddress is GClass2769 selectedGridAddress ? selectedGridAddress.Grid : null)
.ThenBy(ic => ic.ItemAddress is GClass2769 selectedGridAddress ? gridOrder(selectedGridAddress.LocationInGrid, selectedGridAddress.Grid) : 0);
return prepend ? result.Prepend(itemContext) : result;
}