mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-14 04:34:16 +01:00
118 lines
3.8 KiB
C#
118 lines
3.8 KiB
C#
using System.Runtime.InteropServices;
|
|
|
|
using Dalamud.Game.Text.SeStringHandling;
|
|
using Dalamud.Game.Text.SeStringHandling.Payloads;
|
|
using Dalamud.Interface.ImGuiSeStringRenderer;
|
|
using Dalamud.Interface.Internal.UiDebug2.Utility;
|
|
using Dalamud.Interface.Utility;
|
|
using Dalamud.Interface.Utility.Raii;
|
|
|
|
using FFXIVClientStructs.FFXIV.Client.System.String;
|
|
using FFXIVClientStructs.FFXIV.Component.GUI;
|
|
using ImGuiNET;
|
|
|
|
using static Dalamud.Interface.ColorHelpers;
|
|
using static Dalamud.Interface.Internal.UiDebug2.Utility.Gui;
|
|
using static Dalamud.Utility.Util;
|
|
|
|
namespace Dalamud.Interface.Internal.UiDebug2.Browsing;
|
|
|
|
/// <summary>
|
|
/// A tree for an <see cref="AtkTextNode"/> that can be printed and browsed via ImGui.
|
|
/// </summary>
|
|
internal unsafe partial class TextNodeTree : ResNodeTree
|
|
{
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="TextNodeTree"/> class.
|
|
/// </summary>
|
|
/// <param name="node">The node to create a tree for.</param>
|
|
/// <param name="addonTree">The tree representing the containing addon.</param>
|
|
internal TextNodeTree(AtkResNode* node, AddonTree addonTree)
|
|
: base(node, addonTree)
|
|
{
|
|
}
|
|
|
|
private AtkTextNode* TxtNode => (AtkTextNode*)this.Node;
|
|
|
|
private Utf8String NodeText => this.TxtNode->NodeText;
|
|
|
|
/// <inheritdoc/>
|
|
private protected override void PrintNodeObject() => ShowStruct(this.TxtNode);
|
|
|
|
/// <inheritdoc/>
|
|
private protected override void PrintFieldsForNodeType(bool isEditorOpen = false)
|
|
{
|
|
if (isEditorOpen)
|
|
{
|
|
return;
|
|
}
|
|
|
|
ImGui.TextColored(new(1), "Text:");
|
|
ImGui.SameLine();
|
|
|
|
try
|
|
{
|
|
var style = new SeStringDrawParams
|
|
{
|
|
Color = this.TxtNode->TextColor.RGBA,
|
|
EdgeColor = this.TxtNode->EdgeColor.RGBA,
|
|
ForceEdgeColor = true,
|
|
EdgeStrength = 1f,
|
|
};
|
|
|
|
ImGuiHelpers.SeStringWrapped(this.NodeText.AsSpan(), style);
|
|
}
|
|
catch
|
|
{
|
|
ImGui.TextUnformatted(Marshal.PtrToStringAnsi(new(this.NodeText.StringPtr)) ?? string.Empty);
|
|
}
|
|
|
|
PrintFieldValuePairs(
|
|
("Font", $"{this.TxtNode->FontType}"),
|
|
("Font Size", $"{this.TxtNode->FontSize}"),
|
|
("Alignment", $"{this.TxtNode->AlignmentType}"));
|
|
|
|
PrintColor(this.TxtNode->TextColor, $"Text Color: {SwapEndianness(this.TxtNode->TextColor.RGBA):X8}");
|
|
ImGui.SameLine();
|
|
PrintColor(this.TxtNode->EdgeColor, $"Edge Color: {SwapEndianness(this.TxtNode->EdgeColor.RGBA):X8}");
|
|
|
|
this.PrintPayloads();
|
|
}
|
|
|
|
private void PrintPayloads()
|
|
{
|
|
using var tree = ImRaii.TreeNode($"Text Payloads##{(nint)this.Node:X}");
|
|
|
|
if (tree.Success)
|
|
{
|
|
var utf8String = this.NodeText;
|
|
var seStringBytes = new byte[utf8String.BufUsed];
|
|
for (var i = 0L; i < utf8String.BufUsed; i++)
|
|
{
|
|
seStringBytes[i] = utf8String.StringPtr.Value[i];
|
|
}
|
|
|
|
var seString = SeString.Parse(seStringBytes);
|
|
for (var i = 0; i < seString.Payloads.Count; i++)
|
|
{
|
|
var payload = seString.Payloads[i];
|
|
ImGui.TextUnformatted($"[{i}]");
|
|
ImGui.SameLine();
|
|
switch (payload.Type)
|
|
{
|
|
case PayloadType.RawText when payload is TextPayload tp:
|
|
{
|
|
Gui.PrintFieldValuePair("Raw Text", tp.Text ?? string.Empty);
|
|
break;
|
|
}
|
|
|
|
default:
|
|
{
|
|
ImGui.TextUnformatted(payload.ToString());
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|