diff --git a/Glamourer/Configuration.cs b/Glamourer/Configuration.cs index d7b9ec1..4f6c435 100644 --- a/Glamourer/Configuration.cs +++ b/Glamourer/Configuration.cs @@ -44,6 +44,7 @@ public class Configuration : IPluginConfiguration, ISavable public bool ShowColorConfig { get; set; } = true; public bool ChangeEntireItem { get; set; } = false; public bool AlwaysApplyAssociatedMods { get; set; } = false; + public bool AllowDoubleClickToApply { get; set; } = false; public ModifiableHotkey ToggleQuickDesignBar { get; set; } = new(VirtualKey.NO_KEY); public DoubleModifier DeleteDesignModifier { get; set; } = new(ModifierHotkey.Control, ModifierHotkey.Shift); public ChangeLogDisplayType ChangeLogDisplayType { get; set; } = ChangeLogDisplayType.New; diff --git a/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs b/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs index 6321482..cfc3877 100644 --- a/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs +++ b/Glamourer/Gui/Tabs/DesignTab/DesignFileSystemSelector.cs @@ -3,6 +3,7 @@ using Dalamud.Interface.Internal.Notifications; using Dalamud.Plugin.Services; using Glamourer.Designs; using Glamourer.Events; +using Glamourer.Services; using ImGuiNET; using OtterGui; using OtterGui.Classes; @@ -21,6 +22,7 @@ public sealed class DesignFileSystemSelector : FileSystemSelector config.AllowDoubleClickToApply = v); Checkbox("Show all Application Rule Checkboxes for Automation", "Show multiple separate application rule checkboxes for automated designs, instead of a single box for enabling or disabling.", config.ShowAllAutomatedApplicationRules, v => config.ShowAllAutomatedApplicationRules = v); @@ -183,9 +186,6 @@ public class SettingsTab( config.ShowUnlockedItemWarnings, v => config.ShowUnlockedItemWarnings = v); if (config.UseAdvancedParameters) { - //Checkbox("Show Revert Advanced Customizations Button in Quick Design Bar", - // "Show a button to revert only advanced customizations on your character or a target in the quick design bar.", - // config.ShowRevertAdvancedParametersButton, v => config.ShowRevertAdvancedParametersButton = v); Checkbox("Show Color Display Config", "Show the Color Display configuration options in the Advanced Customization panels.", config.ShowColorConfig, v => config.ShowColorConfig = v); Checkbox("Show Palette+ Import Button", @@ -207,13 +207,14 @@ public class SettingsTab( private void DrawQuickDesignBoxes() { - var showAuto = config.EnableAutoDesigns; - var showAdvanced = config.UseAdvancedParameters || config.UseAdvancedDyes; - var numColumns = 6 - (showAuto ? 0 : 1) - (showAdvanced ? 0 : 1); + var showAuto = config.EnableAutoDesigns; + var showAdvanced = config.UseAdvancedParameters || config.UseAdvancedDyes; + var numColumns = 6 - (showAuto ? 0 : 1) - (showAdvanced ? 0 : 1); ImGui.NewLine(); ImGui.TextUnformatted("Show the Following Buttons in the Quick Design Bar:"); ImGui.Dummy(Vector2.Zero); - using var table = ImRaii.Table("##tableQdb", numColumns, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders | ImGuiTableFlags.NoHostExtendX); + using var table = ImRaii.Table("##tableQdb", numColumns, + ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.Borders | ImGuiTableFlags.NoHostExtendX); if (!table) return; diff --git a/Glamourer/Services/DesignApplier.cs b/Glamourer/Services/DesignApplier.cs new file mode 100644 index 0000000..e0134d4 --- /dev/null +++ b/Glamourer/Services/DesignApplier.cs @@ -0,0 +1,61 @@ +using Glamourer.Designs; +using Glamourer.Interop; +using Glamourer.Interop.Structs; +using Glamourer.State; +using OtterGui.Services; +using Penumbra.GameData.Actors; + +namespace Glamourer.Services; + +public sealed class DesignApplier(StateManager stateManager, ObjectManager objects) : IService +{ + public void ApplyToPlayer(DesignBase design) + { + var (player, data) = objects.PlayerData; + if (!data.Valid) + return; + + if (!stateManager.GetOrCreate(player, data.Objects[0], out var state)) + return; + + stateManager.ApplyDesign(state, design, ApplySettings.ManualWithLinks); + } + + public void ApplyToTarget(DesignBase design) + { + var (player, data) = objects.TargetData; + if (!data.Valid) + return; + + if (!stateManager.GetOrCreate(player, data.Objects[0], out var state)) + return; + + stateManager.ApplyDesign(state, design, ApplySettings.ManualWithLinks); + } + + public void Apply(ActorIdentifier actor, DesignBase design) + { + objects.Update(); + Apply(actor, objects.TryGetValue(actor, out var d) ? d : ActorData.Invalid, design, ApplySettings.ManualWithLinks); + } + + public void Apply(ActorIdentifier actor, DesignBase design, ApplySettings settings) + { + objects.Update(); + Apply(actor, objects.TryGetValue(actor, out var d) ? d : ActorData.Invalid, design, settings); + } + + public void Apply(ActorIdentifier actor, ActorData data, DesignBase design) + => Apply(actor, data, design, ApplySettings.ManualWithLinks); + + public void Apply(ActorIdentifier actor, ActorData data, DesignBase design, ApplySettings settings) + { + if (!actor.IsValid || !data.Valid) + return; + + if (!stateManager.GetOrCreate(actor, data.Objects[0], out var state)) + return; + + stateManager.ApplyDesign(state, design, ApplySettings.ManualWithLinks); + } +} diff --git a/Glamourer/State/StateManager.cs b/Glamourer/State/StateManager.cs index 1b190b9..6ea28d9 100644 --- a/Glamourer/State/StateManager.cs +++ b/Glamourer/State/StateManager.cs @@ -68,6 +68,9 @@ public sealed class StateManager( if (TryGetValue(identifier, out state)) return true; + if (!actor.Valid) + return false; + try { // Initial Creation, use the actors data for the base data,