Add option to apply designs to player with doubl click.

This commit is contained in:
Ottermandias 2024-03-01 23:41:30 +01:00
parent 64c1f75ee0
commit bfe50f459d
5 changed files with 80 additions and 8 deletions

View file

@ -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;

View file

@ -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<Design, Design
private readonly DesignConverter _converter;
private readonly TabSelected _selectionEvent;
private readonly DesignColors _designColors;
private readonly DesignApplier _designApplier;
private string? _clipboardText;
private Design? _cloneDesign;
@ -43,7 +45,8 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
{ }
public DesignFileSystemSelector(DesignManager designManager, DesignFileSystem fileSystem, IKeyState keyState, DesignChanged @event,
Configuration config, DesignConverter converter, TabSelected selectionEvent, Logger log, DesignColors designColors)
Configuration config, DesignConverter converter, TabSelected selectionEvent, Logger log, DesignColors designColors,
DesignApplier designApplier)
: base(fileSystem, keyState, log, allowMultipleSelection: true)
{
_designManager = designManager;
@ -52,6 +55,7 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
_converter = converter;
_selectionEvent = selectionEvent;
_designColors = designColors;
_designApplier = designApplier;
_event.Subscribe(OnDesignChange, DesignChanged.Priority.DesignFileSystemSelector);
_selectionEvent.Subscribe(OnTabSelected, TabSelected.Priority.DesignSelector);
_designColors.ColorChanged += SetFilterDirty;
@ -92,6 +96,8 @@ public sealed class DesignFileSystemSelector : FileSystemSelector<Design, Design
var name = IncognitoMode ? leaf.Value.Incognito : leaf.Value.Name.Text;
using var color = ImRaii.PushColor(ImGuiCol.Text, state.Color);
using var _ = ImRaii.TreeNode(name, flag);
if (_config.AllowDoubleClickToApply && ImGui.IsItemHovered() && ImGui.IsMouseDoubleClicked(ImGuiMouseButton.Left))
_designApplier.ApplyToPlayer(leaf.Value);
}
public override void Dispose()

View file

@ -175,6 +175,9 @@ public class SettingsTab(
ImGui.Separator();
ImGui.Dummy(Vector2.Zero);
Checkbox("Allow Double-Clicking Designs to Apply",
"Tries to apply a design to the current player character When double-clicking it in the design selector.",
config.AllowDoubleClickToApply, v => 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;

View file

@ -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);
}
}

View file

@ -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,