Merge remote-tracking branch 'Exter-N/single-row-highlight'

This commit is contained in:
Ottermandias 2024-08-06 17:13:02 +02:00
commit a40a5d343f
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 buttonWidth = (ImGui.GetContentRegionAvail().X - itemSpacing * 7.0f) * 0.125f;
var frameHeight = ImGui.GetFrameHeight(); var frameHeight = ImGui.GetFrameHeight();
var highlighterSize = ImUtf8.CalcIconSize(FontAwesomeIcon.Crosshairs) + framePadding * 2.0f; 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 font = ImRaii.PushFont(UiBuilder.MonoFont);
using var alignment = ImRaii.PushStyle(ImGuiStyleVar.ButtonTextAlign, new Vector2(0, 0.5f)); 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 i = 0; i < ColorTable.NumRows >> 1; i += 8)
{ {
for (var j = 0; j < 8; ++j) for (var j = 0; j < 8; ++j)
@ -72,7 +75,7 @@ public partial class MtrlTab
var cursor = ImGui.GetCursorScreenPos(); var cursor = ImGui.GetCursorScreenPos();
ImGui.SetCursorScreenPos(rcMin with { Y = float.Lerp(rcMin.Y, rcMax.Y, 0.5f) - highlighterSize.Y * 0.5f }); ImGui.SetCursorScreenPos(rcMin with { Y = float.Lerp(rcMin.Y, rcMax.Y, 0.5f) - highlighterSize.Y * 0.5f });
font.Pop(); font.Pop();
ColorTableHighlightButton(pairIndex, disabled); ColorTablePairHighlightButton(pairIndex, disabled);
font.Push(UiBuilder.MonoFont); font.Push(UiBuilder.MonoFont);
ImGui.SetCursorScreenPos(cursor); ImGui.SetCursorScreenPos(cursor);
} }
@ -83,6 +86,8 @@ public partial class MtrlTab
{ {
var retA = false; var retA = false;
var retB = false; var retB = false;
var rowAIdx = _colorTableSelectedPair << 1;
var rowBIdx = rowAIdx | 1;
var dyeA = dyeTable?[_colorTableSelectedPair << 1] ?? default; var dyeA = dyeTable?[_colorTableSelectedPair << 1] ?? default;
var dyeB = dyeTable?[(_colorTableSelectedPair << 1) | 1] ?? default; var dyeB = dyeTable?[(_colorTableSelectedPair << 1) | 1] ?? default;
var previewDyeA = _stainService.GetStainCombo(dyeA.Channel).CurrentSelection.Key; var previewDyeA = _stainService.GetStainCombo(dyeA.Channel).CurrentSelection.Key;
@ -91,23 +96,15 @@ public partial class MtrlTab
var dyePackB = _stainService.GudStmFile.GetValueOrNull(dyeB.Template, previewDyeB); var dyePackB = _stainService.GudStmFile.GetValueOrNull(dyeB.Template, previewDyeB);
using (var columns = ImUtf8.Columns(2, "ColorTable"u8)) using (var columns = ImUtf8.Columns(2, "ColorTable"u8))
{ {
using (ImUtf8.PushId("ClipboardA"u8)) using (ImUtf8.PushId("RowHeaderA"u8))
{ {
ColorTableCopyClipboardButton(_colorTableSelectedPair << 1); retA |= DrawRowHeader(rowAIdx, disabled);
ImUtf8.SameLineInner();
retA |= ColorTablePasteFromClipboardButton(_colorTableSelectedPair << 1, disabled);
} }
ImGui.SameLine();
CenteredTextInRest($"Row {_colorTableSelectedPair + 1}A");
columns.Next(); columns.Next();
using (ImUtf8.PushId("ClipboardB"u8)) using (ImUtf8.PushId("RowHeaderB"u8))
{ {
ColorTableCopyClipboardButton((_colorTableSelectedPair << 1) | 1); retB |= DrawRowHeader(rowBIdx, disabled);
ImUtf8.SameLineInner();
retB |= ColorTablePasteFromClipboardButton((_colorTableSelectedPair << 1) | 1, disabled);
} }
ImGui.SameLine();
CenteredTextInRest($"Row {_colorTableSelectedPair + 1}B");
} }
DrawHeader(" Colors"u8); DrawHeader(" Colors"u8);
@ -116,13 +113,13 @@ public partial class MtrlTab
using var dis = ImRaii.Disabled(disabled); using var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("ColorsA"u8)) using (ImUtf8.PushId("ColorsA"u8))
{ {
retA |= DrawColors(table, dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawColors(table, dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("ColorsB"u8)) 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 var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("PbrA"u8)) using (ImUtf8.PushId("PbrA"u8))
{ {
retA |= DrawPbr(table, dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawPbr(table, dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("PbrB"u8)) 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 var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("SheenA"u8)) using (ImUtf8.PushId("SheenA"u8))
{ {
retA |= DrawSheen(table, dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawSheen(table, dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("SheenB"u8)) 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 var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("BlendingA"u8)) using (ImUtf8.PushId("BlendingA"u8))
{ {
retA |= DrawBlending(table, dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawBlending(table, dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("BlendingB"u8)) 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 var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("TemplateA"u8)) using (ImUtf8.PushId("TemplateA"u8))
{ {
retA |= DrawTemplate(table, dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawTemplate(table, dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("TemplateB"u8)) 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 var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("DyeA"u8)) using (ImUtf8.PushId("DyeA"u8))
{ {
retA |= DrawDye(dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawDye(dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("DyeB"u8)) 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 var dis = ImRaii.Disabled(disabled);
using (ImUtf8.PushId("FurtherA"u8)) using (ImUtf8.PushId("FurtherA"u8))
{ {
retA |= DrawFurther(table, dyeTable, dyePackA, _colorTableSelectedPair << 1); retA |= DrawFurther(table, dyeTable, dyePackA, rowAIdx);
} }
columns.Next(); columns.Next();
using (ImUtf8.PushId("FurtherB"u8)) using (ImUtf8.PushId("FurtherB"u8))
{ {
retB |= DrawFurther(table, dyeTable, dyePackB, (_colorTableSelectedPair << 1) | 1); retB |= DrawFurther(table, dyeTable, dyePackB, rowBIdx);
} }
} }
if (retA) if (retA)
UpdateColorTableRowPreview(_colorTableSelectedPair << 1); UpdateColorTableRowPreview(rowAIdx);
if (retB) if (retB)
UpdateColorTableRowPreview((_colorTableSelectedPair << 1) | 1); UpdateColorTableRowPreview(rowBIdx);
return retA | retB; return retA | retB;
} }
@ -239,6 +236,20 @@ public partial class MtrlTab
ImUtf8.CollapsingHeader(label, ImGuiTreeNodeFlags.Leaf); 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) private static bool DrawColors(ColorTable table, ColorDyeTable? dyeTable, DyePack? dyePack, int rowIdx)
{ {
var dyeOffset = ImGui.GetContentRegionAvail().X 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, 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, "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(); 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) private static void CtBlendRect(Vector2 rcMin, Vector2 rcMax, uint topColor, uint bottomColor)
{ {
var style = ImGui.GetStyle(); var style = ImGui.GetStyle();

View file

@ -103,11 +103,8 @@ public partial class MtrlTab
ColorTableCopyClipboardButton(rowIdx); ColorTableCopyClipboardButton(rowIdx);
ImUtf8.SameLineInner(); ImUtf8.SameLineInner();
var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled); var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled);
if ((rowIdx & 1) == 0) ImUtf8.SameLineInner();
{ ColorTableRowHighlightButton(rowIdx, disabled);
ImUtf8.SameLineInner();
ColorTableHighlightButton(rowIdx >> 1, disabled);
}
ImGui.TableNextColumn(); ImGui.TableNextColumn();
using (ImRaii.PushFont(UiBuilder.MonoFont)) using (ImRaii.PushFont(UiBuilder.MonoFont))
@ -213,11 +210,8 @@ public partial class MtrlTab
ColorTableCopyClipboardButton(rowIdx); ColorTableCopyClipboardButton(rowIdx);
ImUtf8.SameLineInner(); ImUtf8.SameLineInner();
var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled); var ret = ColorTablePasteFromClipboardButton(rowIdx, disabled);
if ((rowIdx & 1) == 0) ImUtf8.SameLineInner();
{ ColorTableRowHighlightButton(rowIdx, disabled);
ImUtf8.SameLineInner();
ColorTableHighlightButton(rowIdx >> 1, disabled);
}
ImGui.TableNextColumn(); ImGui.TableNextColumn();
using (ImRaii.PushFont(UiBuilder.MonoFont)) 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<LiveMaterialPreviewer> _materialPreviewers = new(4);
private readonly List<LiveColorTablePreviewer> _colorTablePreviewers = new(4); private readonly List<LiveColorTablePreviewer> _colorTablePreviewers = new(4);
private int _highlightedColorTableRow = -1;
private int _highlightedColorTablePair = -1; private int _highlightedColorTablePair = -1;
private readonly Stopwatch _highlightTime = new(); 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() private void CancelColorTableHighlight()
{ {
var rowIdx = _highlightedColorTableRow;
var pairIdx = _highlightedColorTablePair; var pairIdx = _highlightedColorTablePair;
_highlightedColorTableRow = -1;
_highlightedColorTablePair = -1; _highlightedColorTablePair = -1;
_highlightTime.Reset(); _highlightTime.Reset();
if (rowIdx >= 0)
UpdateColorTableRowPreview(rowIdx);
if (pairIdx >= 0) if (pairIdx >= 0)
{ {
UpdateColorTableRowPreview(pairIdx << 1); 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); ApplyHighlight(ref row, ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds);
else if (((_highlightedColorTablePair << 1) | 1) == rowIdx) else if (((_highlightedColorTablePair << 1) | 1) == rowIdx)
ApplyHighlight(ref row, ColorId.InGameHighlight2, (float)_highlightTime.Elapsed.TotalSeconds); ApplyHighlight(ref row, ColorId.InGameHighlight2, (float)_highlightTime.Elapsed.TotalSeconds);
@ -247,6 +270,9 @@ public partial class MtrlTab
rows.ApplyDye(_stainService.GudStmFile, stainIds, dyeRows); rows.ApplyDye(_stainService.GudStmFile, stainIds, dyeRows);
} }
if (_highlightedColorTableRow >= 0)
ApplyHighlight(ref rows[_highlightedColorTableRow], ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds);
if (_highlightedColorTablePair >= 0) if (_highlightedColorTablePair >= 0)
{ {
ApplyHighlight(ref rows[_highlightedColorTablePair << 1], ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds); ApplyHighlight(ref rows[_highlightedColorTablePair << 1], ColorId.InGameHighlight, (float)_highlightTime.Elapsed.TotalSeconds);