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

View file

@ -11,6 +11,7 @@ using Dalamud.Interface.ImGuiSeStringRenderer.Internal;
using Dalamud.Interface.Textures.Internal; using Dalamud.Interface.Textures.Internal;
using Dalamud.Interface.Utility; using Dalamud.Interface.Utility;
using Dalamud.Interface.Utility.Internal; using Dalamud.Interface.Utility.Internal;
using Dalamud.Interface.Utility.Raii;
using Dalamud.Storage.Assets; using Dalamud.Storage.Assets;
using Dalamud.Utility; using Dalamud.Utility;
@ -29,7 +30,7 @@ namespace Dalamud.Interface.Internal.Windows.Data.Widgets;
/// </summary> /// </summary>
internal unsafe class SeStringRendererTestWidget : IDataWindowWidget 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 ImVectorWrapper<byte> testStringBuffer;
private string testString = string.Empty; private string testString = string.Empty;
private ReadOnlySeString? logkind; private ReadOnlySeString? logkind;
@ -119,9 +120,11 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
ImGui.SameLine(); ImGui.SameLine();
var t4 = this.style.ThemeIndex ?? AtkStage.Instance()->AtkUIColorHolder->ActiveColorThemeType; var t4 = this.style.ThemeIndex ?? AtkStage.Instance()->AtkUIColorHolder->ActiveColorThemeType;
ImGui.PushItemWidth(ImGui.CalcTextSize("WWWWWWWWWWWWWW"u8).X); using (ImRaii.ItemWidth(ImGui.CalcTextSize("WWWWWWWWWWWWWW"u8).X))
if (ImGui.Combo("##theme", ref t4, ThemeNames)) {
this.style.ThemeIndex = t4; if (ImGui.Combo("##theme", ref t4, ThemeNames))
this.style.ThemeIndex = t4;
}
ImGui.SameLine(); ImGui.SameLine();
t = this.style.LinkUnderlineThickness > 0f; t = this.style.LinkUnderlineThickness > 0f;
@ -192,22 +195,19 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
dl.PushClipRect(clipMin, clipMax); dl.PushClipRect(clipMin, clipMax);
ImGuiHelpers.CompileSeStringWrapped( ImGuiHelpers.CompileSeStringWrapped(
"<icon(1)>Test test<icon(1)>", "<icon(1)>Test test<icon(1)>",
new SeStringDrawParams new SeStringDrawParams { Color = 0xFFFFFFFF, WrapWidth = float.MaxValue, TargetDrawList = dl });
{ Color = 0xFFFFFFFF, WrapWidth = float.MaxValue, TargetDrawList = dl });
dl.PopClipRect(); dl.PopClipRect();
} }
if (ImGui.CollapsingHeader("Addon Table"u8)) 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.TableSetupScrollFreeze(0, 1);
ImGui.TableSetupColumn("Row ID"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("0000000"u8).X); ImGui.TableSetupColumn("Row ID"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("0000000"u8).X);
ImGui.TableSetupColumn("Text"u8, ImGuiTableColumnFlags.WidthStretch); ImGui.TableSetupColumn("Text"u8, ImGuiTableColumnFlags.WidthStretch);
ImGui.TableSetupColumn( ImGui.TableSetupColumn("Misc"u8, ImGuiTableColumnFlags.WidthFixed, ImGui.CalcTextSize("AAAAAAAAAAAAAAAAA"u8).X);
"Misc"u8,
ImGuiTableColumnFlags.WidthFixed,
ImGui.CalcTextSize("AAAAAAAAAAAAAAAAA"u8).X);
ImGui.TableHeadersRow(); ImGui.TableHeadersRow();
var addon = Service<DataManager>.GetNullable()?.GetExcelSheet<Addon>() ?? var addon = Service<DataManager>.GetNullable()?.GetExcelSheet<Addon>() ??
@ -222,7 +222,7 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
var row = addon.GetRowAt(i); var row = addon.GetRowAt(i);
ImGui.TableNextRow(); ImGui.TableNextRow();
ImGui.PushID(i); using var pushedId = ImRaii.PushId(i);
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
@ -234,14 +234,11 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
ImGui.TableNextColumn(); ImGui.TableNextColumn();
if (ImGui.Button("Print to Chat"u8)) if (ImGui.Button("Print to Chat"u8))
Service<ChatGui>.Get().Print(row.Text.ToDalamudString()); Service<ChatGui>.Get().Print(row.Text);
ImGui.PopID();
} }
} }
clipper.Destroy(); clipper.Destroy();
ImGui.EndTable();
} }
} }
@ -258,9 +255,7 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
if (ImGui.Button("Print to Chat Log"u8)) if (ImGui.Button("Print to Chat Log"u8))
{ {
Service<ChatGui>.Get().Print( Service<ChatGui>.Get().Print(Service<SeStringRenderer>.Get().CompileAndCache(this.testString));
Game.Text.SeStringHandling.SeString.Parse(
Service<SeStringRenderer>.Get().CompileAndCache(this.testString).Data.Span));
} }
ImGui.SameLine(); ImGui.SameLine();
@ -315,6 +310,7 @@ internal unsafe class SeStringRendererTestWidget : IDataWindowWidget
var len = this.testStringBuffer.StorageSpan.IndexOf((byte)0); var len = this.testStringBuffer.StorageSpan.IndexOf((byte)0);
if (len + 4 >= this.testStringBuffer.Capacity) if (len + 4 >= this.testStringBuffer.Capacity)
this.testStringBuffer.EnsureCapacityExponential(len + 4); this.testStringBuffer.EnsureCapacityExponential(len + 4);
if (len < this.testStringBuffer.Capacity) if (len < this.testStringBuffer.Capacity)
{ {
this.testStringBuffer.LengthUnsafe = len; 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}%)"); ImGui.Text($"{this.downloadState.Downloaded:##,###}/{this.downloadState.Total:##,###} ({this.downloadState.Percentage:0.00}%)");
using var disabled = using var disabled = ImRaii.Disabled(this.downloadTask?.IsCompleted is false || this.localPath[0] == 0);
ImRaii.Disabled(this.downloadTask?.IsCompleted is false || this.localPath[0] == 0);
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
ImGui.Text("Download"u8); ImGui.Text("Download"u8);
ImGui.SameLine(); ImGui.SameLine();
@ -388,27 +387,19 @@ internal class TaskSchedulerWidget : IDataWindowWidget
if (task.Task == null) if (task.Task == null)
subTime = task.FinishTime; subTime = task.FinishTime;
switch (task.Status) using var pushedColor = task.Status switch
{ {
case TaskStatus.Created: TaskStatus.Created or TaskStatus.WaitingForActivation or TaskStatus.WaitingToRun
case TaskStatus.WaitingForActivation: => ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.DalamudGrey),
case TaskStatus.WaitingToRun: TaskStatus.Running or TaskStatus.WaitingForChildrenToComplete
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.DalamudGrey); => ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.ParsedBlue),
break; TaskStatus.RanToCompletion
case TaskStatus.Running: => ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.ParsedGreen),
case TaskStatus.WaitingForChildrenToComplete: TaskStatus.Canceled or TaskStatus.Faulted
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.ParsedBlue); => ImRaii.PushColor(ImGuiCol.Header, ImGuiColors.DalamudRed),
break;
case TaskStatus.RanToCompletion: _ => throw new ArgumentOutOfRangeException(),
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.ParsedGreen); };
break;
case TaskStatus.Canceled:
case TaskStatus.Faulted:
ImGui.PushStyleColor(ImGuiCol.Header, ImGuiColors.DalamudRed);
break;
default:
throw new ArgumentOutOfRangeException();
}
if (ImGui.CollapsingHeader($"#{task.Id} - {task.Status} {(subTime - task.StartTime).TotalMilliseconds}ms###task{i}")) if (ImGui.CollapsingHeader($"#{task.Id} - {task.Status} {(subTime - task.StartTime).TotalMilliseconds}ms###task{i}"))
{ {
@ -418,8 +409,7 @@ internal class TaskSchedulerWidget : IDataWindowWidget
{ {
try try
{ {
var cancelFunc = var cancelFunc = typeof(Task).GetMethod("InternalCancel", BindingFlags.NonPublic | BindingFlags.Instance);
typeof(Task).GetMethod("InternalCancel", BindingFlags.NonPublic | BindingFlags.Instance);
cancelFunc?.Invoke(task, null); cancelFunc?.Invoke(task, null);
} }
catch (Exception ex) catch (Exception ex)
@ -430,7 +420,7 @@ internal class TaskSchedulerWidget : IDataWindowWidget
ImGuiHelpers.ScaledDummy(10); ImGuiHelpers.ScaledDummy(10);
ImGui.Text(task.StackTrace?.ToString()); ImGui.Text(task.StackTrace?.ToString() ?? "Null StackTrace");
if (task.Exception != null) if (task.Exception != null)
{ {
@ -443,8 +433,6 @@ internal class TaskSchedulerWidget : IDataWindowWidget
{ {
task.IsBeingViewed = false; task.IsBeingViewed = false;
} }
ImGui.PopStyleColor(1);
} }
this.fileDialogManager.Draw(); this.fileDialogManager.Draw();

View file

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

View file

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

View file

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