From 6039be868582e5d4ac4f54f4ee61e81fb54349f2 Mon Sep 17 00:00:00 2001 From: Ottermandias Date: Tue, 11 Oct 2022 15:10:59 +0200 Subject: [PATCH] Added Enabled State API. --- Penumbra.Api | 2 +- Penumbra/Api/IpcTester.cs | 27 +++++++--- Penumbra/Api/PenumbraApi.cs | 67 ++++++++++++++++++++++--- Penumbra/Api/PenumbraIpcProviders.cs | 18 +++++-- Penumbra/Penumbra.cs | 5 ++ Penumbra/UI/ConfigWindow.Changelog.cs | 4 +- Penumbra/UI/ConfigWindow.SettingsTab.cs | 1 - 7 files changed, 102 insertions(+), 22 deletions(-) diff --git a/Penumbra.Api b/Penumbra.Api index 860f4d62..f41af0fb 160000 --- a/Penumbra.Api +++ b/Penumbra.Api @@ -1 +1 @@ -Subproject commit 860f4d6287d5cbb4b70fef1e74d52992e98ed837 +Subproject commit f41af0fb88626f1579d3c4370b32b901f3c4d3c2 diff --git a/Penumbra/Api/IpcTester.cs b/Penumbra/Api/IpcTester.cs index 486eb826..7ccad1ce 100644 --- a/Penumbra/Api/IpcTester.cs +++ b/Penumbra/Api/IpcTester.cs @@ -81,6 +81,7 @@ public class IpcTester : IDisposable { _pluginState.Initialized.Enable(); _pluginState.Disposed.Enable(); + _pluginState.EnabledChange.Enable(); _redrawing.Redrawn.Enable(); _ui.PreSettingsDraw.Enable(); _ui.PostSettingsDraw.Enable(); @@ -99,6 +100,7 @@ public class IpcTester : IDisposable { _pluginState.Initialized.Disable(); _pluginState.Disposed.Disable(); + _pluginState.EnabledChange.Disable(); _redrawing.Redrawn.Disable(); _ui.PreSettingsDraw.Disable(); _ui.PostSettingsDraw.Disable(); @@ -117,6 +119,7 @@ public class IpcTester : IDisposable { _pluginState.Initialized.Dispose(); _pluginState.Disposed.Dispose(); + _pluginState.EnabledChange.Dispose(); _redrawing.Redrawn.Dispose(); _ui.PreSettingsDraw.Dispose(); _ui.PostSettingsDraw.Dispose(); @@ -142,18 +145,23 @@ public class IpcTester : IDisposable private class PluginState { - private readonly DalamudPluginInterface _pi; - public readonly EventSubscriber Initialized; - public readonly EventSubscriber Disposed; + private readonly DalamudPluginInterface _pi; + public readonly EventSubscriber Initialized; + public readonly EventSubscriber Disposed; + public readonly EventSubscriber< bool > EnabledChange; private readonly List< DateTimeOffset > _initializedList = new(); private readonly List< DateTimeOffset > _disposedList = new(); + private DateTimeOffset _lastEnabledChange = DateTimeOffset.UnixEpoch; + private bool? _lastEnabledValue; + public PluginState( DalamudPluginInterface pi ) { - _pi = pi; - Initialized = Ipc.Initialized.Subscriber( pi, AddInitialized ); - Disposed = Ipc.Disposed.Subscriber( pi, AddDisposed ); + _pi = pi; + Initialized = Ipc.Initialized.Subscriber( pi, AddInitialized ); + Disposed = Ipc.Disposed.Subscriber( pi, AddDisposed ); + EnabledChange = Ipc.EnabledChange.Subscriber( pi, SetLastEnabled ); } public void Draw() @@ -193,6 +201,10 @@ public class IpcTester : IDisposable DrawIntro( Ipc.ApiVersions.Label, "Current Version" ); var (breaking, features) = Ipc.ApiVersions.Subscriber( _pi ).Invoke(); ImGui.TextUnformatted( $"{breaking}.{features:D4}" ); + DrawIntro( Ipc.GetEnabledState.Label, "Current State" ); + ImGui.TextUnformatted( $"{Ipc.GetEnabledState.Subscriber( _pi ).Invoke()}" ); + DrawIntro( Ipc.EnabledChange.Label, "Last Change" ); + ImGui.TextUnformatted( _lastEnabledValue is { } v ? $"{_lastEnabledChange} (to {v})" : "Never" ); } private void AddInitialized() @@ -200,6 +212,9 @@ public class IpcTester : IDisposable private void AddDisposed() => _disposedList.Add( DateTimeOffset.UtcNow ); + + private void SetLastEnabled( bool val ) + => ( _lastEnabledChange, _lastEnabledValue ) = ( DateTimeOffset.Now, val ); } private class Configuration diff --git a/Penumbra/Api/PenumbraApi.cs b/Penumbra/Api/PenumbraApi.cs index 9b35332a..0484f986 100644 --- a/Penumbra/Api/PenumbraApi.cs +++ b/Penumbra/Api/PenumbraApi.cs @@ -33,22 +33,46 @@ public class PenumbraApi : IDisposable, IPenumbraApi public event GameObjectRedrawnDelegate? GameObjectRedrawn { - add => _penumbra!.ObjectReloader.GameObjectRedrawn += value; - remove => _penumbra!.ObjectReloader.GameObjectRedrawn -= value; + add + { + CheckInitialized(); + _penumbra!.ObjectReloader.GameObjectRedrawn += value; + } + remove + { + CheckInitialized(); + _penumbra!.ObjectReloader.GameObjectRedrawn -= value; + } } public event ModSettingChangedDelegate? ModSettingChanged; public event CreatingCharacterBaseDelegate? CreatingCharacterBase { - add => PathResolver.DrawObjectState.CreatingCharacterBase += value; - remove => PathResolver.DrawObjectState.CreatingCharacterBase -= value; + add + { + CheckInitialized(); + PathResolver.DrawObjectState.CreatingCharacterBase += value; + } + remove + { + CheckInitialized(); + PathResolver.DrawObjectState.CreatingCharacterBase -= value; + } } public event CreatedCharacterBaseDelegate? CreatedCharacterBase { - add => PathResolver.DrawObjectState.CreatedCharacterBase += value; - remove => PathResolver.DrawObjectState.CreatedCharacterBase -= value; + add + { + CheckInitialized(); + PathResolver.DrawObjectState.CreatedCharacterBase += value; + } + remove + { + CheckInitialized(); + PathResolver.DrawObjectState.CreatedCharacterBase -= value; + } } public bool Valid @@ -104,8 +128,33 @@ public class PenumbraApi : IDisposable, IPenumbraApi public event Action< string, bool >? ModDirectoryChanged { - add => Penumbra.ModManager.ModDirectoryChanged += value; - remove => Penumbra.ModManager.ModDirectoryChanged -= value; + add + { + CheckInitialized(); + Penumbra.ModManager.ModDirectoryChanged += value; + } + remove + { + CheckInitialized(); + Penumbra.ModManager.ModDirectoryChanged -= value; + } + } + + public bool GetEnabledState() + => Penumbra.Config.EnableMods; + + public event Action< bool >? EnabledChange + { + add + { + CheckInitialized(); + _penumbra!.EnabledChange += value; + } + remove + { + CheckInitialized(); + _penumbra!.EnabledChange -= value; + } } public string GetConfiguration() @@ -334,7 +383,9 @@ public class PenumbraApi : IDisposable, IPenumbraApi { CheckInitialized(); if( !Penumbra.ModManager.TryGetMod( modDirectory, modName, out var mod ) ) + { return PenumbraApiEc.NothingChanged; + } Penumbra.ModManager.DeleteMod( mod.Index ); return PenumbraApiEc.Success; diff --git a/Penumbra/Api/PenumbraIpcProviders.cs b/Penumbra/Api/PenumbraIpcProviders.cs index 5156b081..0db02dbd 100644 --- a/Penumbra/Api/PenumbraIpcProviders.cs +++ b/Penumbra/Api/PenumbraIpcProviders.cs @@ -1,6 +1,5 @@ using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Plugin; -using Penumbra.Collections; using Penumbra.GameData.Enums; using System; using System.Collections.Generic; @@ -21,6 +20,8 @@ public class PenumbraIpcProviders : IDisposable internal readonly EventProvider Disposed; internal readonly FuncProvider< int > ApiVersion; internal readonly FuncProvider< (int Breaking, int Features) > ApiVersions; + internal readonly FuncProvider< bool > GetEnabledState; + internal readonly EventProvider< bool > EnabledChange; // Configuration internal readonly FuncProvider< string > GetModDirectory; @@ -98,10 +99,12 @@ public class PenumbraIpcProviders : IDisposable Api = api; // Plugin State - Initialized = Ipc.Initialized.Provider( pi ); - Disposed = Ipc.Disposed.Provider( pi ); - ApiVersion = Ipc.ApiVersion.Provider( pi, DeprecatedVersion ); - ApiVersions = Ipc.ApiVersions.Provider( pi, () => Api.ApiVersion ); + Initialized = Ipc.Initialized.Provider( pi ); + Disposed = Ipc.Disposed.Provider( pi ); + ApiVersion = Ipc.ApiVersion.Provider( pi, DeprecatedVersion ); + ApiVersions = Ipc.ApiVersions.Provider( pi, () => Api.ApiVersion ); + GetEnabledState = Ipc.GetEnabledState.Provider( pi, Api.GetEnabledState ); + EnabledChange = Ipc.EnabledChange.Provider( pi, () => Api.EnabledChange += EnabledChangeEvent, () => Api.EnabledChange -= EnabledChangeEvent ); // Configuration GetModDirectory = Ipc.GetModDirectory.Provider( pi, Api.GetModDirectory ); @@ -195,6 +198,8 @@ public class PenumbraIpcProviders : IDisposable Initialized.Dispose(); ApiVersion.Dispose(); ApiVersions.Dispose(); + GetEnabledState.Dispose(); + EnabledChange.Dispose(); // Configuration GetModDirectory.Dispose(); @@ -290,6 +295,9 @@ public class PenumbraIpcProviders : IDisposable ChangedItemTooltip.Invoke( type, id ); } + private void EnabledChangeEvent( bool value ) + => EnabledChange.Invoke( value ); + private void OnGameObjectRedrawn( IntPtr objectAddress, int objectTableIndex ) => GameObjectRedrawn.Invoke( objectAddress, objectTableIndex ); diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs index cd08a20b..e556c740 100644 --- a/Penumbra/Penumbra.cs +++ b/Penumbra/Penumbra.cs @@ -25,6 +25,7 @@ using Penumbra.Collections; using Penumbra.Interop.Loader; using Penumbra.Interop.Resolver; using Penumbra.Mods; +using Action = System.Action; using CharacterUtility = Penumbra.Interop.CharacterUtility; using ResidentResourceManager = Penumbra.Interop.ResidentResourceManager; @@ -185,6 +186,8 @@ public class Penumbra : IDalamudPlugin } } + public event Action< bool >? EnabledChange; + public bool Enable() { if( Config.EnableMods ) @@ -202,6 +205,7 @@ public class Penumbra : IDalamudPlugin ResidentResources.Reload(); ObjectReloader.RedrawAll( RedrawType.Redraw ); } + EnabledChange?.Invoke( true ); return true; } @@ -223,6 +227,7 @@ public class Penumbra : IDalamudPlugin ResidentResources.Reload(); ObjectReloader.RedrawAll( RedrawType.Redraw ); } + EnabledChange?.Invoke( false ); return true; } diff --git a/Penumbra/UI/ConfigWindow.Changelog.cs b/Penumbra/UI/ConfigWindow.Changelog.cs index 29ae5192..7a3eed8c 100644 --- a/Penumbra/UI/ConfigWindow.Changelog.cs +++ b/Penumbra/UI/ConfigWindow.Changelog.cs @@ -31,7 +31,9 @@ public partial class ConfigWindow .RegisterEntry( "Meta Manipulation editing now highlights if the selected ID is 0 or 1." ) .RegisterEntry( "Fixed a bug when manually adding EQP or EQDP entries to Mods." ) .RegisterEntry( "Updated some tooltips and hints." ) - .RegisterEntry( "Backend changes regarding API/IPC, consumers can but do not need to use the Penumbra.Api library as a submodule." ); + .RegisterEntry( "Backend changes regarding API/IPC, consumers can but do not need to use the Penumbra.Api library as a submodule." ) + .RegisterEntry( "Added API to delete mods and read and set their pseudo-filesystem paths.", 1 ) + .RegisterEntry( "Added API to check Penumbras enabled state and updates to it.", 1 ); private static void Add5_10_0( Changelog log ) => log.NextVersion( "Version 0.5.10.0" ) diff --git a/Penumbra/UI/ConfigWindow.SettingsTab.cs b/Penumbra/UI/ConfigWindow.SettingsTab.cs index 57d50a8b..ab14c749 100644 --- a/Penumbra/UI/ConfigWindow.SettingsTab.cs +++ b/Penumbra/UI/ConfigWindow.SettingsTab.cs @@ -11,7 +11,6 @@ using ImGuiNET; using OtterGui; using OtterGui.Raii; using OtterGui.Widgets; -using Penumbra.GameData.Enums; using Penumbra.UI.Classes; namespace Penumbra.UI;