diff --git a/Penumbra/Api/PenumbraApi.cs b/Penumbra/Api/PenumbraApi.cs index 8d1f7a10..103178e4 100644 --- a/Penumbra/Api/PenumbraApi.cs +++ b/Penumbra/Api/PenumbraApi.cs @@ -23,6 +23,8 @@ using Penumbra.String; using Penumbra.String.Classes; using Penumbra.Services; using Penumbra.Collections.Manager; +using Penumbra.Interop.Services; +using Penumbra.UI; namespace Penumbra.Api; @@ -31,20 +33,29 @@ public class PenumbraApi : IDisposable, IPenumbraApi public (int, int) ApiVersion => (4, 19); - public event Action? PreSettingsPanelDraw; - public event Action? PostSettingsPanelDraw; + public event Action? PreSettingsPanelDraw + { + add => _communicator.PreSettingsPanelDraw.Subscribe(value!); + remove => _communicator.PreSettingsPanelDraw.Unsubscribe(value!); + } + + public event Action? PostSettingsPanelDraw + { + add => _communicator.PostSettingsPanelDraw.Subscribe(value!); + remove => _communicator.PostSettingsPanelDraw.Unsubscribe(value!); + } public event GameObjectRedrawnDelegate? GameObjectRedrawn { add { CheckInitialized(); - _penumbra!.RedrawService.GameObjectRedrawn += value; + _redrawService.GameObjectRedrawn += value; } remove { CheckInitialized(); - _penumbra!.RedrawService.GameObjectRedrawn -= value; + _redrawService.GameObjectRedrawn -= value; } } @@ -91,10 +102,9 @@ public class PenumbraApi : IDisposable, IPenumbraApi } public bool Valid - => _penumbra != null; + => _lumina != null; private CommunicatorService _communicator; - private Penumbra _penumbra; private Lumina.GameData? _lumina; private ModManager _modManager; @@ -109,32 +119,39 @@ public class PenumbraApi : IDisposable, IPenumbraApi private CutsceneService _cutsceneService; private ModImportManager _modImportManager; private CollectionEditor _collectionEditor; + private RedrawService _redrawService; + private ModFileSystem _modFileSystem; + private ConfigWindow _configWindow; - public unsafe PenumbraApi(CommunicatorService communicator, Penumbra penumbra, ModManager modManager, ResourceLoader resourceLoader, + public unsafe PenumbraApi(CommunicatorService communicator, ModManager modManager, ResourceLoader resourceLoader, Configuration config, CollectionManager collectionManager, DalamudServices dalamud, TempCollectionManager tempCollections, - TempModManager tempMods, ActorService actors, CollectionResolver collectionResolver, CutsceneService cutsceneService, ModImportManager modImportManager, CollectionEditor collectionEditor) + TempModManager tempMods, ActorService actors, CollectionResolver collectionResolver, CutsceneService cutsceneService, + ModImportManager modImportManager, CollectionEditor collectionEditor, RedrawService redrawService, ModFileSystem modFileSystem, + ConfigWindow configWindow) { - _communicator = communicator; - _penumbra = penumbra; - _modManager = modManager; - _resourceLoader = resourceLoader; - _config = config; - _collectionManager = collectionManager; - _dalamud = dalamud; - _tempCollections = tempCollections; - _tempMods = tempMods; - _actors = actors; - _collectionResolver = collectionResolver; - _cutsceneService = cutsceneService; - _modImportManager = modImportManager; - _collectionEditor = collectionEditor; + _communicator = communicator; + _modManager = modManager; + _resourceLoader = resourceLoader; + _config = config; + _collectionManager = collectionManager; + _dalamud = dalamud; + _tempCollections = tempCollections; + _tempMods = tempMods; + _actors = actors; + _collectionResolver = collectionResolver; + _cutsceneService = cutsceneService; + _modImportManager = modImportManager; + _collectionEditor = collectionEditor; + _redrawService = redrawService; + _modFileSystem = modFileSystem; + _configWindow = configWindow; _lumina = (Lumina.GameData?)_dalamud.GameData.GetType() .GetField("gameData", BindingFlags.Instance | BindingFlags.NonPublic) ?.GetValue(_dalamud.GameData); _resourceLoader.ResourceLoaded += OnResourceLoaded; - _communicator.ModPathChanged.Subscribe(ModPathChangeSubscriber); + _communicator.ModPathChanged.Subscribe(ModPathChangeSubscriber); _communicator.ModSettingChanged.Subscribe(OnModSettingChange, -1000); } @@ -144,11 +161,10 @@ public class PenumbraApi : IDisposable, IPenumbraApi return; _resourceLoader.ResourceLoaded -= OnResourceLoaded; - _communicator.ModPathChanged.Unsubscribe(ModPathChangeSubscriber); + _communicator.ModPathChanged.Unsubscribe(ModPathChangeSubscriber); _communicator.ModSettingChanged.Unsubscribe(OnModSettingChange); _lumina = null; _communicator = null!; - _penumbra = null!; _modManager = null!; _resourceLoader = null!; _config = null!; @@ -161,9 +177,16 @@ public class PenumbraApi : IDisposable, IPenumbraApi _cutsceneService = null!; _modImportManager = null!; _collectionEditor = null!; + _redrawService = null!; + _modFileSystem = null!; + _configWindow = null!; } - public event ChangedItemClick? ChangedItemClicked; + public event ChangedItemClick? ChangedItemClicked + { + add => _communicator.ChangedItemClick.Subscribe(new Action(value!)); + remove => _communicator.ChangedItemClick.Unsubscribe(new Action(value!)); + } public string GetModDirectory() { @@ -201,12 +224,12 @@ public class PenumbraApi : IDisposable, IPenumbraApi add { CheckInitialized(); - _penumbra!.EnabledChange += value; + _communicator.EnabledChanged.Subscribe(value!, int.MinValue); } remove { CheckInitialized(); - _penumbra!.EnabledChange -= value; + _communicator.EnabledChanged.Unsubscribe(value!); } } @@ -216,27 +239,32 @@ public class PenumbraApi : IDisposable, IPenumbraApi return JsonConvert.SerializeObject(_config, Formatting.Indented); } - public event ChangedItemHover? ChangedItemTooltip; + public event ChangedItemHover? ChangedItemTooltip + { + add => _communicator.ChangedItemHover.Subscribe(new Action(value!)); + remove => _communicator.ChangedItemHover.Unsubscribe(new Action(value!)); + } + public event GameObjectResourceResolvedDelegate? GameObjectResourceResolved; public PenumbraApiEc OpenMainWindow(TabType tab, string modDirectory, string modName) { CheckInitialized(); - if (_penumbra!.ConfigWindow == null) + if (_configWindow == null) return PenumbraApiEc.SystemDisposed; - _penumbra!.ConfigWindow.IsOpen = true; + _configWindow.IsOpen = true; if (!Enum.IsDefined(tab)) return PenumbraApiEc.InvalidArgument; if (tab != TabType.None) - _penumbra!.ConfigWindow.SelectTab(tab); + _configWindow.SelectTab(tab); if (tab == TabType.Mods && (modDirectory.Length > 0 || modName.Length > 0)) { if (_modManager.TryGetMod(modDirectory, modName, out var mod)) - _penumbra!.ConfigWindow.SelectMod(mod); + _configWindow.SelectMod(mod); else return PenumbraApiEc.ModMissing; } @@ -247,34 +275,34 @@ public class PenumbraApi : IDisposable, IPenumbraApi public void CloseMainWindow() { CheckInitialized(); - if (_penumbra!.ConfigWindow == null) + if (_configWindow == null) return; - _penumbra!.ConfigWindow.IsOpen = false; + _configWindow.IsOpen = false; } public void RedrawObject(int tableIndex, RedrawType setting) { CheckInitialized(); - _penumbra!.RedrawService.RedrawObject(tableIndex, setting); + _redrawService.RedrawObject(tableIndex, setting); } public void RedrawObject(string name, RedrawType setting) { CheckInitialized(); - _penumbra!.RedrawService.RedrawObject(name, setting); + _redrawService.RedrawObject(name, setting); } public void RedrawObject(GameObject? gameObject, RedrawType setting) { CheckInitialized(); - _penumbra!.RedrawService.RedrawObject(gameObject, setting); + _redrawService.RedrawObject(gameObject, setting); } public void RedrawAll(RedrawType setting) { CheckInitialized(); - _penumbra!.RedrawService.RedrawAll(setting); + _redrawService.RedrawAll(setting); } public string ResolveDefaultPath(string path) @@ -657,7 +685,7 @@ public class PenumbraApi : IDisposable, IPenumbraApi { CheckInitialized(); if (!_modManager.TryGetMod(modDirectory, modName, out var mod) - || !_penumbra!.ModFileSystem.FindLeaf(mod, out var leaf)) + || !_modFileSystem.FindLeaf(mod, out var leaf)) return (PenumbraApiEc.ModMissing, string.Empty, false); var fullPath = leaf.FullName(); @@ -672,12 +700,12 @@ public class PenumbraApi : IDisposable, IPenumbraApi return PenumbraApiEc.InvalidArgument; if (!_modManager.TryGetMod(modDirectory, modName, out var mod) - || !_penumbra!.ModFileSystem.FindLeaf(mod, out var leaf)) + || !_modFileSystem.FindLeaf(mod, out var leaf)) return PenumbraApiEc.ModMissing; try { - _penumbra.ModFileSystem.RenameAndMove(leaf, newPath); + _modFileSystem.RenameAndMove(leaf, newPath); return PenumbraApiEc.Success; } catch @@ -986,16 +1014,6 @@ public class PenumbraApi : IDisposable, IPenumbraApi return Functions.ToCompressedBase64(set, MetaManipulation.CurrentVersion); } - internal bool HasTooltip - => ChangedItemTooltip != null; - - internal void InvokeTooltip(object? it) - => ChangedItemTooltip?.Invoke(it); - - internal void InvokeClick(MouseButton button, object? it) - => ChangedItemClicked?.Invoke(button, it); - - [MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)] private void CheckInitialized() { @@ -1117,12 +1135,6 @@ public class PenumbraApi : IDisposable, IPenumbraApi return true; } - public void InvokePreSettingsPanel(string modDirectory) - => PreSettingsPanelDraw?.Invoke(modDirectory); - - public void InvokePostSettingsPanel(string modDirectory) - => PostSettingsPanelDraw?.Invoke(modDirectory); - // TODO: replace all usages with ActorIdentifier stuff when incrementing API private ActorIdentifier NameToIdentifier(string name, ushort worldId) { diff --git a/Penumbra/Penumbra.cs b/Penumbra/Penumbra.cs index d4c867ab..96e3b937 100644 --- a/Penumbra/Penumbra.cs +++ b/Penumbra/Penumbra.cs @@ -1,4 +1,3 @@ -using System; using System.IO; using System.Linq; using System.Text; @@ -11,7 +10,6 @@ using OtterGui; using OtterGui.Log; using Penumbra.Api; using Penumbra.Api.Enums; -using Penumbra.UI; using Penumbra.Util; using Penumbra.Collections; using Penumbra.Collections.Cache; @@ -21,7 +19,7 @@ using Penumbra.Services; using Penumbra.Interop.Services; using Penumbra.Mods.Manager; using Penumbra.Collections.Manager; -using Penumbra.Mods; +using Penumbra.UI.Tabs; namespace Penumbra; @@ -30,13 +28,8 @@ public class Penumbra : IDalamudPlugin public string Name => "Penumbra"; - public static Logger Log { get; private set; } = null!; - public static ChatService ChatService { get; private set; } = null!; - - public readonly RedrawService RedrawService; - public readonly ModFileSystem ModFileSystem; - public HttpApi HttpApi = null!; - internal ConfigWindow? ConfigWindow { get; private set; } + public static readonly Logger Log = new(); + public static ChatService ChatService { get; private set; } = null!; private readonly ValidityChecker _validityChecker; private readonly ResidentResourceManager _residentResources; @@ -46,30 +39,31 @@ public class Penumbra : IDalamudPlugin private readonly CollectionManager _collectionManager; private readonly Configuration _config; private readonly CharacterUtility _characterUtility; + private readonly RedrawService _redrawService; + private readonly CommunicatorService _communicatorService; private PenumbraWindowSystem? _windowSystem; private bool _disposed; - private readonly PenumbraNew _tmp; + private readonly ServiceManager _tmp; public Penumbra(DalamudPluginInterface pluginInterface) { - Log = PenumbraNew.Log; try { - _tmp = new PenumbraNew(this, pluginInterface); + _tmp = new ServiceManager(this, pluginInterface, Log); ChatService = _tmp.Services.GetRequiredService(); _validityChecker = _tmp.Services.GetRequiredService(); - _tmp.Services.GetRequiredService(); + _tmp.Services.GetRequiredService(); // Initialize because not required anywhere else. _config = _tmp.Services.GetRequiredService(); _characterUtility = _tmp.Services.GetRequiredService(); _tempMods = _tmp.Services.GetRequiredService(); _residentResources = _tmp.Services.GetRequiredService(); - _tmp.Services.GetRequiredService(); - _modManager = _tmp.Services.GetRequiredService(); - _collectionManager = _tmp.Services.GetRequiredService(); - _tempCollections = _tmp.Services.GetRequiredService(); - ModFileSystem = _tmp.Services.GetRequiredService(); - RedrawService = _tmp.Services.GetRequiredService(); + _tmp.Services.GetRequiredService(); // Initialize because not required anywhere else. + _modManager = _tmp.Services.GetRequiredService(); + _collectionManager = _tmp.Services.GetRequiredService(); + _tempCollections = _tmp.Services.GetRequiredService(); + _redrawService = _tmp.Services.GetRequiredService(); + _communicatorService = _tmp.Services.GetRequiredService(); _tmp.Services.GetRequiredService(); // Initialize because not required anywhere else. _tmp.Services.GetRequiredService(); // Initialize because not required anywhere else. using (var t = _tmp.Services.GetRequiredService().Measure(StartTimeType.PathResolver)) @@ -100,7 +94,6 @@ public class Penumbra : IDalamudPlugin { using var timer = _tmp.Services.GetRequiredService().Measure(StartTimeType.Api); var api = _tmp.Services.GetRequiredService(); - HttpApi = _tmp.Services.GetRequiredService(); _tmp.Services.GetRequiredService(); api.ChangedItemTooltip += it => { @@ -120,22 +113,16 @@ public class Penumbra : IDalamudPlugin { using var tInterface = _tmp.Services.GetRequiredService().Measure(StartTimeType.Interface); var system = _tmp.Services.GetRequiredService(); + system.Window.Setup(this, _tmp.Services.GetRequiredService()); _tmp.Services.GetRequiredService(); if (!_disposed) - { _windowSystem = system; - ConfigWindow = system.Window; - } else - { system.Dispose(); - } } ); } - public event Action? EnabledChange; - public bool SetEnabled(bool enabled) { if (enabled == _config.EnableMods) @@ -148,7 +135,7 @@ public class Penumbra : IDalamudPlugin { _collectionManager.Active.Default.SetFiles(_characterUtility); _residentResources.Reload(); - RedrawService.RedrawAll(RedrawType.Redraw); + _redrawService.RedrawAll(RedrawType.Redraw); } } else @@ -157,12 +144,12 @@ public class Penumbra : IDalamudPlugin { _characterUtility.ResetAll(); _residentResources.Reload(); - RedrawService.RedrawAll(RedrawType.Redraw); + _redrawService.RedrawAll(RedrawType.Redraw); } } _config.Save(); - EnabledChange?.Invoke(enabled); + _communicatorService.EnabledChanged.Invoke(enabled); return true; } diff --git a/Penumbra/PenumbraNew.cs b/Penumbra/ServiceManager.cs similarity index 94% rename from Penumbra/PenumbraNew.cs rename to Penumbra/ServiceManager.cs index 5cd501af..af2cec75 100644 --- a/Penumbra/PenumbraNew.cs +++ b/Penumbra/ServiceManager.cs @@ -1,10 +1,8 @@ -using System; using Dalamud.Plugin; using Microsoft.Extensions.DependencyInjection; using OtterGui.Classes; using OtterGui.Log; using Penumbra.Api; -using Penumbra.Collections; using Penumbra.Collections.Manager; using Penumbra.GameData; using Penumbra.GameData.Data; @@ -27,22 +25,18 @@ using Penumbra.Meta; namespace Penumbra; -public class PenumbraNew +public class ServiceManager { - public string Name - => "Penumbra"; + public readonly ServiceProvider Services; - public static readonly Logger Log = new(); - public readonly ServiceProvider Services; - - public PenumbraNew(Penumbra penumbra, DalamudPluginInterface pi) + public ServiceManager(Penumbra penumbra, DalamudPluginInterface pi, Logger log) { var startTimer = new StartTracker(); using var time = startTimer.Measure(StartTimeType.Total); var services = new ServiceCollection(); // Add meta services. - services.AddSingleton(Log) + services.AddSingleton(log) .AddSingleton(startTimer) .AddSingleton() .AddSingleton() diff --git a/Penumbra/Services/CommunicatorService.cs b/Penumbra/Services/CommunicatorService.cs index f3a9a389..a45548c7 100644 --- a/Penumbra/Services/CommunicatorService.cs +++ b/Penumbra/Services/CommunicatorService.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics.CodeAnalysis; using System.IO; using Penumbra.Api.Enums; using Penumbra.Collections; @@ -211,6 +210,90 @@ public sealed class CollectionInheritanceChanged : EventWrapper Invoke(this, collection, inherited); } +/// +/// Triggered when the general Enabled state of Penumbra is changed. +/// +/// Parameter is whether Penumbra is now Enabled (true) or Disabled (false). +/// +/// +public sealed class EnabledChanged : EventWrapper> +{ + public EnabledChanged() + : base(nameof(EnabledChanged)) + { } + + public void Invoke(bool enabled) + => Invoke(this, enabled); +} + +/// +/// Triggered before the settings panel is drawn. +/// +/// Parameter is the identifier (directory name) of the currently selected mod. +/// +/// +public sealed class PreSettingsPanelDraw : EventWrapper> +{ + public PreSettingsPanelDraw() + : base(nameof(PreSettingsPanelDraw)) + { } + + public void Invoke(string modDirectory) + => Invoke(this, modDirectory); +} + +/// +/// Triggered after the settings panel is drawn. +/// +/// Parameter is the identifier (directory name) of the currently selected mod. +/// +/// +public sealed class PostSettingsPanelDraw : EventWrapper> +{ + public PostSettingsPanelDraw() + : base(nameof(PostSettingsPanelDraw)) + { } + + public void Invoke(string modDirectory) + => Invoke(this, modDirectory); +} + +/// +/// Triggered when a Changed Item in Penumbra is hovered. +/// +/// Parameter is the hovered object data if any. +/// +/// +public sealed class ChangedItemHover : EventWrapper> +{ + public ChangedItemHover() + : base(nameof(ChangedItemHover)) + { } + + public void Invoke(object? data) + => Invoke(this, data); + + public bool HasTooltip + => HasSubscribers; +} + +/// +/// Triggered when a Changed Item in Penumbra is clicked. +/// +/// Parameter is the clicked mouse button. +/// Parameter is the clicked object data if any.. +/// +/// +public sealed class ChangedItemClick : EventWrapper> +{ + public ChangedItemClick() + : base(nameof(ChangedItemClick)) + { } + + public void Invoke(MouseButton button, object? data) + => Invoke(this, button, data); +} + public class CommunicatorService : IDisposable { /// @@ -249,6 +332,21 @@ public class CommunicatorService : IDisposable /// public readonly CollectionInheritanceChanged CollectionInheritanceChanged = new(); + /// + public readonly EnabledChanged EnabledChanged = new(); + + /// + public readonly PreSettingsPanelDraw PreSettingsPanelDraw = new(); + + /// + public readonly PostSettingsPanelDraw PostSettingsPanelDraw = new(); + + /// + public readonly ChangedItemHover ChangedItemHover = new(); + + /// + public readonly ChangedItemClick ChangedItemClick = new(); + public void Dispose() { CollectionChange.Dispose(); @@ -263,5 +361,10 @@ public class CommunicatorService : IDisposable ModPathChanged.Dispose(); ModSettingChanged.Dispose(); CollectionInheritanceChanged.Dispose(); + EnabledChanged.Dispose(); + PreSettingsPanelDraw.Dispose(); + PostSettingsPanelDraw.Dispose(); + ChangedItemHover.Dispose(); + ChangedItemClick.Dispose(); } } diff --git a/Penumbra/UI/ConfigWindow.cs b/Penumbra/UI/ConfigWindow.cs index 1a02284e..d676cf62 100644 --- a/Penumbra/UI/ConfigWindow.cs +++ b/Penumbra/UI/ConfigWindow.cs @@ -9,7 +9,8 @@ using Penumbra.Api.Enums; using Penumbra.Mods; using Penumbra.UI.Classes; using Penumbra.UI.Tabs; -using Penumbra.Util; +using Penumbra.Util; + namespace Penumbra.UI; public sealed class ConfigWindow : Window @@ -18,8 +19,8 @@ public sealed class ConfigWindow : Window private readonly Configuration _config; private readonly PerformanceTracker _tracker; private readonly ValidityChecker _validityChecker; - private readonly Penumbra _penumbra; - private readonly ConfigTabBar _configTabs; + private Penumbra? _penumbra; + private ConfigTabBar _configTabs = null!; private string? _lastException; public void SelectTab(TabType tab) @@ -31,15 +32,13 @@ public sealed class ConfigWindow : Window public ConfigWindow(PerformanceTracker tracker, DalamudPluginInterface pi, Configuration config, ValidityChecker checker, - TutorialService tutorial, Penumbra penumbra, ConfigTabBar configTabs) + TutorialService tutorial) : base(GetLabel(checker)) { _pluginInterface = pi; _config = config; _tracker = tracker; _validityChecker = checker; - _penumbra = penumbra; - _configTabs = configTabs; RespectCloseHotkey = true; SizeConstraints = new WindowSizeConstraints() @@ -51,6 +50,15 @@ public sealed class ConfigWindow : Window IsOpen = _config.DebugMode; } + public void Setup(Penumbra penumbra, ConfigTabBar configTabs) + { + _penumbra = penumbra; + _configTabs = configTabs; + } + + public override bool DrawConditions() + => _penumbra != null; + public override void PreDraw() { if (_config.FixMainWindow) @@ -61,7 +69,7 @@ public sealed class ConfigWindow : Window public override void Draw() { - using var timer = _tracker.Measure(PerformanceType.UiMainWindow); + using var timer = _tracker.Measure(PerformanceType.UiMainWindow); UiHelpers.SetupCommonSizes(); try { @@ -111,6 +119,7 @@ public sealed class ConfigWindow : Window var text = e.ToString(); if (text == _lastException) return; + _lastException = text; } else @@ -139,7 +148,7 @@ public sealed class ConfigWindow : Window ImGui.NewLine(); UiHelpers.DrawDiscordButton(0); ImGui.SameLine(); - UiHelpers.DrawSupportButton(_penumbra); + UiHelpers.DrawSupportButton(_penumbra!); ImGui.NewLine(); ImGui.NewLine(); } diff --git a/Penumbra/UI/ModsTab/ModPanelChangedItemsTab.cs b/Penumbra/UI/ModsTab/ModPanelChangedItemsTab.cs index 66d53f6c..ae500b1d 100644 --- a/Penumbra/UI/ModsTab/ModPanelChangedItemsTab.cs +++ b/Penumbra/UI/ModsTab/ModPanelChangedItemsTab.cs @@ -7,22 +7,22 @@ using OtterGui.Classes; using OtterGui.Raii; using OtterGui.Widgets; using Penumbra.Api; -using Penumbra.Mods.Manager; +using Penumbra.Services; namespace Penumbra.UI.ModsTab; public class ModPanelChangedItemsTab : ITab { private readonly ModFileSystemSelector _selector; - private readonly PenumbraApi _api; + private readonly CommunicatorService _communicator; public ReadOnlySpan Label => "Changed Items"u8; - public ModPanelChangedItemsTab(PenumbraApi api, ModFileSystemSelector selector) + public ModPanelChangedItemsTab(ModFileSystemSelector selector, CommunicatorService communicator) { - _api = api; - _selector = selector; + _selector = selector; + _communicator = communicator; } public bool IsVisible @@ -36,6 +36,6 @@ public class ModPanelChangedItemsTab : ITab var zipList = ZipList.FromSortedList((SortedList)_selector.Selected!.ChangedItems); var height = ImGui.GetTextLineHeight(); - ImGuiClip.ClippedDraw(zipList, kvp => UiHelpers.DrawChangedItem(_api, kvp.Item1, kvp.Item2, true), height); + ImGuiClip.ClippedDraw(zipList, kvp => UiHelpers.DrawChangedItem(_communicator, kvp.Item1, kvp.Item2, true), height); } } diff --git a/Penumbra/UI/ModsTab/ModPanelSettingsTab.cs b/Penumbra/UI/ModsTab/ModPanelSettingsTab.cs index e6c66fbd..8d831279 100644 --- a/Penumbra/UI/ModsTab/ModPanelSettingsTab.cs +++ b/Penumbra/UI/ModsTab/ModPanelSettingsTab.cs @@ -5,7 +5,6 @@ using ImGuiNET; using OtterGui.Raii; using OtterGui; using OtterGui.Widgets; -using Penumbra.Api; using Penumbra.Api.Enums; using Penumbra.Collections; using Penumbra.Mods; @@ -14,16 +13,17 @@ using Dalamud.Interface.Components; using Dalamud.Interface; using Penumbra.Collections.Manager; using Penumbra.Mods.Manager; +using Penumbra.Services; namespace Penumbra.UI.ModsTab; public class ModPanelSettingsTab : ITab { private readonly Configuration _config; + private readonly CommunicatorService _communicator; private readonly CollectionManager _collectionManager; private readonly ModFileSystemSelector _selector; private readonly TutorialService _tutorial; - private readonly PenumbraApi _api; private readonly ModManager _modManager; private bool _inherited; @@ -33,13 +33,13 @@ public class ModPanelSettingsTab : ITab private int? _currentPriority = null; public ModPanelSettingsTab(CollectionManager collectionManager, ModManager modManager, ModFileSystemSelector selector, - TutorialService tutorial, PenumbraApi api, Configuration config) + TutorialService tutorial, CommunicatorService communicator, Configuration config) { _collectionManager = collectionManager; + _communicator = communicator; _modManager = modManager; _selector = selector; _tutorial = tutorial; - _api = api; _config = config; } @@ -65,7 +65,7 @@ public class ModPanelSettingsTab : ITab DrawInheritedWarning(); UiHelpers.DefaultLineSpace(); - _api.InvokePreSettingsPanel(_selector.Selected!.ModPath.Name); + _communicator.PreSettingsPanelDraw.Invoke(_selector.Selected!.ModPath.Name); DrawEnabledInput(); _tutorial.OpenTutorial(BasicTutorialSteps.EnablingMods); ImGui.SameLine(); @@ -102,7 +102,7 @@ public class ModPanelSettingsTab : ITab } UiHelpers.DefaultLineSpace(); - _api.InvokePostSettingsPanel(_selector.Selected!.ModPath.Name); + _communicator.PostSettingsPanelDraw.Invoke(_selector.Selected!.ModPath.Name); } /// Draw a big red bar if the current setting is inherited. diff --git a/Penumbra/UI/Tabs/ChangedItemsTab.cs b/Penumbra/UI/Tabs/ChangedItemsTab.cs index 6f36af56..92ce322d 100644 --- a/Penumbra/UI/Tabs/ChangedItemsTab.cs +++ b/Penumbra/UI/Tabs/ChangedItemsTab.cs @@ -7,22 +7,22 @@ using OtterGui; using OtterGui.Classes; using OtterGui.Raii; using OtterGui.Widgets; -using Penumbra.Api; using Penumbra.Collections.Manager; using Penumbra.Mods; +using Penumbra.Services; using Penumbra.UI.Classes; namespace Penumbra.UI.Tabs; public class ChangedItemsTab : ITab { - private readonly CollectionManager _collectionManager; - private readonly PenumbraApi _api; + private readonly CollectionManager _collectionManager; + private readonly CommunicatorService _communicator; - public ChangedItemsTab(CollectionManager collectionManager, PenumbraApi api) + public ChangedItemsTab(CollectionManager collectionManager, CommunicatorService communicator) { _collectionManager = collectionManager; - _api = api; + _communicator = communicator; } public ReadOnlySpan Label @@ -81,7 +81,7 @@ public class ChangedItemsTab : ITab private void DrawChangedItemColumn(KeyValuePair, object?)> item) { ImGui.TableNextColumn(); - UiHelpers.DrawChangedItem(_api, item.Key, item.Value.Item2, false); + UiHelpers.DrawChangedItem(_communicator, item.Key, item.Value.Item2, false); ImGui.TableNextColumn(); if (item.Value.Item1.Count > 0) { diff --git a/Penumbra/UI/Tabs/SettingsTab.cs b/Penumbra/UI/Tabs/SettingsTab.cs index 029e03cd..6983afb7 100644 --- a/Penumbra/UI/Tabs/SettingsTab.cs +++ b/Penumbra/UI/Tabs/SettingsTab.cs @@ -9,6 +9,7 @@ using ImGuiNET; using OtterGui; using OtterGui.Raii; using OtterGui.Widgets; +using Penumbra.Api; using Penumbra.Interop.Services; using Penumbra.Mods.Manager; using Penumbra.Services; @@ -35,10 +36,11 @@ public class SettingsTab : ITab private readonly CharacterUtility _characterUtility; private readonly ResidentResourceManager _residentResources; private readonly DalamudServices _dalamud; + private readonly HttpApi _httpApi; public SettingsTab(Configuration config, FontReloader fontReloader, TutorialService tutorial, Penumbra penumbra, FileDialogService fileDialog, ModManager modManager, ModFileSystemSelector selector, CharacterUtility characterUtility, - ResidentResourceManager residentResources, DalamudServices dalamud, ModExportManager modExportManager) + ResidentResourceManager residentResources, DalamudServices dalamud, ModExportManager modExportManager, HttpApi httpApi) { _config = config; _fontReloader = fontReloader; @@ -51,6 +53,7 @@ public class SettingsTab : ITab _residentResources = residentResources; _dalamud = dalamud; _modExportManager = modExportManager; + _httpApi = httpApi; } public void DrawHeader() @@ -630,7 +633,6 @@ public class SettingsTab : ITab private void DrawAdvancedSettings() { var header = ImGui.CollapsingHeader("Advanced"); - _tutorial.OpenTutorial(BasicTutorialSteps.Deprecated1); if (!header) return; @@ -657,9 +659,9 @@ public class SettingsTab : ITab if (ImGui.Checkbox("##http", ref http)) { if (http) - _penumbra.HttpApi.CreateWebServer(); + _httpApi.CreateWebServer(); else - _penumbra.HttpApi.ShutdownWebServer(); + _httpApi.ShutdownWebServer(); _config.EnableHttpApi = http; _config.Save(); diff --git a/Penumbra/UI/TutorialService.cs b/Penumbra/UI/TutorialService.cs index 9671abde..7f9b2ce3 100644 --- a/Penumbra/UI/TutorialService.cs +++ b/Penumbra/UI/TutorialService.cs @@ -47,10 +47,7 @@ public class TutorialService public const string SelectedCollection = "Selected Collection"; public const string DefaultCollection = "Base Collection"; public const string InterfaceCollection = "Interface Collection"; - public const string ActiveCollections = "Active Collections"; public const string AssignedCollections = "Assigned Collections"; - public const string GroupAssignment = "Group Assignment"; - public const string IndividualAssignments = "Individual Assignments"; public const string SupportedRedrawModifiers = " - nothing, to redraw all characters\n" + " - 'self' or '': your own character\n" diff --git a/Penumbra/UI/UiHelpers.cs b/Penumbra/UI/UiHelpers.cs index 7cd1c120..944223f0 100644 --- a/Penumbra/UI/UiHelpers.cs +++ b/Penumbra/UI/UiHelpers.cs @@ -13,6 +13,7 @@ using Penumbra.Api; using Penumbra.Api.Enums; using Penumbra.GameData.Enums; using Penumbra.Interop.Structs; +using Penumbra.Services; using Penumbra.String; using Penumbra.UI.Classes; @@ -60,7 +61,7 @@ public static class UiHelpers /// Draw a changed item, invoking the Api-Events for clicks and tooltips. /// Also draw the item Id in grey if requested. /// - public static void DrawChangedItem(PenumbraApi api, string name, object? data, bool drawId) + public static void DrawChangedItem(CommunicatorService communicator, string name, object? data, bool drawId) { name = ChangedItemName(name, data); var ret = ImGui.Selectable(name) ? MouseButton.Left : MouseButton.None; @@ -68,15 +69,15 @@ public static class UiHelpers ret = ImGui.IsItemClicked(ImGuiMouseButton.Middle) ? MouseButton.Middle : ret; if (ret != MouseButton.None) - api.InvokeClick(ret, data); + communicator.ChangedItemClick.Invoke(ret, data); - if (api.HasTooltip && ImGui.IsItemHovered()) + if (communicator.ChangedItemHover.HasTooltip && ImGui.IsItemHovered()) { // We can not be sure that any subscriber actually prints something in any case. // Circumvent ugly blank tooltip with less-ugly useless tooltip. using var tt = ImRaii.Tooltip(); using var group = ImRaii.Group(); - api.InvokeTooltip(data); + communicator.ChangedItemHover.Invoke(data); group.Dispose(); if (ImGui.GetItemRectSize() == Vector2.Zero) ImGui.TextUnformatted("No actions available."); diff --git a/Penumbra/Util/EventWrapper.cs b/Penumbra/Util/EventWrapper.cs index cc374df1..2d4bb318 100644 --- a/Penumbra/Util/EventWrapper.cs +++ b/Penumbra/Util/EventWrapper.cs @@ -9,6 +9,9 @@ public abstract class EventWrapper : IDisposable where T : Delegate private readonly string _name; private readonly List<(object Subscriber, int Priority)> _event = new(); + public bool HasSubscribers + => _event.Count > 0; + protected EventWrapper(string name) => _name = name;