Reinstate single-row CT highlight

This commit is contained in:
Exter-N 2024-08-05 23:02:34 +02:00
parent 0d1ed6a926
commit 1187efa243
4 changed files with 86 additions and 43 deletions

View file

@ -30,11 +30,14 @@ public partial class MtrlTab
var buttonWidth = (ImGui.GetContentRegionAvail().X - itemSpacing * 7.0f) * 0.125f;
var frameHeight = ImGui.GetFrameHeight();
var highlighterSize = ImUtf8.CalcIconSize(FontAwesomeIcon.Crosshairs) + framePadding * 2.0f;
var spaceWidth = ImUtf8.CalcTextSize(" "u8).X;
var spacePadding = (int)MathF.Ceiling((highlighterSize.X + framePadding.X + itemInnerSpacing) / spaceWidth);
using var font = ImRaii.PushFont(UiBuilder.MonoFont);
using var alignment = ImRaii.PushStyle(ImGuiStyleVar.ButtonTextAlign, new Vector2(0, 0.5f));
// This depends on the font being pushed for "proper" alignment of the pair indices in the buttons.
var spaceWidth = ImUtf8.CalcTextSize(" "u8).X;
var spacePadding = (int)MathF.Ceiling((highlighterSize.X + framePadding.X + itemInnerSpacing) / spaceWidth);
for (var i = 0; i < ColorTable.NumRows >> 1; i += 8)
{
for (var j = 0; j < 8; ++j)
@ -72,7 +75,7 @@ public partial class MtrlTab
var cursor = ImGui.GetCursorScreenPos();
ImGui.SetCursorScreenPos(rcMin with { Y = float.Lerp(rcMin.Y, rcMax.Y, 0.5f) - highlighterSize.Y * 0.5f });
font.Pop();
ColorTableHighlightButton(pairIndex, disabled);
ColorTablePairHighlightButton(pairIndex, disabled);
font.Push(UiBuilder.MonoFont);
ImGui.SetCursorScreenPos(cursor);
}
@ -83,6 +86,8 @@ public partial class MtrlTab
{
var retA = false;
var retB = false;
var rowAIdx = _colorTableSelectedPair << 1;
var rowBIdx = rowAIdx | 1;
var dyeA = dyeTable?[_colorTableSelectedPair << 1] ?? default;
var dyeB = dyeTable?[(_colorTableSelectedPair << 1) | 1] ?? default;
var previewDyeA = _stainService.GetStainCombo(dyeA.Channel).CurrentSelection.Key;
@ -91,23 +96,15 @@ public partial class MtrlTab
var dyePackB = _stainService.GudStmFile.GetValueOrNull(dyeB.Template, previewDyeB);
using (var columns = ImUtf8.Columns(2, "ColorTable"u8))
{
using (ImUtf8.PushId("ClipboardA"u8))
using (ImUtf8.PushId("RowHeaderA"u8))
{
ColorTableCopyClipboardButton(_colorTableSelectedPair << 1);
ImUtf8.SameLineInner();
retA |= ColorTablePasteFromClipboardButton(_colorTableSelectedPair << 1, disabled);
retA |= DrawRowHeader(rowAIdx, disabled);
}
ImGui.SameLine();
CenteredTextInRest($"Row {_colorTableSelectedPair + 1}A");
columns.Next();
using (ImUtf8.PushId("ClipboardB"u8))
using (ImUtf8.PushId("RowHeaderB"u8))
{
ColorTableCopyClipboardButton((_colorTableSelectedPair << 1) | 1);
ImUtf8.SameLineInner();
retB |= ColorTablePasteFromClipboardButton((_colorTableSelectedPair << 1) | 1, disabled);
retB |= DrawRowHeader(rowBIdx, disabled);
}
ImGui.SameLine();
CenteredTextInRest($"Row {_colorTableSelectedPair + 1}B");
}
DrawHeader(" Colors"u8);
@ -116,13 +113,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("ColorsA"u8))
{
retA |= DrawColors(table, dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawColors(table, dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("ColorsB"u8))
{
retB |= DrawColors(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawColors(table, dyeTable, dyePackB, rowBIdx);
}
}
@ -132,13 +129,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("PbrA"u8))
{
retA |= DrawPbr(table, dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawPbr(table, dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("PbrB"u8))
{
retB |= DrawPbr(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawPbr(table, dyeTable, dyePackB, rowBIdx);
}
}
@ -148,13 +145,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("SheenA"u8))
{
retA |= DrawSheen(table, dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawSheen(table, dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("SheenB"u8))
{
retB |= DrawSheen(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawSheen(table, dyeTable, dyePackB, rowBIdx);
}
}
@ -164,13 +161,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("BlendingA"u8))
{
retA |= DrawBlending(table, dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawBlending(table, dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("BlendingB"u8))
{
retB |= DrawBlending(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawBlending(table, dyeTable, dyePackB, rowBIdx);
}
}
@ -180,13 +177,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("TemplateA"u8))
{
retA |= DrawTemplate(table, dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawTemplate(table, dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("TemplateB"u8))
{
retB |= DrawTemplate(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawTemplate(table, dyeTable, dyePackB, rowBIdx);
}
}
@ -197,13 +194,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("DyeA"u8))
{
retA |= DrawDye(dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawDye(dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("DyeB"u8))
{
retB |= DrawDye(dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawDye(dyeTable, dyePackB, rowBIdx);
}
}
@ -213,20 +210,20 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("FurtherA"u8))
{
retA |= DrawFurther(table, dyeTable, dyePackA, _colorTableSelectedPair << 1);
retA |= DrawFurther(table, dyeTable, dyePackA, rowAIdx);
}
columns.Next();
using (ImUtf8.PushId("FurtherB"u8))
{
retB |= DrawFurther(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1);
retB |= DrawFurther(table, dyeTable, dyePackB, rowBIdx);
}
}
if (retA)
UpdateColorTableRowPreview(_colorTableSelectedPair << 1);
UpdateColorTableRowPreview(rowAIdx);
if (retB)
UpdateColorTableRowPreview((_colorTableSelectedPair << 1) | 1);
UpdateColorTableRowPreview(rowBIdx);
return retA | retB;
}
@ -239,6 +236,20 @@ public partial class MtrlTab
ImUtf8.CollapsingHeader(label, ImGuiTreeNodeFlags.Leaf);
}
private bool DrawRowHeader(int rowIdx, bool disabled)
{
ColorTableCopyClipboardButton(rowIdx);
ImUtf8.SameLineInner();
var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled);
ImUtf8.SameLineInner();
ColorTableRowHighlightButton(rowIdx, disabled);
ImGui.SameLine();
CenteredTextInRest($"Row {(rowIdx >> 1) + 1}{"AB"[rowIdx & 1]}");
return ret;
}
private static bool DrawColors(ColorTable table, ColorDyeTable? dyeTable, DyePack? dyePack, int rowIdx)
{
var dyeOffset = ImGui.GetContentRegionAvail().X

View file

@ -228,7 +228,7 @@ public partial class MtrlTab
}
}
private void ColorTableHighlightButton(int pairIdx, bool disabled)
private void ColorTablePairHighlightButton(int pairIdx, bool disabled)
{
ImUtf8.IconButton(FontAwesomeIcon.Crosshairs,
"Highlight this pair of rows on your character, if possible.\n\nHighlight colors can be configured in Penumbra's settings."u8,
@ -240,6 +240,18 @@ public partial class MtrlTab
CancelColorTableHighlight();
}
private void ColorTableRowHighlightButton(int rowIdx, bool disabled)
{
ImUtf8.IconButton(FontAwesomeIcon.Crosshairs,
"Highlight this row on your character, if possible.\n\nHighlight colors can be configured in Penumbra's settings."u8,
ImGui.GetFrameHeight() * Vector2.One, disabled || _colorTablePreviewers.Count == 0);
if (ImGui.IsItemHovered())
HighlightColorTableRow(rowIdx);
else if (_highlightedColorTableRow == rowIdx)
CancelColorTableHighlight();
}
private static void CtBlendRect(Vector2 rcMin, Vector2 rcMax, uint topColor, uint bottomColor)
{
var style = ImGui.GetStyle();

View file

@ -103,11 +103,8 @@ public partial class MtrlTab
ColorTableCopyClipboardButton(rowIdx);
ImUtf8.SameLineInner();
var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled);
if ((rowIdx & 1) == 0)
{
ImUtf8.SameLineInner();
ColorTableHighlightButton(rowIdx >> 1, disabled);
}
ImUtf8.SameLineInner();
ColorTableRowHighlightButton(rowIdx, disabled);
ImGui.TableNextColumn();
using (ImRaii.PushFont(UiBuilder.MonoFont))
@ -213,11 +210,8 @@ public partial class MtrlTab
ColorTableCopyClipboardButton(rowIdx);
ImUtf8.SameLineInner();
var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled);
if ((rowIdx & 1) == 0)
{
ImUtf8.SameLineInner();
ColorTableHighlightButton(rowIdx >> 1, disabled);
}
ImUtf8.SameLineInner();
ColorTableRowHighlightButton(rowIdx, disabled);
ImGui.TableNextColumn();
using (ImRaii.PushFont(UiBuilder.MonoFont))

View file

@ -14,6 +14,7 @@ public partial class MtrlTab
{
private readonly List<LiveMaterialPreviewer> _materialPreviewers = new(4);
private readonly List<LiveColorTablePreviewer> _colorTablePreviewers = new(4);
private int _highlightedColorTableRow = -1;
private int _highlightedColorTablePair = -1;
private readonly Stopwatch _highlightTime = new();
@ -168,13 +169,35 @@ public partial class MtrlTab
}
}
private void HighlightColorTableRow(int rowIdx)
{
var oldRowIdx = _highlightedColorTableRow;
if (_highlightedColorTableRow != rowIdx)
{
_highlightedColorTableRow = rowIdx;
_highlightTime.Restart();
}
if (oldRowIdx >= 0)
UpdateColorTableRowPreview(oldRowIdx);
if (rowIdx >= 0)
UpdateColorTableRowPreview(rowIdx);
}
private void CancelColorTableHighlight()
{
var rowIdx = _highlightedColorTableRow;
var pairIdx = _highlightedColorTablePair;
_highlightedColorTableRow = -1;
_highlightedColorTablePair = -1;
_highlightTime.Reset();
if (rowIdx >= 0)
UpdateColorTableRowPreview(rowIdx);
if (pairIdx >= 0)
{
UpdateColorTableRowPreview(pairIdx << 1);
@ -214,7 +237,7 @@ public partial class MtrlTab
}
}
if (_highlightedColorTablePair << 1 == rowIdx)
if (_highlightedColorTablePair << 1 == rowIdx || _highlightedColorTableRow == rowIdx)
ApplyHighlight(ref row, ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds);
else if (((_highlightedColorTablePair << 1) | 1) == rowIdx)
ApplyHighlight(ref row, ColorId.InGameHighlight2, (float)_highlightTime.Elapsed.TotalSeconds);
@ -247,6 +270,9 @@ public partial class MtrlTab
rows.ApplyDye(_stainService.GudStmFile, stainIds, dyeRows);
}
if (_highlightedColorTableRow >= 0)
ApplyHighlight(ref rows[_highlightedColorTableRow], ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds);
if (_highlightedColorTablePair >= 0)
{
ApplyHighlight(ref rows[_highlightedColorTablePair << 1], ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds);