Files
CustomizeTool/CustomizePlus/UI/Windows/Controls/PluginStateBlock.cs
2024-04-13 04:29:34 +03:00

109 lines
3.7 KiB
C#

using Dalamud.Interface.Utility;
using Dalamud.Interface;
using ImGuiNET;
using System.Numerics;
using CustomizePlus.Core.Services;
using CustomizePlus.Game.Services;
using CustomizePlus.Configuration.Data;
using CustomizePlus.UI.Windows.MainWindow.Tabs.Templates;
using CustomizePlus.Core.Helpers;
using CustomizePlus.Api;
using CustomizePlus.Core.Data;
namespace CustomizePlus.UI.Windows.Controls;
public class PluginStateBlock
{
private readonly BoneEditorPanel _boneEditorPanel;
private readonly PluginConfiguration _configuration;
private readonly GameStateService _gameStateService;
private readonly HookingService _hookingService;
private readonly CustomizePlusIpc _ipcService;
public PluginStateBlock(
BoneEditorPanel boneEditorPanel,
PluginConfiguration configuration,
GameStateService gameStateService,
HookingService hookingService,
CustomizePlusIpc ipcService)
{
_boneEditorPanel = boneEditorPanel;
_configuration = configuration;
_gameStateService = gameStateService;
_hookingService = hookingService;
_ipcService = ipcService;
}
public void Draw(float yPos)
{
var severity = PluginStateSeverity.Normal;
string? message = null;
if(_hookingService.RenderHookFailed || _hookingService.MovementHookFailed)
{
severity = PluginStateSeverity.Error;
message = $"Detected failure in game hooks. Customize+ disabled.";
}
else if (!_configuration.PluginEnabled)
{
severity = PluginStateSeverity.Warning;
message = "Plugin is disabled, template bone editing is not available.";
}
else if (_boneEditorPanel.IsEditorActive)
{
if (!_boneEditorPanel.IsCharacterFound)
{
severity = PluginStateSeverity.Error;
message = $"Selected preview character was not found.";
}
else
{
if (_boneEditorPanel.HasChanges)
severity = PluginStateSeverity.Warning;
message = $"Editor is active.{(_boneEditorPanel.HasChanges ? " You have unsaved changes, finish template bone editing to open save/revert dialog." : "")}";
}
}
else if (_gameStateService.GameInPosingMode())
{
severity = PluginStateSeverity.Warning;
message = $"GPose active. Compatibility with posing tools is limited.";
}
else if (_ipcService.IPCFailed) //this is a low priority error
{
severity = PluginStateSeverity.Error;
message = $"Detected failure in IPC. Integrations with other plugins will not function.";
}
if (message != null)
{
ImGui.SetCursorPos(new Vector2(ImGui.GetWindowContentRegionMax().X - ImGui.CalcTextSize(message).X - 30, yPos - ImGuiHelpers.GlobalScale));
var icon = FontAwesomeIcon.InfoCircle;
var color = Constants.Colors.Normal;
switch (severity)
{
case PluginStateSeverity.Warning:
icon = FontAwesomeIcon.ExclamationTriangle;
color = Constants.Colors.Warning;
break;
case PluginStateSeverity.Error:
icon = FontAwesomeIcon.ExclamationTriangle;
color = Constants.Colors.Error;
break;
}
ImGui.PushStyleColor(ImGuiCol.Text, color);
CtrlHelper.LabelWithIcon(icon, message, false);
ImGui.PopStyleColor();
}
}
private enum PluginStateSeverity
{
Normal,
Warning,
Error
}
}