From d982a9b8c5a2eb415329398b96ff18288c0f441a Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Thu, 29 Jun 2023 12:47:30 -0700 Subject: [PATCH] Simulator changes - Progress bar tooltips in crafting log - Disable modifying actions when generating - Better bottom button layout - Saving/save new, etc --- Craftimizer/Windows/SimulatorWindow.cs | 11 +- Craftimizer/Windows/SimulatorWindowDrawer.cs | 140 ++++++++++++------ .../Windows/SimulatorWindowDrawerUtils.cs | 17 +++ Craftimizer/Windows/SimulatorWindowSolver.cs | 2 + 4 files changed, 123 insertions(+), 47 deletions(-) diff --git a/Craftimizer/Windows/SimulatorWindow.cs b/Craftimizer/Windows/SimulatorWindow.cs index bbe4d47..e932637 100644 --- a/Craftimizer/Windows/SimulatorWindow.cs +++ b/Craftimizer/Windows/SimulatorWindow.cs @@ -19,6 +19,8 @@ public sealed partial class SimulatorWindow : Window, IDisposable private bool IsExpert { get; } private SimulationInput Input { get; } private ClassJob ClassJob { get; } + private Macro? Macro { get; set; } + private string MacroName { get; set; } // State is the state of the simulation *after* its corresponding action is executed. private List<(ActionType Action, string Tooltip, ActionResponse Response, SimulationState State)> Actions { get; } private Simulator.Simulator Simulator { get; set; } @@ -27,7 +29,7 @@ public sealed partial class SimulatorWindow : Window, IDisposable // Simulator is set by ResetSimulator() #pragma warning disable CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. - public SimulatorWindow(Item item, bool isExpert, SimulationInput input, ClassJob classJob, List actions) : base("Simulator", WindowFlags) + public SimulatorWindow(Item item, bool isExpert, SimulationInput input, ClassJob classJob, Macro? macro) : base("Simulator", WindowFlags) #pragma warning restore CS8618 // Non-nullable field must contain a non-null value when exiting constructor. Consider declaring as nullable. { Service.WindowSystem.AddWindow(this); @@ -36,6 +38,8 @@ public sealed partial class SimulatorWindow : Window, IDisposable IsExpert = isExpert; Input = input; ClassJob = classJob; + Macro = macro; + MacroName = Macro?.Name ?? $"Macro {Configuration.Macros.Count + 1}"; Actions = new(); ResetSimulator(); @@ -47,8 +51,9 @@ public sealed partial class SimulatorWindow : Window, IDisposable SizeCondition = ImGuiCond.Appearing; Size = SizeConstraints?.MinimumSize ?? new(10); - foreach (var action in actions) - AppendAction(action); + if (Macro != null) + foreach (var action in Macro.Actions) + AppendAction(action); } private void ResetSimulator() diff --git a/Craftimizer/Windows/SimulatorWindowDrawer.cs b/Craftimizer/Windows/SimulatorWindowDrawer.cs index da08396..59821a0 100644 --- a/Craftimizer/Windows/SimulatorWindowDrawer.cs +++ b/Craftimizer/Windows/SimulatorWindowDrawer.cs @@ -21,7 +21,7 @@ public sealed partial class SimulatorWindow : Window, IDisposable private static readonly Vector2 DurabilityBarSize = new(100, 20); private static readonly Vector2 ConditionBarSize = new(20, 20); private static readonly Vector2 ProgressBarSizeOld = new(200, 20); - private static readonly Vector2 TooltipProgressBarSize = new(100, 5); + public static readonly Vector2 TooltipProgressBarSize = new(100, 5); private static readonly Vector4 ProgressColor = new(0.44f, 0.65f, 0.18f, 1f); private static readonly Vector4 QualityColor = new(0.26f, 0.71f, 0.69f, 1f); @@ -46,13 +46,12 @@ public sealed partial class SimulatorWindow : Window, IDisposable while (SolverActionQueue.TryDequeue(out var poppedAction)) AppendGeneratedAction(poppedAction); - ImGui.TextUnformatted($"{FrameTime.TotalMilliseconds:0.00}ms"); - ImGui.BeginTable("simulatorWindow", 2, ImGuiTableFlags.BordersInnerV); ImGui.TableSetupColumn("", ImGuiTableColumnFlags.WidthFixed, ActionColumnSize); ImGui.TableSetupColumn("", ImGuiTableColumnFlags.WidthStretch); ImGui.TableNextColumn(); DrawActions(); + ImGui.TextUnformatted($"{FrameTime.TotalMilliseconds:0.00}ms"); ImGui.TableNextColumn(); DrawSimulation(); ImGui.EndTable(); @@ -73,6 +72,7 @@ public sealed partial class SimulatorWindow : Window, IDisposable ImGui.PushStyleColor(ImGuiCol.Button, Vector4.Zero); ImGui.PushStyleColor(ImGuiCol.ButtonActive, Vector4.Zero); ImGui.PushStyleColor(ImGuiCol.ButtonHovered, Vector4.Zero); + ImGui.BeginDisabled(!CanModifyActions); foreach (var (category, actions) in SortedActions) { @@ -105,6 +105,8 @@ public sealed partial class SimulatorWindow : Window, IDisposable ImGui.Dummy(actionSize); ImGuiUtils.EndGroupPanel(); } + + ImGui.EndDisabled(); ImGui.PopStyleColor(3); } @@ -119,8 +121,7 @@ public sealed partial class SimulatorWindow : Window, IDisposable ImGuiHelpers.ScaledDummy(5); DrawSimulationActions(drawParams); var bottom = ImGui.GetContentRegionAvail().Y - ImGui.GetStyle().FramePadding.Y * 2; - var textHeight = ImGui.CalcTextSize("A").Y; - var buttonHeight = ImGui.GetStyle().FramePadding.Y * 2 + textHeight; + var buttonHeight = ImGui.GetFrameHeightWithSpacing() * 2 + ImGui.GetFrameHeight(); ImGuiHelpers.ScaledDummy(bottom - buttonHeight); DrawSimulationButtons(drawParams); } @@ -245,27 +246,31 @@ public sealed partial class SimulatorWindow : Window, IDisposable var (action, tooltip, response, state) = Actions[i]; ImGui.PushID(i); if (ImGui.ImageButton(action.GetIcon(ClassJob).ImGuiHandle, actionSize, Vector2.Zero, Vector2.One, 0, default, response != ActionResponse.UsedAction ? BadActionImageTint : Vector4.One)) - RemoveAction(i); - if (ImGui.BeginDragDropSource()) + if (CanModifyActions) + RemoveAction(i); + if (CanModifyActions) { - unsafe { ImGui.SetDragDropPayload("simulationAction", (nint)(&i), sizeof(int)); } - ImGui.ImageButton(Actions[i].Action.GetIcon(ClassJob).ImGuiHandle, actionSize); - ImGui.EndDragDropSource(); - } - if (ImGui.BeginDragDropTarget()) - { - var payload = ImGui.AcceptDragDropPayload("simulationAction"); - bool isValidPayload; - unsafe { isValidPayload = payload.NativePtr != null; } - if (isValidPayload) + if (ImGui.BeginDragDropSource()) { - int draggedIdx; - unsafe { draggedIdx = *(int*)payload.Data; } - var draggedAction = Actions[draggedIdx].Action; - RemoveAction(draggedIdx); - InsertAction(i, draggedAction); + unsafe { ImGui.SetDragDropPayload("simulationAction", (nint)(&i), sizeof(int)); } + ImGui.ImageButton(Actions[i].Action.GetIcon(ClassJob).ImGuiHandle, actionSize); + ImGui.EndDragDropSource(); + } + if (ImGui.BeginDragDropTarget()) + { + var payload = ImGui.AcceptDragDropPayload("simulationAction"); + bool isValidPayload; + unsafe { isValidPayload = payload.NativePtr != null; } + if (isValidPayload) + { + int draggedIdx; + unsafe { draggedIdx = *(int*)payload.Data; } + var draggedAction = Actions[draggedIdx].Action; + RemoveAction(draggedIdx); + InsertAction(i, draggedAction); + } + ImGui.EndDragDropTarget(); } - ImGui.EndDragDropTarget(); } if (ImGui.IsItemHovered()) { @@ -282,11 +287,9 @@ public sealed partial class SimulatorWindow : Window, IDisposable if (response != ActionResponse.UsedAction) ImGui.TextColored(BadActionTextColor, responseText); ImGui.Text($"{action.GetName(ClassJob)}\n{tooltip}"); - DrawProgressBarTooltip(state.Progress, Input.Recipe.MaxProgress, ProgressColor); - DrawProgressBarTooltip(state.Quality, Input.Recipe.MaxQuality, QualityColor); - DrawProgressBarTooltip(state.Durability, Input.Recipe.MaxDurability, DurabilityColor); - DrawProgressBarTooltip(state.CP, Input.Stats.CP, CPColor); - ImGui.Text("Click to Remove\nDrag to Move"); + DrawAllProgressTooltips(state); + if (CanModifyActions) + ImGui.Text("Click to Remove\nDrag to Move"); ImGui.EndTooltip(); } ImGui.PopID(); @@ -300,11 +303,72 @@ public sealed partial class SimulatorWindow : Window, IDisposable private void DrawSimulationButtons(SynthDrawParams drawParams) { - ImGui.Button("Save"); + var totalWidth = drawParams.Total; + var halfWidth = (totalWidth - ImGui.GetStyle().ItemSpacing.X) / 2f; + var quarterWidth = (halfWidth - ImGui.GetStyle().ItemSpacing.X) / 2f; + var halfButtonSize = new Vector2(halfWidth, ImGui.CalcTextSize("A").Y + ImGui.GetStyle().FramePadding.Y * 2); + var quarterButtonSize = new Vector2(quarterWidth, ImGui.CalcTextSize("A").Y + ImGui.GetStyle().FramePadding.Y * 2); + + var conditionRandomnessText = "Condition Randomness"; + var conditionRandomness = Configuration.ConditionRandomness; + ImGui.BeginDisabled(!CanModifyActions); + if (ImGui.Checkbox(conditionRandomnessText, ref conditionRandomness)) + { + Configuration.ConditionRandomness = conditionRandomness; + Configuration.Save(); + ResetSimulator(); + } + ImGui.EndDisabled(); + if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) + ImGui.SetTooltip("Allows the condition to fluctuate randomly like a real craft.\nTurns off when generating a macro."); + + var labelSize = ImGui.CalcTextSize(conditionRandomnessText); + var checkboxWidth = ImGui.GetFrameHeight() + (labelSize.X > 0 ? ImGui.GetStyle().ItemInnerSpacing.X + labelSize.X : 0); + ImGui.PushFont(UiBuilder.IconFont); + var cogWidth = ImGui.CalcTextSize(FontAwesomeIcon.Cog.ToIconString()).X; + ImGui.PopFont(); + ImGui.SameLine(0, totalWidth - ImGui.GetStyle().ItemSpacing.X - checkboxWidth - cogWidth); + ImGuiComponents.IconButton("simSettingsButton", FontAwesomeIcon.Cog); + + // + + var macroName = MacroName; + ImGui.SetNextItemWidth(halfWidth); + if (ImGui.InputTextWithHint("", "Macro Name", ref macroName, 64)) + MacroName = macroName; + ImGui.SameLine(); - if (ImGui.Button("Reset")) + + ImGui.SetNextItemWidth(halfWidth); + DrawSimulationGenerateButton(halfButtonSize); + + // + + ImGui.BeginDisabled(!CanModifyActions); + if (Macro != null) + { + if (ImGui.Button("Save", quarterButtonSize)) + { + Macro.Name = MacroName; + Macro.Actions = Actions.Select(a => a.Action).ToList(); + Configuration.Save(); + } + ImGui.SameLine(); + } + if (ImGui.Button("Save New", Macro == null ? halfButtonSize : quarterButtonSize)) + { + Macro = new() { Name = MacroName, Actions = Actions.Select(a => a.Action).ToList() }; + Configuration.Macros.Add(Macro); + Configuration.Save(); + } + ImGui.SameLine(); + if (ImGui.Button("Reset", halfButtonSize)) ClearAllActions(); - ImGui.SameLine(); + ImGui.EndDisabled(); + } + + private void DrawSimulationGenerateButton(Vector2 buttonSize) + { var state = GenerateSolverState(); string buttonText; string tooltipText; @@ -342,7 +406,7 @@ public sealed partial class SimulatorWindow : Window, IDisposable } } ImGui.BeginDisabled(!isEnabled); - if (ImGui.Button(buttonText)) + if (ImGui.Button(buttonText, buttonSize)) { if (!SolverTask.IsCompleted) { @@ -370,17 +434,5 @@ public sealed partial class SimulatorWindow : Window, IDisposable ImGui.EndDisabled(); if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) ImGui.SetTooltip(tooltipText); - ImGui.SameLine(); - ImGuiComponents.IconButton(FontAwesomeIcon.Cog); - ImGui.SameLine(); - var conditionRandomness = Configuration.ConditionRandomness; - if (ImGui.Checkbox("Condition Randomness", ref conditionRandomness)) - { - Configuration.ConditionRandomness = conditionRandomness; - Configuration.Save(); - ResetSimulator(); - } - if (ImGui.IsItemHovered()) - ImGui.SetTooltip("Allows the condition to fluctuate randomly like a real craft.\nTurns off when generating a macro."); } } diff --git a/Craftimizer/Windows/SimulatorWindowDrawerUtils.cs b/Craftimizer/Windows/SimulatorWindowDrawerUtils.cs index 06bbe35..a1dd47d 100644 --- a/Craftimizer/Windows/SimulatorWindowDrawerUtils.cs +++ b/Craftimizer/Windows/SimulatorWindowDrawerUtils.cs @@ -1,3 +1,4 @@ +using Craftimizer.Simulator; using Dalamud.Interface.Windowing; using ImGuiNET; using System; @@ -117,6 +118,22 @@ public sealed partial class SimulatorWindow : Window, IDisposable ImGuiUtils.EndGroupPanel(); } + public static void DrawAllProgressTooltips(SimulationState state) + { + DrawProgressBarTooltip(state.Progress, state.Input.Recipe.MaxProgress, ProgressColor); + if (ImGui.IsItemHovered()) + ImGui.SetTooltip($"Progress: {state.Progress} / {state.Input.Recipe.MaxProgress}"); + DrawProgressBarTooltip(state.Quality, state.Input.Recipe.MaxQuality, QualityColor); + if (ImGui.IsItemHovered()) + ImGui.SetTooltip($"Quality: {state.Quality} / {state.Input.Recipe.MaxQuality}"); + DrawProgressBarTooltip(state.Durability, state.Input.Recipe.MaxDurability, DurabilityColor); + if (ImGui.IsItemHovered()) + ImGui.SetTooltip($"Durability: {state.Durability} / {state.Input.Recipe.MaxDurability}"); + DrawProgressBarTooltip(state.CP, state.Input.Stats.CP, CPColor); + if (ImGui.IsItemHovered()) + ImGui.SetTooltip($"CP: {state.CP} / {state.Input.Stats.CP}"); + } + private static void DrawProgressBarTooltip(int progress, int maxProgress, Vector4 color) => DrawProgressBar(progress, maxProgress, TooltipProgressBarSize, color); diff --git a/Craftimizer/Windows/SimulatorWindowSolver.cs b/Craftimizer/Windows/SimulatorWindowSolver.cs index fafc6a8..9420e77 100644 --- a/Craftimizer/Windows/SimulatorWindowSolver.cs +++ b/Craftimizer/Windows/SimulatorWindowSolver.cs @@ -16,6 +16,8 @@ public sealed partial class SimulatorWindow : Window, IDisposable private int SolverInitialActionCount { get; set; } private bool SolverActionsChanged { get; set; } = true; + private bool CanModifyActions => SolverTask.IsCompleted; + private void OnActionsChanged() { SolverActionsChanged = true;