Merge pull request #2563 from Infiziert90/ImRaii-Widgets

Apply ImRaii to Widgets Part 1
This commit is contained in:
goat 2026-01-11 00:45:19 +01:00 committed by GitHub
commit f3694a41ff
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 174 additions and 228 deletions

View file

@ -5,9 +5,11 @@ using System.Threading.Tasks;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Components;
using Dalamud.Interface.ImGuiSeStringRenderer;
using Dalamud.Interface.Textures.Internal;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Internal;
using Dalamud.Interface.Utility.Raii;
using Lumina.Text.ReadOnly;
@ -18,13 +20,15 @@ namespace Dalamud.Interface.Internal.Windows.Data.Widgets;
/// </summary>
internal class FontAwesomeTestWidget : IDataWindowWidget
{
private static readonly string[] First = ["(Show All)", "(Undefined)"];
private List<FontAwesomeIcon>? icons;
private List<string>? iconNames;
private string[]? iconCategories;
private int selectedIconCategory;
private string iconSearchInput = string.Empty;
private bool iconSearchChanged = true;
private bool useFixedWidth = false;
private bool useFixedWidth;
/// <inheritdoc/>
public string[]? CommandShortcuts { get; init; } = ["fa", "fatest", "fontawesome"];
@ -44,11 +48,9 @@ internal class FontAwesomeTestWidget : IDataWindowWidget
/// <inheritdoc/>
public void Draw()
{
ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, Vector2.Zero);
using var pushedStyle = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero);
this.iconCategories ??= new[] { "(Show All)", "(Undefined)" }
.Concat(FontAwesomeHelpers.GetCategories().Skip(1))
.ToArray();
this.iconCategories ??= First.Concat(FontAwesomeHelpers.GetCategories().Skip(1)).ToArray();
if (this.iconSearchChanged)
{
@ -101,7 +103,8 @@ internal class FontAwesomeTestWidget : IDataWindowWidget
ImGuiHelpers.ScaledRelativeSameLine(50f);
ImGui.Text($"{this.iconNames?[i]}");
ImGuiHelpers.ScaledRelativeSameLine(280f);
ImGui.PushFont(this.useFixedWidth ? InterfaceManager.IconFontFixedWidth : InterfaceManager.IconFont);
using var pushedFont = ImRaii.PushFont(this.useFixedWidth ? InterfaceManager.IconFontFixedWidth : InterfaceManager.IconFont);
ImGui.Text(this.icons[i].ToIconString());
ImGuiHelpers.ScaledRelativeSameLine(320f);
if (this.useFixedWidth
@ -114,13 +117,10 @@ internal class FontAwesomeTestWidget : IDataWindowWidget
Task.FromResult(
Service<TextureManager>.Get().CreateTextureFromSeString(
ReadOnlySeString.FromText(this.icons[i].ToIconString()),
new() { Font = ImGui.GetFont(), FontSize = ImGui.GetFontSize(), ScreenOffset = Vector2.Zero })));
new SeStringDrawParams { Font = ImGui.GetFont(), FontSize = ImGui.GetFontSize(), ScreenOffset = Vector2.Zero })));
}
ImGui.PopFont();
ImGuiHelpers.ScaledDummy(2f);
}
ImGui.PopStyleVar();
}
}

View file

@ -11,6 +11,7 @@ using Dalamud.Interface.ImGuiSeStringRenderer.Internal;
using Dalamud.Interface.Textures.Internal;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Internal;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Storage.Assets;
using Dalamud.Utility;
@ -29,7 +30,7 @@ namespace Dalamud.Interface.Internal.Windows.Data.Widgets;
/// </summary>
internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
{
private static readonly string[] ThemeNames = ["Dark", "Light", "Classic FF", "Clear Blue"];
private static readonly string[] ThemeNames = ["Dark", "Light", "Classic FF", "Clear Blue", "Clear White", "Clear Green"];
private ImVectorWrapper<byte> testStringBuffer;
private string testString = string.Empty;
private ReadOnlySeString? logkind;
@ -119,9 +120,11 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
ImGui.SameLine();
var t4 = this.style.ThemeIndex ?? AtkStage.Instance()->AtkUIColorHolder->ActiveColorThemeType;
ImGui.PushItemWidth(ImGui.CalcTextSize("WWWWWWWWWWWWWW"u8).X);
if (ImGui.Combo("##theme", ref t4, ThemeNames))
this.style.ThemeIndex = t4;
using (ImRaii.ItemWidth(ImGui.CalcTextSize("WWWWWWWWWWWWWW"u8).X))
{
if (ImGui.Combo("##theme", ref t4, ThemeNames))
this.style.ThemeIndex = t4;
}
ImGui.SameLine();
t = this.style.LinkUnderlineThickness > 0f;
@ -192,22 +195,19 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
dl.PushClipRect(clipMin, clipMax);
ImGuiHelpers.CompileSeStringWrapped(
"<icon(1)>Test test<icon(1)>",
new SeStringDrawParams
{ Color = 0xFFFFFFFF, WrapWidth = float.MaxValue, TargetDrawList = dl });
new SeStringDrawParams { Color = 0xFFFFFFFF, WrapWidth = float.MaxValue, TargetDrawList = dl });
dl.PopClipRect();
}
if (ImGui.CollapsingHeader("Addon Table"u8))
{
if (ImGui.BeginTable("Addon Sheet"u8, 3))
using var table = ImRaii.Table("Addon Sheet"u8, 3);
if (table.Success)
{
ImGui.TableSetupScrollFreeze(0, 1);
ImGui.TableSetupColumn("Row ID"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("0000000"u8).X);
ImGui.TableSetupColumn("Text"u8, ImGuiTableColumnFlags.WidthStretch);
ImGui.TableSetupColumn(
"Misc"u8,
ImGuiTableColumnFlags.WidthFixed,
ImGui.CalcTextSize("AAAAAAAAAAAAAAAAA"u8).X);
ImGui.TableSetupColumn("Misc"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("AAAAAAAAAAAAAAAAA"u8).X);
ImGui.TableHeadersRow();
var addon = Service<DataManager>.GetNullable()?.GetExcelSheet<Addon>() ??
@ -222,7 +222,7 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
var row = addon.GetRowAt(i);
ImGui.TableNextRow();
ImGui.PushID(i);
using var pushedId = ImRaii.PushId(i);
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
@ -234,14 +234,11 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
ImGui.TableNextColumn();
if (ImGui.Button("Print to Chat"u8))
Service<ChatGui>.Get().Print(row.Text.ToDalamudString());
ImGui.PopID();
Service<ChatGui>.Get().Print(row.Text);
}
}
clipper.Destroy();
ImGui.EndTable();
}
}
@ -258,9 +255,7 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
if (ImGui.Button("Print to Chat Log"u8))
{
Service<ChatGui>.Get().Print(
Game.Text.SeStringHandling.SeString.Parse(
Service<SeStringRenderer>.Get().CompileAndCache(this.testString).Data.Span));
Service<ChatGui>.Get().Print(Service<SeStringRenderer>.Get().CompileAndCache(this.testString));
}
ImGui.SameLine();
@ -315,6 +310,7 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
var len = this.testStringBuffer.StorageSpan.IndexOf((byte)0);
if (len + 4 >= this.testStringBuffer.Capacity)
this.testStringBuffer.EnsureCapacityExponential(len + 4);
if (len < this.testStringBuffer.Capacity)
{
this.testStringBuffer.LengthUnsafe = len;

View file

@ -266,8 +266,7 @@ internal class TaskSchedulerWidget : IDataWindowWidget
ImGui.Text($"{this.downloadState.Downloaded:##,###}/{this.downloadState.Total:##,###} ({this.downloadState.Percentage:0.00}%)");
using var disabled =
ImRaii.Disabled(this.downloadTask?.IsCompleted is false || this.localPath[0] == 0);
using var disabled = ImRaii.Disabled(this.downloadTask?.IsCompleted is false || this.localPath[0] == 0);
ImGui.AlignTextToFramePadding();
ImGui.Text("Download"u8);
ImGui.SameLine();
@ -388,27 +387,19 @@ internal class TaskSchedulerWidget : IDataWindowWidget
if (task.Task == null)
subTime = task.FinishTime;
switch (task.Status)
using var pushedColor = task.Status switch
{
case TaskStatus.Created:
case TaskStatus.WaitingForActivation:
case TaskStatus.WaitingToRun:
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.DalamudGrey);
break;
case TaskStatus.Running:
case TaskStatus.WaitingForChildrenToComplete:
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.ParsedBlue);
break;
case TaskStatus.RanToCompletion:
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.ParsedGreen);
break;
case TaskStatus.Canceled:
case TaskStatus.Faulted:
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.DalamudRed);
break;
default:
throw new ArgumentOutOfRangeException();
}
TaskStatus.Created or TaskStatus.WaitingForActivation or TaskStatus.WaitingToRun
=> ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.DalamudGrey),
TaskStatus.Running or TaskStatus.WaitingForChildrenToComplete
=> ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.ParsedBlue),
TaskStatus.RanToCompletion
=> ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.ParsedGreen),
TaskStatus.Canceled or TaskStatus.Faulted
=> ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.DalamudRed),
_ => throw new ArgumentOutOfRangeException(),
};
if (ImGui.CollapsingHeader($"#{task.Id} - {task.Status} {(subTime - task.StartTime).TotalMilliseconds}ms###task{i}"))
{
@ -418,8 +409,7 @@ internal class TaskSchedulerWidget : IDataWindowWidget
{
try
{
var cancelFunc =
typeof(Task).GetMethod("InternalCancel", BindingFlags.NonPublic | BindingFlags.Instance);
var cancelFunc = typeof(Task).GetMethod("InternalCancel", BindingFlags.NonPublic | BindingFlags.Instance);
cancelFunc?.Invoke(task, null);
}
catch (Exception ex)
@ -430,7 +420,7 @@ internal class TaskSchedulerWidget : IDataWindowWidget
ImGuiHelpers.ScaledDummy(10);
ImGui.Text(task.StackTrace?.ToString());
ImGui.Text(task.StackTrace?.ToString() ?? "Null StackTrace");
if (task.Exception != null)
{
@ -443,8 +433,6 @@ internal class TaskSchedulerWidget : IDataWindowWidget
{
task.IsBeingViewed = false;
}
ImGui.PopStyleColor(1);
}
this.fileDialogManager.Draw();

View file

@ -14,6 +14,7 @@ using Dalamud.Interface.Textures.Internal.SharedImmediateTextures;
using Dalamud.Interface.Textures.TextureWraps;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Internal;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin.Services;
using Dalamud.Storage.Assets;
using Dalamud.Utility;
@ -29,6 +30,10 @@ namespace Dalamud.Interface.Internal.Windows.Data.Widgets;
/// </summary>
internal class TexWidget : IDataWindowWidget
{
private const ImGuiTableFlags TableFlags = ImGuiTableFlags.Sortable | ImGuiTableFlags.SortTristate | ImGuiTableFlags.SortMulti |
ImGuiTableFlags.Reorderable | ImGuiTableFlags.Resizable | ImGuiTableFlags.NoBordersInBodyUntilResize |
ImGuiTableFlags.NoSavedSettings;
// TODO: move tracking implementation to PluginStats where applicable,
// and show stats over there instead of TexWidget.
private static readonly Dictionary<
@ -49,7 +54,7 @@ internal class TexWidget : IDataWindowWidget
private string allLoadedTexturesTableName = "##table";
private string iconId = "18";
private bool hiRes = true;
private bool hq = false;
private bool hq;
private string inputTexPath = string.Empty;
private string inputFilePath = string.Empty;
private Assembly[]? inputManifestResourceAssemblyCandidates;
@ -140,46 +145,40 @@ internal class TexWidget : IDataWindowWidget
lock (this.textureManager.BlameTracker)
{
using var pushedId = ImRaii.PushId("blames"u8);
var allBlames = this.textureManager.BlameTracker;
ImGui.PushID("blames"u8);
var sizeSum = allBlames.Sum(static x => Math.Max(0, x.RawSpecs.EstimatedBytes));
if (ImGui.CollapsingHeader(
$"All Loaded Textures: {allBlames.Count:n0} ({Util.FormatBytes(sizeSum)})###header"))
if (ImGui.CollapsingHeader($"All Loaded Textures: {allBlames.Count:n0} ({Util.FormatBytes(sizeSum)})###header"))
this.DrawBlame(allBlames);
ImGui.PopID();
}
ImGui.PushID("loadedGameTextures"u8);
if (ImGui.CollapsingHeader(
$"Loaded Game Textures: {this.textureManager.Shared.ForDebugGamePathTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugGamePathTextures);
ImGui.PopID();
using (ImRaii.PushId("loadedGameTextures"u8))
{
if (ImGui.CollapsingHeader($"Loaded Game Textures: {this.textureManager.Shared.ForDebugGamePathTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugGamePathTextures);
}
ImGui.PushID("loadedFileTextures"u8);
if (ImGui.CollapsingHeader(
$"Loaded File Textures: {this.textureManager.Shared.ForDebugFileSystemTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugFileSystemTextures);
ImGui.PopID();
using (ImRaii.PushId("loadedFileTextures"u8))
{
if (ImGui.CollapsingHeader($"Loaded File Textures: {this.textureManager.Shared.ForDebugFileSystemTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugFileSystemTextures);
}
ImGui.PushID("loadedManifestResourceTextures"u8);
if (ImGui.CollapsingHeader(
$"Loaded Manifest Resource Textures: {this.textureManager.Shared.ForDebugManifestResourceTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugManifestResourceTextures);
ImGui.PopID();
using (ImRaii.PushId("loadedManifestResourceTextures"u8))
{
if (ImGui.CollapsingHeader($"Loaded Manifest Resource Textures: {this.textureManager.Shared.ForDebugManifestResourceTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugManifestResourceTextures);
}
lock (this.textureManager.Shared.ForDebugInvalidatedTextures)
{
ImGui.PushID("invalidatedTextures"u8);
if (ImGui.CollapsingHeader(
$"Invalidated: {this.textureManager.Shared.ForDebugInvalidatedTextures.Count:n0}###header"))
{
using var pushedId = ImRaii.PushId("invalidatedTextures"u8);
if (ImGui.CollapsingHeader($"Invalidated: {this.textureManager.Shared.ForDebugInvalidatedTextures.Count:n0}###header"))
this.DrawLoadedTextures(this.textureManager.Shared.ForDebugInvalidatedTextures);
}
ImGui.PopID();
}
ImGui.Dummy(new(ImGui.GetTextLineHeightWithSpacing()));
var textHeightSpacing = new Vector2(ImGui.GetTextLineHeightWithSpacing());
ImGui.Dummy(textHeightSpacing);
if (!this.textureManager.HasClipboardImage())
{
@ -192,59 +191,53 @@ internal class TexWidget : IDataWindowWidget
if (ImGui.CollapsingHeader(nameof(ITextureProvider.GetFromGameIcon)))
{
ImGui.PushID(nameof(this.DrawGetFromGameIcon));
using var pushedId = ImRaii.PushId(nameof(this.DrawGetFromGameIcon));
this.DrawGetFromGameIcon();
ImGui.PopID();
}
if (ImGui.CollapsingHeader(nameof(ITextureProvider.GetFromGame)))
{
ImGui.PushID(nameof(this.DrawGetFromGame));
using var pushedId = ImRaii.PushId(nameof(this.DrawGetFromGame));
this.DrawGetFromGame();
ImGui.PopID();
}
if (ImGui.CollapsingHeader(nameof(ITextureProvider.GetFromFile)))
{
ImGui.PushID(nameof(this.DrawGetFromFile));
using var pushedId = ImRaii.PushId(nameof(this.DrawGetFromFile));
this.DrawGetFromFile();
ImGui.PopID();
}
if (ImGui.CollapsingHeader(nameof(ITextureProvider.GetFromManifestResource)))
{
ImGui.PushID(nameof(this.DrawGetFromManifestResource));
using var pushedId = ImRaii.PushId(nameof(this.DrawGetFromManifestResource));
this.DrawGetFromManifestResource();
ImGui.PopID();
}
if (ImGui.CollapsingHeader(nameof(ITextureProvider.CreateFromImGuiViewportAsync)))
{
ImGui.PushID(nameof(this.DrawCreateFromImGuiViewportAsync));
using var pushedId = ImRaii.PushId(nameof(this.DrawCreateFromImGuiViewportAsync));
this.DrawCreateFromImGuiViewportAsync();
ImGui.PopID();
}
if (ImGui.CollapsingHeader("UV"u8))
{
ImGui.PushID(nameof(this.DrawUvInput));
using var pushedId = ImRaii.PushId(nameof(this.DrawUvInput));
this.DrawUvInput();
ImGui.PopID();
}
if (ImGui.CollapsingHeader($"CropCopy##{nameof(this.DrawExistingTextureModificationArgs)}"))
{
ImGui.PushID(nameof(this.DrawExistingTextureModificationArgs));
using var pushedId = ImRaii.PushId(nameof(this.DrawExistingTextureModificationArgs));
this.DrawExistingTextureModificationArgs();
ImGui.PopID();
}
ImGui.Dummy(new(ImGui.GetTextLineHeightWithSpacing()));
ImGui.Dummy(textHeightSpacing);
Action? runLater = null;
foreach (var t in this.addedTextures)
{
ImGui.PushID(t.Id);
using var pushedId = ImRaii.PushId(t.Id);
if (ImGui.CollapsingHeader($"Tex #{t.Id} {t}###header", ImGuiTreeNodeFlags.DefaultOpen))
{
if (ImGui.Button("X"u8))
@ -336,8 +329,6 @@ internal class TexWidget : IDataWindowWidget
ImGui.Text(e.ToString());
}
}
ImGui.PopID();
}
runLater?.Invoke();
@ -357,18 +348,16 @@ internal class TexWidget : IDataWindowWidget
if (ImGui.Button("Reset Columns"u8))
this.allLoadedTexturesTableName = "##table" + Environment.TickCount64;
if (!ImGui.BeginTable(
this.allLoadedTexturesTableName,
(int)DrawBlameTableColumnUserId.ColumnCount,
ImGuiTableFlags.Sortable | ImGuiTableFlags.SortTristate | ImGuiTableFlags.SortMulti |
ImGuiTableFlags.Reorderable | ImGuiTableFlags.Resizable | ImGuiTableFlags.NoBordersInBodyUntilResize |
ImGuiTableFlags.NoSavedSettings))
using var table = ImRaii.Table(this.allLoadedTexturesTableName, (int)DrawBlameTableColumnUserId.ColumnCount, TableFlags);
if (!table.Success)
return;
const int numIcons = 1;
float iconWidths;
using (im.IconFontHandle?.Push())
{
iconWidths = ImGui.CalcTextSize(FontAwesomeIcon.Save.ToIconString()).X;
}
ImGui.TableSetupScrollFreeze(0, 1);
ImGui.TableSetupColumn(
@ -463,7 +452,8 @@ internal class TexWidget : IDataWindowWidget
{
var wrap = allBlames[i];
ImGui.TableNextRow();
ImGui.PushID(i);
using var pushedId = ImRaii.PushId(i);
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
@ -480,9 +470,8 @@ internal class TexWidget : IDataWindowWidget
if (ImGui.IsItemHovered())
{
ImGui.BeginTooltip();
using var tooltip = ImRaii.Tooltip();
ImGui.Image(wrap.Handle, wrap.Size);
ImGui.EndTooltip();
}
ImGui.TableNextColumn();
@ -504,21 +493,19 @@ internal class TexWidget : IDataWindowWidget
ImGui.TableNextColumn();
lock (wrap.OwnerPlugins)
this.TextColumnCopiable(string.Join(", ", wrap.OwnerPlugins.Select(static x => x.Name)), false, true);
ImGui.PopID();
}
}
clipper.Destroy();
ImGui.EndTable();
ImGuiHelpers.ScaledDummy(10);
}
private unsafe void DrawLoadedTextures(ICollection<SharedImmediateTexture> textures)
private void DrawLoadedTextures(ICollection<SharedImmediateTexture> textures)
{
var im = Service<InterfaceManager>.Get();
if (!ImGui.BeginTable("##table"u8, 6))
using var table = ImRaii.Table("##table"u8, 6);
if (!table.Success)
return;
const int numIcons = 4;
@ -576,7 +563,7 @@ internal class TexWidget : IDataWindowWidget
}
var remain = texture.SelfReferenceExpiresInForDebug;
ImGui.PushID(row);
using var pushedId = ImRaii.PushId(row);
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
@ -603,28 +590,26 @@ internal class TexWidget : IDataWindowWidget
if (ImGui.IsItemHovered() && texture.GetWrapOrDefault(null) is { } immediate)
{
ImGui.BeginTooltip();
using var tooltip = ImRaii.Tooltip();
ImGui.Image(immediate.Handle, immediate.Size);
ImGui.EndTooltip();
}
ImGui.SameLine();
if (ImGuiComponents.IconButton(FontAwesomeIcon.Sync))
this.textureManager.InvalidatePaths([texture.SourcePathForDebug]);
if (ImGui.IsItemHovered())
ImGui.SetTooltip($"Call {nameof(ITextureSubstitutionProvider.InvalidatePaths)}.");
ImGui.SameLine();
if (remain <= 0)
ImGui.BeginDisabled();
if (ImGuiComponents.IconButton(FontAwesomeIcon.Trash))
texture.ReleaseSelfReference(true);
if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled))
ImGui.SetTooltip("Release self-reference immediately."u8);
if (remain <= 0)
ImGui.EndDisabled();
using (ImRaii.Disabled(remain <= 0))
{
if (ImGuiComponents.IconButton(FontAwesomeIcon.Trash))
texture.ReleaseSelfReference(true);
ImGui.PopID();
if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled))
ImGui.SetTooltip("Release self-reference immediately."u8);
}
}
if (!valid)
@ -633,7 +618,6 @@ internal class TexWidget : IDataWindowWidget
}
clipper.Destroy();
ImGui.EndTable();
ImGuiHelpers.ScaledDummy(10);
}
@ -752,10 +736,7 @@ internal class TexWidget : IDataWindowWidget
{
ImGui.SameLine();
if (ImGui.Button("Load File (Async)"u8))
{
this.addedTextures.Add(
new(Api10: this.textureManager.Shared.GetFromManifestResource(assembly, name).RentAsync()));
}
this.addedTextures.Add(new(Api10: this.textureManager.Shared.GetFromManifestResource(assembly, name).RentAsync()));
ImGui.SameLine();
if (ImGui.Button("Load File (Immediate)"u8))
@ -768,21 +749,20 @@ internal class TexWidget : IDataWindowWidget
private void DrawCreateFromImGuiViewportAsync()
{
var viewports = ImGui.GetPlatformIO().Viewports;
if (ImGui.BeginCombo(
nameof(this.viewportTextureArgs.ViewportId),
$"{this.viewportIndexInt}. {viewports[this.viewportIndexInt].ID:X08}"))
using (var combo = ImRaii.Combo(nameof(this.viewportTextureArgs.ViewportId), $"{this.viewportIndexInt}. {viewports[this.viewportIndexInt].ID:X08}"))
{
for (var i = 0; i < viewports.Size; i++)
if (combo.Success)
{
var sel = this.viewportIndexInt == i;
if (ImGui.Selectable($"#{i}: {viewports[i].ID:X08}", ref sel))
for (var i = 0; i < viewports.Size; i++)
{
this.viewportIndexInt = i;
ImGui.SetItemDefaultFocus();
var sel = this.viewportIndexInt == i;
if (ImGui.Selectable($"#{i}: {viewports[i].ID:X08}", ref sel))
{
this.viewportIndexInt = i;
ImGui.SetItemDefaultFocus();
}
}
}
ImGui.EndCombo();
}
var b = this.viewportTextureArgs.KeepTransparency;
@ -844,17 +824,12 @@ internal class TexWidget : IDataWindowWidget
}
this.supportedRenderTargetFormatNames ??= this.supportedRenderTargetFormats.Select(Enum.GetName).ToArray();
ImGui.Combo(
nameof(this.textureModificationArgs.DxgiFormat),
ref this.renderTargetChoiceInt,
this.supportedRenderTargetFormatNames);
ImGui.Combo(nameof(this.textureModificationArgs.DxgiFormat), ref this.renderTargetChoiceInt, this.supportedRenderTargetFormatNames);
Span<int> wh = stackalloc int[2];
wh[0] = this.textureModificationArgs.NewWidth;
wh[1] = this.textureModificationArgs.NewHeight;
if (ImGui.InputInt(
$"{nameof(this.textureModificationArgs.NewWidth)}/{nameof(this.textureModificationArgs.NewHeight)}",
wh))
if (ImGui.InputInt($"{nameof(this.textureModificationArgs.NewWidth)}/{nameof(this.textureModificationArgs.NewHeight)}", wh))
{
this.textureModificationArgs.NewWidth = wh[0];
this.textureModificationArgs.NewHeight = wh[1];

View file

@ -3,6 +3,7 @@ using System.Numerics;
using System.Text;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Data;
using Dalamud.Interface.ImGuiNotification;
using Dalamud.Interface.ImGuiNotification.Internal;
@ -33,7 +34,7 @@ internal class UiColorWidget : IDataWindowWidget
}
/// <inheritdoc/>
public unsafe void Draw()
public void Draw()
{
var colors = Service<DataManager>.GetNullable()?.GetExcelSheet<UIColor>()
?? throw new InvalidOperationException("UIColor sheet not loaded.");
@ -45,7 +46,9 @@ internal class UiColorWidget : IDataWindowWidget
"<edgecolor(0xEEEEFF)><color(0x0000FF)>BB<color(stackcolor)><edgecolor(stackcolor)>.<br>" +
"· Click on a color to copy the color code.<br>" +
"· Hover on a color to preview the text with edge, when the next color has been used together.");
if (!ImGui.BeginTable("UIColor"u8, 7))
using var table = ImRaii.Table("UIColor"u8, 7);
if (!table.Success)
return;
ImGui.TableSetupScrollFreeze(0, 1);
@ -94,61 +97,61 @@ internal class UiColorWidget : IDataWindowWidget
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.PushID($"row{id}_dark");
if (this.DrawColorColumn(row.Dark) &&
adjacentRow.HasValue)
DrawEdgePreview(id, row.Dark, adjacentRow.Value.Dark);
ImGui.PopID();
using (ImRaii.PushId($"row{id}_dark"))
{
if (this.DrawColorColumn(row.Dark) && adjacentRow.HasValue)
DrawEdgePreview(id, row.Dark, adjacentRow.Value.Dark);
}
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.PushID($"row{id}_light");
if (this.DrawColorColumn(row.Light) &&
adjacentRow.HasValue)
DrawEdgePreview(id, row.Light, adjacentRow.Value.Light);
ImGui.PopID();
using (ImRaii.PushId($"row{id}_light"))
{
if (this.DrawColorColumn(row.Light) && adjacentRow.HasValue)
DrawEdgePreview(id, row.Light, adjacentRow.Value.Light);
}
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.PushID($"row{id}_classic");
if (this.DrawColorColumn(row.ClassicFF) &&
adjacentRow.HasValue)
DrawEdgePreview(id, row.ClassicFF, adjacentRow.Value.ClassicFF);
ImGui.PopID();
using (ImRaii.PushId($"row{id}_classic"))
{
if (this.DrawColorColumn(row.ClassicFF) && adjacentRow.HasValue)
DrawEdgePreview(id, row.ClassicFF, adjacentRow.Value.ClassicFF);
}
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.PushID($"row{id}_blue");
if (this.DrawColorColumn(row.ClearBlue) &&
adjacentRow.HasValue)
DrawEdgePreview(id, row.ClearBlue, adjacentRow.Value.ClearBlue);
ImGui.PopID();
using (ImRaii.PushId($"row{id}_blue"))
{
if (this.DrawColorColumn(row.ClearBlue) && adjacentRow.HasValue)
DrawEdgePreview(id, row.ClearBlue, adjacentRow.Value.ClearBlue);
}
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.PushID($"row{id}_white");
if (this.DrawColorColumn(row.ClearWhite) &&
adjacentRow.HasValue)
DrawEdgePreview(id, row.ClearWhite, adjacentRow.Value.ClearWhite);
ImGui.PopID();
using (ImRaii.PushId($"row{id}_white"))
{
if (this.DrawColorColumn(row.ClearWhite) && adjacentRow.HasValue)
DrawEdgePreview(id, row.ClearWhite, adjacentRow.Value.ClearWhite);
}
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.PushID($"row{id}_green");
if (this.DrawColorColumn(row.ClearGreen) &&
adjacentRow.HasValue)
DrawEdgePreview(id, row.ClearGreen, adjacentRow.Value.ClearGreen);
ImGui.PopID();
using (ImRaii.PushId($"row{id}_green"))
{
if (this.DrawColorColumn(row.ClearGreen) && adjacentRow.HasValue)
DrawEdgePreview(id, row.ClearGreen, adjacentRow.Value.ClearGreen);
}
}
}
clipper.Destroy();
ImGui.EndTable();
}
private static void DrawEdgePreview(uint id, uint sheetColor, uint sheetColor2)
{
ImGui.BeginTooltip();
using var tooltip = ImRaii.Tooltip();
Span<byte> buf = stackalloc byte[256];
var ptr = 0;
ptr += Encoding.UTF8.GetBytes("<colortype(", buf[ptr..]);
@ -185,7 +188,6 @@ internal class UiColorWidget : IDataWindowWidget
EdgeColor = BinaryPrimitives.ReverseEndianness(sheetColor) | 0xFF000000u,
WrapWidth = float.PositiveInfinity,
});
ImGui.EndTooltip();
}
private bool DrawColorColumn(uint sheetColor)

View file

@ -12,6 +12,7 @@ using Dalamud.Interface.Colors;
using Dalamud.Interface.Components;
using Dalamud.Interface.Textures.Internal;
using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Memory;
using Lumina.Data.Files;
@ -163,17 +164,19 @@ internal class UldWidget : IDataWindowWidget
ImGuiColors.DalamudRed,
$"Error: {nameof(UldFile.AssetData)} is not populated.");
}
else if (ImGui.BeginTable("##uldTextureEntries"u8, 3, ImGuiTableFlags.RowBg | ImGuiTableFlags.Borders))
else
{
ImGui.TableSetupColumn("Id"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("000000"u8).X);
ImGui.TableSetupColumn("Path"u8, ImGuiTableColumnFlags.WidthStretch);
ImGui.TableSetupColumn("Actions"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("Preview___"u8).X);
ImGui.TableHeadersRow();
using var table = ImRaii.Table("##uldTextureEntries"u8, 3, ImGuiTableFlags.RowBg | ImGuiTableFlags.Borders);
if (table.Success)
{
ImGui.TableSetupColumn("Id"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("000000"u8).X);
ImGui.TableSetupColumn("Path"u8, ImGuiTableColumnFlags.WidthStretch);
ImGui.TableSetupColumn("Actions"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("Preview___"u8).X);
ImGui.TableHeadersRow();
foreach (var textureEntry in uld.AssetData)
this.DrawTextureEntry(textureEntry, textureManager);
ImGui.EndTable();
foreach (var textureEntry in uld.AssetData)
this.DrawTextureEntry(textureEntry, textureManager);
}
}
}
@ -287,7 +290,7 @@ internal class UldWidget : IDataWindowWidget
if (ImGui.IsItemHovered())
{
ImGui.BeginTooltip();
using var tooltip = ImRaii.Tooltip();
var texturePath = GetStringNullTerminated(textureEntry.Path);
ImGui.Text($"Base path at {texturePath}:");
@ -308,8 +311,6 @@ internal class UldWidget : IDataWindowWidget
ImGui.Text(e.ToString());
}
}
ImGui.EndTooltip();
}
}
@ -318,15 +319,14 @@ internal class UldWidget : IDataWindowWidget
ImGui.SliderInt("FrameData"u8, ref this.selectedFrameData, 0, timeline.FrameData.Length - 1);
var frameData = timeline.FrameData[this.selectedFrameData];
ImGui.Text($"FrameInfo: {frameData.StartFrame} -> {frameData.EndFrame}");
ImGui.Indent();
using var indent = ImRaii.PushIndent();
foreach (var frameDataKeyGroup in frameData.KeyGroups)
{
ImGui.Text($"{frameDataKeyGroup.Usage:G} {frameDataKeyGroup.Type:G}");
foreach (var keyframe in frameDataKeyGroup.Frames)
this.DrawTimelineKeyGroupFrame(keyframe);
}
ImGui.Unindent();
}
private void DrawTimelineKeyGroupFrame(IKeyframe frame)
@ -334,8 +334,7 @@ internal class UldWidget : IDataWindowWidget
switch (frame)
{
case BaseKeyframeData baseKeyframeData:
ImGui.Text(
$"Time: {baseKeyframeData.Time} | Interpolation: {baseKeyframeData.Interpolation} | Acceleration: {baseKeyframeData.Acceleration} | Deceleration: {baseKeyframeData.Deceleration}");
ImGui.Text($"Time: {baseKeyframeData.Time} | Interpolation: {baseKeyframeData.Interpolation} | Acceleration: {baseKeyframeData.Acceleration} | Deceleration: {baseKeyframeData.Deceleration}");
break;
case Float1Keyframe float1Keyframe:
this.DrawTimelineKeyGroupFrame(float1Keyframe.Keyframe);
@ -350,8 +349,7 @@ internal class UldWidget : IDataWindowWidget
case Float3Keyframe float3Keyframe:
this.DrawTimelineKeyGroupFrame(float3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {float3Keyframe.Value[0]} | Value2: {float3Keyframe.Value[1]} | Value3: {float3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {float3Keyframe.Value[0]} | Value2: {float3Keyframe.Value[1]} | Value3: {float3Keyframe.Value[2]}");
break;
case SByte1Keyframe sbyte1Keyframe:
this.DrawTimelineKeyGroupFrame(sbyte1Keyframe.Keyframe);
@ -366,8 +364,7 @@ internal class UldWidget : IDataWindowWidget
case SByte3Keyframe sbyte3Keyframe:
this.DrawTimelineKeyGroupFrame(sbyte3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {sbyte3Keyframe.Value[0]} | Value2: {sbyte3Keyframe.Value[1]} | Value3: {sbyte3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {sbyte3Keyframe.Value[0]} | Value2: {sbyte3Keyframe.Value[1]} | Value3: {sbyte3Keyframe.Value[2]}");
break;
case Byte1Keyframe byte1Keyframe:
this.DrawTimelineKeyGroupFrame(byte1Keyframe.Keyframe);
@ -382,8 +379,7 @@ internal class UldWidget : IDataWindowWidget
case Byte3Keyframe byte3Keyframe:
this.DrawTimelineKeyGroupFrame(byte3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {byte3Keyframe.Value[0]} | Value2: {byte3Keyframe.Value[1]} | Value3: {byte3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {byte3Keyframe.Value[0]} | Value2: {byte3Keyframe.Value[1]} | Value3: {byte3Keyframe.Value[2]}");
break;
case Short1Keyframe short1Keyframe:
this.DrawTimelineKeyGroupFrame(short1Keyframe.Keyframe);
@ -398,8 +394,7 @@ internal class UldWidget : IDataWindowWidget
case Short3Keyframe short3Keyframe:
this.DrawTimelineKeyGroupFrame(short3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {short3Keyframe.Value[0]} | Value2: {short3Keyframe.Value[1]} | Value3: {short3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {short3Keyframe.Value[0]} | Value2: {short3Keyframe.Value[1]} | Value3: {short3Keyframe.Value[2]}");
break;
case UShort1Keyframe ushort1Keyframe:
this.DrawTimelineKeyGroupFrame(ushort1Keyframe.Keyframe);
@ -414,8 +409,7 @@ internal class UldWidget : IDataWindowWidget
case UShort3Keyframe ushort3Keyframe:
this.DrawTimelineKeyGroupFrame(ushort3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {ushort3Keyframe.Value[0]} | Value2: {ushort3Keyframe.Value[1]} | Value3: {ushort3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {ushort3Keyframe.Value[0]} | Value2: {ushort3Keyframe.Value[1]} | Value3: {ushort3Keyframe.Value[2]}");
break;
case Int1Keyframe int1Keyframe:
this.DrawTimelineKeyGroupFrame(int1Keyframe.Keyframe);
@ -430,8 +424,7 @@ internal class UldWidget : IDataWindowWidget
case Int3Keyframe int3Keyframe:
this.DrawTimelineKeyGroupFrame(int3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {int3Keyframe.Value[0]} | Value2: {int3Keyframe.Value[1]} | Value3: {int3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {int3Keyframe.Value[0]} | Value2: {int3Keyframe.Value[1]} | Value3: {int3Keyframe.Value[2]}");
break;
case UInt1Keyframe uint1Keyframe:
this.DrawTimelineKeyGroupFrame(uint1Keyframe.Keyframe);
@ -446,8 +439,7 @@ internal class UldWidget : IDataWindowWidget
case UInt3Keyframe uint3Keyframe:
this.DrawTimelineKeyGroupFrame(uint3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {uint3Keyframe.Value[0]} | Value2: {uint3Keyframe.Value[1]} | Value3: {uint3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {uint3Keyframe.Value[0]} | Value2: {uint3Keyframe.Value[1]} | Value3: {uint3Keyframe.Value[2]}");
break;
case Bool1Keyframe bool1Keyframe:
this.DrawTimelineKeyGroupFrame(bool1Keyframe.Keyframe);
@ -462,28 +454,22 @@ internal class UldWidget : IDataWindowWidget
case Bool3Keyframe bool3Keyframe:
this.DrawTimelineKeyGroupFrame(bool3Keyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Value1: {bool3Keyframe.Value[0]} | Value2: {bool3Keyframe.Value[1]} | Value3: {bool3Keyframe.Value[2]}");
ImGui.Text($" | Value1: {bool3Keyframe.Value[0]} | Value2: {bool3Keyframe.Value[1]} | Value3: {bool3Keyframe.Value[2]}");
break;
case ColorKeyframe colorKeyframe:
this.DrawTimelineKeyGroupFrame(colorKeyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | Add: {colorKeyframe.AddRed} {colorKeyframe.AddGreen} {colorKeyframe.AddBlue} | Multiply: {colorKeyframe.MultiplyRed} {colorKeyframe.MultiplyGreen} {colorKeyframe.MultiplyBlue}");
ImGui.Text($" | Add: {colorKeyframe.AddRed} {colorKeyframe.AddGreen} {colorKeyframe.AddBlue} | Multiply: {colorKeyframe.MultiplyRed} {colorKeyframe.MultiplyGreen} {colorKeyframe.MultiplyBlue}");
break;
case LabelKeyframe labelKeyframe:
this.DrawTimelineKeyGroupFrame(labelKeyframe.Keyframe);
ImGui.SameLine(0, 0);
ImGui.Text(
$" | LabelCommand: {labelKeyframe.LabelCommand} | JumpId: {labelKeyframe.JumpId} | LabelId: {labelKeyframe.LabelId}");
ImGui.Text($" | LabelCommand: {labelKeyframe.LabelCommand} | JumpId: {labelKeyframe.JumpId} | LabelId: {labelKeyframe.LabelId}");
break;
}
}
private void DrawParts(
UldRoot.PartsData partsData,
UldRoot.TextureEntry[] textureEntries,
TextureManager textureManager)
private void DrawParts(UldRoot.PartsData partsData, UldRoot.TextureEntry[] textureEntries, TextureManager textureManager)
{
for (var index = 0; index < partsData.Parts.Length; index++)
{
@ -549,10 +535,9 @@ internal class UldWidget : IDataWindowWidget
if (ImGui.IsItemHovered())
{
ImGui.BeginTooltip();
using var tooltip = ImRaii.Tooltip();
ImGui.Text("Click to copy:"u8);
ImGui.Text(texturePath);
ImGui.EndTooltip();
}
}
}