1
0
Fork 0
forked from aly/qstbak
qstbak/Questionable/Questionable.Windows.QuestComponents/QuickAccessButtonsComponent.cs
2026-08-17 20:29:32 +10:00

211 lines
6.4 KiB
C#

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;
}
}
}
}