From 2742e4d485f586702115fdc05da636c020a7dedb Mon Sep 17 00:00:00 2001 From: Exter-N Date: Fri, 24 Oct 2025 14:12:42 +0200 Subject: [PATCH] Update AdvancedEditingOpen ephemeral setting --- Penumbra/EphemeralConfig.cs | 2 +- Penumbra/Mods/Manager/ModStorage.cs | 18 ++++++++++++++++++ Penumbra/Mods/ModSelection.cs | 4 ++-- Penumbra/Penumbra.cs | 10 ++++++++-- Penumbra/UI/AdvancedWindow/ModEditWindow.cs | 9 +++------ 5 files changed, 32 insertions(+), 11 deletions(-) diff --git a/Penumbra/EphemeralConfig.cs b/Penumbra/EphemeralConfig.cs index 7a5091be..caf34027 100644 --- a/Penumbra/EphemeralConfig.cs +++ b/Penumbra/EphemeralConfig.cs @@ -41,7 +41,7 @@ public class EphemeralConfig : ISavable, IDisposable, IService public ChangedItemIconFlag ChangedItemFilter { get; set; } = ChangedItemFlagExtensions.DefaultFlags; public bool FixMainWindow { get; set; } = false; public string LastModPath { get; set; } = string.Empty; - public bool AdvancedEditingOpen { get; set; } = false; + public HashSet AdvancedEditingOpenForModPaths { get; set; } = []; public bool ForceRedrawOnFileChange { get; set; } = false; public bool IncognitoMode { get; set; } = false; diff --git a/Penumbra/Mods/Manager/ModStorage.cs b/Penumbra/Mods/Manager/ModStorage.cs index ea82582d..bec06f17 100644 --- a/Penumbra/Mods/Manager/ModStorage.cs +++ b/Penumbra/Mods/Manager/ModStorage.cs @@ -32,6 +32,24 @@ public class ModStorage : IReadOnlyList IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + /// + /// Try to obtain a mod by its directory name (unique identifier). + /// + public bool TryGetMod(string identifier, [NotNullWhen(true)] out Mod? mod) + { + foreach (var m in Mods) + { + if (string.Equals(m.Identifier, identifier, StringComparison.OrdinalIgnoreCase)) + { + mod = m; + return true; + } + } + + mod = null; + return false; + } + /// /// Try to obtain a mod by its directory name (unique identifier, preferred), /// or the first mod of the given name if no directory fits. diff --git a/Penumbra/Mods/ModSelection.cs b/Penumbra/Mods/ModSelection.cs index 986f074b..294d8244 100644 --- a/Penumbra/Mods/ModSelection.cs +++ b/Penumbra/Mods/ModSelection.cs @@ -27,8 +27,8 @@ public class ModSelection : EventBase 0) - SelectMod(mods.FirstOrDefault(m => string.Equals(m.Identifier, config.LastModPath, StringComparison.OrdinalIgnoreCase))); + if (_config.LastModPath.Length > 0 && mods.TryGetMod(config.LastModPath, out var mod)) + SelectMod(mod); _communicator.CollectionChange.Subscribe(OnCollectionChange, CollectionChange.Priority.ModSelection); _communicator.CollectionInheritanceChanged.Subscribe(OnInheritanceChange, CollectionInheritanceChanged.Priority.ModSelection); diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs index 770f809a..24066e6e 100644 --- a/Penumbra/Penumbra.cs +++ b/Penumbra/Penumbra.cs @@ -141,8 +141,14 @@ public class Penumbra : IDalamudPlugin if (!_disposed) { _windowSystem = system; - if (_config is { OpenWindowAtStart: true, Ephemeral.AdvancedEditingOpen: true } && _services.GetService().Mod is {} mod) - _services.GetService().OpenForMod(mod); + if (_config is { OpenWindowAtStart: true, Ephemeral.AdvancedEditingOpenForModPaths.Count: > 0 }) + { + var mods = _services.GetService(); + var editWindowFactory = _services.GetService(); + foreach (var identifier in _config.Ephemeral.AdvancedEditingOpenForModPaths) + if (mods.TryGetMod(identifier, out var mod)) + editWindowFactory.OpenForMod(mod); + } } else system.Dispose(); diff --git a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs index d6657420..73ee867b 100644 --- a/Penumbra/UI/AdvancedWindow/ModEditWindow.cs +++ b/Penumbra/UI/AdvancedWindow/ModEditWindow.cs @@ -180,8 +180,8 @@ public partial class ModEditWindow : IndexedWindow, IDisposable public override void OnClose() { base.OnClose(); - _config.Ephemeral.AdvancedEditingOpen = false; - _config.Ephemeral.Save(); + if (Mod is not null && _config.Ephemeral.AdvancedEditingOpenForModPaths.Remove(Mod.Identifier)) + _config.Ephemeral.Save(); AppendTask(() => { _left.Dispose(); @@ -194,11 +194,8 @@ public partial class ModEditWindow : IndexedWindow, IDisposable public override void Draw() { - if (!_config.Ephemeral.AdvancedEditingOpen) - { - _config.Ephemeral.AdvancedEditingOpen = true; + if (Mod is not null && _config.Ephemeral.AdvancedEditingOpenForModPaths.Add(Mod.Identifier)) _config.Ephemeral.Save(); - } if (IsLoading) {