Add chat context menu entries

This commit is contained in:
Liza 2023-12-22 17:48:47 +01:00
parent 19e1e93416
commit b28367fb65
Signed by: liza
GPG Key ID: 7199F8D727D55F67
2 changed files with 69 additions and 26 deletions

View File

@ -86,7 +86,7 @@ public class AutoDiscardPlogon : IDalamudPlugin
ECommonsMain.Init(_pluginInterface, this); ECommonsMain.Init(_pluginInterface, this);
_autoRetainerApi = new(); _autoRetainerApi = new();
_taskManager = new(); _taskManager = new();
_contextMenuIntegration = new(_pluginInterface, _chatGui, itemCache, _configuration, _configWindow); _contextMenuIntegration = new(_pluginInterface, _chatGui, itemCache, _configuration, _configWindow, _gameGui);
_clientState.Login += _discardWindow.Login; _clientState.Login += _discardWindow.Login;
_clientState.Logout += _discardWindow.Logout; _clientState.Logout += _discardWindow.Logout;

View File

@ -15,85 +15,128 @@ internal sealed class ContextMenuIntegration : IDisposable
private readonly ItemCache _itemCache; private readonly ItemCache _itemCache;
private readonly Configuration _configuration; private readonly Configuration _configuration;
private readonly ConfigWindow _configWindow; private readonly ConfigWindow _configWindow;
private readonly InventoryContextMenuItem _addItem; private readonly IGameGui _gameGui;
private readonly InventoryContextMenuItem _removeItem; private readonly SeString _addItemPayload;
private readonly SeString _removeItemPayload;
private readonly InventoryContextMenuItem _addInventoryItem;
private readonly InventoryContextMenuItem _removeInventoryItem;
private readonly DalamudContextMenu _dalamudContextMenu; private readonly DalamudContextMenu _dalamudContextMenu;
public ContextMenuIntegration(DalamudPluginInterface pluginInterface, IChatGui chatGui, ItemCache itemCache, public ContextMenuIntegration(DalamudPluginInterface pluginInterface, IChatGui chatGui, ItemCache itemCache,
Configuration configuration, ConfigWindow configWindow) Configuration configuration, ConfigWindow configWindow, IGameGui gameGui)
{ {
_chatGui = chatGui; _chatGui = chatGui;
_itemCache = itemCache; _itemCache = itemCache;
_configuration = configuration; _configuration = configuration;
_configWindow = configWindow; _configWindow = configWindow;
_addItem = new InventoryContextMenuItem( _gameGui = gameGui;
_addItemPayload =
new SeString(new UIForegroundPayload(52)) new SeString(new UIForegroundPayload(52))
.Append($"\ue05f ") .Append($"\ue05f ")
.Append(new UIForegroundPayload(0)).Append("Add to Auto Discard List"), .Append(new UIForegroundPayload(0)).Append("Add to Auto Discard List");
AddToDiscardList); _removeItemPayload = new SeString(new UIForegroundPayload(52))
_removeItem = new InventoryContextMenuItem( .Append($"\ue05f ")
new SeString(new UIForegroundPayload(52)) .Append(new UIForegroundPayload(0)).Append("Remove from Auto Discard List");
.Append($"\ue05f ") _addInventoryItem = new InventoryContextMenuItem(_addItemPayload, AddToDiscardList);
.Append(new UIForegroundPayload(0)).Append("Remove from Auto Discard List"), _removeInventoryItem = new InventoryContextMenuItem(_removeItemPayload, RemoveFromDiscardList);
RemoveFromDiscardList);
_dalamudContextMenu = new(pluginInterface); _dalamudContextMenu = new(pluginInterface);
_dalamudContextMenu.OnOpenInventoryContextMenu += OpenInventoryContextMenu; _dalamudContextMenu.OnOpenInventoryContextMenu += OpenInventoryContextMenu;
_dalamudContextMenu.OnOpenGameObjectContextMenu += OpenGameObjectContextMenu;
} }
private unsafe void OpenInventoryContextMenu(InventoryContextMenuOpenArgs args) private void OpenInventoryContextMenu(InventoryContextMenuOpenArgs args)
{ {
if (!_configuration.ContextMenu.Enabled) if (!IsEnabled())
return; return;
if (_configuration.ContextMenu.OnlyWhenConfigIsOpen && !_configWindow.IsOpen) if (args.ParentAddonName is not ("Inventory" or "InventoryExpansion" or "InventoryLarge" or "ArmouryBoard"))
return;
if (!(args.ParentAddonName is "Inventory" or "InventoryExpansion" or "InventoryLarge" or "ArmouryBoard"))
return; return;
if (!_configWindow.CanItemBeConfigured(args.ItemId)) if (!_configWindow.CanItemBeConfigured(args.ItemId))
return; return;
if (_configuration.DiscardingItems.Contains(args.ItemId)) if (_configuration.DiscardingItems.Contains(args.ItemId))
args.AddCustomItem(_removeItem); args.AddCustomItem(_removeInventoryItem);
else if (_itemCache.TryGetItem(args.ItemId, out ItemCache.CachedItemInfo? cachedItemInfo) && else if (_itemCache.TryGetItem(args.ItemId, out ItemCache.CachedItemInfo? cachedItemInfo) &&
cachedItemInfo.CanBeDiscarded()) cachedItemInfo.CanBeDiscarded())
args.AddCustomItem(_addItem); args.AddCustomItem(_addInventoryItem);
} }
private void AddToDiscardList(InventoryContextMenuItemSelectedArgs args) private void OpenGameObjectContextMenu(GameObjectContextMenuOpenArgs args)
{ {
if (_configWindow.AddToDiscardList(args.ItemId)) if (!IsEnabled())
return;
if (args.ParentAddonName is not "ChatLog")
return;
uint itemId = (uint)_gameGui.HoveredItem;
if (itemId > 1_000_000)
itemId -= 1_000_000;
if (itemId > 500_000)
itemId -= 500_000;
if (_configuration.DiscardingItems.Contains(itemId))
args.AddCustomItem(new GameObjectContextMenuItem(_removeItemPayload, _ => RemoveFromDiscardList(itemId)));
else if (_itemCache.TryGetItem(itemId, out ItemCache.CachedItemInfo? cachedItemInfo) &&
cachedItemInfo.CanBeDiscarded())
args.AddCustomItem(new GameObjectContextMenuItem(_addItemPayload, _ => AddToDiscardList(itemId)));
}
private void AddToDiscardList(InventoryContextMenuItemSelectedArgs args) => AddToDiscardList(args.ItemId);
private void AddToDiscardList(uint itemId)
{
if (_configWindow.AddToDiscardList(itemId))
{ {
_chatGui.Print(new SeString(new UIForegroundPayload(52)) _chatGui.Print(new SeString(new UIForegroundPayload(52))
.Append($"\ue05f ") .Append($"\ue05f ")
.Append(new UIForegroundPayload(0)) .Append(new UIForegroundPayload(0))
.Append($"Added ") .Append($"Added ")
.Append(new UIForegroundPayload(52)) .Append(new UIForegroundPayload(52))
.Append(_itemCache.GetItemName(args.ItemId)) .Append(new ItemPayload(itemId))
.Append(_itemCache.GetItemName(itemId))
.Append(RawPayload.LinkTerminator)
.Append(new UIForegroundPayload(0)) .Append(new UIForegroundPayload(0))
.Append(" to Auto Discard List.")); .Append(" to Auto Discard List."));
} }
} }
private void RemoveFromDiscardList(InventoryContextMenuItemSelectedArgs args) private void RemoveFromDiscardList(InventoryContextMenuItemSelectedArgs args) => RemoveFromDiscardList(args.ItemId);
private void RemoveFromDiscardList(uint itemId)
{ {
if (_configWindow.RemoveFromDiscardList(args.ItemId)) if (_configWindow.RemoveFromDiscardList(itemId))
{ {
_chatGui.Print(new SeString(new UIForegroundPayload(52)) _chatGui.Print(new SeString(new UIForegroundPayload(52))
.Append($"\ue05f ") .Append($"\ue05f ")
.Append(new UIForegroundPayload(0)) .Append(new UIForegroundPayload(0))
.Append($"Removed ") .Append($"Removed ")
.Append(new UIForegroundPayload(52)) .Append(new UIForegroundPayload(52))
.Append(_itemCache.GetItemName(args.ItemId)) .Append(new ItemPayload(itemId))
.Append(_itemCache.GetItemName(itemId))
.Append(RawPayload.LinkTerminator)
.Append(new UIForegroundPayload(0)) .Append(new UIForegroundPayload(0))
.Append(" from Auto Discard List.")); .Append(" from Auto Discard List."));
} }
} }
private bool IsEnabled()
{
if (!_configuration.ContextMenu.Enabled)
return false;
if (_configuration.ContextMenu.OnlyWhenConfigIsOpen && !_configWindow.IsOpen)
return false;
return true;
}
public void Dispose() public void Dispose()
{ {
_dalamudContextMenu.OnOpenGameObjectContextMenu -= OpenGameObjectContextMenu;
_dalamudContextMenu.OnOpenInventoryContextMenu -= OpenInventoryContextMenu; _dalamudContextMenu.OnOpenInventoryContextMenu -= OpenInventoryContextMenu;
_dalamudContextMenu.Dispose(); _dalamudContextMenu.Dispose();
} }