From 0db552fe8a823d15200278489465c1d117098603 Mon Sep 17 00:00:00 2001 From: Asriel Camora Date: Mon, 13 Nov 2023 22:23:16 -0800 Subject: [PATCH] IconButtonSquare properly centers and aligns FA icons --- Craftimizer/ImGuiUtils.cs | 44 +++++++++++++++++++++++++-- Craftimizer/Windows/MacroClipboard.cs | 2 +- Craftimizer/Windows/MacroEditor.cs | 8 ++--- Craftimizer/Windows/MacroList.cs | 8 ++--- Craftimizer/Windows/RecipeNote.cs | 4 +-- 5 files changed, 53 insertions(+), 13 deletions(-) diff --git a/Craftimizer/ImGuiUtils.cs b/Craftimizer/ImGuiUtils.cs index de749c9..b86e6f5 100644 --- a/Craftimizer/ImGuiUtils.cs +++ b/Craftimizer/ImGuiUtils.cs @@ -507,10 +507,50 @@ internal static class ImGuiUtils return ImGuiExtras.InputTextEx(label, hint, ref input, maxLength, size, flags | Multiline, callback, user_data); } - public static bool IconButtonSized(FontAwesomeIcon icon, Vector2 size) + private static Vector2 GetIconSize(FontAwesomeIcon icon) { using var font = ImRaii.PushFont(UiBuilder.IconFont); - var ret = ImGui.Button(icon.ToIconString(), size); + return ImGui.CalcTextSize(icon.ToIconString()); + } + + private static void DrawCenteredIcon(FontAwesomeIcon icon, Vector2 offset, Vector2 size) + { + var iconSize = GetIconSize(icon); + + float scale; + Vector2 iconOffset; + if (iconSize.X > iconSize.Y) + { + scale = size.X / iconSize.X; + iconOffset = new(0, (size.Y - (iconSize.Y * scale)) / 2f); + } + else if (iconSize.Y > iconSize.X) + { + scale = size.Y / iconSize.Y; + iconOffset = new((size.X - (iconSize.X * scale)) / 2f, 0); + } + else + { + scale = size.X / iconSize.X; + iconOffset = Vector2.Zero; + } + + ImGui.GetWindowDrawList().AddText(UiBuilder.IconFont, UiBuilder.IconFont.FontSize * scale, offset + iconOffset, ImGui.GetColorU32(ImGuiCol.Text), icon.ToIconString()); + } + + public static bool IconButtonSquare(FontAwesomeIcon icon, float size = -1) + { + var ret = false; + + var buttonSize = new Vector2(size == -1 ? ImGui.GetFrameHeight() : size); + var pos = ImGui.GetCursorScreenPos(); + var spacing = new Vector2(ImGui.GetStyle().FramePadding.Y); + + if (ImGui.Button($"###{icon.ToIconString()}", buttonSize)) + ret = true; + + DrawCenteredIcon(icon, pos + spacing, buttonSize - spacing * 2); + return ret; } diff --git a/Craftimizer/Windows/MacroClipboard.cs b/Craftimizer/Windows/MacroClipboard.cs index ee13d72..989ce6a 100644 --- a/Craftimizer/Windows/MacroClipboard.cs +++ b/Craftimizer/Windows/MacroClipboard.cs @@ -49,7 +49,7 @@ public sealed class MacroClipboard : Window, IDisposable ImGui.SetCursorPos(buttonCursor); { using var color = ImRaii.PushColor(ImGuiCol.Button, ImGui.GetColorU32(buttonActive ? ImGuiCol.ButtonActive : ImGuiCol.ButtonHovered), buttonHovered); - ImGuiUtils.IconButtonSized(FontAwesomeIcon.Paste, new(ImGui.GetFrameHeight())); + ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Paste); if (buttonClicked) { ImGui.SetClipboardText(macro); diff --git a/Craftimizer/Windows/MacroEditor.cs b/Craftimizer/Windows/MacroEditor.cs index 801970d..46cb057 100644 --- a/Craftimizer/Windows/MacroEditor.cs +++ b/Craftimizer/Windows/MacroEditor.cs @@ -1314,14 +1314,14 @@ public sealed class MacroEditor : Window, IDisposable "can vary wildly depending on the solver's settings."); } ImGui.SameLine(); - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Paste, new(height))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Paste)) Service.Plugin.CopyMacro(Macro.Select(s => s.Action).ToArray()); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Copy to Clipboard"); ImGui.SameLine(); using (var _disabled = ImRaii.Disabled(SolverRunning)) { - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.FileImport, new(height))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.FileImport)) ShowImportPopup(); } if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) @@ -1332,7 +1332,7 @@ public sealed class MacroEditor : Window, IDisposable { using (var _disabled = ImRaii.Disabled(SolverRunning)) { - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Undo, new(height))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Undo)) { SolverStartStepCount = null; Macro.Clear(); @@ -1346,7 +1346,7 @@ public sealed class MacroEditor : Window, IDisposable ImGui.SameLine(); using (var _disabled = ImRaii.Disabled(SolverRunning)) { - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Trash, new(height))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Trash)) { SolverStartStepCount = null; Macro.Clear(); diff --git a/Craftimizer/Windows/MacroList.cs b/Craftimizer/Windows/MacroList.cs index 6bc5b56..aee068d 100644 --- a/Craftimizer/Windows/MacroList.cs +++ b/Craftimizer/Windows/MacroList.cs @@ -197,23 +197,23 @@ public sealed class MacroList : Window, IDisposable ImGui.TableNextColumn(); { - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Paste, new(miniRowHeight))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Paste, miniRowHeight)) Service.Plugin.CopyMacro(macro.Actions); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Copy to Clipboard"); ImGui.SameLine(); - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Trash, new(miniRowHeight)) && ImGui.GetIO().KeyShift) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Trash, miniRowHeight) && ImGui.GetIO().KeyShift) Service.Configuration.RemoveMacro(macro); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Delete (Hold Shift)"); - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.PencilAlt, new(miniRowHeight))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.PencilAlt, miniRowHeight)) ShowRenamePopup(macro); DrawRenamePopup(macro); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Rename"); ImGui.SameLine(); - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Edit, new(miniRowHeight))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Edit, miniRowHeight)) OpenEditor(macro); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Open in Simulator"); diff --git a/Craftimizer/Windows/RecipeNote.cs b/Craftimizer/Windows/RecipeNote.cs index a660e85..f33b912 100644 --- a/Craftimizer/Windows/RecipeNote.cs +++ b/Craftimizer/Windows/RecipeNote.cs @@ -644,11 +644,11 @@ public sealed unsafe class RecipeNote : Window, IDisposable ImGui.TableNextColumn(); { - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Edit, new(miniRowHeight))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Edit, miniRowHeight)) Service.Plugin.OpenMacroEditor(CharacterStats!, RecipeData!, new(Service.ClientState.LocalPlayer!.StatusList), macro.Actions, setter); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Open in Simulator"); - if (ImGuiUtils.IconButtonSized(FontAwesomeIcon.Paste, new(miniRowHeight))) + if (ImGuiUtils.IconButtonSquare(FontAwesomeIcon.Paste, miniRowHeight)) Service.Plugin.CopyMacro(macro.Actions); if (ImGui.IsItemHovered()) ImGui.SetTooltip("Copy to Clipboard");