Reorder stuff.

This commit is contained in:
Ottermandias 2024-04-24 23:28:12 +02:00
parent 6b1743b776
commit 514121d8c1
58 changed files with 416 additions and 539 deletions

View file

@ -8,8 +8,9 @@ using Penumbra.Communication;
using Penumbra.Interop.PathResolving; using Penumbra.Interop.PathResolving;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Api.Api; namespace Penumbra.Api.Api;

View file

@ -5,7 +5,7 @@ using Penumbra.Collections.Manager;
using Penumbra.GameData.Actors; using Penumbra.GameData.Actors;
using Penumbra.GameData.Interop; using Penumbra.GameData.Interop;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Api.Api; namespace Penumbra.Api.Api;

View file

@ -6,7 +6,7 @@ using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
namespace Penumbra.Api; namespace Penumbra.Api;

View file

@ -8,7 +8,7 @@ using Penumbra.Interop.ResourceLoading;
using Penumbra.Meta; using Penumbra.Meta;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;

View file

@ -2,7 +2,7 @@ using OtterGui;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;

View file

@ -5,7 +5,7 @@ using Penumbra.Communication;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Collections.Manager; namespace Penumbra.Collections.Manager;

View file

@ -1,6 +1,6 @@
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.Util; using Penumbra.Util;

View file

@ -1,7 +1,7 @@
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Collections; namespace Penumbra.Collections;

View file

@ -2,7 +2,7 @@ using Newtonsoft.Json.Linq;
using Penumbra.Services; using Penumbra.Services;
using Newtonsoft.Json; using Newtonsoft.Json;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
namespace Penumbra.Collections; namespace Penumbra.Collections;

View file

@ -4,7 +4,7 @@ using Penumbra.Api.Api;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
namespace Penumbra.Communication; namespace Penumbra.Communication;

View file

@ -3,7 +3,9 @@ using OtterGui;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Import.Structs; using Penumbra.Import.Structs;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.Util; using Penumbra.Util;
using ZipArchive = SharpCompress.Archives.Zip.ZipArchive; using ZipArchive = SharpCompress.Archives.Zip.ZipArchive;

View file

@ -11,7 +11,7 @@ using Penumbra.Interop.Services;
using Penumbra.Interop.Structs; using Penumbra.Interop.Structs;
using Penumbra.Meta.Files; using Penumbra.Meta.Files;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Services; using Penumbra.Services;
using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager; using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager;

View file

@ -1,6 +1,7 @@
using OtterGui.Classes; using OtterGui.Classes;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;

View file

@ -1,4 +1,4 @@
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;

View file

@ -1,6 +1,7 @@
using OtterGui.Classes; using OtterGui.Classes;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;

View file

@ -1,6 +1,7 @@
using OtterGui; using OtterGui;
using OtterGui.Compression; using OtterGui.Compression;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Mods.SubMods;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;

View file

@ -1,5 +1,5 @@
using OtterGui; using OtterGui;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;

View file

@ -1,5 +1,5 @@
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;

View file

@ -5,7 +5,7 @@ using OtterGui.Classes;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.UI.ModsTab; using Penumbra.UI.ModsTab;

View file

@ -1,6 +1,6 @@
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;

View file

@ -3,8 +3,9 @@ using Dalamud.Interface.Internal.Notifications;
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Tasks; using OtterGui.Tasks;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Editor; namespace Penumbra.Mods.Editor;

View file

@ -1,6 +1,6 @@
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.Util; using Penumbra.Util;

View file

@ -1,11 +1,11 @@
using FFXIVClientStructs.FFXIV.Client.UI.Agent;
using Newtonsoft.Json; using Newtonsoft.Json;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Services; using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Groups;
public interface ITexToolsGroup public interface ITexToolsGroup
{ {
@ -16,22 +16,22 @@ public interface IModGroup
{ {
public const int MaxMultiOptions = 63; public const int MaxMultiOptions = 63;
public Mod Mod { get; } public Mod Mod { get; }
public string Name { get; } public string Name { get; }
public string Description { get; } public string Description { get; }
public GroupType Type { get; } public GroupType Type { get; }
public ModPriority Priority { get; set; } public ModPriority Priority { get; set; }
public Setting DefaultSettings { get; set; } public Setting DefaultSettings { get; set; }
public FullPath? FindBestMatch(Utf8GamePath gamePath); public FullPath? FindBestMatch(Utf8GamePath gamePath);
public int AddOption(Mod mod, string name, string description = ""); public int AddOption(Mod mod, string name, string description = "");
public IReadOnlyList<IModOption> Options { get; } public IReadOnlyList<IModOption> Options { get; }
public IReadOnlyList<IModDataContainer> DataContainers { get; } public IReadOnlyList<IModDataContainer> DataContainers { get; }
public bool IsOption { get; } public bool IsOption { get; }
public IModGroup Convert(GroupType type); public IModGroup Convert(GroupType type);
public bool MoveOption(int optionIdxFrom, int optionIdxTo); public bool MoveOption(int optionIdxFrom, int optionIdxTo);
public int GetIndex(); public int GetIndex();
@ -88,67 +88,15 @@ public interface IModGroup
public static (int Redirections, int Swaps, int Manips) GetCountsBase(IModGroup group) public static (int Redirections, int Swaps, int Manips) GetCountsBase(IModGroup group)
{ {
var redirectionCount = 0; var redirectionCount = 0;
var swapCount = 0; var swapCount = 0;
var manipCount = 0; var manipCount = 0;
foreach (var option in group.DataContainers) foreach (var option in group.DataContainers)
{ {
redirectionCount += option.Files.Count; redirectionCount += option.Files.Count;
swapCount += option.FileSwaps.Count; swapCount += option.FileSwaps.Count;
manipCount += option.Manipulations.Count; manipCount += option.Manipulations.Count;
} }
return (redirectionCount, swapCount, manipCount); return (redirectionCount, swapCount, manipCount);
} }
} }
public readonly struct ModSaveGroup : ISavable
{
private readonly DirectoryInfo _basePath;
private readonly IModGroup? _group;
private readonly int _groupIdx;
private readonly DefaultSubMod? _defaultMod;
private readonly bool _onlyAscii;
public ModSaveGroup(Mod mod, int groupIdx, bool onlyAscii)
{
_basePath = mod.ModPath;
_groupIdx = groupIdx;
if (_groupIdx < 0)
_defaultMod = mod.Default;
else
_group = mod.Groups[_groupIdx];
_onlyAscii = onlyAscii;
}
public ModSaveGroup(DirectoryInfo basePath, IModGroup group, int groupIdx, bool onlyAscii)
{
_basePath = basePath;
_group = group;
_groupIdx = groupIdx;
_onlyAscii = onlyAscii;
}
public ModSaveGroup(DirectoryInfo basePath, DefaultSubMod @default, bool onlyAscii)
{
_basePath = basePath;
_groupIdx = -1;
_defaultMod = @default;
_onlyAscii = onlyAscii;
}
public string ToFilename(FilenameService fileNames)
=> fileNames.OptionGroupFile(_basePath.FullName, _groupIdx, _group?.Name ?? string.Empty, _onlyAscii);
public void Save(StreamWriter writer)
{
using var j = new JsonTextWriter(writer);
j.Formatting = Formatting.Indented;
var serializer = new JsonSerializer { Formatting = Formatting.Indented };
j.WriteStartObject();
if (_groupIdx >= 0)
_group!.WriteJson(j, serializer);
else
IModDataContainer.WriteModData(j, serializer, _defaultMod!, _basePath);
j.WriteEndObject();
}
}

View file

@ -0,0 +1,57 @@
using Newtonsoft.Json;
using Penumbra.Mods.SubMods;
using Penumbra.Services;
namespace Penumbra.Mods.Groups;
public readonly struct ModSaveGroup : ISavable
{
private readonly DirectoryInfo _basePath;
private readonly IModGroup? _group;
private readonly int _groupIdx;
private readonly DefaultSubMod? _defaultMod;
private readonly bool _onlyAscii;
public ModSaveGroup(Mod mod, int groupIdx, bool onlyAscii)
{
_basePath = mod.ModPath;
_groupIdx = groupIdx;
if (_groupIdx < 0)
_defaultMod = mod.Default;
else
_group = mod.Groups[_groupIdx];
_onlyAscii = onlyAscii;
}
public ModSaveGroup(DirectoryInfo basePath, IModGroup group, int groupIdx, bool onlyAscii)
{
_basePath = basePath;
_group = group;
_groupIdx = groupIdx;
_onlyAscii = onlyAscii;
}
public ModSaveGroup(DirectoryInfo basePath, DefaultSubMod @default, bool onlyAscii)
{
_basePath = basePath;
_groupIdx = -1;
_defaultMod = @default;
_onlyAscii = onlyAscii;
}
public string ToFilename(FilenameService fileNames)
=> fileNames.OptionGroupFile(_basePath.FullName, _groupIdx, _group?.Name ?? string.Empty, _onlyAscii);
public void Save(StreamWriter writer)
{
using var j = new JsonTextWriter(writer);
j.Formatting = Formatting.Indented;
var serializer = new JsonSerializer { Formatting = Formatting.Indented };
j.WriteStartObject();
if (_groupIdx >= 0)
_group!.WriteJson(j, serializer);
else
IModDataContainer.WriteModData(j, serializer, _defaultMod!, _basePath);
j.WriteEndObject();
}
}

View file

@ -6,9 +6,11 @@ using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Groups;
/// <summary> Groups that allow all available options to be selected at once. </summary> /// <summary> Groups that allow all available options to be selected at once. </summary>
public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
@ -16,11 +18,11 @@ public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
public GroupType Type public GroupType Type
=> GroupType.Multi; => GroupType.Multi;
public Mod Mod { get; set; } = mod; public Mod Mod { get; set; } = mod;
public string Name { get; set; } = "Group"; public string Name { get; set; } = "Group";
public string Description { get; set; } = "A non-exclusive group of settings."; public string Description { get; set; } = "A non-exclusive group of settings.";
public ModPriority Priority { get; set; } public ModPriority Priority { get; set; }
public Setting DefaultSettings { get; set; } public Setting DefaultSettings { get; set; }
public readonly List<MultiSubMod> OptionData = []; public readonly List<MultiSubMod> OptionData = [];
public IReadOnlyList<IModOption> Options public IReadOnlyList<IModOption> Options
@ -45,7 +47,7 @@ public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
var subMod = new MultiSubMod(mod, this) var subMod = new MultiSubMod(mod, this)
{ {
Name = name, Name = name,
Description = description, Description = description,
}; };
OptionData.Add(subMod); OptionData.Add(subMod);
@ -56,9 +58,9 @@ public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
{ {
var ret = new MultiModGroup(mod) var ret = new MultiModGroup(mod)
{ {
Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty, Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty,
Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty, Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty,
Priority = json[nameof(Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default, Priority = json[nameof(Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default,
DefaultSettings = json[nameof(DefaultSettings)]?.ToObject<Setting>() ?? Setting.Zero, DefaultSettings = json[nameof(DefaultSettings)]?.ToObject<Setting>() ?? Setting.Zero,
}; };
if (ret.Name.Length == 0) if (ret.Name.Length == 0)
@ -93,9 +95,9 @@ public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
case GroupType.Single: case GroupType.Single:
var single = new SingleModGroup(Mod) var single = new SingleModGroup(Mod)
{ {
Name = Name, Name = Name,
Description = Description, Description = Description,
Priority = Priority, Priority = Priority,
DefaultSettings = DefaultSettings.TurnMulti(OptionData.Count), DefaultSettings = DefaultSettings.TurnMulti(OptionData.Count),
}; };
single.OptionData.AddRange(OptionData.Select(o => o.ConvertToSingle(Mod, single))); single.OptionData.AddRange(OptionData.Select(o => o.ConvertToSingle(Mod, single)));
@ -152,7 +154,7 @@ public sealed class MultiModGroup(Mod mod) : IModGroup, ITexToolsGroup
=> IModGroup.GetCountsBase(this); => IModGroup.GetCountsBase(this);
public Setting FixSetting(Setting setting) public Setting FixSetting(Setting setting)
=> new(setting.Value & ((1ul << OptionData.Count) - 1)); => new(setting.Value & (1ul << OptionData.Count) - 1);
/// <summary> Create a group without a mod only for saving it in the creator. </summary> /// <summary> Create a group without a mod only for saving it in the creator. </summary>
internal static MultiModGroup CreateForSaving(string name) internal static MultiModGroup CreateForSaving(string name)

View file

@ -4,9 +4,11 @@ using OtterGui;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Groups;
/// <summary> Groups that allow only one of their available options to be selected. </summary> /// <summary> Groups that allow only one of their available options to be selected. </summary>
public sealed class SingleModGroup(Mod mod) : IModGroup, ITexToolsGroup public sealed class SingleModGroup(Mod mod) : IModGroup, ITexToolsGroup
@ -14,11 +16,11 @@ public sealed class SingleModGroup(Mod mod) : IModGroup, ITexToolsGroup
public GroupType Type public GroupType Type
=> GroupType.Single; => GroupType.Single;
public Mod Mod { get; set; } = mod; public Mod Mod { get; set; } = mod;
public string Name { get; set; } = "Option"; public string Name { get; set; } = "Option";
public string Description { get; set; } = "A mutually exclusive group of settings."; public string Description { get; set; } = "A mutually exclusive group of settings.";
public ModPriority Priority { get; set; } public ModPriority Priority { get; set; }
public Setting DefaultSettings { get; set; } public Setting DefaultSettings { get; set; }
public readonly List<SingleSubMod> OptionData = []; public readonly List<SingleSubMod> OptionData = [];
@ -34,7 +36,7 @@ public sealed class SingleModGroup(Mod mod) : IModGroup, ITexToolsGroup
{ {
var subMod = new SingleSubMod(mod, this) var subMod = new SingleSubMod(mod, this)
{ {
Name = name, Name = name,
Description = description, Description = description,
}; };
OptionData.Add(subMod); OptionData.Add(subMod);
@ -55,9 +57,9 @@ public sealed class SingleModGroup(Mod mod) : IModGroup, ITexToolsGroup
var options = json["Options"]; var options = json["Options"];
var ret = new SingleModGroup(mod) var ret = new SingleModGroup(mod)
{ {
Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty, Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty,
Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty, Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty,
Priority = json[nameof(Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default, Priority = json[nameof(Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default,
DefaultSettings = json[nameof(DefaultSettings)]?.ToObject<Setting>() ?? Setting.Zero, DefaultSettings = json[nameof(DefaultSettings)]?.ToObject<Setting>() ?? Setting.Zero,
}; };
if (ret.Name.Length == 0) if (ret.Name.Length == 0)
@ -82,9 +84,9 @@ public sealed class SingleModGroup(Mod mod) : IModGroup, ITexToolsGroup
case GroupType.Multi: case GroupType.Multi:
var multi = new MultiModGroup(Mod) var multi = new MultiModGroup(Mod)
{ {
Name = Name, Name = Name,
Description = Description, Description = Description,
Priority = Priority, Priority = Priority,
DefaultSettings = Setting.Multi((int)DefaultSettings.Value), DefaultSettings = Setting.Multi((int)DefaultSettings.Value),
}; };
multi.OptionData.AddRange(OptionData.Select((o, i) => o.ConvertToMulti(Mod, multi, new ModPriority(i)))); multi.OptionData.AddRange(OptionData.Select((o, i) => o.ConvertToMulti(Mod, multi, new ModPriority(i))));

View file

@ -7,7 +7,7 @@ using Penumbra.String.Classes;
using Penumbra.Meta; using Penumbra.Meta;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
namespace Penumbra.Mods.ItemSwap; namespace Penumbra.Mods.ItemSwap;

View file

@ -2,7 +2,6 @@ using Penumbra.Communication;
using Penumbra.GameData.Data; using Penumbra.GameData.Data;
using Penumbra.GameData.Enums; using Penumbra.GameData.Enums;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Subclasses;
using Penumbra.Services; using Penumbra.Services;
namespace Penumbra.Mods.Manager; namespace Penumbra.Mods.Manager;

View file

@ -2,7 +2,9 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using OtterGui; using OtterGui;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;

View file

@ -4,7 +4,9 @@ using OtterGui.Classes;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.Util; using Penumbra.Util;

View file

@ -1,9 +1,10 @@
using OtterGui; using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using Penumbra.Collections.Cache;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods; namespace Penumbra.Mods;

View file

@ -9,8 +9,10 @@ using Penumbra.GameData.Data;
using Penumbra.Import; using Penumbra.Import;
using Penumbra.Import.Structs; using Penumbra.Import.Structs;
using Penumbra.Meta; using Penumbra.Meta;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;

View file

@ -5,29 +5,25 @@ using Penumbra.Services;
namespace Penumbra.Mods; namespace Penumbra.Mods;
public readonly struct ModLocalData : ISavable public readonly struct ModLocalData(Mod mod) : ISavable
{ {
public const int FileVersion = 3; public const int FileVersion = 3;
private readonly Mod _mod;
public ModLocalData(Mod mod)
=> _mod = mod;
public string ToFilename(FilenameService fileNames) public string ToFilename(FilenameService fileNames)
=> fileNames.LocalDataFile(_mod); => fileNames.LocalDataFile(mod);
public void Save(StreamWriter writer) public void Save(StreamWriter writer)
{ {
var jObject = new JObject var jObject = new JObject
{ {
{ nameof(FileVersion), JToken.FromObject(FileVersion) }, { nameof(FileVersion), JToken.FromObject(FileVersion) },
{ nameof(Mod.ImportDate), JToken.FromObject(_mod.ImportDate) }, { nameof(Mod.ImportDate), JToken.FromObject(mod.ImportDate) },
{ nameof(Mod.LocalTags), JToken.FromObject(_mod.LocalTags) }, { nameof(Mod.LocalTags), JToken.FromObject(mod.LocalTags) },
{ nameof(Mod.Note), JToken.FromObject(_mod.Note) }, { nameof(Mod.Note), JToken.FromObject(mod.Note) },
{ nameof(Mod.Favorite), JToken.FromObject(_mod.Favorite) }, { nameof(Mod.Favorite), JToken.FromObject(mod.Favorite) },
}; };
using var jWriter = new JsonTextWriter(writer) { Formatting = Formatting.Indented }; using var jWriter = new JsonTextWriter(writer);
jWriter.Formatting = Formatting.Indented;
jObject.WriteTo(jWriter); jObject.WriteTo(jWriter);
} }

View file

@ -4,31 +4,27 @@ using Penumbra.Services;
namespace Penumbra.Mods; namespace Penumbra.Mods;
public readonly struct ModMeta : ISavable public readonly struct ModMeta(Mod mod) : ISavable
{ {
public const uint FileVersion = 3; public const uint FileVersion = 3;
private readonly Mod _mod;
public ModMeta(Mod mod)
=> _mod = mod;
public string ToFilename(FilenameService fileNames) public string ToFilename(FilenameService fileNames)
=> fileNames.ModMetaPath(_mod); => fileNames.ModMetaPath(mod);
public void Save(StreamWriter writer) public void Save(StreamWriter writer)
{ {
var jObject = new JObject var jObject = new JObject
{ {
{ nameof(FileVersion), JToken.FromObject(FileVersion) }, { nameof(FileVersion), JToken.FromObject(FileVersion) },
{ nameof(Mod.Name), JToken.FromObject(_mod.Name) }, { nameof(Mod.Name), JToken.FromObject(mod.Name) },
{ nameof(Mod.Author), JToken.FromObject(_mod.Author) }, { nameof(Mod.Author), JToken.FromObject(mod.Author) },
{ nameof(Mod.Description), JToken.FromObject(_mod.Description) }, { nameof(Mod.Description), JToken.FromObject(mod.Description) },
{ nameof(Mod.Version), JToken.FromObject(_mod.Version) }, { nameof(Mod.Version), JToken.FromObject(mod.Version) },
{ nameof(Mod.Website), JToken.FromObject(_mod.Website) }, { nameof(Mod.Website), JToken.FromObject(mod.Website) },
{ nameof(Mod.ModTags), JToken.FromObject(_mod.ModTags) }, { nameof(Mod.ModTags), JToken.FromObject(mod.ModTags) },
}; };
using var jWriter = new JsonTextWriter(writer) { Formatting = Formatting.Indented }; using var jWriter = new JsonTextWriter(writer);
jWriter.Formatting = Formatting.Indented;
jObject.WriteTo(jWriter); jObject.WriteTo(jWriter);
} }
} }

View file

@ -1,6 +1,6 @@
using Newtonsoft.Json; using Newtonsoft.Json;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Settings;
[JsonConverter(typeof(Converter))] [JsonConverter(typeof(Converter))]
public readonly record struct ModPriority(int Value) : public readonly record struct ModPriority(int Value) :

View file

@ -1,12 +1,11 @@
using OtterGui; using OtterGui;
using OtterGui.Filesystem; using OtterGui.Filesystem;
using Penumbra.Api.Enums; using Penumbra.Api.Enums;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.String.Classes;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Settings;
/// <summary> Contains the settings for a given mod. </summary> /// <summary> Contains the settings for a given mod. </summary>
public class ModSettings public class ModSettings

View file

@ -1,7 +1,7 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using OtterGui; using OtterGui;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Settings;
[JsonConverter(typeof(Converter))] [JsonConverter(typeof(Converter))]
public readonly record struct Setting(ulong Value) public readonly record struct Setting(ulong Value)

View file

@ -1,4 +1,4 @@
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.Settings;
public class SettingList : List<Setting> public class SettingList : List<Setting>
{ {

View file

@ -0,0 +1,30 @@
using Newtonsoft.Json.Linq;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.String.Classes;
namespace Penumbra.Mods.SubMods;
public class DefaultSubMod(IMod mod) : IModDataContainer
{
public const string FullName = "Default Option";
internal readonly IMod Mod = mod;
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } = [];
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } = [];
public HashSet<MetaManipulation> Manipulations { get; set; } = [];
IMod IModDataContainer.Mod
=> Mod;
IModGroup? IModDataContainer.Group
=> null;
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
=> ((IModDataContainer)this).AddDataTo(redirections, manipulations);
public (int GroupIndex, int DataIndex) GetDataIndices()
=> (-1, 0);
}

View file

@ -2,18 +2,19 @@ using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.SubMods;
public interface IModDataContainer public interface IModDataContainer
{ {
public IMod Mod { get; } public IMod Mod { get; }
public IModGroup? Group { get; } public IModGroup? Group { get; }
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } public Dictionary<Utf8GamePath, FullPath> Files { get; set; }
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; }
public HashSet<MetaManipulation> Manipulations { get; set; } public HashSet<MetaManipulation> Manipulations { get; set; }
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations) public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
{ {
@ -28,24 +29,24 @@ public interface IModDataContainer
public string GetName() public string GetName()
=> this switch => this switch
{ {
IModOption o => o.FullName, IModOption o => o.FullName,
DefaultSubMod => DefaultSubMod.FullName, DefaultSubMod => DefaultSubMod.FullName,
_ => $"Container {GetDataIndices().DataIndex + 1}", _ => $"Container {GetDataIndices().DataIndex + 1}",
}; };
public string GetFullName() public string GetFullName()
=> this switch => this switch
{ {
IModOption o => o.FullName, IModOption o => o.FullName,
DefaultSubMod => DefaultSubMod.FullName, DefaultSubMod => DefaultSubMod.FullName,
_ when Group != null => $"{Group.Name}: Container {GetDataIndices().DataIndex + 1}", _ when Group != null => $"{Group.Name}: Container {GetDataIndices().DataIndex + 1}",
_ => $"Container {GetDataIndices().DataIndex + 1}", _ => $"Container {GetDataIndices().DataIndex + 1}",
}; };
public static void Clone(IModDataContainer from, IModDataContainer to) public static void Clone(IModDataContainer from, IModDataContainer to)
{ {
to.Files = new Dictionary<Utf8GamePath, FullPath>(from.Files); to.Files = new Dictionary<Utf8GamePath, FullPath>(from.Files);
to.FileSwaps = new Dictionary<Utf8GamePath, FullPath>(from.FileSwaps); to.FileSwaps = new Dictionary<Utf8GamePath, FullPath>(from.FileSwaps);
to.Manipulations = [.. from.Manipulations]; to.Manipulations = [.. from.Manipulations];
} }
@ -126,3 +127,5 @@ public interface IModDataContainer
} }
} }
} }
public interface IModDataOption : IModOption, IModDataContainer;

View file

@ -1,17 +1,17 @@
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Linq; using Newtonsoft.Json.Linq;
namespace Penumbra.Mods.Subclasses; namespace Penumbra.Mods.SubMods;
public interface IModOption public interface IModOption
{ {
public string Name { get; set; } public string Name { get; set; }
public string FullName { get; } public string FullName { get; }
public string Description { get; set; } public string Description { get; set; }
public static void Load(JToken json, IModOption option) public static void Load(JToken json, IModOption option)
{ {
option.Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty; option.Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty;
option.Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty; option.Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty;
} }

View file

@ -0,0 +1,92 @@
using Newtonsoft.Json.Linq;
using OtterGui;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.String.Classes;
namespace Penumbra.Mods.SubMods;
public class MultiSubMod(Mod mod, MultiModGroup group) : IModDataOption
{
internal readonly Mod Mod = mod;
internal readonly MultiModGroup Group = group;
public string Name { get; set; } = "Option";
public string FullName
=> $"{Group.Name}: {Name}";
public string Description { get; set; } = string.Empty;
public ModPriority Priority { get; set; } = ModPriority.Default;
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } = [];
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } = [];
public HashSet<MetaManipulation> Manipulations { get; set; } = [];
IMod IModDataContainer.Mod
=> Mod;
IModGroup IModDataContainer.Group
=> Group;
public MultiSubMod(Mod mod, MultiModGroup group, JToken json)
: this(mod, group)
{
IModOption.Load(json, this);
IModDataContainer.Load(json, this, mod.ModPath);
Priority = json[nameof(IModGroup.Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default;
}
public MultiSubMod Clone(Mod mod, MultiModGroup group)
{
var ret = new MultiSubMod(mod, group)
{
Name = Name,
Description = Description,
Priority = Priority,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public SingleSubMod ConvertToSingle(Mod mod, SingleModGroup group)
{
var ret = new SingleSubMod(mod, group)
{
Name = Name,
Description = Description,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
=> ((IModDataContainer)this).AddDataTo(redirections, manipulations);
public static MultiSubMod CreateForSaving(string name, string description, ModPriority priority)
=> new(null!, null!)
{
Name = name,
Description = description,
Priority = priority,
};
public (int GroupIndex, int DataIndex) GetDataIndices()
=> (Group.GetIndex(), GetDataIndex());
public (int GroupIndex, int OptionIndex) GetOptionIndices()
=> (Group.GetIndex(), GetDataIndex());
private int GetDataIndex()
{
var dataIndex = Group.DataContainers.IndexOf(this);
if (dataIndex < 0)
throw new Exception($"Group {Group.Name} from SubMod {Name} does not contain this SubMod.");
return dataIndex;
}
}

View file

@ -0,0 +1,82 @@
using Newtonsoft.Json.Linq;
using OtterGui;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
using Penumbra.String.Classes;
namespace Penumbra.Mods.SubMods;
public class SingleSubMod(Mod mod, SingleModGroup group) : IModDataOption
{
internal readonly Mod Mod = mod;
internal readonly SingleModGroup Group = group;
public string Name { get; set; } = "Option";
public string FullName
=> $"{Group.Name}: {Name}";
public string Description { get; set; } = string.Empty;
IMod IModDataContainer.Mod
=> Mod;
IModGroup IModDataContainer.Group
=> Group;
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } = [];
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } = [];
public HashSet<MetaManipulation> Manipulations { get; set; } = [];
public SingleSubMod(Mod mod, SingleModGroup group, JToken json)
: this(mod, group)
{
IModOption.Load(json, this);
IModDataContainer.Load(json, this, mod.ModPath);
}
public SingleSubMod Clone(Mod mod, SingleModGroup group)
{
var ret = new SingleSubMod(mod, group)
{
Name = Name,
Description = Description,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public MultiSubMod ConvertToMulti(Mod mod, MultiModGroup group, ModPriority priority)
{
var ret = new MultiSubMod(mod, group)
{
Name = Name,
Description = Description,
Priority = priority,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
=> ((IModDataContainer)this).AddDataTo(redirections, manipulations);
public (int GroupIndex, int DataIndex) GetDataIndices()
=> (Group.GetIndex(), GetDataIndex());
public (int GroupIndex, int OptionIndex) GetOptionIndices()
=> (Group.GetIndex(), GetDataIndex());
private int GetDataIndex()
{
var dataIndex = Group.DataContainers.IndexOf(this);
if (dataIndex < 0)
throw new Exception($"Group {Group.Name} from SubMod {Name} does not contain this SubMod.");
return dataIndex;
}
}

View file

@ -1,352 +0,0 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using OtterGui;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor;
using Penumbra.String.Classes;
namespace Penumbra.Mods.Subclasses;
public interface IModDataOption : IModOption, IModDataContainer;
public class SingleSubMod(Mod mod, SingleModGroup group) : IModDataOption
{
internal readonly Mod Mod = mod;
internal readonly SingleModGroup Group = group;
public string Name { get; set; } = "Option";
public string FullName
=> $"{Group.Name}: {Name}";
public string Description { get; set; } = string.Empty;
IMod IModDataContainer.Mod
=> Mod;
IModGroup IModDataContainer.Group
=> Group;
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } = [];
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } = [];
public HashSet<MetaManipulation> Manipulations { get; set; } = [];
public SingleSubMod(Mod mod, SingleModGroup group, JToken json)
: this(mod, group)
{
IModOption.Load(json, this);
IModDataContainer.Load(json, this, mod.ModPath);
}
public SingleSubMod Clone(Mod mod, SingleModGroup group)
{
var ret = new SingleSubMod(mod, group)
{
Name = Name,
Description = Description,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public MultiSubMod ConvertToMulti(Mod mod, MultiModGroup group, ModPriority priority)
{
var ret = new MultiSubMod(mod, group)
{
Name = Name,
Description = Description,
Priority = priority,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
=> ((IModDataContainer)this).AddDataTo(redirections, manipulations);
public (int GroupIndex, int DataIndex) GetDataIndices()
=> (Group.GetIndex(), GetDataIndex());
public (int GroupIndex, int OptionIndex) GetOptionIndices()
=> (Group.GetIndex(), GetDataIndex());
private int GetDataIndex()
{
var dataIndex = Group.DataContainers.IndexOf(this);
if (dataIndex < 0)
throw new Exception($"Group {Group.Name} from SubMod {Name} does not contain this SubMod.");
return dataIndex;
}
}
public class MultiSubMod(Mod mod, MultiModGroup group) : IModDataOption
{
internal readonly Mod Mod = mod;
internal readonly MultiModGroup Group = group;
public string Name { get; set; } = "Option";
public string FullName
=> $"{Group.Name}: {Name}";
public string Description { get; set; } = string.Empty;
public ModPriority Priority { get; set; } = ModPriority.Default;
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } = [];
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } = [];
public HashSet<MetaManipulation> Manipulations { get; set; } = [];
IMod IModDataContainer.Mod
=> Mod;
IModGroup IModDataContainer.Group
=> Group;
public MultiSubMod(Mod mod, MultiModGroup group, JToken json)
: this(mod, group)
{
IModOption.Load(json, this);
IModDataContainer.Load(json, this, mod.ModPath);
Priority = json[nameof(IModGroup.Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default;
}
public MultiSubMod Clone(Mod mod, MultiModGroup group)
{
var ret = new MultiSubMod(mod, group)
{
Name = Name,
Description = Description,
Priority = Priority,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public SingleSubMod ConvertToSingle(Mod mod, SingleModGroup group)
{
var ret = new SingleSubMod(mod, group)
{
Name = Name,
Description = Description,
};
IModDataContainer.Clone(this, ret);
return ret;
}
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
=> ((IModDataContainer)this).AddDataTo(redirections, manipulations);
public static MultiSubMod CreateForSaving(string name, string description, ModPriority priority)
=> new(null!, null!)
{
Name = name,
Description = description,
Priority = priority,
};
public (int GroupIndex, int DataIndex) GetDataIndices()
=> (Group.GetIndex(), GetDataIndex());
public (int GroupIndex, int OptionIndex) GetOptionIndices()
=> (Group.GetIndex(), GetDataIndex());
private int GetDataIndex()
{
var dataIndex = Group.DataContainers.IndexOf(this);
if (dataIndex < 0)
throw new Exception($"Group {Group.Name} from SubMod {Name} does not contain this SubMod.");
return dataIndex;
}
}
public class DefaultSubMod(IMod mod) : IModDataContainer
{
public const string FullName = "Default Option";
public string Description
=> string.Empty;
internal readonly IMod Mod = mod;
public Dictionary<Utf8GamePath, FullPath> Files { get; set; } = [];
public Dictionary<Utf8GamePath, FullPath> FileSwaps { get; set; } = [];
public HashSet<MetaManipulation> Manipulations { get; set; } = [];
IMod IModDataContainer.Mod
=> Mod;
IModGroup? IModDataContainer.Group
=> null;
public DefaultSubMod(Mod mod, JToken json)
: this(mod)
{
IModDataContainer.Load(json, this, mod.ModPath);
}
public void AddDataTo(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
=> ((IModDataContainer)this).AddDataTo(redirections, manipulations);
public (int GroupIndex, int DataIndex) GetDataIndices()
=> (-1, 0);
}
//public sealed class SubMod(IMod mod, IModGroup group) : IModOption
//{
// public string Name { get; set; } = "Default";
//
// public string FullName
// => Group == null ? "Default Option" : $"{Group.Name}: {Name}";
//
// public string Description { get; set; } = string.Empty;
//
// internal readonly IMod Mod = mod;
// internal readonly IModGroup? Group = group;
//
// internal (int GroupIdx, int OptionIdx) GetIndices()
// {
// if (IsDefault)
// return (-1, 0);
//
// var groupIdx = Mod.Groups.IndexOf(Group);
// if (groupIdx < 0)
// throw new Exception($"Group {Group.Name} from SubMod {Name} is not contained in Mod {Mod.Name}.");
//
// return (groupIdx, GetOptionIndex());
// }
//
// private int GetOptionIndex()
// {
// var optionIndex = Group switch
// {
// null => 0,
// SingleModGroup single => single.OptionData.IndexOf(this),
// MultiModGroup multi => multi.OptionData.IndexOf(p => p.Mod == this),
// _ => throw new Exception($"Group {Group.Name} from SubMod {Name} has unknown type {typeof(Group)}"),
// };
// if (optionIndex < 0)
// throw new Exception($"Group {Group!.Name} from SubMod {Name} does not contain this SubMod.");
//
// return optionIndex;
// }
//
// public static SubMod CreateDefault(IMod mod)
// => new(mod, null!);
//
// [MemberNotNullWhen(false, nameof(Group))]
// public bool IsDefault
// => Group == null;
//
// public void AddData(Dictionary<Utf8GamePath, FullPath> redirections, HashSet<MetaManipulation> manipulations)
// {
// foreach (var (path, file) in Files)
// redirections.TryAdd(path, file);
//
// foreach (var (path, file) in FileSwaps)
// redirections.TryAdd(path, file);
// manipulations.UnionWith(Manipulations);
// }
//
// public Dictionary<Utf8GamePath, FullPath> FileData = [];
// public Dictionary<Utf8GamePath, FullPath> FileSwapData = [];
// public HashSet<MetaManipulation> ManipulationData = [];
//
// public IReadOnlyDictionary<Utf8GamePath, FullPath> Files
// => FileData;
//
// public IReadOnlyDictionary<Utf8GamePath, FullPath> FileSwaps
// => FileSwapData;
//
// public IReadOnlySet<MetaManipulation> Manipulations
// => ManipulationData;
//
// public void Load(DirectoryInfo basePath, JToken json, out ModPriority priority)
// {
// FileData.Clear();
// FileSwapData.Clear();
// ManipulationData.Clear();
//
// // Every option has a name, but priorities are only relevant for multi group options.
// Name = json[nameof(Name)]?.ToObject<string>() ?? string.Empty;
// Description = json[nameof(Description)]?.ToObject<string>() ?? string.Empty;
// priority = json[nameof(IModGroup.Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default;
//
// var files = (JObject?)json[nameof(Files)];
// if (files != null)
// foreach (var property in files.Properties())
// {
// if (Utf8GamePath.FromString(property.Name, out var p, true))
// FileData.TryAdd(p, new FullPath(basePath, property.Value.ToObject<Utf8RelPath>()));
// }
//
// var swaps = (JObject?)json[nameof(FileSwaps)];
// if (swaps != null)
// foreach (var property in swaps.Properties())
// {
// if (Utf8GamePath.FromString(property.Name, out var p, true))
// FileSwapData.TryAdd(p, new FullPath(property.Value.ToObject<string>()!));
// }
//
// var manips = json[nameof(Manipulations)];
// if (manips != null)
// foreach (var s in manips.Children().Select(c => c.ToObject<MetaManipulation>())
// .Where(m => m.Validate()))
// ManipulationData.Add(s);
// }
//
//
// /// <summary> Create a sub mod without a mod or group only for saving it in the creator. </summary>
// internal static SubMod CreateForSaving(string name)
// => new(null!, null!)
// {
// Name = name,
// };
//
//
// public static void WriteSubMod(JsonWriter j, JsonSerializer serializer, SubMod mod, DirectoryInfo basePath, ModPriority? priority)
// {
// j.WriteStartObject();
// j.WritePropertyName(nameof(Name));
// j.WriteValue(mod.Name);
// j.WritePropertyName(nameof(Description));
// j.WriteValue(mod.Description);
// if (priority != null)
// {
// j.WritePropertyName(nameof(IModGroup.Priority));
// j.WriteValue(priority.Value.Value);
// }
//
// j.WritePropertyName(nameof(mod.Files));
// j.WriteStartObject();
// foreach (var (gamePath, file) in mod.Files)
// {
// if (file.ToRelPath(basePath, out var relPath))
// {
// j.WritePropertyName(gamePath.ToString());
// j.WriteValue(relPath.ToString());
// }
// }
//
// j.WriteEndObject();
// j.WritePropertyName(nameof(mod.FileSwaps));
// j.WriteStartObject();
// foreach (var (gamePath, file) in mod.FileSwaps)
// {
// j.WritePropertyName(gamePath.ToString());
// j.WriteValue(file.ToString());
// }
//
// j.WriteEndObject();
// j.WritePropertyName(nameof(mod.Manipulations));
// serializer.Serialize(j, mod.Manipulations);
// j.WriteEndObject();
// }
//}

View file

@ -2,8 +2,10 @@ using OtterGui.Classes;
using Penumbra.Collections; using Penumbra.Collections;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String.Classes; using Penumbra.String.Classes;
@ -46,7 +48,7 @@ public class TemporaryMod : IMod
=> Array.Empty<IModGroup>(); => Array.Empty<IModGroup>();
public TemporaryMod() public TemporaryMod()
=> Default = new(this); => Default = new DefaultSubMod(this);
public void SetFile(Utf8GamePath gamePath, FullPath fullPath) public void SetFile(Utf8GamePath gamePath, FullPath fullPath)
=> Default.Files[gamePath] = fullPath; => Default.Files[gamePath] = fullPath;

View file

@ -93,6 +93,10 @@
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="Mods\Subclasses\" />
</ItemGroup>
<Target Name="GetGitHash" BeforeTargets="GetAssemblyVersion" Returns="InformationalVersion"> <Target Name="GetGitHash" BeforeTargets="GetAssemblyVersion" Returns="InformationalVersion">
<Exec Command="git rev-parse --short HEAD" ConsoleToMSBuild="true" StandardOutputImportance="low" ContinueOnError="true"> <Exec Command="git rev-parse --short HEAD" ConsoleToMSBuild="true" StandardOutputImportance="low" ContinueOnError="true">
<Output TaskParameter="ExitCode" PropertyName="GitCommitHashSuccess" /> <Output TaskParameter="ExitCode" PropertyName="GitCommitHashSuccess" />

View file

@ -10,7 +10,7 @@ using Penumbra.Interop.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.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.UI; using Penumbra.UI;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;
using Penumbra.UI.ResourceWatcher; using Penumbra.UI.ResourceWatcher;

View file

@ -2,7 +2,7 @@ using OtterGui.Classes;
using OtterGui.Log; using OtterGui.Log;
using OtterGui.Services; using OtterGui.Services;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Groups;
namespace Penumbra.Services; namespace Penumbra.Services;

View file

@ -13,9 +13,10 @@ using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs; using Penumbra.GameData.Structs;
using Penumbra.Meta; using Penumbra.Meta;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Groups;
using Penumbra.Mods.ItemSwap; using Penumbra.Mods.ItemSwap;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;

View file

@ -4,7 +4,7 @@ using OtterGui;
using OtterGui.Classes; using OtterGui.Classes;
using OtterGui.Raii; using OtterGui.Raii;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;

View file

@ -8,7 +8,7 @@ using Penumbra.GameData.Files;
using Penumbra.Interop.ResourceTree; using Penumbra.Interop.ResourceTree;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.String.Classes; using Penumbra.String.Classes;
namespace Penumbra.UI.AdvancedWindow; namespace Penumbra.UI.AdvancedWindow;

View file

@ -21,7 +21,7 @@ using Penumbra.Meta;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.String; using Penumbra.String;
using Penumbra.String.Classes; using Penumbra.String.Classes;

View file

@ -4,7 +4,7 @@ using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.SubMods;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;
namespace Penumbra.UI.AdvancedWindow; namespace Penumbra.UI.AdvancedWindow;

View file

@ -14,7 +14,7 @@ using Penumbra.Collections.Manager;
using Penumbra.Communication; using Penumbra.Communication;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;
using MessageService = Penumbra.Services.MessageService; using MessageService = Penumbra.Services.MessageService;

View file

@ -9,7 +9,7 @@ using Penumbra.Collections.Manager;
using Penumbra.Meta.Manipulations; using Penumbra.Meta.Manipulations;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Subclasses; using Penumbra.Mods.Settings;
using Penumbra.String.Classes; using Penumbra.String.Classes;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;

View file

@ -11,9 +11,10 @@ using Penumbra.Api.Enums;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Editor; using Penumbra.Mods.Editor;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;

View file

@ -8,8 +8,10 @@ using Penumbra.UI.Classes;
using Dalamud.Interface.Components; using Dalamud.Interface.Components;
using Penumbra.Collections.Manager; using Penumbra.Collections.Manager;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses;
using Penumbra.Services; using Penumbra.Services;
using Penumbra.Mods.SubMods;
using Penumbra.Mods.Groups;
using Penumbra.Mods.Settings;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;

View file

@ -5,7 +5,6 @@ using OtterGui.Raii;
using OtterGui.Widgets; using OtterGui.Widgets;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager; using Penumbra.Mods.Manager;
using Penumbra.Mods.Subclasses;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;