From 158eda6d7f9c2e924b55d9323f61011a5c170509 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Sat, 16 Sep 2023 14:42:15 +0200 Subject: [PATCH] Add context menu integration --- ARDiscard/ARDiscard.csproj | 3 +- ARDiscard/AutoDiscardPlogon.cs | 3 ++ ARDiscard/Configuration.cs | 7 +++ ARDiscard/ContextMenuIntegration.cs | 75 +++++++++++++++++++++++++++++ ARDiscard/Windows/ConfigWindow.cs | 74 +++++++++++++++++++++++----- ARDiscard/packages.lock.json | 6 +++ 6 files changed, 155 insertions(+), 13 deletions(-) create mode 100644 ARDiscard/ContextMenuIntegration.cs diff --git a/ARDiscard/ARDiscard.csproj b/ARDiscard/ARDiscard.csproj index d567f53..4d3f0e9 100644 --- a/ARDiscard/ARDiscard.csproj +++ b/ARDiscard/ARDiscard.csproj @@ -1,7 +1,7 @@ net7.0-windows - 2.1 + 2.2 11.0 enable true @@ -25,6 +25,7 @@ + diff --git a/ARDiscard/AutoDiscardPlogon.cs b/ARDiscard/AutoDiscardPlogon.cs index c05513a..22fc68d 100644 --- a/ARDiscard/AutoDiscardPlogon.cs +++ b/ARDiscard/AutoDiscardPlogon.cs @@ -38,6 +38,7 @@ public class AutoDiscardPlogon : IDalamudPlugin private readonly InventoryUtils _inventoryUtils; private readonly AutoRetainerApi _autoRetainerApi; private readonly TaskManager _taskManager; + private readonly ContextMenuIntegration _contextMenuIntegration; private DateTime _cancelDiscardAfter = DateTime.MaxValue; @@ -83,6 +84,7 @@ public class AutoDiscardPlogon : IDalamudPlugin ECommonsMain.Init(_pluginInterface, this); _autoRetainerApi = new(); _taskManager = new(); + _contextMenuIntegration = new(_configuration, _configWindow); _clientState.Login += _discardWindow.Login; _clientState.Logout += _discardWindow.Logout; @@ -271,6 +273,7 @@ public class AutoDiscardPlogon : IDalamudPlugin _clientState.Login -= _discardWindow.Login; _clientState.Logout -= _discardWindow.Logout; + _contextMenuIntegration.Dispose(); _autoRetainerApi.Dispose(); ECommonsMain.Dispose(); diff --git a/ARDiscard/Configuration.cs b/ARDiscard/Configuration.cs index ce7bdcd..76be885 100644 --- a/ARDiscard/Configuration.cs +++ b/ARDiscard/Configuration.cs @@ -12,6 +12,7 @@ public sealed class Configuration : IPluginConfiguration public List ExcludedCharacters { get; set; } = new(); public ArmouryConfiguration Armoury { get; set; } = new(); + public ContextMenuConfiguration ContextMenu { get; set; } = new(); public sealed class CharacterInfo { @@ -27,4 +28,10 @@ public sealed class Configuration : IPluginConfiguration public bool CheckRightSideGear { get; set; } = false; public int MaximumGearItemLevel { get; set; } = 45; } + + public sealed class ContextMenuConfiguration + { + public bool Enabled { get; set; } = false; + public bool OnlyWhenConfigIsOpen { get; set; } = true; + } } diff --git a/ARDiscard/ContextMenuIntegration.cs b/ARDiscard/ContextMenuIntegration.cs new file mode 100644 index 0000000..abe51f3 --- /dev/null +++ b/ARDiscard/ContextMenuIntegration.cs @@ -0,0 +1,75 @@ +using System; +using System.Linq; +using ARDiscard.GameData; +using ARDiscard.Windows; +using Dalamud.ContextMenu; +using Dalamud.Game.Text; +using Dalamud.Game.Text.SeStringHandling; +using Dalamud.Game.Text.SeStringHandling.Payloads; +using Dalamud.Logging; + +namespace ARDiscard; + +public sealed class ContextMenuIntegration : IDisposable +{ + private readonly Configuration _configuration; + private readonly ConfigWindow _configWindow; + private readonly InventoryContextMenuItem _addItem; + private readonly InventoryContextMenuItem _removeItem; + private readonly DalamudContextMenu _dalamudContextMenu; + + public ContextMenuIntegration(Configuration configuration, ConfigWindow configWindow) + { + _configuration = configuration; + _configWindow = configWindow; + _addItem = new InventoryContextMenuItem( + new SeString(new UIForegroundPayload(52)) + .Append($"\ue05f ") + .Append(new UIForegroundPayload(0)).Append("Add to Auto Discard List"), + AddToDiscardList); + _removeItem = new InventoryContextMenuItem( + new SeString(new UIForegroundPayload(52)) + .Append($"\ue05f ") + .Append(new UIForegroundPayload(0)).Append("Remove from Auto Discard List"), + RemoveFromDiscardList); + + _dalamudContextMenu = new(); + _dalamudContextMenu.OnOpenInventoryContextMenu += OpenInventoryContextMenu; + } + + private void OpenInventoryContextMenu(InventoryContextMenuOpenArgs args) + { + if (!_configuration.ContextMenu.Enabled) + return; + + if (_configuration.ContextMenu.OnlyWhenConfigIsOpen && !_configWindow.IsOpen) + return; + + if (!(args.ParentAddonName is "Inventory" or "InventoryExpansion" or "InventoryLarge")) + return; + + if (!_configWindow.CanItemBeConfigured(args.ItemId)) + return; + + if (_configuration.DiscardingItems.Contains(args.ItemId)) + args.AddCustomItem(_removeItem); + else if (!InternalConfiguration.BlacklistedItems.Contains(args.ItemId)) + args.AddCustomItem(_addItem); + } + + private void AddToDiscardList(InventoryContextMenuItemSelectedArgs args) + { + _configWindow.AddToDiscardList(args.ItemId); + } + + private void RemoveFromDiscardList(InventoryContextMenuItemSelectedArgs args) + { + _configWindow.RemoveFromDiscardList(args.ItemId); + } + + public void Dispose() + { + _dalamudContextMenu.OnOpenInventoryContextMenu -= OpenInventoryContextMenu; + _dalamudContextMenu.Dispose(); + } +} diff --git a/ARDiscard/Windows/ConfigWindow.cs b/ARDiscard/Windows/ConfigWindow.cs index 1d5e498..5d8639c 100644 --- a/ARDiscard/Windows/ConfigWindow.cs +++ b/ARDiscard/Windows/ConfigWindow.cs @@ -297,6 +297,29 @@ public sealed class ConfigWindow : Window ImGui.Unindent(30); ImGui.EndDisabled(); + + ImGui.Separator(); + + bool contextMenuEnabled = _configuration.ContextMenu.Enabled; + if (ImGui.Checkbox("Inventory context menu integration", ref contextMenuEnabled)) + { + _configuration.ContextMenu.Enabled = contextMenuEnabled; + Save(); + } + + ImGui.BeginDisabled(!contextMenuEnabled); + ImGui.Indent(30); + bool contextMenuOnlyWhenConfigIsOpen = _configuration.ContextMenu.OnlyWhenConfigIsOpen; + if (ImGui.Checkbox("Only add menu entries while config window is open", + ref contextMenuOnlyWhenConfigIsOpen)) + { + _configuration.ContextMenu.OnlyWhenConfigIsOpen = contextMenuOnlyWhenConfigIsOpen; + Save(); + } + + ImGui.Unindent(30); + ImGui.EndDisabled(); + ImGui.EndTabItem(); } } @@ -307,23 +330,29 @@ public sealed class ConfigWindow : Window _searchResults = new(); else { - if (_allItems == null) - { - _allItems = _itemCache.AllItems - .Where(x => !x.IsUnique && !x.IsUntradable) - .Where(x => x.UiCategory != UiCategories.Currency && x.UiCategory != UiCategories.Crystals && - x.UiCategory != UiCategories.Unobtainable) - .Select(x => (x.ItemId, x.Name.ToString())) - .ToList(); - } - - _searchResults = _allItems.Where(x => x.Name.Contains(_itemName, StringComparison.CurrentCultureIgnoreCase) - || (uint.TryParse(_itemName, out uint itemId) && x.ItemId == itemId)) + _searchResults = EnsureAllItemsLoaded().Where(x => + x.Name.Contains(_itemName, StringComparison.CurrentCultureIgnoreCase) + || (uint.TryParse(_itemName, out uint itemId) && x.ItemId == itemId)) .OrderBy(x => _itemName.EqualsIgnoreCase(x.Name) ? string.Empty : x.Name) .ToList(); } } + private List<(uint ItemId, string Name)> EnsureAllItemsLoaded() + { + if (_allItems == null) + { + _allItems = _itemCache.AllItems + .Where(x => !x.IsUnique && !x.IsUntradable) + .Where(x => x.UiCategory != UiCategories.Currency && x.UiCategory != UiCategories.Crystals && + x.UiCategory != UiCategories.Unobtainable) + .Select(x => (x.ItemId, x.Name.ToString())) + .ToList(); + } + + return _allItems; + } + private void Save() { _configuration.DiscardingItems = _discarding.Select(x => x.ItemId).ToList(); @@ -331,4 +360,25 @@ public sealed class ConfigWindow : Window ConfigSaved?.Invoke(this, EventArgs.Empty); } + + internal void AddToDiscardList(uint itemId) + { + var item = EnsureAllItemsLoaded().SingleOrDefault(x => x.ItemId == itemId); + if (item.ItemId != 0) + { + _discarding.Add(item); + Save(); + } + } + + internal void RemoveFromDiscardList(uint itemId) + { + if (_discarding.RemoveAll(x => x.ItemId == itemId) > 0) + Save(); + } + + public bool CanItemBeConfigured(uint itemId) + { + return EnsureAllItemsLoaded().SingleOrDefault(x => x.ItemId == itemId).ItemId == itemId; + } } diff --git a/ARDiscard/packages.lock.json b/ARDiscard/packages.lock.json index 467f0f2..6bf9223 100644 --- a/ARDiscard/packages.lock.json +++ b/ARDiscard/packages.lock.json @@ -2,6 +2,12 @@ "version": 1, "dependencies": { "net7.0-windows7.0": { + "Dalamud.ContextMenu": { + "type": "Direct", + "requested": "[1.2.3, )", + "resolved": "1.2.3", + "contentHash": "ydemplF7DNcA/LLeongDVzWUD/JV0Fw3EwA2+P0jYq3Le2ZYSt4U8qyJq4FyoChqt0lFG8BxYCAzfeWp4Jmnqw==" + }, "DalamudPackager": { "type": "Direct", "requested": "[2.1.11, )",