mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-18 05:47:52 +01:00
100 lines
3.4 KiB
C#
100 lines
3.4 KiB
C#
using Newtonsoft.Json;
|
|
using Penumbra.Mods.SubMods;
|
|
using Penumbra.Services;
|
|
|
|
namespace Penumbra.Mods.Groups;
|
|
|
|
public readonly struct ModSaveGroup : ISavable
|
|
{
|
|
public const int CurrentVersion = 0;
|
|
|
|
private readonly DirectoryInfo _basePath;
|
|
private readonly IModGroup? _group;
|
|
private readonly int _groupIdx;
|
|
private readonly DefaultSubMod? _defaultMod;
|
|
private readonly bool _onlyAscii;
|
|
|
|
private ModSaveGroup(DirectoryInfo basePath, IModGroup group, int groupIndex, bool onlyAscii)
|
|
{
|
|
_basePath = basePath;
|
|
_group = group;
|
|
_groupIdx = groupIndex;
|
|
_onlyAscii = onlyAscii;
|
|
}
|
|
|
|
public static ModSaveGroup WithoutMod(DirectoryInfo basePath, IModGroup group, int groupIndex, bool onlyAscii)
|
|
=> new(basePath, group, groupIndex, onlyAscii);
|
|
|
|
public ModSaveGroup(IModGroup group, bool onlyAscii)
|
|
: this(group.Mod.ModPath, group, group.GetIndex(), onlyAscii)
|
|
{ }
|
|
|
|
public ModSaveGroup(DirectoryInfo basePath, DefaultSubMod @default, bool onlyAscii)
|
|
{
|
|
_basePath = basePath;
|
|
_groupIdx = -1;
|
|
_defaultMod = @default;
|
|
_onlyAscii = onlyAscii;
|
|
}
|
|
|
|
public ModSaveGroup(DirectoryInfo basePath, IModDataContainer container, bool onlyAscii)
|
|
{
|
|
_basePath = basePath;
|
|
_defaultMod = container as DefaultSubMod;
|
|
_onlyAscii = onlyAscii;
|
|
if (_defaultMod != null)
|
|
{
|
|
_groupIdx = -1;
|
|
_group = null;
|
|
}
|
|
else
|
|
{
|
|
_group = container.Group!;
|
|
_groupIdx = _group.GetIndex();
|
|
}
|
|
}
|
|
|
|
public ModSaveGroup(IModDataContainer container, bool onlyAscii)
|
|
{
|
|
_basePath = (container.Mod as Mod)?.ModPath
|
|
?? throw new Exception("Invalid save group from default data container without base path."); // Should not happen.
|
|
_defaultMod = container as DefaultSubMod;
|
|
_onlyAscii = onlyAscii;
|
|
_group = container.Group;
|
|
_groupIdx = _group?.GetIndex() ?? -1;
|
|
}
|
|
|
|
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();
|
|
j.WritePropertyName("Version");
|
|
j.WriteValue(CurrentVersion);
|
|
if (_groupIdx >= 0)
|
|
_group!.WriteJson(j, serializer, _basePath);
|
|
else
|
|
SubMod.WriteModContainer(j, serializer, _defaultMod!, _basePath);
|
|
j.WriteEndObject();
|
|
}
|
|
|
|
public static void WriteJsonBase(JsonTextWriter jWriter, IModGroup group)
|
|
{
|
|
jWriter.WritePropertyName(nameof(group.Name));
|
|
jWriter.WriteValue(group.Name);
|
|
jWriter.WritePropertyName(nameof(group.Description));
|
|
jWriter.WriteValue(group.Description);
|
|
jWriter.WritePropertyName(nameof(group.Image));
|
|
jWriter.WriteValue(group.Image);
|
|
jWriter.WritePropertyName(nameof(group.Priority));
|
|
jWriter.WriteValue(group.Priority.Value);
|
|
jWriter.WritePropertyName(nameof(group.Type));
|
|
jWriter.WriteValue(group.Type.ToString());
|
|
jWriter.WritePropertyName(nameof(group.DefaultSettings));
|
|
jWriter.WriteValue(group.DefaultSettings.Value);
|
|
}
|
|
}
|