using Dalamud.Bindings.ImGui; using Dalamud.Interface; using Dalamud.Interface.Components; using Dalamud.Interface.Utility.Raii; using Dalamud.Plugin.Services; using Questionable.Controller; using Questionable.Functions; using Questionable.Model; using Questionable.Model.Questing; namespace Questionable.Windows.JournalComponents; internal sealed class QuestJournalUtils { private readonly QuestController _questController; private readonly QuestFunctions _questFunctions; private readonly ICommandManager _commandManager; public QuestJournalUtils(QuestController questController, QuestFunctions questFunctions, ICommandManager commandManager) { _questController = questController; _questFunctions = questFunctions; _commandManager = commandManager; } public void ShowContextMenu(IQuestInfo questInfo, Quest? quest, string label) { ImU8String strId; if (ImGui.IsItemClicked(ImGuiMouseButton.Right)) { strId = new ImU8String(12, 1); strId.AppendLiteral("##QuestPopup"); strId.AppendFormatted(questInfo.QuestId); ImGui.OpenPopup(strId); } strId = new ImU8String(12, 1); strId.AppendLiteral("##QuestPopup"); strId.AppendFormatted(questInfo.QuestId); using ImRaii.IEndObject endObject = ImRaii.Popup(strId); if (!endObject) { return; } using (ImRaii.Disabled(quest == null || (!_questFunctions.IsReadyToAcceptQuest(questInfo.QuestId) && !_questFunctions.IsQuestAccepted(questInfo.QuestId)))) { if (ImGui.MenuItem("Start as next quest")) { if (quest == null) { return; } if (_questFunctions.IsQuestAccepted(questInfo.QuestId)) { QuestProgressInfo questProgressInfo = _questFunctions.GetQuestProgressInfo(questInfo.QuestId); if (questProgressInfo != null) { _questController.SetStartedQuest(quest, questProgressInfo.Sequence); _questController.Start(label); } } else { _questController.SetNextQuest(quest); _questController.Start(label); } } } bool flag = _commandManager.Commands.ContainsKey("/questinfo"); using (ImRaii.Disabled(!(questInfo.QuestId is QuestId) || !flag)) { if (ImGui.MenuItem("View in Quest Map")) { _commandManager.ProcessCommand($"/questinfo {questInfo.QuestId}"); } } } internal static void ShowFilterContextMenu(QuestJournalComponent journalUi) { if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Filter, "Filter")) { ImGui.OpenPopup("##QuestFilters"); } using ImRaii.IEndObject endObject = ImRaii.Popup("##QuestFilters"); if (!(!endObject) && (ImGui.Checkbox("Show only Available Quests", ref journalUi.Filter.AvailableOnly) || ImGui.Checkbox("Hide Quests Without Path", ref journalUi.Filter.HideNoPaths) || ImGui.Checkbox("Hide Unobtainable Quests", ref journalUi.Filter.HideUnobtainable))) { journalUi.UpdateFilter(); } } }