Consolidate progress bar code, add different styles
This commit is contained in:
@@ -168,6 +168,13 @@ public class MacroCopyConfiguration
|
|||||||
[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
|
[JsonObjectCreationHandling(JsonObjectCreationHandling.Populate)]
|
||||||
public partial class Configuration
|
public partial class Configuration
|
||||||
{
|
{
|
||||||
|
public enum ProgressBarType
|
||||||
|
{
|
||||||
|
Colorful,
|
||||||
|
Simple,
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
public static event Action? OnMacroListChanged;
|
public static event Action? OnMacroListChanged;
|
||||||
|
|
||||||
[JsonInclude] [JsonPropertyName("Macros")]
|
[JsonInclude] [JsonPropertyName("Macros")]
|
||||||
@@ -193,6 +200,7 @@ public partial class Configuration
|
|||||||
public bool SynthHelperDisplayOnlyFirstStep { get; set; }
|
public bool SynthHelperDisplayOnlyFirstStep { get; set; }
|
||||||
public bool SynthHelperAbilityAnts { get; set; }
|
public bool SynthHelperAbilityAnts { get; set; }
|
||||||
public bool CheckDelineations { get; set; } = true;
|
public bool CheckDelineations { get; set; } = true;
|
||||||
|
public ProgressBarType ProgressType { get; set; } = ProgressBarType.Colorful;
|
||||||
|
|
||||||
public bool PinSynthHelperToWindow { get; set; } = true;
|
public bool PinSynthHelperToWindow { get; set; } = true;
|
||||||
public bool PinRecipeNoteToWindow { get; set; } = true;
|
public bool PinRecipeNoteToWindow { get; set; } = true;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
|
using Craftimizer.Plugin;
|
||||||
using Dalamud.Interface.Colors;
|
using Dalamud.Interface.Colors;
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
|
using System;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Craftimizer.Utils;
|
namespace Craftimizer.Utils;
|
||||||
@@ -15,7 +17,8 @@ public static class Colors
|
|||||||
|
|
||||||
private static Vector4 SolverProgressBg => ImGui.ColorConvertU32ToFloat4(ImGui.GetColorU32(ImGuiCol.TableBorderLight));
|
private static Vector4 SolverProgressBg => ImGui.ColorConvertU32ToFloat4(ImGui.GetColorU32(ImGuiCol.TableBorderLight));
|
||||||
private static Vector4 SolverProgressFgBland => ImGuiColors.DalamudWhite2;
|
private static Vector4 SolverProgressFgBland => ImGuiColors.DalamudWhite2;
|
||||||
private static readonly Vector4[] SolverProgressFg =
|
|
||||||
|
private static readonly Vector4[] SolverProgressFgColorful =
|
||||||
[
|
[
|
||||||
new(0.87f, 0.19f, 0.30f, 1f),
|
new(0.87f, 0.19f, 0.30f, 1f),
|
||||||
new(0.96f, 0.62f, 0.12f, 1f),
|
new(0.96f, 0.62f, 0.12f, 1f),
|
||||||
@@ -26,6 +29,16 @@ public static class Colors
|
|||||||
new(0.70f, 0.49f, 0.88f, 1f),
|
new(0.70f, 0.49f, 0.88f, 1f),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
private static readonly Vector4[] SolverProgressFgMonochromatic =
|
||||||
|
[
|
||||||
|
new(0.33f, 0.33f, 0.33f, 1f),
|
||||||
|
new(0.44f, 0.44f, 0.44f, 1f),
|
||||||
|
new(0.56f, 0.56f, 0.56f, 1f),
|
||||||
|
new(0.68f, 0.68f, 0.68f, 1f),
|
||||||
|
new(0.81f, 0.81f, 0.81f, 1f),
|
||||||
|
new(0.93f, 0.93f, 0.93f, 1f),
|
||||||
|
];
|
||||||
|
|
||||||
public static readonly Vector4[] CollectabilityThreshold =
|
public static readonly Vector4[] CollectabilityThreshold =
|
||||||
[
|
[
|
||||||
new(0.47f, 0.78f, 0.93f, 1f), // Blue
|
new(0.47f, 0.78f, 0.93f, 1f), // Blue
|
||||||
@@ -33,10 +46,21 @@ public static class Colors
|
|||||||
new(0.75f, 1f, 0.75f, 1f), // Green
|
new(0.75f, 1f, 0.75f, 1f), // Green
|
||||||
];
|
];
|
||||||
|
|
||||||
public static (Vector4 Background, Vector4 Foreground) GetSolverProgressColors(int? stageValue) =>
|
public static (Vector4 Background, Vector4 Foreground) GetSolverProgressColors(int? stageValue)
|
||||||
stageValue is not { } stage ?
|
{
|
||||||
(SolverProgressBg, SolverProgressFgBland) :
|
var fg = Service.Configuration.ProgressType switch
|
||||||
stage == 0 ?
|
{
|
||||||
(SolverProgressBg, SolverProgressFg[0]) :
|
Configuration.ProgressBarType.Colorful => SolverProgressFgColorful,
|
||||||
(SolverProgressFg[(stage - 1) % SolverProgressFg.Length], SolverProgressFg[stage % SolverProgressFg.Length]);
|
Configuration.ProgressBarType.Simple => SolverProgressFgMonochromatic,
|
||||||
|
_ => throw new InvalidOperationException("No progress bar should be visible")
|
||||||
|
};
|
||||||
|
|
||||||
|
if (stageValue is not { } stage)
|
||||||
|
return (SolverProgressBg, SolverProgressFgBland);
|
||||||
|
|
||||||
|
if (stage == 0)
|
||||||
|
return (SolverProgressBg, fg[0]);
|
||||||
|
|
||||||
|
return (fg[(stage - 1) % fg.Length], fg[stage % fg.Length]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -170,4 +170,42 @@ internal static class DynamicBars
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void DrawProgressBar(Solver.Solver solver, float? availSpace = null)
|
||||||
|
{
|
||||||
|
var spacing = ImGui.GetStyle().ItemSpacing.X;
|
||||||
|
availSpace ??= ImGui.GetContentRegionAvail().X;
|
||||||
|
|
||||||
|
var fraction = (float)solver.ProgressValue / solver.ProgressMax;
|
||||||
|
if (Service.Configuration.ProgressType == Configuration.ProgressBarType.None)
|
||||||
|
{
|
||||||
|
ImGui.AlignTextToFramePadding();
|
||||||
|
ImGuiUtils.TextCentered($"{fraction * 100:N0}%", availSpace.Value);
|
||||||
|
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
DrawProgressBarTooltip(solver);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var percentWidth = ImGui.CalcTextSize("100%").X;
|
||||||
|
var progressWidth = availSpace.Value - percentWidth - spacing;
|
||||||
|
var progressColors = Colors.GetSolverProgressColors(solver.ProgressStage);
|
||||||
|
|
||||||
|
using (ImRaii.PushColor(ImGuiCol.FrameBg, progressColors.Background))
|
||||||
|
using (ImRaii.PushColor(ImGuiCol.PlotHistogram, progressColors.Foreground))
|
||||||
|
ImGui.ProgressBar(Math.Clamp(fraction, 0, 1), new(progressWidth, ImGui.GetFrameHeight()), string.Empty);
|
||||||
|
if (ImGui.IsItemHovered())
|
||||||
|
DrawProgressBarTooltip(solver);
|
||||||
|
ImGui.SameLine(0, spacing);
|
||||||
|
ImGui.AlignTextToFramePadding();
|
||||||
|
ImGuiUtils.TextRight($"{fraction * 100:N0}%", percentWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void DrawProgressBarTooltip(Solver.Solver solver)
|
||||||
|
{
|
||||||
|
var tooltip = $"Solver Progress: {solver.ProgressValue:N0} / {solver.ProgressMax:N0}";
|
||||||
|
if (solver.ProgressValue > solver.ProgressMax)
|
||||||
|
tooltip += $"\n\nThis is taking longer than expected. Check to see if your gear stats are good and the solver settings are adequate.";
|
||||||
|
ImGuiUtils.TooltipWrapped(tooltip);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1224,21 +1224,7 @@ public sealed class MacroEditor : Window, IDisposable
|
|||||||
ImGui.GetWindowDrawList().AddLine(pos, pos + new Vector2(availSpace, 0), ImGui.GetColorU32(ImGuiCol.Border));
|
ImGui.GetWindowDrawList().AddLine(pos, pos + new Vector2(availSpace, 0), ImGui.GetColorU32(ImGuiCol.Border));
|
||||||
ImGui.Dummy(default);
|
ImGui.Dummy(default);
|
||||||
if (SolverRunning && SolverObject is { } solver)
|
if (SolverRunning && SolverObject is { } solver)
|
||||||
{
|
DynamicBars.DrawProgressBar(solver, availSpace);
|
||||||
var percentWidth = ImGui.CalcTextSize("100%").X;
|
|
||||||
var progressWidth = availSpace - percentWidth - spacing;
|
|
||||||
var fraction = (float)solver.ProgressValue / solver.ProgressMax;
|
|
||||||
var progressColors = Colors.GetSolverProgressColors(solver.ProgressStage);
|
|
||||||
|
|
||||||
using (ImRaii.PushColor(ImGuiCol.FrameBg, progressColors.Background))
|
|
||||||
using (ImRaii.PushColor(ImGuiCol.PlotHistogram, progressColors.Foreground))
|
|
||||||
ImGui.ProgressBar(Math.Clamp(fraction, 0, 1), new(progressWidth, ImGui.GetFrameHeight()), string.Empty);
|
|
||||||
if (ImGui.IsItemHovered())
|
|
||||||
RecipeNote.DrawSolverTooltip(solver);
|
|
||||||
ImGui.SameLine(0, spacing);
|
|
||||||
ImGui.AlignTextToFramePadding();
|
|
||||||
ImGuiUtils.TextRight($"{fraction * 100:N0}%", percentWidth);
|
|
||||||
}
|
|
||||||
DrawMacroActions(availSpace);
|
DrawMacroActions(availSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -715,14 +715,6 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
|||||||
public Action<IEnumerable<ActionType>>? MacroEditorSetter;
|
public Action<IEnumerable<ActionType>>? MacroEditorSetter;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void DrawSolverTooltip(Solver.Solver solver)
|
|
||||||
{
|
|
||||||
var tooltip = $"Solver Progress: {solver.ProgressValue:N0} / {solver.ProgressMax:N0}";
|
|
||||||
if (solver.ProgressValue > solver.ProgressMax)
|
|
||||||
tooltip += $"\n\nThis is taking longer than expected. Check to see if your gear stats are good and the solver settings are adequate.";
|
|
||||||
ImGuiUtils.TooltipWrapped(tooltip);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DrawMacro(in MacroTaskState state, float panelWidth)
|
private void DrawMacro(in MacroTaskState state, float panelWidth)
|
||||||
{
|
{
|
||||||
var panelTitle = state.Type switch
|
var panelTitle = state.Type switch
|
||||||
@@ -794,19 +786,31 @@ public sealed unsafe class RecipeNote : Window, IDisposable
|
|||||||
var calcTextSize = ImGui.CalcTextSize("Calculating...");
|
var calcTextSize = ImGui.CalcTextSize("Calculating...");
|
||||||
var spacing = ImGui.GetStyle().ItemSpacing.X;
|
var spacing = ImGui.GetStyle().ItemSpacing.X;
|
||||||
var fraction = Math.Clamp((float)solver.ProgressValue / solver.ProgressMax, 0, 1);
|
var fraction = Math.Clamp((float)solver.ProgressValue / solver.ProgressMax, 0, 1);
|
||||||
var progressColors = Colors.GetSolverProgressColors(solver.ProgressStage);
|
|
||||||
|
|
||||||
var c = ImGui.GetCursorPos();
|
var c = ImGui.GetCursorPos();
|
||||||
ImGuiUtils.AlignCentered(windowHeight + spacing + calcTextSize.X, ImGui.GetContentRegionAvail().X - stepsAvailWidthOffset);
|
ImGuiUtils.AlignCentered(windowHeight + spacing + calcTextSize.X, ImGui.GetContentRegionAvail().X - stepsAvailWidthOffset);
|
||||||
|
|
||||||
|
if (Service.Configuration.ProgressType == Configuration.ProgressBarType.None)
|
||||||
|
{
|
||||||
|
var textSize = ImGui.CalcTextSize($"{fraction * 100:N0}%");
|
||||||
|
var cursor = ImGui.GetCursorPos();
|
||||||
|
ImGuiUtils.AlignMiddle(textSize, new(windowHeight));
|
||||||
|
ImGui.TextUnformatted($"{fraction * 100:N0}%");
|
||||||
|
ImGui.SetCursorPos(cursor);
|
||||||
|
ImGui.Dummy(new Vector2(windowHeight + 4));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var progressColors = Colors.GetSolverProgressColors(solver.ProgressStage);
|
||||||
ImGuiUtils.ArcProgress(
|
ImGuiUtils.ArcProgress(
|
||||||
fraction,
|
fraction,
|
||||||
windowHeight / 2f + 2,
|
windowHeight / 2f + 2,
|
||||||
.5f,
|
.5f,
|
||||||
ImGui.ColorConvertFloat4ToU32(progressColors.Background),
|
ImGui.ColorConvertFloat4ToU32(progressColors.Background),
|
||||||
ImGui.ColorConvertFloat4ToU32(progressColors.Foreground));
|
ImGui.ColorConvertFloat4ToU32(progressColors.Foreground));
|
||||||
|
}
|
||||||
if (ImGui.IsItemHovered())
|
if (ImGui.IsItemHovered())
|
||||||
DrawSolverTooltip(solver);
|
DynamicBars.DrawProgressBarTooltip(solver);
|
||||||
|
|
||||||
ImGui.SameLine(0, spacing);
|
ImGui.SameLine(0, spacing);
|
||||||
|
|
||||||
|
|||||||
@@ -178,6 +178,24 @@ public sealed class Settings : Window, IDisposable
|
|||||||
_ => "Unknown"
|
_ => "Unknown"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
private static string GetProgressBarTypeName(Configuration.ProgressBarType type) =>
|
||||||
|
type switch
|
||||||
|
{
|
||||||
|
Configuration.ProgressBarType.Colorful => "Colorful",
|
||||||
|
Configuration.ProgressBarType.Simple => "Simple",
|
||||||
|
Configuration.ProgressBarType.None => "None",
|
||||||
|
_ => "Unknown",
|
||||||
|
};
|
||||||
|
|
||||||
|
private static string GetProgressBarTooltip(Configuration.ProgressBarType type) =>
|
||||||
|
type switch
|
||||||
|
{
|
||||||
|
Configuration.ProgressBarType.Colorful => "Colorful, rainbow colors",
|
||||||
|
Configuration.ProgressBarType.Simple => "Simple, grayscale colors",
|
||||||
|
Configuration.ProgressBarType.None => "No progress bar; only percent completion is shown",
|
||||||
|
_ => "Unknown"
|
||||||
|
};
|
||||||
|
|
||||||
public override void Draw()
|
public override void Draw()
|
||||||
{
|
{
|
||||||
if (ImGui.BeginTabBar("settingsTabBar"))
|
if (ImGui.BeginTabBar("settingsTabBar"))
|
||||||
@@ -244,6 +262,16 @@ public sealed class Settings : Window, IDisposable
|
|||||||
ref isDirty
|
ref isDirty
|
||||||
);
|
);
|
||||||
|
|
||||||
|
DrawOption(
|
||||||
|
"Progress Bar Style",
|
||||||
|
"The style of progress bar to use when solving for a macro.",
|
||||||
|
GetProgressBarTypeName,
|
||||||
|
GetProgressBarTooltip,
|
||||||
|
Config.ProgressType,
|
||||||
|
v => Config.ProgressType = v,
|
||||||
|
ref isDirty
|
||||||
|
);
|
||||||
|
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
|
|
||||||
using (var panel = ImRaii2.GroupPanel("Copying Settings", -1, out _))
|
using (var panel = ImRaii2.GroupPanel("Copying Settings", -1, out _))
|
||||||
|
|||||||
@@ -265,7 +265,7 @@ public sealed unsafe class SynthHelper : Window, IDisposable
|
|||||||
if (SolverRunning && SolverObject is { } solver)
|
if (SolverRunning && SolverObject is { } solver)
|
||||||
{
|
{
|
||||||
ImGuiHelpers.ScaledDummy(5);
|
ImGuiHelpers.ScaledDummy(5);
|
||||||
DrawHelperTaskProgress(solver);
|
DynamicBars.DrawProgressBar(solver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -429,26 +429,6 @@ public sealed unsafe class SynthHelper : Window, IDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DrawHelperTaskProgress(Solver.Solver solver)
|
|
||||||
{
|
|
||||||
var spacing = ImGui.GetStyle().ItemSpacing.X;
|
|
||||||
var availSpace = ImGui.GetContentRegionAvail().X;
|
|
||||||
|
|
||||||
var percentWidth = ImGui.CalcTextSize("100%").X;
|
|
||||||
var progressWidth = availSpace - percentWidth - spacing;
|
|
||||||
var fraction = (float)solver.ProgressValue / solver.ProgressMax;
|
|
||||||
var progressColors = Colors.GetSolverProgressColors(solver.ProgressStage);
|
|
||||||
|
|
||||||
using (ImRaii.PushColor(ImGuiCol.FrameBg, progressColors.Background))
|
|
||||||
using (ImRaii.PushColor(ImGuiCol.PlotHistogram, progressColors.Foreground))
|
|
||||||
ImGui.ProgressBar(Math.Clamp(fraction, 0, 1), new(progressWidth, ImGui.GetFrameHeight()), string.Empty);
|
|
||||||
if (ImGui.IsItemHovered())
|
|
||||||
RecipeNote.DrawSolverTooltip(solver);
|
|
||||||
ImGui.SameLine(0, spacing);
|
|
||||||
ImGui.AlignTextToFramePadding();
|
|
||||||
ImGuiUtils.TextRight($"{fraction * 100:N0}%", percentWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void DrawMacroActions()
|
private void DrawMacroActions()
|
||||||
{
|
{
|
||||||
if (SolverRunning)
|
if (SolverRunning)
|
||||||
|
|||||||
Reference in New Issue
Block a user