From e4883b15cc0c5383ab107c875604532e7159de42 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Thu, 23 May 2024 23:40:09 +0200 Subject: [PATCH] Add a overwrite with player state button to design tab. --- Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs | 37 +++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs index f00a74c..e0d2da7 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs @@ -17,6 +17,7 @@ using OtterGui.Raii; using Penumbra.GameData.Enums; using System; using static Glamourer.Gui.Tabs.HeaderDrawer; +using static System.Net.Mime.MediaTypeNames; namespace Glamourer.Gui.Tabs.DesignTab; @@ -38,8 +39,8 @@ public class DesignPanel private readonly CustomizeParameterDrawer _parameterDrawer; private readonly DesignLinkDrawer _designLinkDrawer; private readonly MaterialDrawer _materials; - private readonly Button[] _leftButtons; - private readonly Button[] _rightButtons; + private readonly Button[] _leftButtons; + private readonly Button[] _rightButtons; public DesignPanel(DesignFileSystemSelector selector, @@ -78,6 +79,7 @@ public class DesignPanel new SetFromClipboardButton(this), new UndoButton(this), new ExportToClipboardButton(this), + new ApplyCharacterButton(this), ]; _rightButtons = [ @@ -561,4 +563,35 @@ public class DesignPanel } } } + + private sealed class ApplyCharacterButton(DesignPanel panel) : Button + { + public override bool Visible + => panel._selector.Selected != null && panel._objects.Player.Valid; + + protected override string Description + => "Overwrite this design with your character's current state."; + + protected override FontAwesomeIcon Icon + => FontAwesomeIcon.UserEdit; + + protected override void OnClick() + { + try + { + var (player, actor) = panel._objects.PlayerData; + if (!player.IsValid || !actor.Valid || !panel._state.GetOrCreate(player, actor.Objects[0], out var state)) + throw new Exception("No player state available."); + + var design = panel._converter.Convert(state, ApplicationRules.FromModifiers(state)) + ?? throw new Exception("The clipboard did not contain valid data."); + panel._manager.ApplyDesign(panel._selector.Selected!, design); + } + catch (Exception ex) + { + Glamourer.Messager.NotificationMessage(ex, $"Could not apply player state to {panel._selector.Selected!.Name}.", + $"Could not apply player state to design {panel._selector.Selected!.Identifier}", NotificationType.Error, false); + } + } + } }