Make everything services.

This commit is contained in:
Ottermandias 2024-06-18 21:59:04 +02:00
parent cf1dcfcb7c
commit e05dbe9885
81 changed files with 220 additions and 317 deletions

@ -1 +1 @@
Subproject commit e95c0f04edc7e85aea67498fd8bf495a7fe6d3c8 Subproject commit caa9e9b9a5dc3928eba10b315cf6a0f6f1d84b65

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
@ -18,7 +19,7 @@ public enum RedirectResult
FilteredGamePath = 3, FilteredGamePath = 3,
} }
public class TempModManager : IDisposable public class TempModManager : IDisposable, IService
{ {
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -1,5 +1,6 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -17,7 +18,7 @@ using Penumbra.String.Classes;
namespace Penumbra.Collections.Cache; namespace Penumbra.Collections.Cache;
public class CollectionCacheManager : IDisposable public class CollectionCacheManager : IDisposable, IService
{ {
private readonly FrameworkManager _framework; private readonly FrameworkManager _framework;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -3,6 +3,7 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
@ -11,7 +12,7 @@ using Penumbra.UI;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;
public class ActiveCollectionData public class ActiveCollectionData : IService
{ {
public ModCollection Current { get; internal set; } = ModCollection.Empty; public ModCollection Current { get; internal set; } = ModCollection.Empty;
public ModCollection Default { get; internal set; } = ModCollection.Empty; public ModCollection Default { get; internal set; } = ModCollection.Empty;
@ -20,7 +21,7 @@ public class ActiveCollectionData
public readonly ModCollection?[] SpecialCollections = new ModCollection?[Enum.GetValues<Api.Enums.ApiCollectionType>().Length - 3]; public readonly ModCollection?[] SpecialCollections = new ModCollection?[Enum.GetValues<Api.Enums.ApiCollectionType>().Length - 3];
} }
public class ActiveCollections : ISavable, IDisposable public class ActiveCollections : ISavable, IDisposable, IService
{ {
public const int Version = 2; public const int Version = 2;

View file

@ -1,4 +1,5 @@
using OtterGui; using OtterGui;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
@ -7,7 +8,7 @@ using Penumbra.Services;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;
public class CollectionEditor(SaveService saveService, CommunicatorService communicator, ModStorage modStorage) public class CollectionEditor(SaveService saveService, CommunicatorService communicator, ModStorage modStorage) : IService
{ {
/// <summary> Enable or disable the mod inheritance of mod idx. </summary> /// <summary> Enable or disable the mod inheritance of mod idx. </summary>
public bool SetModInheritance(ModCollection collection, Mod mod, bool inherit) public bool SetModInheritance(ModCollection collection, Mod mod, bool inherit)

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using Penumbra.Collections.Cache; using Penumbra.Collections.Cache;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;
@ -8,7 +9,7 @@ public class CollectionManager(
InheritanceManager inheritances, InheritanceManager inheritances,
CollectionCacheManager caches, CollectionCacheManager caches,
TempCollectionManager temp, TempCollectionManager temp,
CollectionEditor editor) CollectionEditor editor) : IService
{ {
public readonly CollectionStorage Storage = storage; public readonly CollectionStorage Storage = storage;
public readonly ActiveCollections Active = active; public readonly ActiveCollections Active = active;

View file

@ -1,7 +1,7 @@
using System;
using Dalamud.Interface.Internal.Notifications; using Dalamud.Interface.Internal.Notifications;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
@ -11,7 +11,6 @@ using Penumbra.Mods.Manager.OptionEditor;
using Penumbra.Mods.Settings; using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.CollectionTab;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;
@ -24,7 +23,7 @@ public readonly record struct LocalCollectionId(int Id) : IAdditionOperators<Loc
=> new(left.Id + right); => new(left.Id + right);
} }
public class CollectionStorage : IReadOnlyList<ModCollection>, IDisposable public class CollectionStorage : IReadOnlyList<ModCollection>, IDisposable, IService
{ {
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;
private readonly SaveService _saveService; private readonly SaveService _saveService;

View file

@ -2,11 +2,10 @@ using Dalamud.Interface.Internal.Notifications;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.CollectionTab;
using Penumbra.Util;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;
@ -15,7 +14,7 @@ namespace Penumbra.Collections.Manager;
/// This is transitive, so a collection A inheriting from B also inherits from everything B inherits. /// This is transitive, so a collection A inheriting from B also inherits from everything B inherits.
/// Circular dependencies are resolved by distinctness. /// Circular dependencies are resolved by distinctness.
/// </summary> /// </summary>
public class InheritanceManager : IDisposable public class InheritanceManager : IDisposable, IService
{ {
public enum ValidInheritance public enum ValidInheritance
{ {
@ -144,7 +143,8 @@ public class InheritanceManager : IDisposable
continue; continue;
changes = true; changes = true;
Penumbra.Messager.NotificationMessage($"{collection.Name} can not inherit from {subCollection.Name}, removed.", NotificationType.Warning); Penumbra.Messager.NotificationMessage($"{collection.Name} can not inherit from {subCollection.Name}, removed.",
NotificationType.Warning);
} }
else if (_storage.ByName(subCollectionName, out subCollection)) else if (_storage.ByName(subCollectionName, out subCollection))
{ {
@ -153,12 +153,14 @@ public class InheritanceManager : IDisposable
if (AddInheritance(collection, subCollection, false)) if (AddInheritance(collection, subCollection, false))
continue; continue;
Penumbra.Messager.NotificationMessage($"{collection.Name} can not inherit from {subCollection.Name}, removed.", NotificationType.Warning); Penumbra.Messager.NotificationMessage($"{collection.Name} can not inherit from {subCollection.Name}, removed.",
NotificationType.Warning);
} }
else else
{ {
Penumbra.Messager.NotificationMessage( Penumbra.Messager.NotificationMessage(
$"Inherited collection {subCollectionName} for {collection.AnonymizedName} does not exist, it was removed.", NotificationType.Warning); $"Inherited collection {subCollectionName} for {collection.AnonymizedName} does not exist, it was removed.",
NotificationType.Warning);
changes = true; changes = true;
} }
} }

View file

@ -1,4 +1,5 @@
using OtterGui; using OtterGui;
using OtterGui.Services;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
@ -8,7 +9,7 @@ using Penumbra.String;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;
public class TempCollectionManager : IDisposable public class TempCollectionManager : IDisposable, IService
{ {
public int GlobalChangeCounter { get; private set; } public int GlobalChangeCounter { get; private set; }
public readonly IndividualCollections Collections; public readonly IndividualCollections Collections;

View file

@ -3,6 +3,7 @@ using Dalamud.Game.Text.SeStringHandling;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using ImGuiNET; using ImGuiNET;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -10,12 +11,11 @@ using Penumbra.GameData.Actors;
using Penumbra.Interop.Services; using Penumbra.Interop.Services;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Services;
using Penumbra.UI; using Penumbra.UI;
namespace Penumbra; namespace Penumbra;
public class CommandHandler : IDisposable public class CommandHandler : IDisposable, IApiService
{ {
private const string CommandName = "/penumbra"; private const string CommandName = "/penumbra";

View file

@ -4,6 +4,7 @@ using Newtonsoft.Json;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Import.Structs; using Penumbra.Import.Structs;
using Penumbra.Interop.Services; using Penumbra.Interop.Services;
@ -18,7 +19,7 @@ using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs;
namespace Penumbra; namespace Penumbra;
[Serializable] [Serializable]
public class Configuration : IPluginConfiguration, ISavable public class Configuration : IPluginConfiguration, ISavable, IService
{ {
[JsonIgnore] [JsonIgnore]
private readonly SaveService _saveService; private readonly SaveService _saveService;

View file

@ -1,6 +1,7 @@
using Dalamud.Interface.Internal.Notifications; using Dalamud.Interface.Internal.Notifications;
using Newtonsoft.Json; using Newtonsoft.Json;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Enums; using Penumbra.Enums;
@ -14,7 +15,7 @@ using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs;
namespace Penumbra; namespace Penumbra;
public class EphemeralConfig : ISavable, IDisposable public class EphemeralConfig : ISavable, IDisposable, IService
{ {
[JsonIgnore] [JsonIgnore]
private readonly SaveService _saveService; private readonly SaveService _saveService;

View file

@ -1,6 +1,7 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Data.Parsing; using Lumina.Data.Parsing;
using OtterGui; using OtterGui;
using OtterGui.Services;
using OtterGui.Tasks; using OtterGui.Tasks;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.GameData; using Penumbra.GameData;
@ -21,7 +22,8 @@ namespace Penumbra.Import.Models;
using Schema2 = SharpGLTF.Schema2; using Schema2 = SharpGLTF.Schema2;
using LuminaMaterial = Lumina.Models.Materials.Material; using LuminaMaterial = Lumina.Models.Materials.Material;
public sealed class ModelManager(IFramework framework, ActiveCollections collections, GamePathParser parser) : SingleTaskQueue, IDisposable public sealed class ModelManager(IFramework framework, ActiveCollections collections, GamePathParser parser)
: SingleTaskQueue, IDisposable, IService
{ {
private readonly IFramework _framework = framework; private readonly IFramework _framework = framework;

View file

@ -3,6 +3,7 @@ using Dalamud.Interface.Internal;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Lumina.Data.Files; using Lumina.Data.Files;
using OtterGui.Log; using OtterGui.Log;
using OtterGui.Services;
using OtterGui.Tasks; using OtterGui.Tasks;
using OtterTex; using OtterTex;
using SixLabors.ImageSharp; using SixLabors.ImageSharp;
@ -12,22 +13,14 @@ using Image = SixLabors.ImageSharp.Image;
namespace Penumbra.Import.Textures; namespace Penumbra.Import.Textures;
public sealed class TextureManager : SingleTaskQueue, IDisposable public sealed class TextureManager(UiBuilder uiBuilder, IDataManager gameData, Logger logger)
: SingleTaskQueue, IDisposable, IService
{ {
private readonly Logger _logger; private readonly Logger _logger = logger;
private readonly UiBuilder _uiBuilder;
private readonly IDataManager _gameData;
private readonly ConcurrentDictionary<IAction, (Task, CancellationTokenSource)> _tasks = new(); private readonly ConcurrentDictionary<IAction, (Task, CancellationTokenSource)> _tasks = new();
private bool _disposed; private bool _disposed;
public TextureManager(UiBuilder uiBuilder, IDataManager gameData, Logger logger)
{
_uiBuilder = uiBuilder;
_gameData = gameData;
_logger = logger;
}
public IReadOnlyDictionary<IAction, (Task, CancellationTokenSource)> Tasks public IReadOnlyDictionary<IAction, (Task, CancellationTokenSource)> Tasks
=> _tasks; => _tasks;
@ -64,7 +57,8 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
{ {
var token = new CancellationTokenSource(); var token = new CancellationTokenSource();
var task = Enqueue(a, token.Token); var task = Enqueue(a, token.Token);
task.ContinueWith(_ => _tasks.TryRemove(a, out var unused), CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default); task.ContinueWith(_ => _tasks.TryRemove(a, out var unused), CancellationToken.None, TaskContinuationOptions.None,
TaskScheduler.Default);
return (task, token); return (task, token);
}).Item1; }).Item1;
} }
@ -217,7 +211,7 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
/// <summary> Load a texture wrap for a given image. </summary> /// <summary> Load a texture wrap for a given image. </summary>
public IDalamudTextureWrap LoadTextureWrap(byte[] rgba, int width, int height) public IDalamudTextureWrap LoadTextureWrap(byte[] rgba, int width, int height)
=> _uiBuilder.LoadImageRaw(rgba, width, height, 4); => uiBuilder.LoadImageRaw(rgba, width, height, 4);
/// <summary> Load any supported file from game data or drive depending on extension and if the path is rooted. </summary> /// <summary> Load any supported file from game data or drive depending on extension and if the path is rooted. </summary>
public (BaseImage, TextureType) Load(string path) public (BaseImage, TextureType) Load(string path)
@ -326,7 +320,7 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
} }
public bool GameFileExists(string path) public bool GameFileExists(string path)
=> _gameData.FileExists(path); => gameData.FileExists(path);
/// <summary> Add up to 13 mip maps to the input if mip maps is true, otherwise return input. </summary> /// <summary> Add up to 13 mip maps to the input if mip maps is true, otherwise return input. </summary>
public static ScratchImage AddMipMaps(ScratchImage input, bool mipMaps) public static ScratchImage AddMipMaps(ScratchImage input, bool mipMaps)
@ -382,7 +376,7 @@ public sealed class TextureManager : SingleTaskQueue, IDisposable
if (Path.IsPathRooted(path)) if (Path.IsPathRooted(path))
return File.OpenRead(path); return File.OpenRead(path);
var file = _gameData.GetFile(path); var file = gameData.GetFile(path);
return file != null ? new MemoryStream(file.Data) : throw new Exception($"Unable to obtain \"{path}\" from game files."); return file != null ? new MemoryStream(file.Data) : throw new Exception($"Unable to obtain \"{path}\" from game files.");
} }

View file

@ -1,6 +1,5 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Object;
using OtterGui.Services; using OtterGui.Services;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Interop; using Penumbra.GameData.Interop;
@ -9,7 +8,7 @@ using Penumbra.String;
namespace Penumbra.Interop.PathResolving; namespace Penumbra.Interop.PathResolving;
public sealed class CutsceneService : IService, IDisposable public sealed class CutsceneService : IRequiredService, IDisposable
{ {
public const int CutsceneStartIdx = (int)ScreenActor.CutsceneStart; public const int CutsceneStartIdx = (int)ScreenActor.CutsceneStart;
public const int CutsceneEndIdx = (int)ScreenActor.CutsceneEnd; public const int CutsceneEndIdx = (int)ScreenActor.CutsceneEnd;

View file

@ -1,6 +1,7 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Client.Game.Character;
using FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.Object;
using OtterGui.Services;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Communication; using Penumbra.Communication;
@ -10,7 +11,8 @@ using Penumbra.Services;
namespace Penumbra.Interop.PathResolving; namespace Penumbra.Interop.PathResolving;
public unsafe class IdentifiedCollectionCache : IDisposable, IEnumerable<(nint Address, ActorIdentifier Identifier, ModCollection Collection)> public unsafe class IdentifiedCollectionCache : IDisposable, IEnumerable<(nint Address, ActorIdentifier Identifier, ModCollection Collection)>,
IService
{ {
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;
private readonly CharacterDestructor _characterDestructor; private readonly CharacterDestructor _characterDestructor;

View file

@ -1,5 +1,6 @@
using FFXIVClientStructs.FFXIV.Client.Graphics.Scene; using FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -34,7 +35,7 @@ namespace Penumbra.Interop.PathResolving;
// ChangeCustomize and RspSetupCharacter, which is hooked here, as well as Character.CalculateHeight. // ChangeCustomize and RspSetupCharacter, which is hooked here, as well as Character.CalculateHeight.
// GMP Entries seem to be only used by "48 8B ?? 53 55 57 48 83 ?? ?? 48 8B", which is SetupVisor. // GMP Entries seem to be only used by "48 8B ?? 53 55 57 48 83 ?? ?? 48 8B", which is SetupVisor.
public sealed unsafe class MetaState : IDisposable public sealed unsafe class MetaState : IDisposable, IService
{ {
private readonly Configuration _config; private readonly Configuration _config;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -1,4 +1,5 @@
using FFXIVClientStructs.FFXIV.Client.System.Resource; using FFXIVClientStructs.FFXIV.Client.System.Resource;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -9,7 +10,7 @@ using Penumbra.Util;
namespace Penumbra.Interop.PathResolving; namespace Penumbra.Interop.PathResolving;
public class PathResolver : IDisposable public class PathResolver : IDisposable, IService
{ {
private readonly PerformanceTracker _performance; private readonly PerformanceTracker _performance;
private readonly Configuration _config; private readonly Configuration _config;

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Interop.Services; using Penumbra.Interop.Services;
using Penumbra.String; using Penumbra.String;
@ -5,7 +6,7 @@ using Penumbra.String;
namespace Penumbra.Interop.PathResolving; namespace Penumbra.Interop.PathResolving;
public sealed class PathState(CollectionResolver collectionResolver, MetaState metaState, CharacterUtility characterUtility) public sealed class PathState(CollectionResolver collectionResolver, MetaState metaState, CharacterUtility characterUtility)
: IDisposable : IDisposable, IService
{ {
public readonly CollectionResolver CollectionResolver = collectionResolver; public readonly CollectionResolver CollectionResolver = collectionResolver;
public readonly MetaState MetaState = metaState; public readonly MetaState MetaState = metaState;

View file

@ -1,9 +1,9 @@
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Interop.Hooks.Resources; using Penumbra.Interop.Hooks.Resources;
using Penumbra.Interop.ResourceLoading; using Penumbra.Interop.ResourceLoading;
using Penumbra.Interop.Structs; using Penumbra.Interop.Structs;
using Penumbra.String;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Interop.PathResolving; namespace Penumbra.Interop.PathResolving;
@ -13,7 +13,7 @@ namespace Penumbra.Interop.PathResolving;
/// Those are loaded synchronously. /// Those are loaded synchronously.
/// Thus, we need to ensure the correct files are loaded when a material is loaded. /// Thus, we need to ensure the correct files are loaded when a material is loaded.
/// </summary> /// </summary>
public sealed unsafe class SubfileHelper : IDisposable, IReadOnlyCollection<KeyValuePair<nint, ResolveData>> public sealed unsafe class SubfileHelper : IDisposable, IReadOnlyCollection<KeyValuePair<nint, ResolveData>>, IService
{ {
private readonly GameState _gameState; private readonly GameState _gameState;
private readonly ResourceLoader _loader; private readonly ResourceLoader _loader;

View file

@ -1,13 +1,14 @@
using Dalamud.Hooking; using Dalamud.Hooking;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using OtterGui.Services;
using Penumbra.GameData; using Penumbra.GameData;
using Penumbra.Interop.Structs; using Penumbra.Interop.Structs;
using Penumbra.Util; using Penumbra.Util;
namespace Penumbra.Interop.ResourceLoading; namespace Penumbra.Interop.ResourceLoading;
public unsafe class FileReadService : IDisposable public unsafe class FileReadService : IDisposable, IRequiredService
{ {
public FileReadService(PerformanceTracker performance, ResourceManagerService resourceManager, IGameInteropProvider interop) public FileReadService(PerformanceTracker performance, ResourceManagerService resourceManager, IGameInteropProvider interop)
{ {

View file

@ -1,4 +1,5 @@
using FFXIVClientStructs.FFXIV.Client.System.Resource; using FFXIVClientStructs.FFXIV.Client.System.Resource;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Interop.PathResolving; using Penumbra.Interop.PathResolving;
@ -10,7 +11,7 @@ using FileMode = Penumbra.Interop.Structs.FileMode;
namespace Penumbra.Interop.ResourceLoading; namespace Penumbra.Interop.ResourceLoading;
public unsafe class ResourceLoader : IDisposable public unsafe class ResourceLoader : IDisposable, IService
{ {
private readonly ResourceService _resources; private readonly ResourceService _resources;
private readonly FileReadService _fileReadService; private readonly FileReadService _fileReadService;
@ -212,7 +213,7 @@ public unsafe class ResourceLoader : IDisposable
/// <summary> /// <summary>
/// Catch weird errors with invalid decrements of the reference count. /// Catch weird errors with invalid decrements of the reference count.
/// </summary> /// </summary>
private void DecRefProtection(ResourceHandle* handle, ref byte? returnValue) private static void DecRefProtection(ResourceHandle* handle, ref byte? returnValue)
{ {
if (handle->RefCount != 0) if (handle->RefCount != 0)
return; return;

View file

@ -4,12 +4,13 @@ using FFXIVClientStructs.FFXIV.Client.System.Resource;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using FFXIVClientStructs.Interop; using FFXIVClientStructs.Interop;
using FFXIVClientStructs.STD; using FFXIVClientStructs.STD;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData; using Penumbra.GameData;
namespace Penumbra.Interop.ResourceLoading; namespace Penumbra.Interop.ResourceLoading;
public unsafe class ResourceManagerService public unsafe class ResourceManagerService : IRequiredService
{ {
public ResourceManagerService(IGameInteropProvider interop) public ResourceManagerService(IGameInteropProvider interop)
=> interop.InitializeFromAttributes(this); => interop.InitializeFromAttributes(this);

View file

@ -2,6 +2,7 @@ using Dalamud.Hooking;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.Resource; using FFXIVClientStructs.FFXIV.Client.System.Resource;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData; using Penumbra.GameData;
using Penumbra.Interop.SafeHandles; using Penumbra.Interop.SafeHandles;
@ -13,7 +14,7 @@ using CSResourceHandle = FFXIVClientStructs.FFXIV.Client.System.Resource.Handle.
namespace Penumbra.Interop.ResourceLoading; namespace Penumbra.Interop.ResourceLoading;
public unsafe class ResourceService : IDisposable public unsafe class ResourceService : IDisposable, IRequiredService
{ {
private readonly PerformanceTracker _performance; private readonly PerformanceTracker _performance;
private readonly ResourceManagerService _resourceManager; private readonly ResourceManagerService _resourceManager;

View file

@ -2,13 +2,14 @@ using Dalamud.Hooking;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData; using Penumbra.GameData;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Interop.ResourceLoading; namespace Penumbra.Interop.ResourceLoading;
public unsafe class TexMdlService : IDisposable public unsafe class TexMdlService : IDisposable, IRequiredService
{ {
/// <summary> Custom ulong flag to signal our files as opposed to SE files. </summary> /// <summary> Custom ulong flag to signal our files as opposed to SE files. </summary>
public static readonly IntPtr CustomFileFlag = new(0xDEADBEEF); public static readonly IntPtr CustomFileFlag = new(0xDEADBEEF);

View file

@ -1,5 +1,6 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Object; using FFXIVClientStructs.FFXIV.Client.Game.Object;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
@ -17,7 +18,7 @@ public class ResourceTreeFactory(
ObjectIdentification identifier, ObjectIdentification identifier,
Configuration config, Configuration config,
ActorManager actors, ActorManager actors,
PathState pathState) PathState pathState) : IService
{ {
private TreeBuildCache CreateTreeBuildCache() private TreeBuildCache CreateTreeBuildCache()
=> new(objects, gameData, actors); => new(objects, gameData, actors);

View file

@ -1,11 +1,12 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using OtterGui.Services;
using Penumbra.GameData; using Penumbra.GameData;
using Penumbra.Interop.Structs; using Penumbra.Interop.Structs;
namespace Penumbra.Interop.Services; namespace Penumbra.Interop.Services;
public unsafe class CharacterUtility : IDisposable public unsafe class CharacterUtility : IDisposable, IRequiredService
{ {
public record struct InternalIndex(int Value); public record struct InternalIndex(int Value);

View file

@ -1,6 +1,7 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.System.Framework; using FFXIVClientStructs.FFXIV.Client.System.Framework;
using FFXIVClientStructs.FFXIV.Component.GUI; using FFXIVClientStructs.FFXIV.Component.GUI;
using OtterGui.Services;
using Penumbra.GameData; using Penumbra.GameData;
namespace Penumbra.Interop.Services; namespace Penumbra.Interop.Services;
@ -9,7 +10,7 @@ namespace Penumbra.Interop.Services;
/// Handle font reloading via game functions. /// Handle font reloading via game functions.
/// May cause a interface flicker while reloading. /// May cause a interface flicker while reloading.
/// </summary> /// </summary>
public unsafe class FontReloader public unsafe class FontReloader : IService
{ {
public bool Valid public bool Valid
=> _reloadFontsFunc != null; => _reloadFontsFunc != null;

View file

@ -1,10 +1,11 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Graphics.Render; using FFXIVClientStructs.FFXIV.Client.Graphics.Render;
using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle; using FFXIVClientStructs.FFXIV.Client.System.Resource.Handle;
using OtterGui.Services;
namespace Penumbra.Interop.Services; namespace Penumbra.Interop.Services;
public unsafe class ModelRenderer : IDisposable public unsafe class ModelRenderer : IDisposable, IRequiredService
{ {
public bool Ready { get; private set; } public bool Ready { get; private set; }
@ -37,14 +38,14 @@ public unsafe class ModelRenderer : IDisposable
if (DefaultCharacterGlassShaderPackage == null) if (DefaultCharacterGlassShaderPackage == null)
{ {
DefaultCharacterGlassShaderPackage = *CharacterGlassShaderPackage; DefaultCharacterGlassShaderPackage = *CharacterGlassShaderPackage;
anyMissing |= DefaultCharacterGlassShaderPackage == null; anyMissing |= DefaultCharacterGlassShaderPackage == null;
} }
if (anyMissing) if (anyMissing)
return; return;
Ready = true; Ready = true;
_framework.Update -= LoadDefaultResources; _framework.Update -= LoadDefaultResources;
} }

View file

@ -6,6 +6,7 @@ using Dalamud.Game.ClientState.Objects.Types;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Housing; using FFXIVClientStructs.FFXIV.Client.Game.Housing;
using FFXIVClientStructs.Interop; using FFXIVClientStructs.Interop;
using OtterGui.Services;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Communication; using Penumbra.Communication;
@ -20,7 +21,7 @@ using Character = FFXIVClientStructs.FFXIV.Client.Game.Character.Character;
namespace Penumbra.Interop.Services; namespace Penumbra.Interop.Services;
public unsafe partial class RedrawService public unsafe partial class RedrawService : IService
{ {
public const int GPosePlayerIdx = 201; public const int GPosePlayerIdx = 201;
public const int GPoseSlots = 42; public const int GPoseSlots = 42;
@ -171,7 +172,8 @@ public sealed unsafe partial class RedrawService : IDisposable
if (gPose) if (gPose)
DisableDraw(actor!); DisableDraw(actor!);
if (actor is PlayerCharacter && _objects.GetDalamudObject(tableIndex + 1) is { ObjectKind: ObjectKind.MountType or ObjectKind.Ornament } mountOrOrnament) if (actor is PlayerCharacter
&& _objects.GetDalamudObject(tableIndex + 1) is { ObjectKind: ObjectKind.MountType or ObjectKind.Ornament } mountOrOrnament)
{ {
*ActorDrawState(mountOrOrnament) |= DrawState.Invisibility; *ActorDrawState(mountOrOrnament) |= DrawState.Invisibility;
if (gPose) if (gPose)
@ -190,7 +192,8 @@ public sealed unsafe partial class RedrawService : IDisposable
if (gPose) if (gPose)
EnableDraw(actor!); EnableDraw(actor!);
if (actor is PlayerCharacter && _objects.GetDalamudObject(tableIndex + 1) is { ObjectKind: ObjectKind.MountType or ObjectKind.Ornament } mountOrOrnament) if (actor is PlayerCharacter
&& _objects.GetDalamudObject(tableIndex + 1) is { ObjectKind: ObjectKind.MountType or ObjectKind.Ornament } mountOrOrnament)
{ {
*ActorDrawState(mountOrOrnament) &= ~DrawState.Invisibility; *ActorDrawState(mountOrOrnament) &= ~DrawState.Invisibility;
if (gPose) if (gPose)
@ -380,7 +383,7 @@ public sealed unsafe partial class RedrawService : IDisposable
if (!ret && lowerName.Length > 1 && lowerName[0] == '#' && ushort.TryParse(lowerName[1..], out var objectIndex)) if (!ret && lowerName.Length > 1 && lowerName[0] == '#' && ushort.TryParse(lowerName[1..], out var objectIndex))
{ {
ret = true; ret = true;
actor = _objects.GetDalamudObject((int) objectIndex); actor = _objects.GetDalamudObject((int)objectIndex);
} }
return ret; return ret;

View file

@ -1,10 +1,11 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Dalamud.Utility.Signatures; using Dalamud.Utility.Signatures;
using OtterGui.Services;
using Penumbra.GameData; using Penumbra.GameData;
namespace Penumbra.Interop.Services; namespace Penumbra.Interop.Services;
public unsafe class ResidentResourceManager public unsafe class ResidentResourceManager : IService
{ {
// A static pointer to the resident resource manager address. // A static pointer to the resident resource manager address.
[Signature(Sigs.ResidentResourceManager, ScanType = ScanType.StaticAddress)] [Signature(Sigs.ResidentResourceManager, ScanType = ScanType.StaticAddress)]

View file

@ -1,5 +1,6 @@
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using OtterGui.Compression; using OtterGui.Compression;
using OtterGui.Services;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
@ -13,7 +14,7 @@ using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManage
namespace Penumbra.Meta; namespace Penumbra.Meta;
public unsafe class MetaFileManager public class MetaFileManager : IService
{ {
internal readonly Configuration Config; internal readonly Configuration Config;
internal readonly CharacterUtility CharacterUtility; internal readonly CharacterUtility CharacterUtility;

View file

@ -1,4 +1,5 @@
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Mods.Groups; using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
@ -7,7 +8,7 @@ using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;
public class DuplicateManager(ModManager modManager, SaveService saveService, Configuration config) public class DuplicateManager(ModManager modManager, SaveService saveService, Configuration config) : IService
{ {
private readonly SHA256 _hasher = SHA256.Create(); private readonly SHA256 _hasher = SHA256.Create();
private readonly List<(FullPath[] Paths, long Size, byte[] Hash)> _duplicates = []; private readonly List<(FullPath[] Paths, long Size, byte[] Hash)> _duplicates = [];

View file

@ -1,11 +1,12 @@
using OtterGui; using OtterGui;
using OtterGui.Compression; using OtterGui.Compression;
using OtterGui.Services;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Files; using Penumbra.GameData.Files;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;
public partial class MdlMaterialEditor(ModFileCollection files) public partial class MdlMaterialEditor(ModFileCollection files) : IService
{ {
[GeneratedRegex(@"/mt_c(?'RaceCode'\d{4})b0001_(?'Suffix'.*?)\.mtrl", RegexOptions.ExplicitCapture | RegexOptions.NonBacktracking)] [GeneratedRegex(@"/mt_c(?'RaceCode'\d{4})b0001_(?'Suffix'.*?)\.mtrl", RegexOptions.ExplicitCapture | RegexOptions.NonBacktracking)]
private static partial Regex MaterialRegex(); private static partial Regex MaterialRegex();

View file

@ -1,5 +1,5 @@
using OtterGui;
using OtterGui.Compression; using OtterGui.Compression;
using OtterGui.Services;
using Penumbra.Mods.Groups; using Penumbra.Mods.Groups;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
@ -14,7 +14,7 @@ public class ModEditor(
ModSwapEditor swapEditor, ModSwapEditor swapEditor,
MdlMaterialEditor mdlMaterialEditor, MdlMaterialEditor mdlMaterialEditor,
FileCompactor compactor) FileCompactor compactor)
: IDisposable : IDisposable, IService
{ {
public readonly ModNormalizer ModNormalizer = modNormalizer; public readonly ModNormalizer ModNormalizer = modNormalizer;
public readonly ModMetaEditor MetaEditor = metaEditor; public readonly ModMetaEditor MetaEditor = metaEditor;

View file

@ -1,10 +1,11 @@
using OtterGui; using OtterGui;
using OtterGui.Services;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;
public class ModFileCollection : IDisposable public class ModFileCollection : IDisposable, IService
{ {
private readonly List<FileRegistry> _available = []; private readonly List<FileRegistry> _available = [];
private readonly List<FileRegistry> _mtrl = []; private readonly List<FileRegistry> _mtrl = [];

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
@ -5,7 +6,7 @@ using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;
public class ModFileEditor(ModFileCollection files, ModManager modManager, CommunicatorService communicator) public class ModFileEditor(ModFileCollection files, ModManager modManager, CommunicatorService communicator) : IService
{ {
public bool Changes { get; private set; } public bool Changes { get; private set; }

View file

@ -2,6 +2,7 @@ using Dalamud.Interface.Internal.Notifications;
using Dalamud.Utility; using Dalamud.Utility;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
@ -13,7 +14,7 @@ using Penumbra.UI.ModsTab;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;
public class ModMerger : IDisposable public class ModMerger : IDisposable, IService
{ {
private readonly Configuration _config; private readonly Configuration _config;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -1,15 +1,15 @@
using Dalamud.Interface.Internal.Notifications; using Dalamud.Interface.Internal.Notifications;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using OtterGui.Tasks; using OtterGui.Tasks;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;
public class ModNormalizer(ModManager _modManager, Configuration _config) public class ModNormalizer(ModManager _modManager, Configuration _config) : IService
{ {
private readonly List<List<Dictionary<Utf8GamePath, FullPath>>> _redirections = []; private readonly List<List<Dictionary<Utf8GamePath, FullPath>>> _redirections = [];

View file

@ -1,10 +1,10 @@
using Penumbra.Mods; using OtterGui.Services;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.Util; using Penumbra.Util;
public class ModSwapEditor(ModManager modManager) public class ModSwapEditor(ModManager modManager) : IService
{ {
private readonly Dictionary<Utf8GamePath, FullPath> _swaps = []; private readonly Dictionary<Utf8GamePath, FullPath> _swaps = [];

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
using Penumbra.Mods.Groups; using Penumbra.Mods.Groups;
@ -8,7 +9,7 @@ using Penumbra.Util;
namespace Penumbra.Mods.Manager; namespace Penumbra.Mods.Manager;
public class ModCacheManager : IDisposable public class ModCacheManager : IDisposable, IService
{ {
private readonly Configuration _config; private readonly Configuration _config;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -1,6 +1,7 @@
using Dalamud.Utility; using Dalamud.Utility;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Mods.Manager; namespace Penumbra.Mods.Manager;
@ -23,7 +24,7 @@ public enum ModDataChangeType : ushort
Note = 0x0800, Note = 0x0800,
} }
public class ModDataEditor(SaveService saveService, CommunicatorService communicatorService) public class ModDataEditor(SaveService saveService, CommunicatorService communicatorService) : IService
{ {
/// <summary> Create the file containing the meta information about a mod from scratch. </summary> /// <summary> Create the file containing the meta information about a mod from scratch. </summary>
public void CreateMeta(DirectoryInfo directory, string? name, string? author, string? description, string? version, public void CreateMeta(DirectoryInfo directory, string? name, string? author, string? description, string? version,
@ -49,7 +50,6 @@ public class ModDataEditor(SaveService saveService, CommunicatorService communic
var save = true; var save = true;
if (File.Exists(dataFile)) if (File.Exists(dataFile))
{
try try
{ {
var text = File.ReadAllText(dataFile); var text = File.ReadAllText(dataFile);
@ -65,7 +65,6 @@ public class ModDataEditor(SaveService saveService, CommunicatorService communic
{ {
Penumbra.Log.Error($"Could not load local mod data:\n{e}"); Penumbra.Log.Error($"Could not load local mod data:\n{e}");
} }
}
if (importDate == 0) if (importDate == 0)
importDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(); importDate = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();

View file

@ -1,10 +1,11 @@
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Mods.Manager; namespace Penumbra.Mods.Manager;
public class ModExportManager : IDisposable public class ModExportManager : IDisposable, IService
{ {
private readonly Configuration _config; private readonly Configuration _config;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -1,12 +1,11 @@
using Newtonsoft.Json.Linq;
using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Mods.Manager; namespace Penumbra.Mods.Manager;
public sealed class ModFileSystem : FileSystem<Mod>, IDisposable, ISavable public sealed class ModFileSystem : FileSystem<Mod>, IDisposable, ISavable, IService
{ {
private readonly ModManager _modManager; private readonly ModManager _modManager;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -1,11 +1,12 @@
using Dalamud.Interface.Internal.Notifications; using Dalamud.Interface.Internal.Notifications;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Import; using Penumbra.Import;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
namespace Penumbra.Mods.Manager; namespace Penumbra.Mods.Manager;
public class ModImportManager(ModManager modManager, Configuration config, ModEditor modEditor) : IDisposable public class ModImportManager(ModManager modManager, Configuration config, ModEditor modEditor) : IDisposable, IService
{ {
private readonly ConcurrentQueue<string[]> _modsToUnpack = new(); private readonly ConcurrentQueue<string[]> _modsToUnpack = new();
@ -32,7 +33,8 @@ public class ModImportManager(ModManager modManager, Configuration config, ModEd
if (File.Exists(s)) if (File.Exists(s))
return true; return true;
Penumbra.Messager.NotificationMessage($"Failed to import queued mod at {s}, the file does not exist.", NotificationType.Warning, false); Penumbra.Messager.NotificationMessage($"Failed to import queued mod at {s}, the file does not exist.", NotificationType.Warning,
false);
return false; return false;
}).Select(s => new FileInfo(s)).ToArray(); }).Select(s => new FileInfo(s)).ToArray();

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager.OptionEditor; using Penumbra.Mods.Manager.OptionEditor;
@ -27,7 +28,7 @@ public enum ModPathChangeType
StartingReload, StartingReload,
} }
public sealed class ModManager : ModStorage, IDisposable public sealed class ModManager : ModStorage, IDisposable, IService
{ {
private readonly Configuration _config; private readonly Configuration _config;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -4,6 +4,7 @@ using Newtonsoft.Json.Linq;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
using Penumbra.Import; using Penumbra.Import;
@ -23,7 +24,7 @@ public partial class ModCreator(
Configuration config, Configuration config,
ModDataEditor _dataEditor, ModDataEditor _dataEditor,
MetaFileManager _metaFileManager, MetaFileManager _metaFileManager,
GamePathParser _gamePathParser) GamePathParser _gamePathParser) : IService
{ {
public readonly Configuration Config = config; public readonly Configuration Config = config;

View file

@ -5,36 +5,15 @@ using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using OtterGui; using OtterGui;
using OtterGui.Classes;
using OtterGui.Log; using OtterGui.Log;
using OtterGui.Services; using OtterGui.Services;
using Penumbra.Api;
using Penumbra.Api.Api; using Penumbra.Api.Api;
using Penumbra.Collections.Cache;
using Penumbra.Collections.Manager;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.Import.Models;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.Import.Textures;
using Penumbra.Interop.PathResolving; using Penumbra.Interop.PathResolving;
using Penumbra.Interop.ResourceLoading;
using Penumbra.Interop.ResourceTree;
using Penumbra.Interop.Services;
using Penumbra.Meta; using Penumbra.Meta;
using Penumbra.Mods;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.UI;
using Penumbra.UI.AdvancedWindow;
using Penumbra.UI.Classes;
using Penumbra.UI.ModsTab;
using Penumbra.UI.ResourceWatcher;
using Penumbra.UI.Tabs;
using Penumbra.UI.Tabs.Debug;
using IPenumbraApi = Penumbra.Api.Api.IPenumbraApi; using IPenumbraApi = Penumbra.Api.Api.IPenumbraApi;
using MdlMaterialEditor = Penumbra.Mods.Editor.MdlMaterialEditor;
using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager;
using Penumbra.Api.IpcTester;
namespace Penumbra.Services; namespace Penumbra.Services;
@ -45,19 +24,18 @@ public static class StaticServiceManager
var services = new ServiceManager(log) var services = new ServiceManager(log)
.AddDalamudServices(pi) .AddDalamudServices(pi)
.AddExistingService(log) .AddExistingService(log)
.AddExistingService(penumbra) .AddExistingService(penumbra);
.AddInterop()
.AddConfiguration()
.AddCollections()
.AddMods()
.AddResources()
.AddResolvers()
.AddInterface()
.AddModEditor()
.AddApi();
services.AddIServices(typeof(EquipItem).Assembly); services.AddIServices(typeof(EquipItem).Assembly);
services.AddIServices(typeof(Penumbra).Assembly); services.AddIServices(typeof(Penumbra).Assembly);
services.AddIServices(typeof(ImGuiUtil).Assembly); services.AddIServices(typeof(ImGuiUtil).Assembly);
services.AddSingleton(p =>
{
var cutsceneService = p.GetRequiredService<CutsceneService>();
return new CutsceneResolver(cutsceneService.GetParentIndex);
})
.AddSingleton(p => p.GetRequiredService<MetaFileManager>().ImcChecker)
.AddSingleton(s => (ModStorage)s.GetRequiredService<ModManager>())
.AddSingleton<IPenumbraApi>(x => x.GetRequiredService<PenumbraApi>());
services.CreateProvider(); services.CreateProvider();
return services; return services;
} }
@ -83,118 +61,4 @@ public static class StaticServiceManager
.AddDalamudService<IGameInteropProvider>(pi) .AddDalamudService<IGameInteropProvider>(pi)
.AddDalamudService<IPluginLog>(pi) .AddDalamudService<IPluginLog>(pi)
.AddDalamudService<INotificationManager>(pi); .AddDalamudService<INotificationManager>(pi);
private static ServiceManager AddInterop(this ServiceManager services)
=> services.AddSingleton<FrameworkManager>()
.AddSingleton<CutsceneService>()
.AddSingleton(p =>
{
var cutsceneService = p.GetRequiredService<CutsceneService>();
return new CutsceneResolver(cutsceneService.GetParentIndex);
})
.AddSingleton<CharacterUtility>()
.AddSingleton<ModelRenderer>()
.AddSingleton<ResourceManagerService>()
.AddSingleton<ResourceService>()
.AddSingleton<FileReadService>()
.AddSingleton<TexMdlService>()
.AddSingleton<CreateFileWHook>()
.AddSingleton<ResidentResourceManager>()
.AddSingleton<FontReloader>()
.AddSingleton<RedrawService>()
.AddSingleton(p => p.GetRequiredService<MetaFileManager>().ImcChecker);
private static ServiceManager AddConfiguration(this ServiceManager services)
=> services.AddSingleton<Configuration>()
.AddSingleton<EphemeralConfig>()
.AddSingleton<PredefinedTagManager>();
private static ServiceManager AddCollections(this ServiceManager services)
=> services.AddSingleton<CollectionStorage>()
.AddSingleton<ActiveCollectionData>()
.AddSingleton<ActiveCollections>()
.AddSingleton<InheritanceManager>()
.AddSingleton<CollectionCacheManager>()
.AddSingleton<TempCollectionManager>()
.AddSingleton<CollectionEditor>()
.AddSingleton<CollectionManager>();
private static ServiceManager AddMods(this ServiceManager services)
=> services.AddSingleton<TempModManager>()
.AddSingleton<ModDataEditor>()
.AddSingleton<ModCreator>()
.AddSingleton<ModManager>()
.AddSingleton<ModExportManager>()
.AddSingleton<ModImportManager>()
.AddSingleton<ModFileSystem>()
.AddSingleton<ModCacheManager>()
.AddSingleton(s => (ModStorage)s.GetRequiredService<ModManager>());
private static ServiceManager AddResources(this ServiceManager services)
=> services.AddSingleton<ResourceLoader>()
.AddSingleton<ResourceWatcher>()
.AddSingleton<ResourceTreeFactory>()
.AddSingleton<MetaFileManager>();
private static ServiceManager AddResolvers(this ServiceManager services)
=> services.AddSingleton<CollectionResolver>()
.AddSingleton<CutsceneService>()
.AddSingleton<DrawObjectState>()
.AddSingleton<MetaState>()
.AddSingleton<PathState>()
.AddSingleton<SubfileHelper>()
.AddSingleton<IdentifiedCollectionCache>()
.AddSingleton<PathResolver>();
private static ServiceManager AddInterface(this ServiceManager services)
=> services.AddSingleton<FileDialogService>()
.AddSingleton<TutorialService>()
.AddSingleton<PenumbraChangelog>()
.AddSingleton<LaunchButton>()
.AddSingleton<ConfigWindow>()
.AddSingleton<PenumbraWindowSystem>()
.AddSingleton<ModEditWindow>()
.AddSingleton<CommandHandler>()
.AddSingleton<SettingsTab>()
.AddSingleton<ModsTab>()
.AddSingleton<MultiModPanel>()
.AddSingleton<ModPanel>()
.AddSingleton<ModFileSystemSelector>()
.AddSingleton<CollectionSelectHeader>()
.AddSingleton<ImportPopup>()
.AddSingleton<ModPanelDescriptionTab>()
.AddSingleton<ModPanelEditTab>()
.AddSingleton<ModPanelChangedItemsTab>()
.AddSingleton<ModPanelConflictsTab>()
.AddSingleton<ModPanelCollectionsTab>()
.AddSingleton<ModPanelTabBar>()
.AddSingleton<ModFileSystemSelector>()
.AddSingleton<CollectionsTab>()
.AddSingleton<ChangedItemsTab>()
.AddSingleton<EffectiveTab>()
.AddSingleton<OnScreenTab>()
.AddSingleton<DebugTab>()
.AddSingleton<MessagesTab>()
.AddSingleton<ResourceTab>()
.AddSingleton<ConfigTabBar>()
.AddSingleton<ResourceWatcher>()
.AddSingleton<ItemSwapTab>()
.AddSingleton<ModMergeTab>()
.AddSingleton<ChangedItemDrawer>()
.AddSingleton(p => new Diagnostics(p));
private static ServiceManager AddModEditor(this ServiceManager services)
=> services.AddSingleton<ModFileCollection>()
.AddSingleton<DuplicateManager>()
.AddSingleton<MdlMaterialEditor>()
.AddSingleton<ModFileEditor>()
.AddSingleton<ModSwapEditor>()
.AddSingleton<ModNormalizer>()
.AddSingleton<ModMerger>()
.AddSingleton<ModEditor>()
.AddSingleton<TextureManager>()
.AddSingleton<ModelManager>();
private static ServiceManager AddApi(this ServiceManager services)
=> services.AddSingleton<IPenumbraApi>(x => x.GetRequiredService<PenumbraApi>());
} }

View file

@ -3,6 +3,7 @@ using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
@ -24,7 +25,7 @@ using Penumbra.UI.Classes;
namespace Penumbra.UI.AdvancedWindow; namespace Penumbra.UI.AdvancedWindow;
public class ItemSwapTab : IDisposable, ITab public class ItemSwapTab : IDisposable, ITab, IUiService
{ {
private readonly Configuration _config; private readonly Configuration _config;
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -7,6 +7,7 @@ using Dalamud.Plugin.Services;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Communication; using Penumbra.Communication;
@ -32,7 +33,7 @@ using MdlMaterialEditor = Penumbra.Mods.Editor.MdlMaterialEditor;
namespace Penumbra.UI.AdvancedWindow; namespace Penumbra.UI.AdvancedWindow;
public partial class ModEditWindow : Window, IDisposable public partial class ModEditWindow : Window, IDisposable, IUiService
{ {
private const string WindowBaseLabel = "###SubModEdit"; private const string WindowBaseLabel = "###SubModEdit";

View file

@ -2,6 +2,7 @@ using Dalamud.Interface.Utility;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.SubMods; using Penumbra.Mods.SubMods;
@ -9,7 +10,7 @@ using Penumbra.UI.Classes;
namespace Penumbra.UI.AdvancedWindow; namespace Penumbra.UI.AdvancedWindow;
public class ModMergeTab(ModMerger modMerger) public class ModMergeTab(ModMerger modMerger) : IUiService
{ {
private readonly ModCombo _modCombo = new(() => modMerger.ModsWithoutCurrent.ToList()); private readonly ModCombo _modCombo = new(() => modMerger.ModsWithoutCurrent.ToList());
private string _newModName = string.Empty; private string _newModName = string.Empty;
@ -183,7 +184,7 @@ public class ModMergeTab(ModMerger modMerger)
else else
{ {
ImGuiUtil.DrawTableColumn(option.GetName()); ImGuiUtil.DrawTableColumn(option.GetName());
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.Selectable(group.Name, false); ImGui.Selectable(group.Name, false);
if (ImGui.BeginPopupContextItem("##groupContext")) if (ImGui.BeginPopupContextItem("##groupContext"))

View file

@ -10,6 +10,7 @@ using Lumina.Excel.GeneratedSheets;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
@ -19,7 +20,7 @@ using ApiChangedItemIcon = Penumbra.Api.Enums.ChangedItemIcon;
namespace Penumbra.UI; namespace Penumbra.UI;
public class ChangedItemDrawer : IDisposable public class ChangedItemDrawer : IDisposable, IUiService
{ {
[Flags] [Flags]
public enum ChangedItemIcon : uint public enum ChangedItemIcon : uint
@ -99,8 +100,10 @@ public class ChangedItemDrawer : IDisposable
slot = 0; slot = 0;
foreach (var (item, flag) in LowerNames.Zip(Order)) foreach (var (item, flag) in LowerNames.Zip(Order))
{
if (item.Contains(lowerInput, StringComparison.Ordinal)) if (item.Contains(lowerInput, StringComparison.Ordinal))
slot |= flag; slot |= flag;
}
return slot != 0; return slot != 0;
} }

View file

@ -1,8 +1,9 @@
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
namespace Penumbra.UI; namespace Penumbra.UI;
public class PenumbraChangelog public class PenumbraChangelog : IUiService
{ {
public const int LastChangelogVersion = 0; public const int LastChangelogVersion = 0;

View file

@ -1,6 +1,7 @@
using ImGuiNET; using ImGuiNET;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui; using OtterGui;
using OtterGui.Services;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Interop.PathResolving; using Penumbra.Interop.PathResolving;
@ -9,7 +10,7 @@ using Penumbra.UI.ModsTab;
namespace Penumbra.UI.Classes; namespace Penumbra.UI.Classes;
public class CollectionSelectHeader public class CollectionSelectHeader : IUiService
{ {
private readonly CollectionCombo _collectionCombo; private readonly CollectionCombo _collectionCombo;
private readonly ActiveCollections _activeCollections; private readonly ActiveCollections _activeCollections;

View file

@ -4,6 +4,7 @@ using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Custom; using OtterGui.Custom;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Text; using OtterGui.Text;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Services; using Penumbra.Services;
@ -13,7 +14,7 @@ using Penumbra.Util;
namespace Penumbra.UI; namespace Penumbra.UI;
public sealed class ConfigWindow : Window public sealed class ConfigWindow : Window, IUiService
{ {
private readonly DalamudPluginInterface _pluginInterface; private readonly DalamudPluginInterface _pluginInterface;
private readonly Configuration _config; private readonly Configuration _config;

View file

@ -3,12 +3,13 @@ using Dalamud.Interface.ImGuiFileDialog;
using Dalamud.Utility; using Dalamud.Utility;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Services;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.UI; namespace Penumbra.UI;
public class FileDialogService : IDisposable public class FileDialogService : IDisposable, IUiService
{ {
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;
private readonly FileDialogManager _manager; private readonly FileDialogManager _manager;

View file

@ -1,13 +1,14 @@
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using ImGuiNET; using ImGuiNET;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Import.Structs; using Penumbra.Import.Structs;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
namespace Penumbra.UI; namespace Penumbra.UI;
/// <summary> Draw the progress information for import. </summary> /// <summary> Draw the progress information for import. </summary>
public sealed class ImportPopup : Window public sealed class ImportPopup : Window, IUiService
{ {
public const string WindowLabel = "Penumbra Import Status"; public const string WindowLabel = "Penumbra Import Status";

View file

@ -2,6 +2,7 @@ using Dalamud.Interface;
using Dalamud.Interface.Internal; using Dalamud.Interface.Internal;
using Dalamud.Plugin; using Dalamud.Plugin;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using OtterGui.Services;
namespace Penumbra.UI; namespace Penumbra.UI;
@ -9,7 +10,7 @@ namespace Penumbra.UI;
/// A Launch Button used in the title screen of the game, /// A Launch Button used in the title screen of the game,
/// using the Dalamud-provided collapsible submenu. /// using the Dalamud-provided collapsible submenu.
/// </summary> /// </summary>
public class LaunchButton : IDisposable public class LaunchButton : IDisposable, IUiService
{ {
private readonly ConfigWindow _configWindow; private readonly ConfigWindow _configWindow;
private readonly UiBuilder _uiBuilder; private readonly UiBuilder _uiBuilder;

View file

@ -8,6 +8,7 @@ using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using OtterGui.FileSystem.Selector; using OtterGui.FileSystem.Selector;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -21,7 +22,7 @@ using MessageService = Penumbra.Services.MessageService;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSystemSelector.ModState> public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSystemSelector.ModState>, IUiService
{ {
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;
private readonly MessageService _messager; private readonly MessageService _messager;
@ -33,9 +34,9 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
private readonly ModImportManager _modImportManager; private readonly ModImportManager _modImportManager;
private readonly IDragDropManager _dragDrop; private readonly IDragDropManager _dragDrop;
private readonly ModSearchStringSplitter Filter = new(); private readonly ModSearchStringSplitter Filter = new();
public ModSettings SelectedSettings { get; private set; } = ModSettings.Empty; public ModSettings SelectedSettings { get; private set; } = ModSettings.Empty;
public ModCollection SelectedSettingCollection { get; private set; } = ModCollection.Empty; public ModCollection SelectedSettingCollection { get; private set; } = ModCollection.Empty;
public ModFileSystemSelector(IKeyState keyState, CommunicatorService communicator, ModFileSystem fileSystem, ModManager modManager, public ModFileSystemSelector(IKeyState keyState, CommunicatorService communicator, ModFileSystem fileSystem, ModManager modManager,

View file

@ -1,13 +1,14 @@
using Dalamud.Interface.Utility.Raii; using Dalamud.Interface.Utility.Raii;
using Dalamud.Plugin; using Dalamud.Plugin;
using ImGuiNET; using ImGuiNET;
using OtterGui.Services;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public class ModPanel : IDisposable public class ModPanel : IDisposable, IUiService
{ {
private readonly MultiModPanel _multiModPanel; private readonly MultiModPanel _multiModPanel;
private readonly ModFileSystemSelector _selector; private readonly ModFileSystemSelector _selector;

View file

@ -2,39 +2,29 @@ using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public class ModPanelChangedItemsTab : ITab public class ModPanelChangedItemsTab(ModFileSystemSelector selector, ChangedItemDrawer drawer) : ITab, IUiService
{ {
private readonly ModFileSystemSelector _selector;
private readonly ChangedItemDrawer _drawer;
private ChangedItemDrawer.ChangedItemIcon _filter = Enum.GetValues<ChangedItemDrawer.ChangedItemIcon>().Aggregate((a, b) => a | b);
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "Changed Items"u8; => "Changed Items"u8;
public ModPanelChangedItemsTab(ModFileSystemSelector selector, ChangedItemDrawer drawer)
{
_selector = selector;
_drawer = drawer;
}
public bool IsVisible public bool IsVisible
=> _selector.Selected!.ChangedItems.Count > 0; => selector.Selected!.ChangedItems.Count > 0;
public void DrawContent() public void DrawContent()
{ {
_drawer.DrawTypeFilter(); drawer.DrawTypeFilter();
ImGui.Separator(); ImGui.Separator();
using var table = ImRaii.Table("##changedItems", 1, ImGuiTableFlags.RowBg | ImGuiTableFlags.ScrollY, using var table = ImRaii.Table("##changedItems", 1, ImGuiTableFlags.RowBg | ImGuiTableFlags.ScrollY,
new Vector2(ImGui.GetContentRegionAvail().X, -1)); new Vector2(ImGui.GetContentRegionAvail().X, -1));
if (!table) if (!table)
return; return;
var zipList = ZipList.FromSortedList((SortedList<string, object?>)_selector.Selected!.ChangedItems); var zipList = ZipList.FromSortedList((SortedList<string, object?>)selector.Selected!.ChangedItems);
var height = ImGui.GetFrameHeightWithSpacing(); var height = ImGui.GetFrameHeightWithSpacing();
ImGui.TableNextColumn(); ImGui.TableNextColumn();
var skips = ImGuiClip.GetNecessarySkips(height); var skips = ImGuiClip.GetNecessarySkips(height);
@ -43,14 +33,14 @@ public class ModPanelChangedItemsTab : ITab
} }
private bool CheckFilter((string Name, object? Data) kvp) private bool CheckFilter((string Name, object? Data) kvp)
=> _drawer.FilterChangedItem(kvp.Name, kvp.Data, LowerString.Empty); => drawer.FilterChangedItem(kvp.Name, kvp.Data, LowerString.Empty);
private void DrawChangedItem((string Name, object? Data) kvp) private void DrawChangedItem((string Name, object? Data) kvp)
{ {
ImGui.TableNextColumn(); ImGui.TableNextColumn();
_drawer.DrawCategoryIcon(kvp.Name, kvp.Data); drawer.DrawCategoryIcon(kvp.Name, kvp.Data);
ImGui.SameLine(); ImGui.SameLine();
_drawer.DrawChangedItem(kvp.Name, kvp.Data); drawer.DrawChangedItem(kvp.Name, kvp.Data);
_drawer.DrawModelData(kvp.Data); drawer.DrawModelData(kvp.Data);
} }
} }

View file

@ -2,6 +2,7 @@ using Dalamud.Interface.Utility;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -10,25 +11,16 @@ using Penumbra.UI.Classes;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public class ModPanelCollectionsTab : ITab public class ModPanelCollectionsTab(CollectionStorage storage, ModFileSystemSelector selector) : ITab, IUiService
{ {
private readonly ModFileSystemSelector _selector; private readonly List<(ModCollection, ModCollection, uint, string)> _cache = [];
private readonly CollectionStorage _collections;
private readonly List<(ModCollection, ModCollection, uint, string)> _cache = new();
public ModPanelCollectionsTab(CollectionStorage storage, ModFileSystemSelector selector)
{
_collections = storage;
_selector = selector;
}
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "Collections"u8; => "Collections"u8;
public void DrawContent() public void DrawContent()
{ {
var (direct, inherited) = CountUsage(_selector.Selected!); var (direct, inherited) = CountUsage(selector.Selected!);
ImGui.NewLine(); ImGui.NewLine();
if (direct == 1) if (direct == 1)
ImGui.TextUnformatted("This Mod is directly configured in 1 collection."); ImGui.TextUnformatted("This Mod is directly configured in 1 collection.");
@ -80,7 +72,7 @@ public class ModPanelCollectionsTab : ITab
var disInherited = ColorId.InheritedDisabledMod.Value(); var disInherited = ColorId.InheritedDisabledMod.Value();
var directCount = 0; var directCount = 0;
var inheritedCount = 0; var inheritedCount = 0;
foreach (var collection in _collections) foreach (var collection in storage)
{ {
var (settings, parent) = collection[mod.Index]; var (settings, parent) = collection[mod.Index];
var (color, text) = settings == null var (color, text) = settings == null

View file

@ -3,6 +3,7 @@ using Dalamud.Interface.Utility;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Text; using OtterGui.Text;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Collections.Cache; using Penumbra.Collections.Cache;
@ -16,7 +17,7 @@ using Penumbra.UI.Classes;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public class ModPanelConflictsTab(CollectionManager collectionManager, ModFileSystemSelector selector) : ITab public class ModPanelConflictsTab(CollectionManager collectionManager, ModFileSystemSelector selector) : ITab, IUiService
{ {
private int? _currentPriority; private int? _currentPriority;

View file

@ -2,6 +2,7 @@ using Dalamud.Interface.Utility;
using ImGuiNET; using ImGuiNET;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui; using OtterGui;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
@ -12,7 +13,7 @@ public class ModPanelDescriptionTab(
TutorialService tutorial, TutorialService tutorial,
ModManager modManager, ModManager modManager,
PredefinedTagManager predefinedTagsConfig) PredefinedTagManager predefinedTagsConfig)
: ITab : ITab, IUiService
{ {
private readonly TagButtons _localTags = new(); private readonly TagButtons _localTags = new();
private readonly TagButtons _modTags = new(); private readonly TagButtons _modTags = new();

View file

@ -6,13 +6,13 @@ using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Widgets; using OtterGui.Widgets;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Services;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
using Penumbra.Mods.Settings; using Penumbra.Mods.Settings;
using Penumbra.Mods.Manager.OptionEditor;
using Penumbra.UI.ModsTab.Groups; using Penumbra.UI.ModsTab.Groups;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
@ -31,7 +31,7 @@ public class ModPanelEditTab(
ModGroupEditDrawer groupEditDrawer, ModGroupEditDrawer groupEditDrawer,
DescriptionEditPopup descriptionPopup, DescriptionEditPopup descriptionPopup,
AddGroupDrawer addGroupDrawer) AddGroupDrawer addGroupDrawer)
: ITab : ITab, IUiService
{ {
private readonly TagButtons _modTags = new(); private readonly TagButtons _modTags = new();

View file

@ -2,6 +2,7 @@ using Dalamud.Interface;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
@ -9,7 +10,7 @@ using Penumbra.UI.AdvancedWindow;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public class ModPanelTabBar public class ModPanelTabBar : IUiService
{ {
private enum ModPanelTabType private enum ModPanelTabType
{ {
@ -33,7 +34,7 @@ public class ModPanelTabBar
public readonly ITab[] Tabs; public readonly ITab[] Tabs;
private ModPanelTabType _preferredTab = ModPanelTabType.Settings; private ModPanelTabType _preferredTab = ModPanelTabType.Settings;
private Mod? _lastMod = null; private Mod? _lastMod;
public ModPanelTabBar(ModEditWindow modEditWindow, ModPanelSettingsTab settings, ModPanelDescriptionTab description, public ModPanelTabBar(ModEditWindow modEditWindow, ModPanelSettingsTab settings, ModPanelDescriptionTab description,
ModPanelConflictsTab conflicts, ModPanelChangedItemsTab changedItems, ModPanelEditTab edit, ModManager modManager, ModPanelConflictsTab conflicts, ModPanelChangedItemsTab changedItems, ModPanelEditTab edit, ModManager modManager,
@ -49,15 +50,15 @@ public class ModPanelTabBar
_tutorial = tutorial; _tutorial = tutorial;
Collections = collections; Collections = collections;
Tabs = new ITab[] Tabs =
{ [
Settings, Settings,
Description, Description,
Conflicts, Conflicts,
ChangedItems, ChangedItems,
Collections, Collections,
Edit, Edit,
}; ];
} }
public void Draw(Mod mod) public void Draw(Mod mod)

View file

@ -3,12 +3,13 @@ using Dalamud.Interface.Utility;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
public class MultiModPanel(ModFileSystemSelector _selector, ModDataEditor _editor) public class MultiModPanel(ModFileSystemSelector _selector, ModDataEditor _editor) : IUiService
{ {
public void Draw() public void Draw()
{ {
@ -65,8 +66,8 @@ public class MultiModPanel(ModFileSystemSelector _selector, ModDataEditor _edito
} }
private string _tag = string.Empty; private string _tag = string.Empty;
private readonly List<Mod> _addMods = []; private readonly List<Mod> _addMods = [];
private readonly List<(Mod, int)> _removeMods = []; private readonly List<(Mod, int)> _removeMods = [];
private void DrawMultiTagger() private void DrawMultiTagger()
{ {

View file

@ -6,14 +6,14 @@ using Newtonsoft.Json.Linq;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;
using ErrorEventArgs = Newtonsoft.Json.Serialization.ErrorEventArgs;
namespace Penumbra.UI; namespace Penumbra.UI;
public sealed class PredefinedTagManager : ISavable, IReadOnlyList<string> public sealed class PredefinedTagManager : ISavable, IReadOnlyList<string>, IService
{ {
public const int Version = 1; public const int Version = 1;

View file

@ -2,6 +2,7 @@ using FFXIVClientStructs.FFXIV.Client.Game.Object;
using FFXIVClientStructs.FFXIV.Client.System.Resource; using FFXIVClientStructs.FFXIV.Client.System.Resource;
using ImGuiNET; using ImGuiNET;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
@ -15,7 +16,7 @@ using Penumbra.UI.Classes;
namespace Penumbra.UI.ResourceWatcher; namespace Penumbra.UI.ResourceWatcher;
public sealed class ResourceWatcher : IDisposable, ITab public sealed class ResourceWatcher : IDisposable, ITab, IUiService
{ {
public const int DefaultMaxEntries = 1024; public const int DefaultMaxEntries = 1024;
public const RecordType AllRecords = RecordType.Request | RecordType.ResourceLoad | RecordType.FileLoad | RecordType.Destruction; public const RecordType AllRecords = RecordType.Request | RecordType.ResourceLoad | RecordType.FileLoad | RecordType.Destruction;

View file

@ -2,6 +2,7 @@ using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -17,7 +18,7 @@ public class ChangedItemsTab(
CollectionSelectHeader collectionHeader, CollectionSelectHeader collectionHeader,
ChangedItemDrawer drawer, ChangedItemDrawer drawer,
CommunicatorService communicator) CommunicatorService communicator)
: ITab : ITab, IUiService
{ {
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "Changed Items"u8; => "Changed Items"u8;

View file

@ -2,6 +2,7 @@ using Dalamud.Game.ClientState.Objects;
using Dalamud.Plugin; using Dalamud.Plugin;
using ImGuiNET; using ImGuiNET;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
@ -11,7 +12,7 @@ using Penumbra.UI.CollectionTab;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public sealed class CollectionsTab : IDisposable, ITab public sealed class CollectionsTab : IDisposable, ITab, IUiService
{ {
private readonly EphemeralConfig _config; private readonly EphemeralConfig _config;
private readonly CollectionSelector _selector; private readonly CollectionSelector _selector;

View file

@ -1,4 +1,5 @@
using ImGuiNET; using ImGuiNET;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Mods; using Penumbra.Mods;
@ -8,7 +9,7 @@ using Watcher = Penumbra.UI.ResourceWatcher.ResourceWatcher;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public class ConfigTabBar : IDisposable public class ConfigTabBar : IDisposable, IUiService
{ {
private readonly CommunicatorService _communicator; private readonly CommunicatorService _communicator;

View file

@ -44,7 +44,7 @@ using Penumbra.Api.IpcTester;
namespace Penumbra.UI.Tabs.Debug; namespace Penumbra.UI.Tabs.Debug;
public class Diagnostics(IServiceProvider provider) public class Diagnostics(ServiceManager provider) : IUiService
{ {
public void DrawDiagnostics() public void DrawDiagnostics()
{ {
@ -55,7 +55,7 @@ public class Diagnostics(IServiceProvider provider)
foreach (var type in typeof(ActorManager).Assembly.GetTypes() foreach (var type in typeof(ActorManager).Assembly.GetTypes()
.Where(t => t is { IsAbstract: false, IsInterface: false } && t.IsAssignableTo(typeof(IAsyncDataContainer)))) .Where(t => t is { IsAbstract: false, IsInterface: false } && t.IsAssignableTo(typeof(IAsyncDataContainer))))
{ {
var container = (IAsyncDataContainer)provider.GetRequiredService(type); var container = (IAsyncDataContainer)provider.Provider!.GetRequiredService(type);
ImGuiUtil.DrawTableColumn(container.Name); ImGuiUtil.DrawTableColumn(container.Name);
ImGuiUtil.DrawTableColumn(container.Time.ToString()); ImGuiUtil.DrawTableColumn(container.Time.ToString());
ImGuiUtil.DrawTableColumn(Functions.HumanReadableSize(container.Memory)); ImGuiUtil.DrawTableColumn(Functions.HumanReadableSize(container.Memory));
@ -64,7 +64,7 @@ public class Diagnostics(IServiceProvider provider)
} }
} }
public class DebugTab : Window, ITab public class DebugTab : Window, ITab, IUiService
{ {
private readonly PerformanceTracker _performance; private readonly PerformanceTracker _performance;
private readonly Configuration _config; private readonly Configuration _config;

View file

@ -3,6 +3,7 @@ using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Cache; using Penumbra.Collections.Cache;
@ -15,7 +16,7 @@ using Penumbra.UI.Classes;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public class EffectiveTab(CollectionManager collectionManager, CollectionSelectHeader collectionHeader) public class EffectiveTab(CollectionManager collectionManager, CollectionSelectHeader collectionHeader)
: ITab : ITab, IUiService
{ {
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "Effective Changes"u8; => "Effective Changes"u8;

View file

@ -1,9 +1,10 @@
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public class MessagesTab(MessageService messages) : ITab public class MessagesTab(MessageService messages) : ITab, IUiService
{ {
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "Messages"u8; => "Messages"u8;

View file

@ -6,6 +6,7 @@ using Penumbra.UI.Classes;
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.Housing; using FFXIVClientStructs.FFXIV.Client.Game.Housing;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Interop.Services; using Penumbra.Interop.Services;
@ -30,7 +31,7 @@ public class ModsTab(
CollectionSelectHeader collectionHeader, CollectionSelectHeader collectionHeader,
ITargetManager targets, ITargetManager targets,
ObjectManager objects) ObjectManager objects)
: ITab : ITab, IUiService
{ {
private readonly ActiveCollections _activeCollections = collectionManager.Active; private readonly ActiveCollections _activeCollections = collectionManager.Active;

View file

@ -1,16 +1,12 @@
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public class OnScreenTab : ITab public class OnScreenTab(ResourceTreeViewerFactory resourceTreeViewerFactory) : ITab, IUiService
{ {
private readonly ResourceTreeViewer _viewer; private readonly ResourceTreeViewer _viewer = resourceTreeViewerFactory.Create(0, delegate { }, delegate { });
public OnScreenTab(ResourceTreeViewerFactory resourceTreeViewerFactory)
{
_viewer = resourceTreeViewerFactory.Create(0, delegate { }, delegate { });
}
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "On-Screen"u8; => "On-Screen"u8;

View file

@ -6,6 +6,7 @@ using FFXIVClientStructs.STD;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Interop.ResourceLoading; using Penumbra.Interop.ResourceLoading;
using Penumbra.String.Classes; using Penumbra.String.Classes;
@ -13,7 +14,7 @@ using Penumbra.String.Classes;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public class ResourceTab(Configuration config, ResourceManagerService resourceManager, ISigScanner sigScanner) public class ResourceTab(Configuration config, ResourceManagerService resourceManager, ISigScanner sigScanner)
: ITab : ITab, IUiService
{ {
public ReadOnlySpan<byte> Label public ReadOnlySpan<byte> Label
=> "Resource Manager"u8; => "Resource Manager"u8;

View file

@ -9,6 +9,7 @@ using OtterGui;
using OtterGui.Compression; using OtterGui.Compression;
using OtterGui.Custom; using OtterGui.Custom;
using OtterGui.Raii; using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Api; using Penumbra.Api;
using Penumbra.Interop.Services; using Penumbra.Interop.Services;
@ -19,7 +20,7 @@ using Penumbra.UI.ModsTab;
namespace Penumbra.UI.Tabs; namespace Penumbra.UI.Tabs;
public class SettingsTab : ITab public class SettingsTab : ITab, IUiService
{ {
public const int RootDirectoryMaxLength = 64; public const int RootDirectoryMaxLength = 64;

View file

@ -1,3 +1,4 @@
using OtterGui.Services;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
@ -40,7 +41,7 @@ public enum BasicTutorialSteps
} }
/// <summary> Service for the in-game tutorial. </summary> /// <summary> Service for the in-game tutorial. </summary>
public class TutorialService public class TutorialService : IUiService
{ {
public const string SelectedCollection = "Selected Collection"; public const string SelectedCollection = "Selected Collection";
public const string DefaultCollection = "Base Collection"; public const string DefaultCollection = "Base Collection";

View file

@ -1,12 +1,13 @@
using Dalamud.Interface; using Dalamud.Interface;
using Dalamud.Interface.Windowing; using Dalamud.Interface.Windowing;
using Dalamud.Plugin; using Dalamud.Plugin;
using OtterGui.Services;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
using Penumbra.UI.Tabs.Debug; using Penumbra.UI.Tabs.Debug;
namespace Penumbra.UI; namespace Penumbra.UI;
public class PenumbraWindowSystem : IDisposable public class PenumbraWindowSystem : IDisposable, IUiService
{ {
private readonly UiBuilder _uiBuilder; private readonly UiBuilder _uiBuilder;
private readonly WindowSystem _windowSystem; private readonly WindowSystem _windowSystem;