Skip automatic updates from temporary settings when applied by design.

This commit is contained in:
Ottermandias 2025-02-19 23:42:05 +01:00
parent 9e7679e70f
commit 5a9e9513f4
4 changed files with 31 additions and 12 deletions

View file

@ -7,12 +7,12 @@ using Penumbra.GameData.Structs;
namespace Glamourer.Interop.Penumbra; namespace Glamourer.Interop.Penumbra;
public class ModSettingApplier(PenumbraService penumbra, Configuration config, ObjectManager objects, CollectionOverrideService overrides) public class ModSettingApplier(PenumbraService penumbra, PenumbraAutoRedrawSkip autoRedrawSkip, Configuration config, ObjectManager objects, CollectionOverrideService overrides)
: IService : IService
{ {
private readonly HashSet<Guid> _collectionTracker = []; private readonly HashSet<Guid> _collectionTracker = [];
public void HandleStateApplication(ActorState state, MergedDesign design) public void HandleStateApplication(ActorState state, MergedDesign design, bool skipAutoRedraw)
{ {
if (!config.AlwaysApplyAssociatedMods || (design.AssociatedMods.Count == 0 && !design.ResetTemporarySettings)) if (!config.AlwaysApplyAssociatedMods || (design.AssociatedMods.Count == 0 && !design.ResetTemporarySettings))
return; return;
@ -26,6 +26,7 @@ public class ModSettingApplier(PenumbraService penumbra, Configuration config, O
} }
_collectionTracker.Clear(); _collectionTracker.Clear();
using var skip = autoRedrawSkip.SkipAutoUpdates(skipAutoRedraw);
foreach (var actor in data.Objects) foreach (var actor in data.Objects)
{ {
var (collection, _, overridden) = overrides.GetCollection(actor, state.Identifier); var (collection, _, overridden) = overrides.GetCollection(actor, state.Identifier);

View file

@ -12,16 +12,18 @@ namespace Glamourer.Interop.Penumbra;
public class PenumbraAutoRedraw : IDisposable, IRequiredService public class PenumbraAutoRedraw : IDisposable, IRequiredService
{ {
private const int WaitFrames = 5; private const int WaitFrames = 5;
private readonly Configuration _config; private readonly Configuration _config;
private readonly PenumbraService _penumbra; private readonly PenumbraService _penumbra;
private readonly StateManager _state; private readonly StateManager _state;
private readonly ObjectManager _objects; private readonly ObjectManager _objects;
private readonly IFramework _framework; private readonly IFramework _framework;
private readonly StateChanged _stateChanged; private readonly StateChanged _stateChanged;
private readonly PenumbraAutoRedrawSkip _skip;
public PenumbraAutoRedraw(PenumbraService penumbra, Configuration config, StateManager state, ObjectManager objects, IFramework framework, public PenumbraAutoRedraw(PenumbraService penumbra, Configuration config, StateManager state, ObjectManager objects, IFramework framework,
StateChanged stateChanged) StateChanged stateChanged, PenumbraAutoRedrawSkip skip)
{ {
_penumbra = penumbra; _penumbra = penumbra;
_config = config; _config = config;
@ -29,6 +31,7 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
_objects = objects; _objects = objects;
_framework = framework; _framework = framework;
_stateChanged = stateChanged; _stateChanged = stateChanged;
_skip = skip;
_penumbra.ModSettingChanged += OnModSettingChange; _penumbra.ModSettingChanged += OnModSettingChange;
_framework.Update += OnFramework; _framework.Update += OnFramework;
_stateChanged.Subscribe(OnStateChanged, StateChanged.Priority.PenumbraAutoRedraw); _stateChanged.Subscribe(OnStateChanged, StateChanged.Priority.PenumbraAutoRedraw);
@ -94,7 +97,7 @@ public class PenumbraAutoRedraw : IDisposable, IRequiredService
} }
}); });
} }
else if (_config.AutoRedrawEquipOnChanges) else if (_config.AutoRedrawEquipOnChanges && !_skip.Skip)
{ {
// Only update once per frame. // Only update once per frame.
var playerName = _penumbra.GetCurrentPlayerCollection(); var playerName = _penumbra.GetCurrentPlayerCollection();

View file

@ -0,0 +1,15 @@
using OtterGui.Classes;
using OtterGui.Services;
namespace Glamourer.Interop.Penumbra;
public class PenumbraAutoRedrawSkip : IService
{
private bool _skipAutoUpdates;
public BoolSetter SkipAutoUpdates(bool skip)
=> new(ref _skipAutoUpdates, skip);
public bool Skip
=> _skipAutoUpdates;
}

View file

@ -262,7 +262,7 @@ public class StateEditor(
public void ApplyDesign(object data, MergedDesign mergedDesign, ApplySettings settings) public void ApplyDesign(object data, MergedDesign mergedDesign, ApplySettings settings)
{ {
var state = (ActorState)data; var state = (ActorState)data;
modApplier.HandleStateApplication(state, mergedDesign); modApplier.HandleStateApplication(state, mergedDesign, true);
if (!Editor.ChangeModelId(state, mergedDesign.Design.DesignData.ModelId, mergedDesign.Design.DesignData.Customize, if (!Editor.ChangeModelId(state, mergedDesign.Design.DesignData.ModelId, mergedDesign.Design.DesignData.Customize,
mergedDesign.Design.GetDesignDataRef().GetEquipmentPtr(), settings.Source, out var oldModelId, settings.Key)) mergedDesign.Design.GetDesignDataRef().GetEquipmentPtr(), settings.Source, out var oldModelId, settings.Key))
return; return;