Add Open->All context menu option
This commit is contained in:
83
src/ContextMenus/OpenInteractions.cs
Normal file
83
src/ContextMenus/OpenInteractions.cs
Normal file
@@ -0,0 +1,83 @@
|
|||||||
|
using Comfort.Common;
|
||||||
|
using EFT.UI;
|
||||||
|
using EFT.UI.DragAndDrop;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace UIFixes;
|
||||||
|
|
||||||
|
public class OpenInteractions(ItemContextAbstractClass itemContext, ItemUiContext itemUiContext) : ItemInfoInteractionsAbstractClass<OpenInteractions.Options>(itemUiContext)
|
||||||
|
{
|
||||||
|
private readonly ItemContextAbstractClass itemContext = itemContext;
|
||||||
|
|
||||||
|
public override void ExecuteInteractionInternal(Options interaction)
|
||||||
|
{
|
||||||
|
if (itemContext == null || itemContext.Item is not LootItemClass compoundItem)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var taskSerializer = itemUiContext_0.gameObject.AddComponent<NestedContainerTaskSerializer>();
|
||||||
|
taskSerializer.Initialize(GetNestedContainers(itemContext), containerContext =>
|
||||||
|
{
|
||||||
|
if (containerContext != null)
|
||||||
|
{
|
||||||
|
itemUiContext_0.OpenItem(containerContext.Item as LootItemClass, containerContext, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Task.CompletedTask;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool IsActive(Options button)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override IResult IsInteractive(Options button)
|
||||||
|
{
|
||||||
|
return SuccessfulResult.New;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override bool HasIcons
|
||||||
|
{
|
||||||
|
get { return false; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum Options
|
||||||
|
{
|
||||||
|
All
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerable<ItemContextAbstractClass> GetNestedContainers(ItemContextAbstractClass first)
|
||||||
|
{
|
||||||
|
var windowRoot = Singleton<PreloaderUI>.Instance;
|
||||||
|
LootItemClass parent = first.Item as LootItemClass;
|
||||||
|
|
||||||
|
yield return first;
|
||||||
|
|
||||||
|
while (true)
|
||||||
|
{
|
||||||
|
var innerContainers = parent.GetFirstLevelItems()
|
||||||
|
.Where(i => i != parent)
|
||||||
|
.Where(i => i is LootItemClass innerContainer && innerContainer.Grids.Any());
|
||||||
|
if (innerContainers.Count() != 1)
|
||||||
|
{
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
var targetId = innerContainers.First().Id;
|
||||||
|
var targetItemView = windowRoot.GetComponentsInChildren<GridItemView>().FirstOrDefault(itemView => itemView.Item.Id == targetId);
|
||||||
|
if (targetItemView == null)
|
||||||
|
{
|
||||||
|
yield return null; // Keeps returning null until the window is open
|
||||||
|
}
|
||||||
|
|
||||||
|
parent = targetItemView.Item as LootItemClass;
|
||||||
|
yield return targetItemView.ItemContext;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class NestedContainerTaskSerializer : TaskSerializer<ItemContextAbstractClass> { }
|
@@ -125,9 +125,20 @@ public static class ContextMenuPatches
|
|||||||
}
|
}
|
||||||
|
|
||||||
[PatchPostfix]
|
[PatchPostfix]
|
||||||
public static void Postfix(ref IEnumerable<EItemInfoButton> __result)
|
public static void Postfix(ref IEnumerable<EItemInfoButton> __result, Item ___item_0)
|
||||||
{
|
{
|
||||||
__result = __result.Append(EItemInfoButton.Repair).Append(EItemInfoButton.Insure);
|
__result = __result.Append(EItemInfoButton.Repair).Append(EItemInfoButton.Insure);
|
||||||
|
|
||||||
|
if (___item_0 is LootItemClass container && container.Grids.Any())
|
||||||
|
{
|
||||||
|
var innerContainers = container.GetFirstLevelItems()
|
||||||
|
.Where(i => i != container)
|
||||||
|
.Where(i => i is LootItemClass innerContainer && innerContainer.Grids.Any());
|
||||||
|
if (innerContainers.Count() == 1)
|
||||||
|
{
|
||||||
|
__result = __result.Append(EItemInfoButton.Open);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +152,12 @@ public static class ContextMenuPatches
|
|||||||
}
|
}
|
||||||
|
|
||||||
[PatchPrefix]
|
[PatchPrefix]
|
||||||
public static bool Prefix(EItemInfoButton parentInteraction, ISubInteractions subInteractionsWrapper, Item ___item_0, ItemUiContext ___itemUiContext_1)
|
public static bool Prefix(
|
||||||
|
EItemInfoButton parentInteraction,
|
||||||
|
ISubInteractions subInteractionsWrapper,
|
||||||
|
Item ___item_0,
|
||||||
|
ItemContextAbstractClass ___itemContextAbstractClass,
|
||||||
|
ItemUiContext ___itemUiContext_1)
|
||||||
{
|
{
|
||||||
// Clear this, since something else should be active (even a different mouseover of the insurance button)
|
// Clear this, since something else should be active (even a different mouseover of the insurance button)
|
||||||
LoadingInsuranceActions = false;
|
LoadingInsuranceActions = false;
|
||||||
@@ -179,6 +195,12 @@ public static class ContextMenuPatches
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Settings.OpenAllContextMenu.Value && parentInteraction == EItemInfoButton.Open)
|
||||||
|
{
|
||||||
|
subInteractionsWrapper.SetSubInteractions(new OpenInteractions(___itemContextAbstractClass, ___itemUiContext_1));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -139,6 +139,7 @@ internal class Settings
|
|||||||
public static ConfigEntry<bool> ContextMenuOnRight { get; set; }
|
public static ConfigEntry<bool> ContextMenuOnRight { get; set; }
|
||||||
public static ConfigEntry<bool> AddOfferContextMenu { get; set; }
|
public static ConfigEntry<bool> AddOfferContextMenu { get; set; }
|
||||||
public static ConfigEntry<bool> WishlistContextEverywhere { get; set; }
|
public static ConfigEntry<bool> WishlistContextEverywhere { get; set; }
|
||||||
|
public static ConfigEntry<bool> OpenAllContextMenu { get; set; }
|
||||||
public static ConfigEntry<bool> ShowGPCurrency { get; set; }
|
public static ConfigEntry<bool> ShowGPCurrency { get; set; }
|
||||||
public static ConfigEntry<bool> ShowOutOfStockCheckbox { get; set; }
|
public static ConfigEntry<bool> ShowOutOfStockCheckbox { get; set; }
|
||||||
public static ConfigEntry<SortingTableDisplay> SortingTableButton { get; set; }
|
public static ConfigEntry<SortingTableDisplay> SortingTableButton { get; set; }
|
||||||
@@ -748,6 +749,15 @@ internal class Settings
|
|||||||
null,
|
null,
|
||||||
new ConfigurationManagerAttributes { })));
|
new ConfigurationManagerAttributes { })));
|
||||||
|
|
||||||
|
configEntries.Add(OpenAllContextMenu = config.Bind(
|
||||||
|
InventorySection,
|
||||||
|
"Open All Context Flyout",
|
||||||
|
true,
|
||||||
|
new ConfigDescription(
|
||||||
|
"Add a flyout to the Open context menu to recursively open a stack of containers",
|
||||||
|
null,
|
||||||
|
new ConfigurationManagerAttributes { })));
|
||||||
|
|
||||||
configEntries.Add(ShowGPCurrency = config.Bind(
|
configEntries.Add(ShowGPCurrency = config.Bind(
|
||||||
InventorySection,
|
InventorySection,
|
||||||
"Show GP Coins in Currency",
|
"Show GP Coins in Currency",
|
||||||
|
Reference in New Issue
Block a user