Rework FateTableWidget (#1988)

* Rework FateTableWidget

* Maybe better FateTable column order

* Add Icon, MapIcon and Radius column
This commit is contained in:
Haselnussbomber 2024-08-01 19:32:12 +02:00 committed by GitHub
parent a5fa109afa
commit 731c0b7c6d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -1,4 +1,7 @@
using Dalamud.Game.ClientState.Fates;
using Dalamud.Game.ClientState.Fates;
using Dalamud.Interface.Textures.Internal;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using ImGuiNET;
@ -9,8 +12,6 @@ namespace Dalamud.Interface.Internal.Windows.Data.Widgets;
/// </summary>
internal class FateTableWidget : IDataWindowWidget
{
private bool resolveGameData;
/// <inheritdoc/>
public string[]? CommandShortcuts { get; init; } = { "fate", "fatetable" };
@ -29,44 +30,154 @@ internal class FateTableWidget : IDataWindowWidget
/// <inheritdoc/>
public void Draw()
{
ImGui.Checkbox("Resolve GameData", ref this.resolveGameData);
var fateTable = Service<FateTable>.Get();
var textureManager = Service<TextureManager>.Get();
var stateString = string.Empty;
if (fateTable.Length == 0)
{
ImGui.TextUnformatted("No fates or data not ready.");
return;
}
else
using var table = ImRaii.Table("FateTable", 13, ImGuiTableFlags.ScrollY | ImGuiTableFlags.RowBg | ImGuiTableFlags.Borders | ImGuiTableFlags.NoSavedSettings);
if (!table) return;
ImGui.TableSetupColumn("Index", ImGuiTableColumnFlags.WidthFixed, 40);
ImGui.TableSetupColumn("Address", ImGuiTableColumnFlags.WidthFixed, 120);
ImGui.TableSetupColumn("FateId", ImGuiTableColumnFlags.WidthFixed, 40);
ImGui.TableSetupColumn("State", ImGuiTableColumnFlags.WidthFixed, 80);
ImGui.TableSetupColumn("Level", ImGuiTableColumnFlags.WidthFixed, 50);
ImGui.TableSetupColumn("Icon", ImGuiTableColumnFlags.WidthFixed, 30);
ImGui.TableSetupColumn("MapIcon", ImGuiTableColumnFlags.WidthFixed, 30);
ImGui.TableSetupColumn("Name", ImGuiTableColumnFlags.WidthStretch);
ImGui.TableSetupColumn("Progress", ImGuiTableColumnFlags.WidthFixed, 55);
ImGui.TableSetupColumn("Duration", ImGuiTableColumnFlags.WidthFixed, 80);
ImGui.TableSetupColumn("Bonus", ImGuiTableColumnFlags.WidthFixed, 40);
ImGui.TableSetupColumn("Position", ImGuiTableColumnFlags.WidthFixed, 240);
ImGui.TableSetupColumn("Radius", ImGuiTableColumnFlags.WidthFixed, 40);
ImGui.TableSetupScrollFreeze(7, 1);
ImGui.TableHeadersRow();
for (var i = 0; i < fateTable.Length; i++)
{
stateString += $"FateTableLen: {fateTable.Length}\n";
var fate = fateTable[i];
if (fate == null)
continue;
ImGui.TextUnformatted(stateString);
ImGui.TableNextRow();
ImGui.TableNextColumn(); // Index
ImGui.TextUnformatted($"#{i}");
for (var i = 0; i < fateTable.Length; i++)
ImGui.TableNextColumn(); // Address
DrawCopyableText($"0x{fate.Address:X}", "Click to copy Address");
ImGui.TableNextColumn(); // FateId
DrawCopyableText(fate.FateId.ToString(), "Click to copy FateId (RowId of Fate sheet)");
ImGui.TableNextColumn(); // State
ImGui.TextUnformatted(fate.State.ToString());
ImGui.TableNextColumn(); // Level
if (fate.Level == fate.MaxLevel)
{
var fate = fateTable[i];
if (fate == null)
continue;
ImGui.TextUnformatted($"{fate.Level}");
}
else
{
ImGui.TextUnformatted($"{fate.Level}-{fate.MaxLevel}");
}
var fateString = $"{fate.Address.ToInt64():X}:[{i}]" +
$" - Lv.{fate.Level} {fate.Name} ({fate.Progress}%)" +
$" - X{fate.Position.X} Y{fate.Position.Y} Z{fate.Position.Z}" +
$" - Territory {(this.resolveGameData ? (fate.TerritoryType.GameData?.Name ?? fate.TerritoryType.Id.ToString()) : fate.TerritoryType.Id.ToString())}\n";
ImGui.TableNextColumn(); // Icon
fateString += $" StartTimeEpoch: {fate.StartTimeEpoch}" +
$" - Duration: {fate.Duration}" +
$" - State: {fate.State}" +
$" - GameData name: {(this.resolveGameData ? (fate.GameData.Name ?? fate.FateId.ToString()) : fate.FateId.ToString())}";
ImGui.TextUnformatted(fateString);
ImGui.SameLine();
if (ImGui.Button($"C##{fate.Address.ToInt64():X}"))
if (fate.IconId != 0)
{
if (textureManager.Shared.GetFromGameIcon(fate.IconId).TryGetWrap(out var texture, out _))
{
ImGui.SetClipboardText(fate.Address.ToString("X"));
ImGui.Image(texture.ImGuiHandle, new(ImGui.GetTextLineHeight()));
if (ImGui.IsItemHovered())
{
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
ImGui.BeginTooltip();
ImGui.TextUnformatted("Click to copy IconId");
ImGui.TextUnformatted($"ID: {fate.IconId} Size: {texture.Width}x{texture.Height}");
ImGui.Image(texture.ImGuiHandle, new(texture.Width, texture.Height));
ImGui.EndTooltip();
}
if (ImGui.IsItemClicked())
{
ImGui.SetClipboardText(fate.IconId.ToString());
}
}
}
ImGui.TableNextColumn(); // MapIconId
if (fate.MapIconId != 0)
{
if (textureManager.Shared.GetFromGameIcon(fate.MapIconId).TryGetWrap(out var texture, out _))
{
ImGui.Image(texture.ImGuiHandle, new(ImGui.GetTextLineHeight()));
if (ImGui.IsItemHovered())
{
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
ImGui.BeginTooltip();
ImGui.TextUnformatted("Click to copy MapIconId");
ImGui.TextUnformatted($"ID: {fate.MapIconId} Size: {texture.Width}x{texture.Height}");
ImGui.Image(texture.ImGuiHandle, new(texture.Width, texture.Height));
ImGui.EndTooltip();
}
if (ImGui.IsItemClicked())
{
ImGui.SetClipboardText(fate.MapIconId.ToString());
}
}
}
ImGui.TableNextColumn(); // Name
DrawCopyableText(fate.Name.ToString(), "Click to copy Name");
ImGui.TableNextColumn(); // Progress
ImGui.TextUnformatted($"{fate.Progress}%");
ImGui.TableNextColumn(); // TimeRemaining
if (fate.State == FateState.Running)
{
ImGui.TextUnformatted($"{TimeSpan.FromSeconds(fate.TimeRemaining):mm\\:ss} / {TimeSpan.FromSeconds(fate.Duration):mm\\:ss}");
}
ImGui.TableNextColumn(); // HasExpBonus
ImGui.TextUnformatted(fate.HasExpBonus.ToString());
ImGui.TableNextColumn(); // Position
DrawCopyableText(fate.Position.ToString(), "Click to copy Position");
ImGui.TableNextColumn(); // Radius
DrawCopyableText(fate.Radius.ToString(), "Click to copy Radius");
}
}
private static void DrawCopyableText(string text, string tooltipText)
{
ImGuiHelpers.SafeTextWrapped(text);
if (ImGui.IsItemHovered())
{
ImGui.SetMouseCursor(ImGuiMouseCursor.Hand);
ImGui.BeginTooltip();
ImGui.TextUnformatted(tooltipText);
ImGui.EndTooltip();
}
if (ImGui.IsItemClicked())
{
ImGui.SetClipboardText(text);
}
}
}