From b31b2e24dc79e803a67c15faeb93c4ba2ea95417 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Mon, 13 Nov 2023 22:31:35 +0100 Subject: [PATCH] Add customization options to the preview discards window --- ARDiscard/ARDiscard.csproj | 2 +- ARDiscard/AutoDiscardPlogon.cs | 8 +++- ARDiscard/Configuration.cs | 7 ++++ ARDiscard/GameData/ItemCache.cs | 11 +++++ ARDiscard/Windows/ConfigWindow.cs | 18 +++++++- ARDiscard/Windows/DiscardWindow.cs | 66 +++++++++++++++++++++++++----- 6 files changed, 96 insertions(+), 16 deletions(-) diff --git a/ARDiscard/ARDiscard.csproj b/ARDiscard/ARDiscard.csproj index 8c845fd..0a41ea4 100644 --- a/ARDiscard/ARDiscard.csproj +++ b/ARDiscard/ARDiscard.csproj @@ -1,7 +1,7 @@ net7.0-windows - 3.2 + 3.3 11.0 enable true diff --git a/ARDiscard/AutoDiscardPlogon.cs b/ARDiscard/AutoDiscardPlogon.cs index 1ad31da..5029068 100644 --- a/ARDiscard/AutoDiscardPlogon.cs +++ b/ARDiscard/AutoDiscardPlogon.cs @@ -14,6 +14,7 @@ using ECommons.Automation; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Component.GUI; +using LLib; namespace ARDiscard; @@ -32,6 +33,7 @@ public class AutoDiscardPlogon : IDalamudPlugin private readonly IGameGui _gameGui; private readonly ICommandManager _commandManager; private readonly InventoryUtils _inventoryUtils; + private readonly IconCache _iconCache; private readonly AutoRetainerApi _autoRetainerApi; private readonly TaskManager _taskManager; private readonly ContextMenuIntegration _contextMenuIntegration; @@ -40,7 +42,7 @@ public class AutoDiscardPlogon : IDalamudPlugin public AutoDiscardPlogon(DalamudPluginInterface pluginInterface, ICommandManager commandManager, IChatGui chatGui, IDataManager dataManager, IClientState clientState, ICondition condition, IPluginLog pluginLog, - IGameGui gameGui) + IGameGui gameGui, ITextureProvider textureProvider) { ItemCache itemCache = new ItemCache(dataManager); @@ -64,11 +66,12 @@ public class AutoDiscardPlogon : IDalamudPlugin HelpMessage = "Show what will be discarded with your current configuration", }); _inventoryUtils = new InventoryUtils(_configuration, itemCache, _pluginLog); + _iconCache = new IconCache(textureProvider); _pluginInterface.UiBuilder.Draw += _windowSystem.Draw; _pluginInterface.UiBuilder.OpenConfigUi += OpenConfigUi; - _discardWindow = new(_inventoryUtils, itemCache, clientState, condition); + _discardWindow = new(_inventoryUtils, itemCache, _iconCache, clientState, condition, _configuration); _windowSystem.AddWindow(_discardWindow); _configWindow = new(_pluginInterface, _configuration, itemCache, clientState, condition); @@ -274,6 +277,7 @@ public class AutoDiscardPlogon : IDalamudPlugin _contextMenuIntegration.Dispose(); _autoRetainerApi.Dispose(); ECommonsMain.Dispose(); + _iconCache.Dispose(); _pluginInterface.UiBuilder.OpenConfigUi -= OpenConfigUi; _pluginInterface.UiBuilder.Draw -= _windowSystem.Draw; diff --git a/ARDiscard/Configuration.cs b/ARDiscard/Configuration.cs index 6dccac5..50049f1 100644 --- a/ARDiscard/Configuration.cs +++ b/ARDiscard/Configuration.cs @@ -13,6 +13,7 @@ internal sealed class Configuration : IPluginConfiguration public ArmouryConfiguration Armoury { get; set; } = new(); public ContextMenuConfiguration ContextMenu { get; set; } = new(); + public PreviewConfiguration Preview { get; set; } = new(); public uint IgnoreItemCountWhenAbove { get; set; } = 50; public sealed class CharacterInfo @@ -35,4 +36,10 @@ internal sealed class Configuration : IPluginConfiguration public bool Enabled { get; set; } = false; public bool OnlyWhenConfigIsOpen { get; set; } = true; } + + public sealed class PreviewConfiguration + { + public bool GroupByCategory { get; set; } = true; + public bool ShowIcons { get; set; } = true; + } } diff --git a/ARDiscard/GameData/ItemCache.cs b/ARDiscard/GameData/ItemCache.cs index 0a4f9e4..11181ba 100644 --- a/ARDiscard/GameData/ItemCache.cs +++ b/ARDiscard/GameData/ItemCache.cs @@ -19,6 +19,7 @@ internal sealed class ItemCache { ItemId = item.RowId, Name = item.Name.ToString(), + IconId = item.Icon, ILvl = item.LevelItem.Row, Rarity = item.Rarity, IsUnique = item.IsUnique, @@ -26,6 +27,7 @@ internal sealed class ItemCache IsIndisposable = item.IsIndisposable, Level = item.LevelEquip, UiCategory = item.ItemUICategory.Row, + UiCategoryName = item.ItemUICategory.Value!.Name.ToString(), }; } } @@ -46,10 +48,18 @@ internal sealed class ItemCache return string.Empty; } + public ushort GetItemIconId(uint itemId) + { + if (_items.TryGetValue(itemId, out var item)) + return item.IconId; + return ushort.MinValue; + } + public sealed class CachedItemInfo { public required uint ItemId { get; init; } public required string Name { get; init; } + public required ushort IconId { get; init; } public required uint ILvl { get; init; } public required uint Level { get; init; } public required byte Rarity { get; init; } @@ -62,5 +72,6 @@ internal sealed class ItemCache public required bool IsIndisposable { get; init; } public required uint UiCategory { get; init; } + public required string UiCategoryName { get; init; } } } diff --git a/ARDiscard/Windows/ConfigWindow.cs b/ARDiscard/Windows/ConfigWindow.cs index 4cda12c..c682114 100644 --- a/ARDiscard/Windows/ConfigWindow.cs +++ b/ARDiscard/Windows/ConfigWindow.cs @@ -2,12 +2,10 @@ using System.Collections.Generic; using System.Linq; using System.Numerics; -using System.Threading.Tasks; using ARDiscard.GameData; using Dalamud.Game.ClientState.Conditions; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility; -using Dalamud.Interface.Windowing; using Dalamud.Plugin; using Dalamud.Plugin.Services; using ECommons; @@ -332,6 +330,22 @@ internal sealed class ConfigWindow : LImGui.LWindow Save(); } + ImGui.Separator(); + + bool groupPreviewByCategory = _configuration.Preview.GroupByCategory; + if (ImGui.Checkbox("Group items in 'Preview' by category", ref groupPreviewByCategory)) + { + _configuration.Preview.GroupByCategory = groupPreviewByCategory; + Save(); + } + + bool showIconsInPreview = _configuration.Preview.ShowIcons; + if (ImGui.Checkbox("Show icons in 'Preview'", ref showIconsInPreview)) + { + _configuration.Preview.ShowIcons = showIconsInPreview; + Save(); + } + ImGui.EndTabItem(); } } diff --git a/ARDiscard/Windows/DiscardWindow.cs b/ARDiscard/Windows/DiscardWindow.cs index 3b828bb..e6a66b8 100644 --- a/ARDiscard/Windows/DiscardWindow.cs +++ b/ARDiscard/Windows/DiscardWindow.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; using System.Linq; using ARDiscard.GameData; using Dalamud.Game.ClientState.Conditions; +using Dalamud.Interface.Internal; using Dalamud.Interface.Utility; -using Dalamud.Interface.Windowing; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Common.Math; using ImGuiNET; @@ -16,22 +16,26 @@ internal sealed class DiscardWindow : LImGui.LWindow { private readonly InventoryUtils _inventoryUtils; private readonly ItemCache _itemCache; + private readonly IconCache _iconCache; private readonly IClientState _clientState; private readonly ICondition _condition; + private readonly Configuration _configuration; private List _displayedItems = new(); public event EventHandler? OpenConfigurationClicked; public event EventHandler? DiscardAllClicked; - public DiscardWindow(InventoryUtils inventoryUtils, ItemCache itemCache, - IClientState clientState, ICondition condition) + public DiscardWindow(InventoryUtils inventoryUtils, ItemCache itemCache, IconCache iconCache, + IClientState clientState, ICondition condition, Configuration configuration) : base("Discard Items###AutoDiscardDiscard") { _inventoryUtils = inventoryUtils; _itemCache = itemCache; + _iconCache = iconCache; _clientState = clientState; _condition = condition; + _configuration = configuration; Size = new Vector2(600, 400); SizeCondition = ImGuiCond.FirstUseEver; @@ -62,10 +66,22 @@ internal sealed class DiscardWindow : LImGui.LWindow } else { - foreach (var displayedItem in _displayedItems) + if (_configuration.Preview.GroupByCategory) { - if (ImGui.Selectable(displayedItem.ToString(), displayedItem.Selected)) - displayedItem.Selected = !displayedItem.Selected; + foreach (var category in _displayedItems.OrderBy(x => x.UiCategory) + .GroupBy(x => new { x.UiCategory, x.UiCategoryName })) + { + ImGui.Text($"{category.Key.UiCategoryName}"); + ImGui.Indent(); + foreach (var displayedItem in category) + DrawItem(displayedItem); + ImGui.Unindent(); + } + } + else + { + foreach (var displayedItem in _displayedItems) + DrawItem(displayedItem); } } } @@ -95,6 +111,23 @@ internal sealed class DiscardWindow : LImGui.LWindow ImGui.EndDisabled(); } + private void DrawItem(SelectableItem displayedItem) + { + if (_configuration.Preview.ShowIcons) + { + IDalamudTextureWrap? icon = _iconCache.GetIcon(displayedItem.IconId); + if (icon != null) + { + ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23)); + ImGui.SameLine(); + ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 3); + } + } + + if (ImGui.Selectable(displayedItem.ToString(), displayedItem.Selected)) + displayedItem.Selected = !displayedItem.Selected; + } + public override void OnOpen() => RefreshInventory(false); public override void OnClose() => _displayedItems.Clear(); @@ -113,13 +146,21 @@ internal sealed class DiscardWindow : LImGui.LWindow } _displayedItems = _inventoryUtils.GetAllItemsToDiscard() - .GroupBy(x => x.InventoryItem->ItemID) + .GroupBy(x => new + { + ItemId = x.InventoryItem->ItemID, + ItemInfo = _itemCache.GetItem(x.InventoryItem->ItemID), + }) + .Where(x => x.Key.ItemInfo != null) .Select(x => new SelectableItem { - ItemId = x.Key, - Name = _itemCache.GetItemName(x.Key), + ItemId = x.Key.ItemId, + Name = x.Key.ItemInfo!.Name, + IconId = x.Key.ItemInfo!.IconId, Quantity = x.Sum(y => y.InventoryItem->Quantity), - Selected = !notSelected.Contains(x.Key), + UiCategory = x.Key.ItemInfo!.UiCategory, + UiCategoryName = x.Key.ItemInfo!.UiCategoryName, + Selected = !notSelected.Contains(x.Key.ItemId), }) .OrderBy(x => x.Name.ToLower()) .ToList(); @@ -129,8 +170,11 @@ internal sealed class DiscardWindow : LImGui.LWindow { public required uint ItemId { get; init; } public required string Name { get; init; } + public required ushort IconId { get; init; } public required long Quantity { get; init; } - public bool Selected { get; set; } = true; + public required uint UiCategory { get; init; } + public required string UiCategoryName { get; init; } + public required bool Selected { get; set; } public override string ToString() {