Improve error messaging

This commit is contained in:
ackwell 2024-01-09 01:15:08 +11:00
parent 36cbca4684
commit c3ba8a2231
3 changed files with 50 additions and 12 deletions

View file

@ -37,7 +37,12 @@ public sealed class ModelManager(IFramework framework, ActiveCollections collect
public Task<MdlFile?> ImportGltf(string inputPath) public Task<MdlFile?> ImportGltf(string inputPath)
{ {
var action = new ImportGltfAction(inputPath); var action = new ImportGltfAction(inputPath);
return Enqueue(action).ContinueWith(_ => action.Out); return Enqueue(action).ContinueWith(task =>
{
if (task.IsFaulted && task.Exception != null)
throw task.Exception;
return action.Out;
});
} }
/// <summary> Try to find the .sklb paths for a .mdl file. </summary> /// <summary> Try to find the .sklb paths for a .mdl file. </summary>
/// <param name="mdlPath"> .mdl file to look up the skeletons for. </param> /// <param name="mdlPath"> .mdl file to look up the skeletons for. </param>

View file

@ -18,9 +18,9 @@ public partial class ModEditWindow
public List<Utf8GamePath>? GamePaths { get; private set; } public List<Utf8GamePath>? GamePaths { get; private set; }
public int GamePathIndex; public int GamePathIndex;
private bool _dirty; private bool _dirty;
public bool PendingIo { get; private set; } public bool PendingIo { get; private set; }
public string? IoException { get; private set; } public List<Exception> IoExceptions { get; private set; } = [];
public MdlTab(ModEditWindow edit, byte[] bytes, string path) public MdlTab(ModEditWindow edit, byte[] bytes, string path)
{ {
@ -85,7 +85,7 @@ public partial class ModEditWindow
task.ContinueWith(t => task.ContinueWith(t =>
{ {
IoException = t.Exception?.ToString(); RecordIoExceptions(t.Exception);
GamePaths = t.Result; GamePaths = t.Result;
PendingIo = false; PendingIo = false;
}); });
@ -120,7 +120,7 @@ public partial class ModEditWindow
} }
catch (Exception exception) catch (Exception exception)
{ {
IoException = exception.ToString(); RecordIoExceptions(exception);
return; return;
} }
@ -128,7 +128,7 @@ public partial class ModEditWindow
_edit._models.ExportToGltf(Mdl, skeletons, outputPath) _edit._models.ExportToGltf(Mdl, skeletons, outputPath)
.ContinueWith(task => .ContinueWith(task =>
{ {
IoException = task.Exception?.ToString(); RecordIoExceptions(task.Exception);
PendingIo = false; PendingIo = false;
}); });
} }
@ -141,7 +141,7 @@ public partial class ModEditWindow
_edit._models.ImportGltf(inputPath) _edit._models.ImportGltf(inputPath)
.ContinueWith(task => .ContinueWith(task =>
{ {
IoException = task.Exception?.ToString(); RecordIoExceptions(task.Exception);
if (task is { IsCompletedSuccessfully: true, Result: not null }) if (task is { IsCompletedSuccessfully: true, Result: not null })
{ {
Initialize(task.Result); Initialize(task.Result);
@ -151,6 +151,15 @@ public partial class ModEditWindow
}); });
} }
private void RecordIoExceptions(Exception? exception)
{
IoExceptions = exception switch {
null => [],
AggregateException ae => ae.Flatten().InnerExceptions.ToList(),
Exception other => [other],
};
}
/// <summary> Read a .sklb from the active collection or game. </summary> /// <summary> Read a .sklb from the active collection or game. </summary>
/// <param name="sklbPath"> Game path to the .sklb to load. </param> /// <param name="sklbPath"> Game path to the .sklb to load. </param>
private SklbFile ReadSklb(string sklbPath) private SklbFile ReadSklb(string sklbPath)

View file

@ -7,6 +7,7 @@ using Penumbra.GameData;
using Penumbra.GameData.Files; using Penumbra.GameData.Files;
using Penumbra.Import.Models; using Penumbra.Import.Models;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.UI.Classes;
namespace Penumbra.UI.AdvancedWindow; namespace Penumbra.UI.AdvancedWindow;
@ -61,8 +62,7 @@ public partial class ModEditWindow
ImGui.SameLine(); ImGui.SameLine();
DrawExport(tab, childSize, disabled); DrawExport(tab, childSize, disabled);
if (tab.IoException != null) DrawIoExceptions(tab);
ImGuiUtil.TextWrapped(tab.IoException);
} }
private void DrawImport(MdlTab tab, Vector2 size, bool _1) private void DrawImport(MdlTab tab, Vector2 size, bool _1)
@ -99,10 +99,10 @@ public partial class ModEditWindow
if (tab.GamePaths == null) if (tab.GamePaths == null)
{ {
if (tab.IoException == null) if (tab.IoExceptions.Count == 0)
ImGui.TextUnformatted("Resolving model game paths."); ImGui.TextUnformatted("Resolving model game paths.");
else else
ImGuiUtil.TextWrapped(tab.IoException); ImGui.TextUnformatted("Failed to resolve model game paths.");
return; return;
} }
@ -127,6 +127,30 @@ public partial class ModEditWindow
); );
} }
private void DrawIoExceptions(MdlTab tab)
{
if (tab.IoExceptions.Count == 0)
return;
var size = new Vector2(ImGui.GetContentRegionAvail().X, 0);
using var frame = ImRaii.FramedGroup("Exceptions", size, headerPreIcon: FontAwesomeIcon.TimesCircle, borderColor: Colors.RegexWarningBorder);
var spaceAvail = ImGui.GetContentRegionAvail().X - ImGui.GetStyle().ItemSpacing.X - 100;
foreach (var exception in tab.IoExceptions)
{
var message = $"{exception.GetType().Name}: {exception.Message} {exception.Message}";
var textSize = ImGui.CalcTextSize(message).X;
if (textSize > spaceAvail)
message = message.Substring(0, (int)Math.Floor(message.Length * (spaceAvail / textSize))) + "...";
using (var exceptionNode = ImRaii.TreeNode(message))
{
if (exceptionNode)
ImGuiUtil.TextWrapped(exception.ToString());
}
}
}
private void DrawGamePathCombo(MdlTab tab) private void DrawGamePathCombo(MdlTab tab)
{ {
if (tab.GamePaths!.Count != 0) if (tab.GamePaths!.Count != 0)