Add collectability colors to reliability

This commit is contained in:
Asriel Camora
2024-06-22 16:24:33 -07:00
parent 4204391c4d
commit 92bfaba783
2 changed files with 52 additions and 71 deletions
+52 -9
View File
@@ -6,6 +6,7 @@ using System;
using System.Numerics; using System.Numerics;
using System.Linq; using System.Linq;
using Dalamud.Utility.Numerics; using Dalamud.Utility.Numerics;
using Dalamud.Interface;
namespace Craftimizer.Utils; namespace Craftimizer.Utils;
@@ -44,6 +45,31 @@ internal static class DynamicBars
defaultSize); defaultSize);
}); });
private static ImRaii.Color? PushCollectableColor(this in BarData bar, float collectability, bool colorUnmetThreshold = true)
{
if (bar.Collectability is not { } collectabilities)
return null;
var ret = collectabilities.Count;
for (var i = 0; i < collectabilities.Count; ++i)
{
if (collectability < collectabilities[i])
{
ret = i;
break;
}
}
if (ret == 0)
{
if (colorUnmetThreshold)
return ImRaii.PushColor(ImGuiCol.Text, Colors.Collectability);
return null;
}
return ImRaii.PushColor(ImGuiCol.Text, Colors.CollectabilityThreshold[ret - 1]);
}
public static void Draw(IEnumerable<BarData> bars, float? textSize = null) public static void Draw(IEnumerable<BarData> bars, float? textSize = null)
{ {
var spacing = ImGui.GetStyle().ItemSpacing.X; var spacing = ImGui.GetStyle().ItemSpacing.X;
@@ -63,7 +89,6 @@ internal static class DynamicBars
var screenPos = ImGui.GetCursorScreenPos(); var screenPos = ImGui.GetCursorScreenPos();
using (var color = ImRaii.PushColor(ImGuiCol.PlotHistogram, bar.Color)) using (var color = ImRaii.PushColor(ImGuiCol.PlotHistogram, bar.Color))
ImGui.ProgressBar(Math.Clamp(bar.Value / bar.Max, 0, 1), new(barSize, ImGui.GetFrameHeight()), string.Empty); ImGui.ProgressBar(Math.Clamp(bar.Value / bar.Max, 0, 1), new(barSize, ImGui.GetFrameHeight()), string.Empty);
var passedCollectabilityColor = 0;
if (bar.Collectability is { } collectability) if (bar.Collectability is { } collectability)
{ {
var i = 0; var i = 0;
@@ -78,8 +103,6 @@ internal static class DynamicBars
var isLast = i == collectability.Count; var isLast = i == collectability.Count;
var offsetNext = isLast ? barSize : barSize * collectability[i]!.Value / bar.Max; var offsetNext = isLast ? barSize : barSize * collectability[i]!.Value / bar.Max;
var passedThreshold = bar.Value >= threshold; var passedThreshold = bar.Value >= threshold;
if (passedThreshold)
passedCollectabilityColor = i;
ImGui.GetWindowDrawList().AddRectFilled( ImGui.GetWindowDrawList().AddRectFilled(
screenPos + new Vector2(offset, 0), screenPos + new Vector2(offset, 0),
screenPos + new Vector2(offsetNext, height), screenPos + new Vector2(offsetNext, height),
@@ -103,17 +126,37 @@ internal static class DynamicBars
ImGui.SetCursorPos(pos); ImGui.SetCursorPos(pos);
ImGuiUtils.ViolinPlot(violinData, new(barSize, ImGui.GetFrameHeight())); ImGuiUtils.ViolinPlot(violinData, new(barSize, ImGui.GetFrameHeight()));
if (ImGui.IsItemHovered()) if (ImGui.IsItemHovered())
ImGuiUtils.Tooltip( {
$"Min: {reliability.Min}\n" + using var _font = ImRaii.PushFont(UiBuilder.DefaultFont);
$"Med: {reliability.Median:0.##}\n" + using var _tooltip = ImRaii.Tooltip();
$"Avg: {reliability.Average:0.##}\n" + using var _ = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero);
$"Max: {reliability.Max}");
ImGui.TextUnformatted("Min: ");
ImGui.SameLine(0, 0);
using (var color = bar.PushCollectableColor(reliability.Min))
ImGui.TextUnformatted(reliability.Min.ToString());
ImGui.TextUnformatted("Med: ");
ImGui.SameLine(0, 0);
using (var color = bar.PushCollectableColor(reliability.Median))
ImGui.TextUnformatted(reliability.Median.ToString());
ImGui.TextUnformatted("Avg: ");
ImGui.SameLine(0, 0);
using (var color = bar.PushCollectableColor(reliability.Average))
ImGui.TextUnformatted(reliability.Average.ToString());
ImGui.TextUnformatted("Max: ");
ImGui.SameLine(0, 0);
using (var color = bar.PushCollectableColor(reliability.Max))
ImGui.TextUnformatted(reliability.Max.ToString());
}
} }
} }
} }
ImGui.SameLine(0, spacing); ImGui.SameLine(0, spacing);
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
using var _color = ImRaii.PushColor(ImGuiCol.Text, passedCollectabilityColor != 0 ? Colors.CollectabilityThreshold[passedCollectabilityColor - 1] : default, passedCollectabilityColor != 0); using var _color = bar.PushCollectableColor(bar.Value, false);
if (bar.Caption is { } caption) if (bar.Caption is { } caption)
ImGuiUtils.TextRight(caption, textSize.Value); ImGuiUtils.TextRight(caption, textSize.Value);
else else
-62
View File
@@ -1112,68 +1112,6 @@ public sealed class MacroEditor : Window, IDisposable
} }
} }
private readonly record struct BarData(string Name, Vector4 Color, SimulatedMacro.Reliablity.Param? Reliability, float Value, float Max, string? Caption, Condition? Condition);
private void DrawBars(IEnumerable<BarData> bars)
{
var spacing = ImGui.GetStyle().ItemSpacing.X;
var totalSize = ImGui.GetContentRegionAvail().X;
totalSize -= 2 * spacing;
var textSize = bars.Max(b =>
{
if (b.Caption is { } caption)
return ImGui.CalcTextSize(caption).X;
// max (sp/2) "/" (sp/2) max
return Math.Max(ImGui.CalcTextSize($"{b.Value:0}").X, ImGui.CalcTextSize($"{b.Max:0}").X) * 2
+ spacing
+ ImGui.CalcTextSize("/").X;
});
var maxSize = (textSize - 2 * spacing - ImGui.CalcTextSize("/").X) / 2;
var barSize = totalSize - textSize - spacing;
foreach (var bar in bars)
{
using var panel = ImRaii2.GroupPanel(bar.Name, totalSize, out _);
if (bar.Condition is { } condition)
{
}
else
{
var pos = ImGui.GetCursorPos();
using (var color = ImRaii.PushColor(ImGuiCol.PlotHistogram, bar.Color))
ImGui.ProgressBar(Math.Clamp(bar.Value / bar.Max, 0, 1), new(barSize, ImGui.GetFrameHeight()), string.Empty);
if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenOverlapped))
{
if (bar.Reliability is { } reliability)
{
if (reliability.GetViolinData(bar.Max, (int)(barSize / 5), 0.02) is { } violinData)
{
ImGui.SetCursorPos(pos);
ImGuiUtils.ViolinPlot(violinData, new(barSize, ImGui.GetFrameHeight()));
if (ImGui.IsItemHovered())
ImGuiUtils.Tooltip(
$"Min: {reliability.Min}\n" +
$"Med: {reliability.Median:0.##}\n" +
$"Avg: {reliability.Average:0.##}\n" +
$"Max: {reliability.Max}");
}
}
}
ImGui.SameLine(0, spacing);
ImGui.AlignTextToFramePadding();
if (bar.Caption is { } caption)
ImGuiUtils.TextRight(caption, textSize);
else
{
ImGuiUtils.TextRight($"{bar.Value:0}", maxSize);
ImGui.SameLine(0, spacing / 2);
ImGui.TextUnformatted("/");
ImGui.SameLine(0, spacing / 2);
ImGuiUtils.TextRight($"{bar.Max:0}", maxSize);
}
}
}
}
private void DrawMacro() private void DrawMacro()
{ {
var spacing = ImGui.GetStyle().ItemSpacing.X; var spacing = ImGui.GetStyle().ItemSpacing.X;