Files
CustomizeTool/CustomizePlus/UI/Windows/MainWindow/Tabs/SettingsTab.cs
2024-01-09 22:52:17 +03:00

224 lines
7.2 KiB
C#

//using CustomizePlus.UI.Windows.Debug;
using Dalamud.Interface;
using Dalamud.Interface.Internal.Notifications;
using Dalamud.Interface.Utility;
using ImGuiNET;
using OtterGui.Classes;
using OtterGui;
using OtterGui.Raii;
using OtterGui.Widgets;
using System.Diagnostics;
using System.Numerics;
using CustomizePlus.Core.Services;
using CustomizePlus.Configuration.Data;
using CustomizePlus.Profiles;
using CustomizePlus.Templates;
using CustomizePlus.Core.Helpers;
namespace CustomizePlus.UI.Windows.MainWindow.Tabs;
public class SettingsTab
{
private const uint DiscordColor = 0xFFDA8972;
private readonly PluginConfiguration _configuration;
private readonly TemplateManager _templateManager;
private readonly ProfileManager _profileManager;
private readonly HookingService _hookingService;
private readonly SaveService _saveService;
private readonly TemplateEditorManager _templateEditorManager;
private readonly CPlusChangeLog _changeLog;
private readonly MessageService _messageService;
public SettingsTab(
PluginConfiguration configuration,
TemplateManager templateManager,
ProfileManager profileManager,
HookingService hookingService,
SaveService saveService,
TemplateEditorManager templateEditorManager,
CPlusChangeLog changeLog,
MessageService messageService)
{
_configuration = configuration;
_templateManager = templateManager;
_profileManager = profileManager;
_hookingService = hookingService;
_saveService = saveService;
_templateEditorManager = templateEditorManager;
_changeLog = changeLog;
_messageService = messageService;
}
public void Draw()
{
using var child = ImRaii.Child("MainWindowChild");
if (!child)
return;
DrawGeneralSettings();
ImGui.NewLine();
ImGui.NewLine();
using (var child2 = ImRaii.Child("SettingsChild"))
{
DrawInterface();
DrawAdvancedSettings();
}
DrawSupportButtons();
}
#region General Settings
// General Settings
private void DrawGeneralSettings()
{
DrawPluginEnabledCheckbox();
}
private void DrawPluginEnabledCheckbox()
{
using (var disabled = ImRaii.Disabled(_templateEditorManager.IsEditorActive))
{
var isChecked = _configuration.PluginEnabled;
//users doesn't really need to know what exactly this checkbox does so we just tell them it toggles all profiles
if (CtrlHelper.CheckboxWithTextAndHelp("##pluginenabled", "Enable Customize+",
"Globally enables or disables all plugin functionality.", ref isChecked))
{
_configuration.PluginEnabled = isChecked;
_configuration.Save();
_hookingService.ReloadHooks();
}
}
}
#endregion
#region Interface Settings
private void DrawInterface()
{
var isShouldDraw = ImGui.CollapsingHeader("Interface");
if (!isShouldDraw)
return;
DrawHideWindowInCutscene();
DrawFoldersDefaultOpen();
if (Widget.DoubleModifierSelector("Template Deletion Modifier",
"A modifier you need to hold while clicking the Delete Template button for it to take effect.", 100 * ImGuiHelpers.GlobalScale,
_configuration.UISettings.DeleteTemplateModifier, v => _configuration.UISettings.DeleteTemplateModifier = v))
_configuration.Save();
}
private void DrawHideWindowInCutscene()
{
var isChecked = _configuration.UISettings.HideWindowInCutscene;
if (CtrlHelper.CheckboxWithTextAndHelp("##hidewindowincutscene", "Hide plugin windows in cutscenes",
"Controls whether any Fantasia+ windows are hidden during cutscenes or not.", ref isChecked))
{
_configuration.UISettings.HideWindowInCutscene = isChecked;
_configuration.Save();
}
}
private void DrawFoldersDefaultOpen()
{
var isChecked = _configuration.UISettings.FoldersDefaultOpen;
if (CtrlHelper.CheckboxWithTextAndHelp("##foldersdefaultopen", "Open all folders by default",
"Controls whether folders in template and profile lists are open by default or not.", ref isChecked))
{
_configuration.UISettings.FoldersDefaultOpen = isChecked;
_configuration.Save();
}
}
#endregion
#region Advanced Settings
// Advanced Settings
private void DrawAdvancedSettings()
{
var isShouldDraw = ImGui.CollapsingHeader("Advanced");
if (!isShouldDraw)
return;
ImGui.NewLine();
CtrlHelper.LabelWithIcon(FontAwesomeIcon.ExclamationTriangle,
"These are advanced settings. Enable them at your own risk.");
ImGui.NewLine();
DrawEnableRootPositionCheckbox();
DrawDebugModeCheckbox();
}
private void DrawEnableRootPositionCheckbox()
{
var isChecked = _configuration.EditorConfiguration.RootPositionEditingEnabled;
if (CtrlHelper.CheckboxWithTextAndHelp("##rootpos", "Root editing",
"Enables ability to edit the root bones.", ref isChecked))
{
_configuration.EditorConfiguration.RootPositionEditingEnabled = isChecked;
_configuration.Save();
}
}
private void DrawDebugModeCheckbox()
{
var isChecked = _configuration.DebuggingModeEnabled;
if (CtrlHelper.CheckboxWithTextAndHelp("##debugmode", "Debug mode",
"Enables debug mode", ref isChecked))
{
_configuration.DebuggingModeEnabled = isChecked;
_configuration.Save();
}
}
#endregion
#region Support Area
private void DrawSupportButtons()
{
var width = ImGui.CalcTextSize("Join Discord for Support").X + ImGui.GetStyle().FramePadding.X * 2;
var xPos = ImGui.GetWindowWidth() - width;
// Respect the scroll bar width.
if (ImGui.GetScrollMaxY() > 0)
xPos -= ImGui.GetStyle().ScrollbarSize + ImGui.GetStyle().FramePadding.X;
ImGui.SetCursorPos(new Vector2(xPos, 0));
DrawDiscordButton(width);
ImGui.SetCursorPos(new Vector2(xPos, 1 * ImGui.GetFrameHeightWithSpacing()));
if (ImGui.Button("Show update history", new Vector2(width, 0)))
_changeLog.Changelog.ForceOpen = true;
}
/// <summary> Draw a button to open the official discord server. </summary>
private void DrawDiscordButton(float width)
{
const string address = @"https://discord.gg/KvGJCCnG8t";
using var color = ImRaii.PushColor(ImGuiCol.Button, DiscordColor);
if (ImGui.Button("Join Discord for Support", new Vector2(width, 0)))
try
{
var process = new ProcessStartInfo(address)
{
UseShellExecute = true,
};
Process.Start(process);
}
catch
{
_messageService.NotificationMessage($"Unable to open Discord at {address}.", NotificationType.Error, false);
}
ImGuiUtil.HoverTooltip($"Open {address}");
}
#endregion
}