From beb777e3cdc0d52aa8963beb6dcd23c9fd043768 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Wed, 3 May 2023 16:56:38 +0200 Subject: [PATCH] Add some more debugging fuckery for the import popup fuckery. --- Penumbra/Configuration.cs | 1 + Penumbra/Mods/Manager/ModImportManager.cs | 18 +++++- Penumbra/UI/ImportPopup.cs | 23 ++++--- Penumbra/UI/Tabs/DebugTab.cs | 74 ++++++++++++++++++++++- Penumbra/UI/WindowSystem.cs | 14 +++-- 5 files changed, 110 insertions(+), 20 deletions(-) diff --git a/Penumbra/Configuration.cs b/Penumbra/Configuration.cs index cc10e3a7..ff5df1ab 100644 --- a/Penumbra/Configuration.cs +++ b/Penumbra/Configuration.cs @@ -49,6 +49,7 @@ public class Configuration : IPluginConfiguration, ISavable public bool HideRedrawBar { get; set; } = false; public int OptionGroupCollapsibleMin { get; set; } = 5; + public bool DebugSeparateWindow = false; #if DEBUG public bool DebugMode { get; set; } = true; #else diff --git a/Penumbra/Mods/Manager/ModImportManager.cs b/Penumbra/Mods/Manager/ModImportManager.cs index 84aa2c7f..5a9fa319 100644 --- a/Penumbra/Mods/Manager/ModImportManager.cs +++ b/Penumbra/Mods/Manager/ModImportManager.cs @@ -23,6 +23,14 @@ public class ModImportManager : IDisposable private TexToolsImporter? _import; + + internal IEnumerable ModBatches + => _modsToUnpack; + + internal IEnumerable AddableMods + => _modsToAdd; + + public ModImportManager(ModManager modManager, Configuration config, ModEditor modEditor) { _modManager = modManager; @@ -43,9 +51,9 @@ public class ModImportManager : IDisposable Penumbra.ChatService.NotificationMessage($"Failed to import queued mod at {s}, the file does not exist.", "Warning", NotificationType.Warning); return false; - }).Select(s => new FileInfo(s)).ToArray(); + Penumbra.Log.Debug($"Unpacking mods: {string.Join("\n\t", files.Select(f => f.FullName))}."); if (files.Length == 0) return; @@ -62,10 +70,13 @@ public class ModImportManager : IDisposable } public void AddUnpack(IEnumerable paths) - => _modsToUnpack.Enqueue(paths.ToArray()); + => AddUnpack(paths.ToArray()); public void AddUnpack(params string[] paths) - => _modsToUnpack.Enqueue(paths); + { + Penumbra.Log.Debug($"Adding mods to install: {string.Join("\n\t", paths)}"); + _modsToUnpack.Enqueue(paths); + } public void ClearImport() { @@ -117,6 +128,7 @@ public class ModImportManager : IDisposable } else if (dir != null) { + Penumbra.Log.Debug($"Adding newly installed mod to queue: {dir.FullName}"); _modsToAdd.Enqueue(dir); } } diff --git a/Penumbra/UI/ImportPopup.cs b/Penumbra/UI/ImportPopup.cs index 85b4f650..064e1255 100644 --- a/Penumbra/UI/ImportPopup.cs +++ b/Penumbra/UI/ImportPopup.cs @@ -11,10 +11,15 @@ namespace Penumbra.UI; /// Draw the progress information for import. public sealed class ImportPopup : Window { + public const string WindowLabel = "Penumbra Import Status"; + private readonly ModImportManager _modImportManager; + public bool WasDrawn { get; private set; } + public bool PopupWasDrawn { get; private set; } + public ImportPopup(ModImportManager modImportManager) - : base("Penumbra Import Status", + : base(WindowLabel, ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.NoBackground @@ -22,7 +27,7 @@ public sealed class ImportPopup : Window | ImGuiWindowFlags.NoInputs, true) { _modImportManager = modImportManager; - IsOpen = true; + IsOpen = true; SizeConstraints = new WindowSizeConstraints { MinimumSize = Vector2.Zero, @@ -30,15 +35,16 @@ public sealed class ImportPopup : Window }; } - public override void PreDraw() + public override void PreOpenCheck() { + WasDrawn = false; + PopupWasDrawn = false; _modImportManager.TryUnpacking(); - ImGui.SetNextWindowCollapsed(false, ImGuiCond.Always); - IsOpen = true; } public override void Draw() { + WasDrawn = true; if (!_modImportManager.IsImporting(out var import)) return; @@ -47,12 +53,13 @@ public sealed class ImportPopup : Window ImGui.OpenPopup(importPopup); var display = ImGui.GetIO().DisplaySize; - var height = Math.Max(display.Y / 4, 15 * ImGui.GetFrameHeightWithSpacing()); - var width = display.X / 8; - var size = new Vector2(width * 2, height); + var height = Math.Max(display.Y / 4, 15 * ImGui.GetFrameHeightWithSpacing()); + var width = display.X / 8; + var size = new Vector2(width * 2, height); ImGui.SetNextWindowPos(ImGui.GetMainViewport().GetCenter(), ImGuiCond.Always, Vector2.One / 2); ImGui.SetNextWindowSize(size); using var popup = ImRaii.Popup(importPopup, ImGuiWindowFlags.Modal); + PopupWasDrawn = true; using (var child = ImRaii.Child("##import", new Vector2(-1, size.Y - ImGui.GetFrameHeight() * 2))) { if (child) diff --git a/Penumbra/UI/Tabs/DebugTab.cs b/Penumbra/UI/Tabs/DebugTab.cs index 0e821ab8..ae8b047d 100644 --- a/Penumbra/UI/Tabs/DebugTab.cs +++ b/Penumbra/UI/Tabs/DebugTab.cs @@ -2,6 +2,8 @@ using System; using System.IO; using System.Linq; using System.Numerics; +using Dalamud.Interface; +using Dalamud.Interface.Windowing; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Group; using FFXIVClientStructs.FFXIV.Client.Game.Object; @@ -13,6 +15,7 @@ using Penumbra.Api; using Penumbra.Collections.Manager; using Penumbra.GameData.Actors; using Penumbra.GameData.Files; +using Penumbra.Import.Structs; using Penumbra.Interop.ResourceLoading; using Penumbra.Interop.PathResolving; using Penumbra.Interop.Structs; @@ -28,7 +31,7 @@ using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManage namespace Penumbra.UI.Tabs; -public class DebugTab : ITab +public class DebugTab : Window, ITab { private readonly StartTracker _timer; private readonly PerformanceTracker _performance; @@ -50,14 +53,23 @@ public class DebugTab : ITab private readonly SubfileHelper _subfileHelper; private readonly IdentifiedCollectionCache _identifiedCollectionCache; private readonly CutsceneService _cutsceneService; + private readonly ModImportManager _modImporter; + private readonly ImportPopup _importPopup; public DebugTab(StartTracker timer, PerformanceTracker performance, Configuration config, CollectionManager collectionManager, ValidityChecker validityChecker, ModManager modManager, HttpApi httpApi, ActorService actorService, DalamudServices dalamud, StainService stains, CharacterUtility characterUtility, ResidentResourceManager residentResources, ResourceManagerService resourceManager, PenumbraIpcProviders ipc, CollectionResolver collectionResolver, DrawObjectState drawObjectState, PathState pathState, SubfileHelper subfileHelper, IdentifiedCollectionCache identifiedCollectionCache, - CutsceneService cutsceneService) + CutsceneService cutsceneService, ModImportManager modImporter, ImportPopup importPopup) + : base("Penumbra Debug Window", ImGuiWindowFlags.NoCollapse, false) { + IsOpen = true; + SizeConstraints = new WindowSizeConstraints + { + MinimumSize = new Vector2(200, 200), + MaximumSize = new Vector2(2000, 2000), + }; _timer = timer; _performance = performance; _config = config; @@ -78,13 +90,15 @@ public class DebugTab : ITab _subfileHelper = subfileHelper; _identifiedCollectionCache = identifiedCollectionCache; _cutsceneService = cutsceneService; + _modImporter = modImporter; + _importPopup = importPopup; } public ReadOnlySpan Label => "Debug"u8; public bool IsVisible - => _config.DebugMode; + => _config.DebugMode && !_config.DebugSeparateWindow; #if DEBUG private const string DebugVersionString = "(Debug)"; @@ -127,6 +141,14 @@ public class DebugTab : ITab if (!ImGui.CollapsingHeader("General")) return; + var separateWindow = _config.DebugSeparateWindow; + if (ImGui.Checkbox("Draw as Separate Window", ref separateWindow)) + { + IsOpen = true; + _config.DebugSeparateWindow = separateWindow; + _config.Save(); + } + using (var table = Table("##DebugGeneralTable", 2, ImGuiTableFlags.SizingFixedFit)) { if (table) @@ -178,6 +200,40 @@ public class DebugTab : ITab } } } + + using (var tree = TreeNode("Mod Import")) + { + if (tree) + { + using var table = Table("##DebugModImport", 2, ImGuiTableFlags.SizingFixedFit); + if (table) + { + var importing = _modImporter.IsImporting(out var importer); + PrintValue("Is Importing", importing.ToString()); + PrintValue("Importer State", (importer?.State ?? ImporterState.None).ToString()); + PrintValue("Import Window Was Drawn", _importPopup.WasDrawn.ToString()); + PrintValue("Import Popup Was Drawn", _importPopup.PopupWasDrawn.ToString()); + ImGui.TableNextColumn(); + ImGui.TextUnformatted("Import Batches"); + ImGui.TableNextColumn(); + foreach (var (batch, index) in _modImporter.ModBatches.WithIndex()) + { + foreach (var mod in batch) + PrintValue(index.ToString(), mod); + } + + ImGui.TableNextColumn(); + ImGui.TextUnformatted("Addable Mods"); + ImGui.TableNextColumn(); + foreach (var mod in _modImporter.AddableMods) + { + ImGui.TableNextColumn(); + ImGui.TableNextColumn(); + ImGui.TextUnformatted(mod.Name); + } + } + } + } } private void DrawPerformanceTab() @@ -655,4 +711,16 @@ public class DebugTab : ITab ImGui.TableNextColumn(); ImGui.TextUnformatted(value); } + + public override void Draw() + => DrawContent(); + + public override bool DrawConditions() + => _config.DebugMode && _config.DebugSeparateWindow; + + public override void OnClose() + { + _config.DebugSeparateWindow = false; + _config.Save(); + } } diff --git a/Penumbra/UI/WindowSystem.cs b/Penumbra/UI/WindowSystem.cs index 4756accf..bde27bfc 100644 --- a/Penumbra/UI/WindowSystem.cs +++ b/Penumbra/UI/WindowSystem.cs @@ -4,6 +4,7 @@ using Dalamud.Interface.Windowing; using Dalamud.Plugin; using Penumbra.UI; using Penumbra.UI.AdvancedWindow; +using Penumbra.UI.Tabs; namespace Penumbra; @@ -16,17 +17,18 @@ public class PenumbraWindowSystem : IDisposable public readonly PenumbraChangelog Changelog; public PenumbraWindowSystem(DalamudPluginInterface pi, Configuration config, PenumbraChangelog changelog, ConfigWindow window, - LaunchButton _, ModEditWindow editWindow, FileDialogService fileDialog, ImportPopup importPopup) + LaunchButton _, ModEditWindow editWindow, FileDialogService fileDialog, ImportPopup importPopup, DebugTab debugTab) { - _uiBuilder = pi.UiBuilder; - _fileDialog = fileDialog; - Changelog = changelog; - Window = window; - _windowSystem = new WindowSystem("Penumbra"); + _uiBuilder = pi.UiBuilder; + _fileDialog = fileDialog; + Changelog = changelog; + Window = window; + _windowSystem = new WindowSystem("Penumbra"); _windowSystem.AddWindow(changelog.Changelog); _windowSystem.AddWindow(window); _windowSystem.AddWindow(editWindow); _windowSystem.AddWindow(importPopup); + _windowSystem.AddWindow(debugTab); _uiBuilder.OpenConfigUi += Window.Toggle; _uiBuilder.Draw += _windowSystem.Draw; _uiBuilder.Draw += _fileDialog.Draw;