diff --git a/Glamourer/Automation/AutoDesignManager.cs b/Glamourer/Automation/AutoDesignManager.cs index 619ba64..ff1988c 100644 --- a/Glamourer/Automation/AutoDesignManager.cs +++ b/Glamourer/Automation/AutoDesignManager.cs @@ -13,12 +13,13 @@ using Glamourer.Services; using Glamourer.Structs; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using OtterGui; using OtterGui.Filesystem; using Penumbra.GameData.Actors; namespace Glamourer.Automation; -public class AutoDesignManager : ISavable, IReadOnlyList +public class AutoDesignManager : ISavable, IReadOnlyList, IDisposable { public const int CurrentVersion = 1; @@ -28,6 +29,7 @@ public class AutoDesignManager : ISavable, IReadOnlyList private readonly DesignManager _designs; private readonly ActorService _actors; private readonly AutomationChanged _event; + private readonly DesignChanged _designEvent; private readonly List _data = new(); private readonly Dictionary _enabled = new(); @@ -36,17 +38,22 @@ public class AutoDesignManager : ISavable, IReadOnlyList => _enabled; public AutoDesignManager(JobService jobs, ActorService actors, SaveService saveService, DesignManager designs, AutomationChanged @event, - FixedDesignMigrator migrator, DesignFileSystem fileSystem) + FixedDesignMigrator migrator, DesignFileSystem fileSystem, DesignChanged designEvent) { _jobs = jobs; _actors = actors; _saveService = saveService; _designs = designs; _event = @event; + _designEvent = designEvent; + _designEvent.Subscribe(OnDesignChange, DesignChanged.Priority.AutoDesignManager); Load(); migrator.ConsumeMigratedData(_actors, fileSystem, this); } + public void Dispose() + => _designEvent.Unsubscribe(OnDesignChange); + public IEnumerator GetEnumerator() => _data.GetEnumerator(); @@ -538,4 +545,27 @@ public class AutoDesignManager : ISavable, IReadOnlyList _ => Array.Empty(), }; } + + private void OnDesignChange(DesignChanged.Type type, Design design, object? data) + { + if (type is not DesignChanged.Type.Deleted) + return; + + foreach (var (set, idx) in this.WithIndex()) + { + var deleted = 0; + for (var i = 0; i < set.Designs.Count; ++i) + { + if (set.Designs[i].Design != design) + continue; + + DeleteDesign(set, i--); + ++deleted; + } + + if (deleted > 0) + Glamourer.Log.Information( + $"Removed {deleted} automated designs from automated design set {idx} due to deletion of {design.Incognito}."); + } + } } diff --git a/Glamourer/Events/DesignChanged.cs b/Glamourer/Events/DesignChanged.cs index 3e4a51d..c06eb53 100644 --- a/Glamourer/Events/DesignChanged.cs +++ b/Glamourer/Events/DesignChanged.cs @@ -81,6 +81,9 @@ public sealed class DesignChanged : EventWrapper DesignFileSystemSelector = -1, + + /// + AutoDesignManager = 1, } public DesignChanged()