rich text, updated lightfinder description and bug fixes

This commit is contained in:
2025-10-01 08:59:08 +09:00
parent 76520878bf
commit dea4ef4832
5 changed files with 205 additions and 48 deletions

View File

@@ -1,17 +1,23 @@
using Dalamud.Bindings.ImGui;
using Dalamud.Bindings.ImGui;
using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Game.Text.SeStringHandling.Payloads;
using Dalamud.Interface;
using Dalamud.Interface.ImGuiSeStringRenderer;
using Dalamud.Interface.Utility;
using Lumina.Text;
using System;
using System.Numerics;
using DalamudSeString = Dalamud.Game.Text.SeStringHandling.SeString;
using DalamudSeStringBuilder = Dalamud.Game.Text.SeStringHandling.SeStringBuilder;
using LuminaSeStringBuilder = Lumina.Text.SeStringBuilder;
namespace LightlessSync.Utils;
public static class SeStringUtils
{
public static SeString BuildFormattedPlayerName(string text, Vector4? textColor, Vector4? glowColor)
public static DalamudSeString BuildFormattedPlayerName(string text, Vector4? textColor, Vector4? glowColor)
{
var b = new SeStringBuilder();
var b = new DalamudSeStringBuilder();
if (glowColor is Vector4 glow)
b.Add(new GlowPayload(glow));
@@ -30,14 +36,47 @@ public static class SeStringUtils
return b.Build();
}
public static SeString BuildPlain(string text)
public static DalamudSeString BuildPlain(string text)
{
var b = new SeStringBuilder();
var b = new DalamudSeStringBuilder();
b.AddText(text ?? string.Empty);
return b.Build();
}
public static void RenderSeString(SeString seString, Vector2 position, ImFontPtr? font = null, ImDrawListPtr? drawList = null)
public static DalamudSeString BuildRichText(ReadOnlySpan<RichTextEntry> fragments)
{
var builder = new LuminaSeStringBuilder();
foreach (var fragment in fragments)
{
if (string.IsNullOrEmpty(fragment.Text))
continue;
var hasColor = fragment.Color.HasValue;
Vector4 color = default;
if (hasColor)
{
color = fragment.Color!.Value;
builder.PushColorRgba(color);
}
if (fragment.Bold)
builder.AppendSetBold(true);
builder.Append(fragment.Text.AsSpan());
if (fragment.Bold)
builder.AppendSetBold(false);
if (hasColor)
builder.PopColor();
}
return DalamudSeString.Parse(builder.ToArray());
}
public static DalamudSeString BuildRichText(params RichTextEntry[] fragments) => BuildRichText(fragments.AsSpan());
public static void RenderSeString(DalamudSeString seString, Vector2 position, ImFontPtr? font = null, ImDrawListPtr? drawList = null)
{
drawList ??= ImGui.GetWindowDrawList();
@@ -51,9 +90,36 @@ public static class SeStringUtils
ImGui.SetCursorScreenPos(position);
ImGuiHelpers.SeStringWrapped(seString.Encode(), drawParams);
var textSize = ImGui.CalcTextSize(seString.TextValue);
if (textSize.Y <= 0f)
textSize.Y = ImGui.GetTextLineHeight();
ImGui.Dummy(new Vector2(0f, textSize.Y));
}
public static Vector2 RenderSeStringWithHitbox(SeString seString, Vector2 position, ImFontPtr? font = null)
public static void RenderSeStringWrapped(DalamudSeString seString, float wrapWidth, ImFontPtr? font = null, ImDrawListPtr? drawList = null)
{
drawList ??= ImGui.GetWindowDrawList();
var drawParams = new SeStringDrawParams
{
Font = font ?? ImGui.GetFont(),
Color = ImGui.GetColorU32(ImGuiCol.Text),
WrapWidth = wrapWidth,
TargetDrawList = drawList
};
ImGuiHelpers.SeStringWrapped(seString.Encode(), drawParams);
var calcWrapWidth = wrapWidth > 0f ? wrapWidth : -1f;
var textSize = ImGui.CalcTextSize(seString.TextValue, wrapWidth: calcWrapWidth);
if (textSize.Y <= 0f)
textSize.Y = ImGui.GetTextLineHeight();
ImGui.Dummy(new Vector2(0f, textSize.Y));
}
public static Vector2 RenderSeStringWithHitbox(DalamudSeString seString, Vector2 position, ImFontPtr? font = null)
{
var drawList = ImGui.GetWindowDrawList();
@@ -99,6 +165,8 @@ public static class SeStringUtils
#region Internal Payloads
public readonly record struct RichTextEntry(string Text, Vector4? Color = null, bool Bold = false);
private abstract class AbstractColorPayload : Payload
{
protected byte Red { get; init; }