Add icons to some UI parts

This commit is contained in:
Liza 2023-11-11 14:01:02 +01:00
parent 92db028e01
commit 9e6dc2bc73
Signed by: liza
GPG Key ID: 7199F8D727D55F67
7 changed files with 78 additions and 22 deletions

View File

@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework> <TargetFramework>net7.0-windows</TargetFramework>
<Version>2.18</Version> <Version>2.19</Version>
<LangVersion>11.0</LangVersion> <LangVersion>11.0</LangVersion>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies> <CopyLocalLockFileAssemblies>true</CopyLocalLockFileAssemblies>

View File

@ -16,6 +16,7 @@ using Deliveroo.GameData;
using Deliveroo.Windows; using Deliveroo.Windows;
using FFXIVClientStructs.FFXIV.Client.UI; using FFXIVClientStructs.FFXIV.Client.UI;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
using LLib;
using LLib.GameUI; using LLib.GameUI;
using Lumina.Excel.GeneratedSheets; using Lumina.Excel.GeneratedSheets;
@ -46,6 +47,7 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
// ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable // ReSharper disable once PrivateFieldCanBeConvertedToLocalVariable
private readonly GcRewardsCache _gcRewardsCache; private readonly GcRewardsCache _gcRewardsCache;
private readonly IconCache _iconCache;
private readonly ConfigWindow _configWindow; private readonly ConfigWindow _configWindow;
private readonly TurnInWindow _turnInWindow; private readonly TurnInWindow _turnInWindow;
private readonly IReadOnlyDictionary<uint, uint> _sealCaps; private readonly IReadOnlyDictionary<uint, uint> _sealCaps;
@ -59,7 +61,7 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
public DeliverooPlugin(DalamudPluginInterface pluginInterface, IChatGui chatGui, IGameGui gameGui, public DeliverooPlugin(DalamudPluginInterface pluginInterface, IChatGui chatGui, IGameGui gameGui,
IFramework framework, IClientState clientState, IObjectTable objectTable, ITargetManager targetManager, IFramework framework, IClientState clientState, IObjectTable objectTable, ITargetManager targetManager,
IDataManager dataManager, ICondition condition, ICommandManager commandManager, IPluginLog pluginLog, IDataManager dataManager, ICondition condition, ICommandManager commandManager, IPluginLog pluginLog,
IAddonLifecycle addonLifecycle) IAddonLifecycle addonLifecycle, ITextureProvider textureProvider)
{ {
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;
_chatGui = chatGui; _chatGui = chatGui;
@ -77,9 +79,10 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
_externalPluginHandler = new ExternalPluginHandler(_pluginInterface, _pluginLog); _externalPluginHandler = new ExternalPluginHandler(_pluginInterface, _pluginLog);
_configuration = (Configuration?)_pluginInterface.GetPluginConfig() ?? new Configuration(); _configuration = (Configuration?)_pluginInterface.GetPluginConfig() ?? new Configuration();
_gcRewardsCache = new GcRewardsCache(dataManager); _gcRewardsCache = new GcRewardsCache(dataManager);
_configWindow = new ConfigWindow(_pluginInterface, this, _configuration, _gcRewardsCache, _clientState, _pluginLog); _iconCache = new IconCache(textureProvider);
_configWindow = new ConfigWindow(_pluginInterface, this, _configuration, _gcRewardsCache, _clientState, _pluginLog, _iconCache);
_windowSystem.AddWindow(_configWindow); _windowSystem.AddWindow(_configWindow);
_turnInWindow = new TurnInWindow(this, _pluginInterface, _configuration, _condition, _gcRewardsCache, _configWindow); _turnInWindow = new TurnInWindow(this, _pluginInterface, _configuration, _condition, _gcRewardsCache, _configWindow, _iconCache);
_windowSystem.AddWindow(_turnInWindow); _windowSystem.AddWindow(_turnInWindow);
_sealCaps = dataManager.GetExcelSheet<GrandCompanyRank>()!.Where(x => x.RowId > 0) _sealCaps = dataManager.GetExcelSheet<GrandCompanyRank>()!.Where(x => x.RowId > 0)
.ToDictionary(x => x.RowId, x => x.MaxSeals); .ToDictionary(x => x.RowId, x => x.MaxSeals);
@ -348,6 +351,9 @@ public sealed partial class DeliverooPlugin : IDalamudPlugin
_framework.Update -= FrameworkUpdate; _framework.Update -= FrameworkUpdate;
_externalPluginHandler.Restore(); _externalPluginHandler.Restore();
_externalPluginHandler.Dispose();
_iconCache.Dispose();
} }
private void ProcessCommand(string command, string arguments) private void ProcessCommand(string command, string arguments)

View File

@ -1,10 +1,11 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
namespace Deliveroo.External; namespace Deliveroo.External;
internal sealed class ExternalPluginHandler internal sealed class ExternalPluginHandler : IDisposable
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly DalamudPluginInterface _pluginInterface;
private readonly IPluginLog _pluginLog; private readonly IPluginLog _pluginLog;
@ -83,4 +84,9 @@ internal sealed class ExternalPluginHandler
if (_pandoraState == true) if (_pandoraState == true)
_pandoraIpc.Enable(); _pandoraIpc.Enable();
} }
public void Dispose()
{
_deliverooIpc.Dispose();
}
} }

View File

@ -10,6 +10,7 @@ internal sealed class GcRewardItem : IEquatable<GcRewardItem>
{ {
ItemId = 0, ItemId = 0,
Name = "---", Name = "---",
IconId = 0,
GrandCompanies = new List<GrandCompany>().AsReadOnly(), GrandCompanies = new List<GrandCompany>().AsReadOnly(),
Tier = RewardTier.First, Tier = RewardTier.First,
SubCategory = RewardSubCategory.Unknown, SubCategory = RewardSubCategory.Unknown,
@ -20,6 +21,7 @@ internal sealed class GcRewardItem : IEquatable<GcRewardItem>
public required uint ItemId { get; init; } public required uint ItemId { get; init; }
public required string Name { get; init; } public required string Name { get; init; }
public required ushort IconId { get; init; }
public required IReadOnlyList<GrandCompany> GrandCompanies { get; init; } public required IReadOnlyList<GrandCompany> GrandCompanies { get; init; }
public required RewardTier Tier { get; init; } public required RewardTier Tier { get; init; }
public required RewardSubCategory SubCategory { get; init; } public required RewardSubCategory SubCategory { get; init; }
@ -28,6 +30,7 @@ internal sealed class GcRewardItem : IEquatable<GcRewardItem>
public required uint SealCost { get; init; } public required uint SealCost { get; init; }
public bool IsValid() => ItemId > 0 && GrandCompanies.Count > 0; public bool IsValid() => ItemId > 0 && GrandCompanies.Count > 0;
public bool Limited => GrandCompanies.Count < 3;
public bool Equals(GcRewardItem? other) public bool Equals(GcRewardItem? other)
{ {

View File

@ -27,6 +27,7 @@ internal sealed class GcRewardsCache
{ {
ItemId = item.Item.Row, ItemId = item.Item.Row,
Name = item.Item.Value!.Name.ToString(), Name = item.Item.Value!.Name.ToString(),
IconId = item.Item.Row == ItemIds.Venture ? 25917 : item.Item.Value!.Icon,
category.Tier, category.Tier,
category.SubCategory, category.SubCategory,
RequiredRank = item.RequiredGrandCompanyRank.Row, RequiredRank = item.RequiredGrandCompanyRank.Row,
@ -38,6 +39,7 @@ internal sealed class GcRewardsCache
{ {
ItemId = item.Key.ItemId, ItemId = item.Key.ItemId,
Name = item.Key.Name, Name = item.Key.Name,
IconId = (ushort)item.Key.IconId,
Tier = item.Key.Tier, Tier = item.Key.Tier,
SubCategory = item.Key.SubCategory, SubCategory = item.Key.SubCategory,
RequiredRank = item.Key.RequiredRank, RequiredRank = item.Key.RequiredRank,

View File

@ -2,8 +2,10 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Numerics; using System.Numerics;
using Dalamud.Game.Text;
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Components; using Dalamud.Interface.Components;
using Dalamud.Interface.Internal;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
@ -21,12 +23,13 @@ internal sealed class ConfigWindow : LImGui.LWindow
private readonly GcRewardsCache _gcRewardsCache; private readonly GcRewardsCache _gcRewardsCache;
private readonly IClientState _clientState; private readonly IClientState _clientState;
private readonly IPluginLog _pluginLog; private readonly IPluginLog _pluginLog;
private readonly IconCache _iconCache;
private readonly IReadOnlyDictionary<uint, GcRewardItem> _itemLookup; private readonly IReadOnlyDictionary<uint, GcRewardItem> _itemLookup;
private uint _dragDropSource; private uint _dragDropSource;
public ConfigWindow(DalamudPluginInterface pluginInterface, DeliverooPlugin plugin, Configuration configuration, public ConfigWindow(DalamudPluginInterface pluginInterface, DeliverooPlugin plugin, Configuration configuration,
GcRewardsCache gcRewardsCache, IClientState clientState, IPluginLog pluginLog) GcRewardsCache gcRewardsCache, IClientState clientState, IPluginLog pluginLog, IconCache iconCache)
: base("Deliveroo - Configuration###DeliverooConfig") : base("Deliveroo - Configuration###DeliverooConfig")
{ {
_pluginInterface = pluginInterface; _pluginInterface = pluginInterface;
@ -35,6 +38,7 @@ internal sealed class ConfigWindow : LImGui.LWindow
_gcRewardsCache = gcRewardsCache; _gcRewardsCache = gcRewardsCache;
_clientState = clientState; _clientState = clientState;
_pluginLog = pluginLog; _pluginLog = pluginLog;
_iconCache = iconCache;
_itemLookup = _gcRewardsCache.RewardLookup; _itemLookup = _gcRewardsCache.RewardLookup;
@ -79,7 +83,16 @@ internal sealed class ConfigWindow : LImGui.LWindow
ImGui.BeginDisabled( ImGui.BeginDisabled(
_configuration.ItemsAvailableForPurchase.Count == 1 && itemId == ItemIds.Venture); _configuration.ItemsAvailableForPurchase.Count == 1 && itemId == ItemIds.Venture);
ImGui.Selectable(_itemLookup[itemId].Name); var item = _itemLookup[itemId];
IDalamudTextureWrap? icon = _iconCache.GetIcon(item.IconId);
if (icon != null)
{
ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23));
ImGui.SameLine();
ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 3);
}
ImGui.Selectable($"{item.Name}{(item.Limited ? $" {SeIconChar.Hyadelyn.ToIconString()}" : "")}");
if (ImGui.BeginDragDropSource()) if (ImGui.BeginDragDropSource())
{ {
@ -132,22 +145,37 @@ internal sealed class ConfigWindow : LImGui.LWindow
Save(); Save();
} }
List<(uint ItemId, string Name)> comboValues = _gcRewardsCache.Rewards List<(uint ItemId, string Name, ushort IconId, bool Limited)> comboValues = _gcRewardsCache.Rewards
.Where(x => x.SubCategory is RewardSubCategory.Materials or RewardSubCategory.Materiel) .Where(x => x.SubCategory is RewardSubCategory.Materials or RewardSubCategory.Materiel)
.Where(x => x.StackSize > 1) .Where(x => x.StackSize > 1)
.Where(x => !_configuration.ItemsAvailableForPurchase.Contains(x.ItemId)) .Where(x => !_configuration.ItemsAvailableForPurchase.Contains(x.ItemId))
.Select(x => (x.ItemId, x.Name)) .Select(x => (x.ItemId, x.Name, x.IconId, x.Limited))
.OrderBy(x => x.Name) .OrderBy(x => x.Name)
.ThenBy(x => x.GetHashCode()) .ThenBy(x => x.GetHashCode())
.ToList(); .ToList();
comboValues.Insert(0, (0, ""));
int currentItem = 0; if (ImGui.BeginCombo($"##ItemSelection", "Add Item...", ImGuiComboFlags.HeightLarge))
if (ImGui.Combo("Add Item", ref currentItem, comboValues.Select(x => x.Name).ToArray(), comboValues.Count)
&& comboValues[currentItem].ItemId != GcRewardItem.None.ItemId)
{ {
_configuration.ItemsAvailableForPurchase.Add(comboValues[currentItem].ItemId); ImGui.SetNextItemWidth(ImGui.GetContentRegionAvail().X);
Save();
foreach (var item in comboValues)
{
IDalamudTextureWrap? icon = _iconCache.GetIcon(item.IconId);
if (icon != null)
{
ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23));
ImGui.SameLine();
ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 3);
}
if (ImGui.Selectable($"{item.Name}{(item.Limited ? $" {SeIconChar.Hyadelyn.ToIconString()}" : "")}##SelectVenture{item.IconId}"))
{
_configuration.ItemsAvailableForPurchase.Add(item.ItemId);
Save();
}
}
ImGui.EndCombo();
} }
ImGui.EndTabItem(); ImGui.EndTabItem();

View File

@ -6,6 +6,7 @@ using Dalamud.Game.ClientState.Conditions;
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Colors; using Dalamud.Interface.Colors;
using Dalamud.Interface.Components; using Dalamud.Interface.Components;
using Dalamud.Interface.Internal;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
@ -24,9 +25,10 @@ internal sealed class TurnInWindow : LImGui.LWindow
private readonly Configuration _configuration; private readonly Configuration _configuration;
private readonly ICondition _condition; private readonly ICondition _condition;
private readonly GcRewardsCache _gcRewardsCache; private readonly GcRewardsCache _gcRewardsCache;
private readonly IconCache _iconCache;
public TurnInWindow(DeliverooPlugin plugin, DalamudPluginInterface pluginInterface, Configuration configuration, public TurnInWindow(DeliverooPlugin plugin, DalamudPluginInterface pluginInterface, Configuration configuration,
ICondition condition, GcRewardsCache gcRewardsCache, ConfigWindow configWindow) ICondition condition, GcRewardsCache gcRewardsCache, ConfigWindow configWindow, IconCache iconCache)
: base("GC Delivery###DeliverooTurnIn") : base("GC Delivery###DeliverooTurnIn")
{ {
_plugin = plugin; _plugin = plugin;
@ -34,6 +36,7 @@ internal sealed class TurnInWindow : LImGui.LWindow
_configuration = configuration; _configuration = configuration;
_condition = condition; _condition = condition;
_gcRewardsCache = gcRewardsCache; _gcRewardsCache = gcRewardsCache;
_iconCache = iconCache;
Position = new Vector2(100, 100); Position = new Vector2(100, 100);
PositionCondition = ImGuiCond.FirstUseEver; PositionCondition = ImGuiCond.FirstUseEver;
@ -177,9 +180,9 @@ internal sealed class TurnInWindow : LImGui.LWindow
var itemsWrapper = ItemsWrapper; var itemsWrapper = ItemsWrapper;
ImGui.Text($"Items to buy ({itemsWrapper.Name}):"); ImGui.Text($"Items to buy ({itemsWrapper.Name}):");
List<(uint ItemId, string Name, IReadOnlyList<GrandCompany> GrandCompanies, uint Rank)> comboValues = new() List<(uint ItemId, string Name, IReadOnlyList<GrandCompany> GrandCompanies, uint Rank, ushort IconId)> comboValues = new()
{ {
(GcRewardItem.None.ItemId, GcRewardItem.None.Name, new List<GrandCompany>(), GcRewardItem.None.RequiredRank) (GcRewardItem.None.ItemId, GcRewardItem.None.Name, new List<GrandCompany>(), GcRewardItem.None.RequiredRank, GcRewardItem.None.IconId)
}; };
foreach (uint itemId in _configuration.ItemsAvailableForPurchase) foreach (uint itemId in _configuration.ItemsAvailableForPurchase)
{ {
@ -188,7 +191,7 @@ internal sealed class TurnInWindow : LImGui.LWindow
string itemName = gcReward.Name; string itemName = gcReward.Name;
if (itemCount > 0) if (itemCount > 0)
itemName += $" ({itemCount:N0})"; itemName += $" ({itemCount:N0})";
comboValues.Add((itemId, itemName, gcReward.GrandCompanies, gcReward.RequiredRank)); comboValues.Add((itemId, itemName, gcReward.GrandCompanies, gcReward.RequiredRank, gcReward.IconId));
} }
if (itemsWrapper.GetItemsToPurchase().Count == 0) if (itemsWrapper.GetItemsToPurchase().Count == 0)
@ -204,6 +207,7 @@ internal sealed class TurnInWindow : LImGui.LWindow
{ {
ImGui.PushID($"ItemToBuy{i}"); ImGui.PushID($"ItemToBuy{i}");
var item = itemsWrapper.GetItemsToPurchase()[i]; var item = itemsWrapper.GetItemsToPurchase()[i];
bool enabled = item.Enabled; bool enabled = item.Enabled;
ImGui.PushID($"Enable{i}"); ImGui.PushID($"Enable{i}");
if (ImGui.Checkbox("", ref enabled)) if (ImGui.Checkbox("", ref enabled))
@ -225,6 +229,13 @@ internal sealed class TurnInWindow : LImGui.LWindow
comboValueIndex = 0; comboValueIndex = 0;
} }
IDalamudTextureWrap? icon = _iconCache.GetIcon(comboValues[comboValueIndex].IconId);
if (icon != null)
{
ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23));
ImGui.SameLine(0, 3);
}
if (ImGui.Combo("", ref comboValueIndex, comboValues.Select(x => x.Name).ToArray(), comboValues.Count)) if (ImGui.Combo("", ref comboValueIndex, comboValues.Select(x => x.Name).ToArray(), comboValues.Count))
{ {
item.ItemId = comboValues[comboValueIndex].ItemId; item.ItemId = comboValues[comboValueIndex].ItemId;
@ -262,7 +273,7 @@ internal sealed class TurnInWindow : LImGui.LWindow
if (enabled) if (enabled)
{ {
ImGui.Indent(27); ImGui.Indent(52);
if (comboValueIndex > 0) if (comboValueIndex > 0)
{ {
ImGui.SetNextItemWidth(ImGuiHelpers.GlobalScale * 130); ImGui.SetNextItemWidth(ImGuiHelpers.GlobalScale * 130);
@ -300,7 +311,7 @@ internal sealed class TurnInWindow : LImGui.LWindow
} }
} }
ImGui.Unindent(27); ImGui.Unindent(52);
} }
ImGui.PopID(); ImGui.PopID();