using System; using System.Globalization; using System.Numerics; using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Interface.Utility; using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin; using Dalamud.Plugin.Services; using Questionable.Controller; using Questionable.External; using Questionable.Validation; namespace Questionable.Windows.QuestComponents; internal sealed class QuickAccessButtonsComponent { private readonly QuestRegistry _questRegistry; private readonly QuestValidator _questValidator; private readonly QuestValidationWindow _questValidationWindow; private readonly ICommandManager _commandManager; private readonly IDalamudPluginInterface _pluginInterface; private readonly Configuration _configuration; private readonly WigglyNavAvailability _wigglyNavAvailability; private readonly NavmeshIpc _navmeshIpc; public bool IsReloading { get; set; } public event EventHandler? Reload; public QuickAccessButtonsComponent(QuestRegistry questRegistry, QuestValidator questValidator, QuestValidationWindow questValidationWindow, ICommandManager commandManager, IDalamudPluginInterface pluginInterface, Configuration configuration, WigglyNavAvailability wigglyNavAvailability, NavmeshIpc navmeshIpc) { _questRegistry = questRegistry; _questValidator = questValidator; _questValidationWindow = questValidationWindow; _commandManager = commandManager; _pluginInterface = pluginInterface; _configuration = configuration; _wigglyNavAvailability = wigglyNavAvailability; _navmeshIpc = navmeshIpc; } public void Draw() { float x = ImGui.GetContentRegionAvail().X; float x2 = ImGui.GetStyle().ItemSpacing.X; float width = (x - x2) / 2f; using (ImRaii.Disabled(IsReloading)) { string text = (IsReloading ? "Reloading..." : "Reload Data"); if (UiThemeUtils.IconTextButton(FontAwesomeIcon.RedoAlt, text, width)) { this.Reload?.Invoke(this, EventArgs.Empty); } } ImGui.SameLine(); Configuration.ENavigationProvider navigationProvider = _configuration.General.NavigationProvider; bool flag = navigationProvider == Configuration.ENavigationProvider.WigglyNav && _wigglyNavAvailability.IsCompatible; bool flag2 = navigationProvider == Configuration.ENavigationProvider.WigglyNavShim; bool flag3 = flag || flag2; bool flag4 = flag || (flag2 ? _navmeshIpc.IsNavmeshAvailable : _commandManager.Commands.ContainsKey("/vnav")); string text2 = "Rebuild Navmesh"; if (flag4 && !_navmeshIpc.IsReady) { int buildProgress = _navmeshIpc.GetBuildProgress(); if (buildProgress < 100) { text2 = $"Rebuilding... {buildProgress}%"; } } using (ImRaii.Disabled(!flag4 || !ImGui.IsKeyDown(ImGuiKey.ModCtrl))) { if (UiThemeUtils.IconTextButton(FontAwesomeIcon.Gem, text2, width)) { if (flag3) { _navmeshIpc.Rebuild(); } else { _commandManager.ProcessCommand("/vnav rebuild"); } } } if (ImGui.IsItemHovered(ImGuiHoveredFlags.AllowWhenDisabled)) { if (!flag4) { if (flag3) { ImGui.SetTooltip("WigglyNav is not available."); } else if (navigationProvider == Configuration.ENavigationProvider.WigglyNav) { ImGui.SetTooltip("WigglyNav is unavailable and vnavmesh, its fallback, is not installed."); } else { ImGui.SetTooltip("vnavmesh is not available.\nPlease install it first."); } } else if (flag2) { ImGui.SetTooltip("Hold CTRL to enable this button.\nRebuilding the WigglyNav navmesh (shim surface) will take some time."); } else if (flag) { ImGui.SetTooltip("Hold CTRL to enable this button.\nRebuilding the WigglyNav navmesh will take some time."); } else { ImGui.SetTooltip("Hold CTRL to enable this button.\nRebuilding the navmesh will take some time."); } } if (_questValidator.IssueCount > 0) { DrawValidationIssuesButton(); } } private void DrawValidationIssuesButton() { int errorCount = _questValidator.ErrorCount; int warningCount = _questValidator.WarningCount; int item = _questValidator.IssueCount - errorCount - warningCount; (int, Vector4, FontAwesomeIcon)[] array = new(int, Vector4, FontAwesomeIcon)[3] { (errorCount, ImGuiColors.DalamudRed, FontAwesomeIcon.ExclamationTriangle), (warningCount, ImGuiColors.DalamudYellow, FontAwesomeIcon.ExclamationCircle), (item, ImGuiColors.ParsedBlue, FontAwesomeIcon.InfoCircle) }; int num = 0; (int, Vector4, FontAwesomeIcon)[] array2 = array; for (int i = 0; i < array2.Length; i++) { if (array2[i].Item1 > 0) { num++; } } if (num == 0) { return; } using (ImRaii.PushId("validationissues")) { float num2 = 3f * ImGuiHelpers.GlobalScale; Vector2[] array3 = new Vector2[array.Length]; using (_pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) { for (int j = 0; j < array.Length; j++) { if (array[j].Item1 > 0) { array3[j] = ImGui.CalcTextSize(array[j].Item3.ToIconString()); } } } string[] array4 = new string[array.Length]; Vector2[] array5 = new Vector2[array.Length]; for (int k = 0; k < array.Length; k++) { if (array[k].Item1 > 0) { array4[k] = array[k].Item1.ToString(CultureInfo.InvariantCulture); array5[k] = ImGui.CalcTextSize(array4[k]); } } float num3 = 0f; for (int l = 0; l < array.Length; l++) { num3 += array3[l].X + array5[l].X; } float x = num3 + ImGui.GetStyle().FramePadding.X * 2f + num2 * 2f * (float)num; float frameHeight = ImGui.GetFrameHeight(); Vector2 cursorScreenPos = ImGui.GetCursorScreenPos(); bool flag = ImGui.Button(string.Empty, new Vector2(x, frameHeight)); ImDrawListPtr windowDrawList = ImGui.GetWindowDrawList(); Vector2 vector = new Vector2(cursorScreenPos.X + ImGui.GetStyle().FramePadding.X, cursorScreenPos.Y + ImGui.GetStyle().FramePadding.Y); for (int m = 0; m < array.Length; m++) { if (array[m].Item1 != 0) { using (_pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) { windowDrawList.AddText(vector, ImGui.GetColorU32(array[m].Item2), array[m].Item3.ToIconString()); } Vector2 vector2 = vector; vector2.X = vector.X + array3[m].X + num2; vector = vector2; windowDrawList.AddText(vector, ImGui.GetColorU32(ImGuiCol.Text), array4[m]); vector2 = vector; vector2.X = vector.X + array5[m].X + 2f * num2; vector = vector2; } } if (flag) { _questValidationWindow.IsOpenAndUncollapsed = true; } } } }