using System.Numerics; using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Colors; using Dalamud.Plugin; using FFXIVClientStructs.FFXIV.Client.Game.UI; using Questionable.Controller; using Questionable.Functions; using Questionable.Model.Questing; namespace Questionable.Windows; internal sealed class UiUtils { private readonly QuestFunctions _questFunctions; private readonly QuestRegistry _questRegistry; private readonly IDalamudPluginInterface _pluginInterface; public UiUtils(QuestFunctions questFunctions, QuestRegistry questRegistry, IDalamudPluginInterface pluginInterface) { _questFunctions = questFunctions; _questRegistry = questRegistry; _pluginInterface = pluginInterface; } public (Vector4 Color, FontAwesomeIcon Icon, string Status) GetQuestStyle(ElementId elementId) { if (_questFunctions.IsQuestAccepted(elementId)) { return (Color: UiThemeUtils.StatusActive, Icon: FontAwesomeIcon.PersonWalkingArrowRight, Status: "Active"); } if (elementId is QuestId questId && _questFunctions.IsDailyAlliedSocietyQuestAndAvailableToday(questId)) { if (_questFunctions.IsQuestBlacklisted(questId)) { return (Color: UiThemeUtils.StatusBlacklisted, Icon: FontAwesomeIcon.Ban, Status: "Blacklisted"); } if (!_questFunctions.IsReadyToAcceptQuest(questId)) { return (Color: UiThemeUtils.StatusComplete, Icon: FontAwesomeIcon.Check, Status: "Complete"); } if (_questFunctions.IsQuestComplete(questId)) { return (Color: UiThemeUtils.StatusAvailableComplete, Icon: FontAwesomeIcon.Running, Status: "Available (Complete)"); } return (Color: UiThemeUtils.StatusAvailable, Icon: FontAwesomeIcon.Running, Status: "Available"); } if (_questFunctions.IsQuestAcceptedOrComplete(elementId)) { return (Color: UiThemeUtils.StatusComplete, Icon: FontAwesomeIcon.Check, Status: "Complete"); } if (_questFunctions.IsQuestUnobtainable(elementId)) { return (Color: UiThemeUtils.StatusUnobtainable, Icon: FontAwesomeIcon.Minus, Status: "Unobtainable"); } if (_questFunctions.IsQuestBlacklisted(elementId)) { return (Color: UiThemeUtils.StatusBlacklisted, Icon: FontAwesomeIcon.Ban, Status: "Blacklisted"); } if (_questFunctions.IsQuestLocked(elementId) || !_questFunctions.IsReadyToAcceptQuest(elementId) || !_questRegistry.IsKnownQuest(elementId)) { return (Color: UiThemeUtils.StatusLocked, Icon: FontAwesomeIcon.Times, Status: "Locked"); } return (Color: UiThemeUtils.StatusAvailable, Icon: FontAwesomeIcon.Running, Status: "Available"); } public static (Vector4 color, FontAwesomeIcon icon) GetInstanceStyle(ushort instanceId) { if (UIState.IsInstanceContentCompleted(instanceId)) { return (color: UiThemeUtils.StatusComplete, icon: FontAwesomeIcon.Check); } if (UIState.IsInstanceContentUnlocked(instanceId)) { return (color: UiThemeUtils.StatusActive, icon: FontAwesomeIcon.Running); } return (color: UiThemeUtils.StatusLocked, icon: FontAwesomeIcon.Times); } public bool ChecklistItem(string text, Vector4 color, FontAwesomeIcon icon, float extraPadding = 0f, bool asBadge = false) { if (asBadge) { UiThemeUtils.StatusBadge(text, color, icon); return ImGui.IsItemHovered(); } if (extraPadding > 0f) { ImGui.SetCursorPosX(ImGui.GetCursorPosX() + extraPadding); } using (_pluginInterface.UiBuilder.IconFontFixedWidthHandle.Push()) { ImGui.TextColored(in color, icon.ToIconString()); } bool num = ImGui.IsItemHovered(); ImGui.SameLine(); if (extraPadding > 0f) { ImGui.SetCursorPosX(ImGui.GetCursorPosX() + extraPadding); } ImGui.TextUnformatted(text); return num | ImGui.IsItemHovered(); } public bool ChecklistItem(string text, bool complete, Vector4? colorOverride = null) { return ChecklistItem(text, colorOverride ?? (complete ? ImGuiColors.ParsedGreen : ImGuiColors.DalamudRed), complete ? FontAwesomeIcon.Check : FontAwesomeIcon.Times); } }