forked from liza/ARControl
(2.x) Add icons
This commit is contained in:
parent
6564a49369
commit
59d6f50c18
@ -27,12 +27,14 @@ public sealed partial class AutoRetainerControlPlugin : IDalamudPlugin
|
|||||||
|
|
||||||
private readonly Configuration _configuration;
|
private readonly Configuration _configuration;
|
||||||
private readonly GameCache _gameCache;
|
private readonly GameCache _gameCache;
|
||||||
|
private readonly IconCache _iconCache;
|
||||||
private readonly VentureResolver _ventureResolver;
|
private readonly VentureResolver _ventureResolver;
|
||||||
private readonly ConfigWindow _configWindow;
|
private readonly ConfigWindow _configWindow;
|
||||||
private readonly AutoRetainerApi _autoRetainerApi;
|
private readonly AutoRetainerApi _autoRetainerApi;
|
||||||
|
|
||||||
public AutoRetainerControlPlugin(DalamudPluginInterface pluginInterface, IDataManager dataManager,
|
public AutoRetainerControlPlugin(DalamudPluginInterface pluginInterface, IDataManager dataManager,
|
||||||
IClientState clientState, IChatGui chatGui, ICommandManager commandManager, IPluginLog pluginLog)
|
IClientState clientState, IChatGui chatGui, ICommandManager commandManager, ITextureProvider textureProvider,
|
||||||
|
IPluginLog pluginLog)
|
||||||
{
|
{
|
||||||
_pluginInterface = pluginInterface;
|
_pluginInterface = pluginInterface;
|
||||||
_clientState = clientState;
|
_clientState = clientState;
|
||||||
@ -43,9 +45,10 @@ public sealed partial class AutoRetainerControlPlugin : IDalamudPlugin
|
|||||||
_configuration = (Configuration?)_pluginInterface.GetPluginConfig() ?? new Configuration { Version = 2 };
|
_configuration = (Configuration?)_pluginInterface.GetPluginConfig() ?? new Configuration { Version = 2 };
|
||||||
|
|
||||||
_gameCache = new GameCache(dataManager);
|
_gameCache = new GameCache(dataManager);
|
||||||
|
_iconCache = new IconCache(textureProvider);
|
||||||
_ventureResolver = new VentureResolver(_gameCache, _pluginLog);
|
_ventureResolver = new VentureResolver(_gameCache, _pluginLog);
|
||||||
_configWindow =
|
_configWindow =
|
||||||
new ConfigWindow(_pluginInterface, _configuration, _gameCache, _clientState, _commandManager, _pluginLog)
|
new ConfigWindow(_pluginInterface, _configuration, _gameCache, _clientState, _commandManager, _iconCache, _pluginLog)
|
||||||
{ IsOpen = true };
|
{ IsOpen = true };
|
||||||
_windowSystem.AddWindow(_configWindow);
|
_windowSystem.AddWindow(_configWindow);
|
||||||
|
|
||||||
@ -184,6 +187,7 @@ public sealed partial class AutoRetainerControlPlugin : IDalamudPlugin
|
|||||||
_pluginInterface.UiBuilder.OpenConfigUi -= _configWindow.Toggle;
|
_pluginInterface.UiBuilder.OpenConfigUi -= _configWindow.Toggle;
|
||||||
_pluginInterface.UiBuilder.Draw -= _windowSystem.Draw;
|
_pluginInterface.UiBuilder.Draw -= _windowSystem.Draw;
|
||||||
|
|
||||||
|
_iconCache.Dispose();
|
||||||
_autoRetainerApi.Dispose();
|
_autoRetainerApi.Dispose();
|
||||||
ECommonsMain.Dispose();
|
ECommonsMain.Dispose();
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using Dalamud.Configuration;
|
using Dalamud.Configuration;
|
||||||
|
using Dalamud.Game.Text;
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
|
|
||||||
namespace ARControl;
|
namespace ARControl;
|
||||||
@ -20,6 +21,17 @@ internal sealed class Configuration : IPluginConfiguration
|
|||||||
public required ListType Type { get; set; } = ListType.CollectOneTime;
|
public required ListType Type { get; set; } = ListType.CollectOneTime;
|
||||||
public required ListPriority Priority { get; set; } = ListPriority.InOrder;
|
public required ListPriority Priority { get; set; } = ListPriority.InOrder;
|
||||||
public List<QueuedItem> Items { get; set; } = new();
|
public List<QueuedItem> Items { get; set; } = new();
|
||||||
|
|
||||||
|
public string GetIcon()
|
||||||
|
{
|
||||||
|
return Type switch
|
||||||
|
{
|
||||||
|
ListType.CollectOneTime => SeIconChar.BoxedNumber1.ToIconString(),
|
||||||
|
ListType.KeepStocked when Priority == ListPriority.Balanced => SeIconChar.EurekaLevel.ToIconString(),
|
||||||
|
ListType.KeepStocked => SeIconChar.Circle.ToIconString(),
|
||||||
|
_ => string.Empty
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum ListType
|
public enum ListType
|
||||||
@ -44,7 +56,6 @@ internal sealed class Configuration : IPluginConfiguration
|
|||||||
{
|
{
|
||||||
public required Guid Id { get; set; }
|
public required Guid Id { get; set; }
|
||||||
public required string Name { get; set; }
|
public required string Name { get; set; }
|
||||||
public required FontAwesomeIcon Icon { get; set; }
|
|
||||||
public List<Guid> ItemListIds { get; set; } = new();
|
public List<Guid> ItemListIds { get; set; } = new();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,6 +14,7 @@ internal sealed class Venture
|
|||||||
var taskDetails = dataManager.GetExcelSheet<RetainerTaskNormal>()!.GetRow(retainerTask.Task)!;
|
var taskDetails = dataManager.GetExcelSheet<RetainerTaskNormal>()!.GetRow(retainerTask.Task)!;
|
||||||
var taskParameters = retainerTask.RetainerTaskParameter.Value!;
|
var taskParameters = retainerTask.RetainerTaskParameter.Value!;
|
||||||
ItemId = taskDetails.Item.Row;
|
ItemId = taskDetails.Item.Row;
|
||||||
|
IconId = taskDetails.Item.Value!.Icon;
|
||||||
Name = taskDetails.Item.Value!.Name.ToString();
|
Name = taskDetails.Item.Value!.Name.ToString();
|
||||||
Level = retainerTask.RetainerLevel;
|
Level = retainerTask.RetainerLevel;
|
||||||
ItemLevelCombat = retainerTask.RequiredItemLevel;
|
ItemLevelCombat = retainerTask.RequiredItemLevel;
|
||||||
@ -76,6 +77,7 @@ internal sealed class Venture
|
|||||||
}
|
}
|
||||||
|
|
||||||
public uint ItemId { get; }
|
public uint ItemId { get; }
|
||||||
|
public ushort IconId { get; }
|
||||||
public string Name { get; }
|
public string Name { get; }
|
||||||
public byte Level { get; }
|
public byte Level { get; }
|
||||||
public ushort ItemLevelCombat { get; }
|
public ushort ItemLevelCombat { get; }
|
||||||
|
53
ARControl/IconCache.cs
Normal file
53
ARControl/IconCache.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using Dalamud.Interface.Internal;
|
||||||
|
using Dalamud.Plugin.Services;
|
||||||
|
|
||||||
|
namespace ARControl;
|
||||||
|
|
||||||
|
internal sealed class IconCache : IDisposable
|
||||||
|
{
|
||||||
|
private readonly ITextureProvider _textureProvider;
|
||||||
|
private readonly Dictionary<uint, TextureContainer> _textureWraps = new();
|
||||||
|
|
||||||
|
public IconCache(ITextureProvider textureProvider)
|
||||||
|
{
|
||||||
|
_textureProvider = textureProvider;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IDalamudTextureWrap? GetIcon(uint iconId)
|
||||||
|
{
|
||||||
|
if (_textureWraps.TryGetValue(iconId, out TextureContainer? container))
|
||||||
|
return container.Texture;
|
||||||
|
|
||||||
|
var iconTex = _textureProvider.GetIcon(iconId);
|
||||||
|
if (iconTex != null)
|
||||||
|
{
|
||||||
|
if (iconTex.ImGuiHandle != nint.Zero)
|
||||||
|
{
|
||||||
|
_textureWraps[iconId] = new TextureContainer { Texture = iconTex };
|
||||||
|
return iconTex;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconTex.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
_textureWraps[iconId] = new TextureContainer { Texture = null };
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
foreach (TextureContainer container in _textureWraps.Values)
|
||||||
|
container.Dispose();
|
||||||
|
|
||||||
|
_textureWraps.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
private sealed class TextureContainer : IDisposable
|
||||||
|
{
|
||||||
|
public required IDalamudTextureWrap? Texture { get; init; }
|
||||||
|
|
||||||
|
public void Dispose() => Texture?.Dispose();
|
||||||
|
}
|
||||||
|
}
|
@ -7,6 +7,7 @@ using Dalamud.Game.Text;
|
|||||||
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.Windowing;
|
using Dalamud.Interface.Windowing;
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
@ -18,6 +19,7 @@ namespace ARControl.Windows;
|
|||||||
|
|
||||||
internal sealed class ConfigWindow : Window
|
internal sealed class ConfigWindow : Window
|
||||||
{
|
{
|
||||||
|
// TODO This should also allow retainers under max level
|
||||||
private const byte MaxLevel = 90;
|
private const byte MaxLevel = 90;
|
||||||
|
|
||||||
private static readonly Vector4 ColorGreen = ImGuiColors.HealerGreen;
|
private static readonly Vector4 ColorGreen = ImGuiColors.HealerGreen;
|
||||||
@ -31,6 +33,7 @@ internal sealed class ConfigWindow : Window
|
|||||||
private readonly GameCache _gameCache;
|
private readonly GameCache _gameCache;
|
||||||
private readonly IClientState _clientState;
|
private readonly IClientState _clientState;
|
||||||
private readonly ICommandManager _commandManager;
|
private readonly ICommandManager _commandManager;
|
||||||
|
private readonly IconCache _iconCache;
|
||||||
private readonly IPluginLog _pluginLog;
|
private readonly IPluginLog _pluginLog;
|
||||||
|
|
||||||
private readonly Dictionary<Guid, TemporaryConfig> _currentEditPopups = new();
|
private readonly Dictionary<Guid, TemporaryConfig> _currentEditPopups = new();
|
||||||
@ -51,6 +54,7 @@ internal sealed class ConfigWindow : Window
|
|||||||
GameCache gameCache,
|
GameCache gameCache,
|
||||||
IClientState clientState,
|
IClientState clientState,
|
||||||
ICommandManager commandManager,
|
ICommandManager commandManager,
|
||||||
|
IconCache iconCache,
|
||||||
IPluginLog pluginLog)
|
IPluginLog pluginLog)
|
||||||
: base("ARC###ARControlConfig")
|
: base("ARC###ARControlConfig")
|
||||||
{
|
{
|
||||||
@ -59,6 +63,7 @@ internal sealed class ConfigWindow : Window
|
|||||||
_gameCache = gameCache;
|
_gameCache = gameCache;
|
||||||
_clientState = clientState;
|
_clientState = clientState;
|
||||||
_commandManager = commandManager;
|
_commandManager = commandManager;
|
||||||
|
_iconCache = iconCache;
|
||||||
_pluginLog = pluginLog;
|
_pluginLog = pluginLog;
|
||||||
|
|
||||||
SizeConstraints = new()
|
SizeConstraints = new()
|
||||||
@ -80,7 +85,7 @@ internal sealed class ConfigWindow : Window
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private unsafe void DrawVentureLists()
|
private void DrawVentureLists()
|
||||||
{
|
{
|
||||||
if (ImGui.BeginTabItem("Venture Lists"))
|
if (ImGui.BeginTabItem("Venture Lists"))
|
||||||
{
|
{
|
||||||
@ -102,7 +107,10 @@ internal sealed class ConfigWindow : Window
|
|||||||
DrawVentureListEditorPopup(list, ref listToDelete);
|
DrawVentureListEditorPopup(list, ref listToDelete);
|
||||||
|
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
if (ImGui.CollapsingHeader($"{list.Name} {(list.Type == Configuration.ListType.CollectOneTime ? SeIconChar.BoxedNumber1.ToIconChar() : SeIconChar.Circle.ToIconChar())}"))
|
|
||||||
|
string label = $"{list.Name} {list.GetIcon()}";
|
||||||
|
|
||||||
|
if (ImGui.CollapsingHeader(label))
|
||||||
{
|
{
|
||||||
ImGui.Indent(30);
|
ImGui.Indent(30);
|
||||||
DrawVentureListItemSelection(list);
|
DrawVentureListItemSelection(list);
|
||||||
@ -257,10 +265,10 @@ internal sealed class ConfigWindow : Window
|
|||||||
private void DrawVentureListItemSelection(Configuration.ItemList list)
|
private void DrawVentureListItemSelection(Configuration.ItemList list)
|
||||||
{
|
{
|
||||||
ImGuiEx.SetNextItemFullWidth();
|
ImGuiEx.SetNextItemFullWidth();
|
||||||
if (ImGui.BeginCombo($"##VentureSelection{list.Id}", "Add Item..."))
|
if (ImGui.BeginCombo($"##VentureSelection{list.Id}", "Add Venture...", ImGuiComboFlags.HeightLarge))
|
||||||
{
|
{
|
||||||
ImGuiEx.SetNextItemFullWidth();
|
ImGuiEx.SetNextItemFullWidth();
|
||||||
ImGui.InputTextWithHint("", "Filter...", ref _searchString, 256);
|
ImGui.InputTextWithHint("", "Filter...", ref _searchString, 256, ImGuiInputTextFlags.AutoSelectAll);
|
||||||
|
|
||||||
foreach (var ventures in _gameCache.Ventures
|
foreach (var ventures in _gameCache.Ventures
|
||||||
.Where(x => x.Name.ToLower().Contains(_searchString.ToLower()))
|
.Where(x => x.Name.ToLower().Contains(_searchString.ToLower()))
|
||||||
@ -270,6 +278,14 @@ internal sealed class ConfigWindow : Window
|
|||||||
.GroupBy(x => x.ItemId))
|
.GroupBy(x => x.ItemId))
|
||||||
{
|
{
|
||||||
var venture = ventures.First();
|
var venture = ventures.First();
|
||||||
|
IDalamudTextureWrap? icon = _iconCache.GetIcon(venture.IconId);
|
||||||
|
if (icon != null)
|
||||||
|
{
|
||||||
|
ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23));
|
||||||
|
ImGui.SameLine();
|
||||||
|
ImGui.SetCursorPosY(ImGui.GetCursorPosY() + 3);
|
||||||
|
}
|
||||||
|
|
||||||
if (ImGui.Selectable(
|
if (ImGui.Selectable(
|
||||||
$"{venture.Name} ({string.Join(" ", ventures.Select(x => x.CategoryName))})##SelectVenture{venture.RowId}"))
|
$"{venture.Name} ({string.Join(" ", ventures.Select(x => x.CategoryName))})##SelectVenture{venture.RowId}"))
|
||||||
{
|
{
|
||||||
@ -278,7 +294,6 @@ internal sealed class ConfigWindow : Window
|
|||||||
ItemId = venture.ItemId,
|
ItemId = venture.ItemId,
|
||||||
RemainingQuantity = 0,
|
RemainingQuantity = 0,
|
||||||
});
|
});
|
||||||
_searchString = string.Empty;
|
|
||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -286,7 +301,7 @@ internal sealed class ConfigWindow : Window
|
|||||||
ImGui.EndCombo();
|
ImGui.EndCombo();
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.Separator();
|
ImGui.Spacing();
|
||||||
|
|
||||||
Configuration.QueuedItem? itemToRemove = null;
|
Configuration.QueuedItem? itemToRemove = null;
|
||||||
Configuration.QueuedItem? itemToAdd = null;
|
Configuration.QueuedItem? itemToAdd = null;
|
||||||
@ -299,6 +314,13 @@ internal sealed class ConfigWindow : Window
|
|||||||
var ventures = _gameCache.Ventures.Where(x => x.ItemId == item.ItemId).ToList();
|
var ventures = _gameCache.Ventures.Where(x => x.ItemId == item.ItemId).ToList();
|
||||||
var venture = ventures.First();
|
var venture = ventures.First();
|
||||||
|
|
||||||
|
IDalamudTextureWrap? icon = _iconCache.GetIcon(venture.IconId);
|
||||||
|
if (icon != null)
|
||||||
|
{
|
||||||
|
ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23));
|
||||||
|
ImGui.SameLine(0, 3);
|
||||||
|
}
|
||||||
|
|
||||||
ImGui.SetNextItemWidth(130);
|
ImGui.SetNextItemWidth(130);
|
||||||
int quantity = item.RemainingQuantity;
|
int quantity = item.RemainingQuantity;
|
||||||
if (ImGui.InputInt($"{venture.Name} ({string.Join(" ", ventures.Select(x => x.CategoryName))})",
|
if (ImGui.InputInt($"{venture.Name} ({string.Join(" ", ventures.Select(x => x.CategoryName))})",
|
||||||
@ -349,6 +371,7 @@ internal sealed class ConfigWindow : Window
|
|||||||
|
|
||||||
if (list.Items.Count > 0 && list.Type == Configuration.ListType.CollectOneTime)
|
if (list.Items.Count > 0 && list.Type == Configuration.ListType.CollectOneTime)
|
||||||
{
|
{
|
||||||
|
ImGui.Spacing();
|
||||||
ImGui.BeginDisabled(list.Items.All(x => x.RemainingQuantity > 0));
|
ImGui.BeginDisabled(list.Items.All(x => x.RemainingQuantity > 0));
|
||||||
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Check, "Remove all finished items"))
|
if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Check, "Remove all finished items"))
|
||||||
{
|
{
|
||||||
@ -356,8 +379,8 @@ internal sealed class ConfigWindow : Window
|
|||||||
Save();
|
Save();
|
||||||
}
|
}
|
||||||
ImGui.EndDisabled();
|
ImGui.EndDisabled();
|
||||||
ImGui.Spacing();
|
|
||||||
}
|
}
|
||||||
|
ImGui.Spacing();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawCharacters()
|
private void DrawCharacters()
|
||||||
@ -479,8 +502,14 @@ internal sealed class ConfigWindow : Window
|
|||||||
ImGui.BeginDisabled(retainer.Level < MaxLevel);
|
ImGui.BeginDisabled(retainer.Level < MaxLevel);
|
||||||
|
|
||||||
bool managed = retainer.Managed && retainer.Level == MaxLevel;
|
bool managed = retainer.Managed && retainer.Level == MaxLevel;
|
||||||
ImGui.Text(_gameCache.Jobs[retainer.Job]);
|
|
||||||
ImGui.SameLine();
|
IDalamudTextureWrap? icon = _iconCache.GetIcon(62000 + retainer.Job);
|
||||||
|
if (icon != null)
|
||||||
|
{
|
||||||
|
ImGui.Image(icon.ImGuiHandle, new Vector2(23, 23));
|
||||||
|
ImGui.SameLine();
|
||||||
|
}
|
||||||
|
|
||||||
if (ImGui.Checkbox($"{retainer.Name}###Retainer{retainer.Name}{retainer.DisplayOrder}",
|
if (ImGui.Checkbox($"{retainer.Name}###Retainer{retainer.Name}{retainer.DisplayOrder}",
|
||||||
ref managed))
|
ref managed))
|
||||||
{
|
{
|
||||||
@ -643,7 +672,6 @@ internal sealed class ConfigWindow : Window
|
|||||||
{
|
{
|
||||||
Id = Guid.NewGuid(),
|
Id = Guid.NewGuid(),
|
||||||
Name = _newGroup.Name,
|
Name = _newGroup.Name,
|
||||||
Icon = FontAwesomeIcon.None,
|
|
||||||
ItemListIds = new(),
|
ItemListIds = new(),
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -868,8 +896,8 @@ internal sealed class ConfigWindow : Window
|
|||||||
var list = itemLists[listIndex].List;
|
var list = itemLists[listIndex].List;
|
||||||
ImGui.Indent(30);
|
ImGui.Indent(30);
|
||||||
ImGui.Text(list.Type == Configuration.ListType.CollectOneTime
|
ImGui.Text(list.Type == Configuration.ListType.CollectOneTime
|
||||||
? $"{SeIconChar.BoxedNumber1.ToIconString()} Items on this list will be collected once."
|
? $"{list.GetIcon()} Items on this list will be collected once."
|
||||||
: $"{SeIconChar.Circle.ToIconString()} Items on this list will be kept in stock on each character.");
|
: $"{list.GetIcon()} Items on this list will be kept in stock on each character.");
|
||||||
ImGui.Spacing();
|
ImGui.Spacing();
|
||||||
foreach (var item in list.Items)
|
foreach (var item in list.Items)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user