qstbak/Questionable/Questionable.Windows/QuestWindow.cs
2025-11-30 10:36:46 +10:00

194 lines
5.6 KiB
C#

using System;
using System.Numerics;
using Dalamud.Bindings.ImGui;
using Dalamud.Interface;
using Dalamud.Interface.Colors;
using Dalamud.Interface.Windowing;
using Dalamud.Plugin;
using Dalamud.Plugin.Services;
using LLib.ImGui;
using Questionable.Controller;
using Questionable.Controller.GameUi;
using Questionable.Data;
using Questionable.Windows.QuestComponents;
namespace Questionable.Windows;
internal sealed class QuestWindow : LWindow, IPersistableWindowConfig
{
private static readonly Version PluginVersion = typeof(QuestionablePlugin).Assembly.GetName().Version;
private readonly IDalamudPluginInterface _pluginInterface;
private readonly QuestController _questController;
private readonly IObjectTable _objectTable;
private readonly IClientState _clientState;
private readonly Configuration _configuration;
private readonly TerritoryData _territoryData;
private readonly ActiveQuestComponent _activeQuestComponent;
private readonly ARealmRebornComponent _aRealmRebornComponent;
private readonly CreationUtilsComponent _creationUtilsComponent;
private readonly EventInfoComponent _eventInfoComponent;
private readonly QuickAccessButtonsComponent _quickAccessButtonsComponent;
private readonly RemainingTasksComponent _remainingTasksComponent;
private readonly IFramework _framework;
private readonly InteractionUiController _interactionUiController;
private readonly TitleBarButton _minimizeButton;
public WindowConfig WindowConfig => _configuration.DebugWindowConfig;
public bool IsMinimized { get; set; }
public QuestWindow(IDalamudPluginInterface pluginInterface, QuestController questController, IObjectTable objectTable, IClientState clientState, Configuration configuration, TerritoryData territoryData, ActiveQuestComponent activeQuestComponent, ARealmRebornComponent aRealmRebornComponent, EventInfoComponent eventInfoComponent, CreationUtilsComponent creationUtilsComponent, QuickAccessButtonsComponent quickAccessButtonsComponent, RemainingTasksComponent remainingTasksComponent, IFramework framework, InteractionUiController interactionUiController, ConfigWindow configWindow)
: base("Questionable v" + PluginVersion.ToString(3) + "###Questionable", ImGuiWindowFlags.AlwaysAutoResize)
{
QuestWindow questWindow = this;
_pluginInterface = pluginInterface;
_questController = questController;
_objectTable = objectTable;
_clientState = clientState;
_configuration = configuration;
_territoryData = territoryData;
_activeQuestComponent = activeQuestComponent;
_aRealmRebornComponent = aRealmRebornComponent;
_eventInfoComponent = eventInfoComponent;
_creationUtilsComponent = creationUtilsComponent;
_quickAccessButtonsComponent = quickAccessButtonsComponent;
_remainingTasksComponent = remainingTasksComponent;
_framework = framework;
_interactionUiController = interactionUiController;
base.SizeConstraints = new WindowSizeConstraints
{
MinimumSize = new Vector2(240f, 30f),
MaximumSize = default(Vector2)
};
base.RespectCloseHotkey = false;
base.AllowClickthrough = false;
_minimizeButton = new TitleBarButton
{
Icon = FontAwesomeIcon.Minus,
Priority = int.MinValue,
IconOffset = new Vector2(1.5f, 1f),
Click = delegate
{
questWindow.IsMinimized = !questWindow.IsMinimized;
questWindow._minimizeButton.Icon = (questWindow.IsMinimized ? FontAwesomeIcon.WindowMaximize : FontAwesomeIcon.Minus);
},
AvailableClickthrough = true
};
base.TitleBarButtons.Insert(0, _minimizeButton);
base.TitleBarButtons.Add(new TitleBarButton
{
Icon = FontAwesomeIcon.Cog,
IconOffset = new Vector2(1.5f, 1f),
Click = delegate
{
configWindow.IsOpenAndUncollapsed = true;
},
Priority = int.MinValue,
ShowTooltip = delegate
{
ImGui.BeginTooltip();
ImGui.Text("Open Configuration");
ImGui.EndTooltip();
}
});
_activeQuestComponent.Reload += OnReload;
_quickAccessButtonsComponent.Reload += OnReload;
_questController.IsQuestWindowOpenFunction = () => questWindow.IsOpen;
}
public void SaveWindowConfig()
{
_pluginInterface.SavePluginConfig(_configuration);
}
public override void PreOpenCheck()
{
if (_questController.IsRunning)
{
base.IsOpen = true;
base.Flags |= ImGuiWindowFlags.NoCollapse;
base.ShowCloseButton = false;
}
else
{
base.Flags &= ~ImGuiWindowFlags.NoCollapse;
base.ShowCloseButton = true;
}
}
public override bool DrawConditions()
{
if (!_configuration.IsPluginSetupComplete())
{
return false;
}
if (!_clientState.IsLoggedIn || _objectTable.LocalPlayer == null || _clientState.IsPvPExcludingDen)
{
return false;
}
if (_configuration.General.HideInAllInstances && _territoryData.IsDutyInstance(_clientState.TerritoryType))
{
return false;
}
return true;
}
public override void DrawContent()
{
try
{
_activeQuestComponent.Draw(IsMinimized);
if (!IsMinimized)
{
ImGui.Separator();
if (_aRealmRebornComponent.ShouldDraw)
{
_aRealmRebornComponent.Draw();
ImGui.Separator();
}
if (_eventInfoComponent.ShouldDraw)
{
_eventInfoComponent.Draw();
ImGui.Separator();
}
_creationUtilsComponent.Draw();
ImGui.Separator();
_quickAccessButtonsComponent.Draw();
_remainingTasksComponent.Draw();
}
}
catch (Exception ex)
{
ImGui.TextColored(ImGuiColors.DalamudRed, ex.ToString());
}
}
private void OnReload(object? sender, EventArgs e)
{
Reload();
}
internal void Reload()
{
_questController.Reload();
_framework.RunOnTick(delegate
{
_interactionUiController.HandleCurrentDialogueChoices();
}, TimeSpan.FromMilliseconds(200L, 0L));
}
}