using HSUI.Config; using HSUI.Config.Tree; using Dalamud.Bindings.ImGui; using System; using System.Collections.Generic; using System.Linq; using System.Numerics; namespace HSUI.Helpers { public static class ImGuiHelper { public static void SetTooltip(string? message) { if (message == null) { return; } if (ImGui.IsItemHovered()) { ImGui.SetTooltip(message); } } public static void DrawSeparator(int topSpacing, int bottomSpacing) { DrawSpacing(topSpacing); ImGui.Separator(); DrawSpacing(bottomSpacing); } public static void DrawSpacing(int spacingSize) { for (int i = 0; i < spacingSize; i++) { ImGui.NewLine(); } } public static void NewLineAndTab() { ImGui.NewLine(); Tab(); } public static void Tab() { ImGui.Text(" "); ImGui.SameLine(); } public static Node? DrawExportResetContextMenu(Node node, bool canExport, bool canReset) { Node? nodeToReset = null; if (ImGui.BeginPopupContextItem("ResetContextMenu")) { if (canExport && ImGui.Selectable("Export")) { var exportString = node.GetBase64String(); ImGui.SetClipboardText(exportString ?? ""); } if (canReset && ImGui.Selectable("Reset")) { ImGui.CloseCurrentPopup(); nodeToReset = node; } ImGui.EndPopup(); } return nodeToReset; } public static (bool, bool) DrawConfirmationModal(string title, string message) { return DrawConfirmationModal(title, new string[] { message }); } public static (bool, bool) DrawConfirmationModal(string title, IEnumerable textLines) { ConfigurationManager.Instance.ShowingModalWindow = true; bool didConfirm = false; bool didClose = false; ImGui.OpenPopup(title + " ##HSUI"); Vector2 center = ImGui.GetMainViewport().GetCenter(); ImGui.SetNextWindowPos(center, ImGuiCond.Appearing, new Vector2(0.5f, 0.5f)); bool p_open = true; // i've no idea what this is used for if (ImGui.BeginPopupModal(title + " ##HSUI", ref p_open, ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoMove)) { float width = 300; float height = Math.Min((ImGui.CalcTextSize(" ").Y + 5) * textLines.Count(), 240); ImGui.BeginChild("confirmation_modal_message", new Vector2(width, height), false); foreach (string text in textLines) { ImGui.Text(text); } ImGui.EndChild(); ImGui.NewLine(); if (ImGui.Button("OK", new Vector2(width / 2f - 5, 24))) { ImGui.CloseCurrentPopup(); didConfirm = true; didClose = true; } ImGui.SetItemDefaultFocus(); ImGui.SameLine(); if (ImGui.Button("Cancel", new Vector2(width / 2f - 5, 24))) { ImGui.CloseCurrentPopup(); didClose = true; } ImGui.EndPopup(); } // close button on nav else { didClose = true; } if (didClose) { ConfigurationManager.Instance.ShowingModalWindow = false; } return (didConfirm, didClose); } public static bool DrawErrorModal(string message) { ConfigurationManager.Instance.ShowingModalWindow = true; bool didClose = false; ImGui.OpenPopup("Error ##HSUI"); Vector2 center = ImGui.GetMainViewport().GetCenter(); ImGui.SetNextWindowPos(center, ImGuiCond.Appearing, new Vector2(0.5f, 0.5f)); bool p_open = true; // i've no idea what this is used for if (ImGui.BeginPopupModal("Error ##HSUI", ref p_open, ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoMove)) { ImGui.Text(message); ImGui.NewLine(); var textSize = ImGui.CalcTextSize(message).X; if (ImGui.Button("OK", new Vector2(textSize, 24))) { ImGui.CloseCurrentPopup(); didClose = true; } ImGui.EndPopup(); } // close button on nav else { didClose = true; } if (didClose) { ConfigurationManager.Instance.ShowingModalWindow = false; } return didClose; } public static (bool, bool) DrawInputModal(string title, string message, ref string value) { ConfigurationManager.Instance.ShowingModalWindow = true; bool didConfirm = false; bool didClose = false; ImGui.OpenPopup(title + " ##HSUI"); Vector2 center = ImGui.GetMainViewport().GetCenter(); ImGui.SetNextWindowPos(center, ImGuiCond.Appearing, new Vector2(0.5f, 0.5f)); bool p_open = true; // i've no idea what this is used for if (ImGui.BeginPopupModal(title + " ##HSUI", ref p_open, ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoMove)) { var textSize = ImGui.CalcTextSize(message).X; ImGui.Text(message); ImGui.PushItemWidth(textSize); ImGui.InputText("", ref value, 64); ImGui.NewLine(); if (ImGui.Button("OK", new Vector2(textSize / 2f - 5, 24))) { ImGui.CloseCurrentPopup(); didConfirm = true; didClose = true; } ImGui.SetItemDefaultFocus(); ImGui.SameLine(); if (ImGui.Button("Cancel", new Vector2(textSize / 2f - 5, 24))) { ImGui.CloseCurrentPopup(); didClose = true; } ImGui.EndPopup(); } // close button on nav else { didClose = true; } if (didClose) { ConfigurationManager.Instance.ShowingModalWindow = false; } return (didConfirm, didClose); } public static string? DrawTextTagsList(string name, ref string searchText) { string? selectedTag = null; ImGui.SetNextWindowSize(new(200, 300)); if (ImGui.BeginPopup(name, ImGuiWindowFlags.NoMove)) { if (!ImGui.IsAnyItemActive() && !ImGui.IsAnyItemFocused() && !ImGui.IsMouseClicked(ImGuiMouseButton.Left)) { ImGui.SetKeyboardFocusHere(0); } // search ImGui.InputText("", ref searchText, 64); List keys = new List(); keys.AddRange(TextTagsHelper.TextTags.Keys); keys.AddRange(TextTagsHelper.ExpTags.Keys); keys.AddRange(TextTagsHelper.CharaTextTags.Keys); foreach (string key in keys) { if (searchText.Length > 0 && !key.Contains(searchText)) { continue; } // tag if (ImGui.Selectable(key)) { selectedTag = key; searchText = ""; } // help tooltip if (ImGui.IsItemHovered() && Plugin.ObjectTable.LocalPlayer != null) { string formattedText = TextTagsHelper.FormattedText(key, Plugin.ObjectTable.LocalPlayer); if (formattedText.Length > 0) { ImGui.SetTooltip("Example: " + formattedText); } } } ImGui.EndPopup(); } return selectedTag; } } }