From 49768e797de161652980f9ed53450e8999b34b1b Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Sun, 1 Oct 2023 00:20:01 +0200 Subject: [PATCH] Add Shift/Ctrl modifiers to Apply Design buttons. --- Glamourer/Designs/DesignBase.cs | 29 ++++++++++++++++++++- Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs | 29 ++++++++++++++------- 2 files changed, 48 insertions(+), 10 deletions(-) diff --git a/Glamourer/Designs/DesignBase.cs b/Glamourer/Designs/DesignBase.cs index 47937dd..c2d7509 100644 --- a/Glamourer/Designs/DesignBase.cs +++ b/Glamourer/Designs/DesignBase.cs @@ -157,6 +157,31 @@ public class DesignBase public void FixCustomizeApplication(CustomizationSet set, CustomizeFlag flags) => ApplyCustomize = flags.FixApplication(set); + internal FlagRestrictionResetter TemporarilyRestrictApplication(EquipFlag equipFlags, CustomizeFlag customizeFlags) + => new(this, equipFlags, customizeFlags); + + internal readonly struct FlagRestrictionResetter : IDisposable + { + private readonly DesignBase _design; + private readonly EquipFlag _oldEquipFlags; + private readonly CustomizeFlag _oldCustomizeFlags; + + public FlagRestrictionResetter(DesignBase d, EquipFlag equipFlags, CustomizeFlag customizeFlags) + { + _design = d; + _oldEquipFlags = d.ApplyEquip; + _oldCustomizeFlags = d.ApplyCustomize; + d.ApplyEquip &= equipFlags; + d.ApplyCustomize &= customizeFlags; + } + + public void Dispose() + { + _design.ApplyEquip = _oldEquipFlags; + _design.ApplyCustomize = _oldCustomizeFlags; + } + } + #endregion #region Serialization @@ -349,7 +374,9 @@ public class DesignBase void PrintWarning(string msg) { if (msg.Length > 0) - Glamourer.Chat.NotificationMessage($"{msg} ({name})\n\nThis change is not saved automatically. If you want this replacement to stick and the warning to stop appearing, please save the design manually once by changing something in it.", "Warning", NotificationType.Warning); + Glamourer.Chat.NotificationMessage( + $"{msg} ({name})\n\nThis change is not saved automatically. If you want this replacement to stick and the warning to stop appearing, please save the design manually once by changing something in it.", + "Warning", NotificationType.Warning); } var wetness = QuadBool.FromJObject(json["Wetness"], "Value", "Apply", QuadBool.NullFalse); diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs index 9076a69..93bc3d9 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignPanel.cs @@ -75,11 +75,12 @@ public class DesignPanel private HeaderDrawer.Button SetFromClipboardButton() => new() { - Description = "Try to apply a design from your clipboard over this design.\nHold Control to only apply gear.\nHold Shift to only apply customizations.", - Icon = FontAwesomeIcon.Clipboard, - OnClick = SetFromClipboard, - Visible = _selector.Selected != null, - Disabled = _selector.Selected?.WriteProtected() ?? true, + Description = + "Try to apply a design from your clipboard over this design.\nHold Control to only apply gear.\nHold Shift to only apply customizations.", + Icon = FontAwesomeIcon.Clipboard, + OnClick = SetFromClipboard, + Visible = _selector.Selected != null, + Disabled = _selector.Selected?.WriteProtected() ?? true, }; private HeaderDrawer.Button ExportToClipboardButton() @@ -396,9 +397,10 @@ public class DesignPanel { try { - var text = ImGui.GetClipboardText(); + var text = ImGui.GetClipboardText(); var (applyEquip, applyCustomize) = UiHelpers.ConvertKeysToBool(); - var design = _converter.FromBase64(text, applyEquip, applyCustomize, out _) ?? throw new Exception("The clipboard did not contain valid data."); + var design = _converter.FromBase64(text, applyEquip, applyCustomize, out _) + ?? throw new Exception("The clipboard did not contain valid data."); _manager.ApplyDesign(_selector.Selected!, design); } catch (Exception ex) @@ -425,12 +427,17 @@ public class DesignPanel private void DrawApplyToSelf() { var (id, data) = _objects.PlayerData; - if (!ImGuiUtil.DrawDisabledButton("Apply to Yourself", Vector2.Zero, "Apply the current design with its settings to your character.", + if (!ImGuiUtil.DrawDisabledButton("Apply to Yourself", Vector2.Zero, + "Apply the current design with its settings to your character.\nHold Control to only apply gear.\nHold Shift to only apply customizations.", !data.Valid)) return; if (_state.GetOrCreate(id, data.Objects[0], out var state)) + { + var (applyGear, applyCustomize) = UiHelpers.ConvertKeysToFlags(); + using var _ = _selector.Selected!.TemporarilyRestrictApplication(applyGear, applyCustomize); _state.ApplyDesign(_selector.Selected!, state, StateChanged.Source.Manual); + } } private void DrawApplyToTarget() @@ -438,14 +445,18 @@ public class DesignPanel var (id, data) = _objects.TargetData; var tt = id.IsValid ? data.Valid - ? "Apply the current design with its settings to your current target." + ? "Apply the current design with its settings to your current target.\nHold Control to only apply gear.\nHold Shift to only apply customizations." : "The current target can not be manipulated." : "No valid target selected."; if (!ImGuiUtil.DrawDisabledButton("Apply to Target", Vector2.Zero, tt, !data.Valid || _objects.IsInGPose)) return; if (_state.GetOrCreate(id, data.Objects[0], out var state)) + { + var (applyGear, applyCustomize) = UiHelpers.ConvertKeysToFlags(); + using var _ = _selector.Selected!.TemporarilyRestrictApplication(applyGear, applyCustomize); _state.ApplyDesign(_selector.Selected!, state, StateChanged.Source.Manual); + } } private void DrawSaveToDat()