Add option to apply only attributes from IMC group.

This commit is contained in:
Ottermandias 2024-09-16 22:54:06 +02:00
parent ac1ea124d9
commit 00fbb2686b
8 changed files with 63 additions and 40 deletions

View file

@ -10,8 +10,7 @@ namespace Penumbra.Mods.Editor;
public class ModMetaEditor(
ModGroupEditor groupEditor,
MetaFileManager metaFileManager,
ImcChecker imcChecker) : MetaDictionary, IService
MetaFileManager metaFileManager) : MetaDictionary, IService
{
public sealed class OtherOptionData : HashSet<string>
{
@ -67,14 +66,14 @@ public class ModMetaEditor(
Changes = false;
}
public static bool DeleteDefaultValues(MetaFileManager metaFileManager, ImcChecker imcChecker, MetaDictionary dict)
public static bool DeleteDefaultValues(MetaFileManager metaFileManager, MetaDictionary dict)
{
var clone = dict.Clone();
dict.Clear();
var count = 0;
foreach (var (key, value) in clone.Imc)
{
var defaultEntry = imcChecker.GetDefaultEntry(key, false);
var defaultEntry = ImcChecker.GetDefaultEntry(key, false);
if (!defaultEntry.Entry.Equals(value))
{
dict.TryAdd(key, value);
@ -164,7 +163,7 @@ public class ModMetaEditor(
}
public void DeleteDefaultValues()
=> Changes = DeleteDefaultValues(metaFileManager, imcChecker, this);
=> Changes = DeleteDefaultValues(metaFileManager, this);
public void Apply(IModDataContainer container)
{

View file

@ -35,6 +35,7 @@ public class ImcModGroup(Mod mod) : IModGroup
public ImcIdentifier Identifier;
public ImcEntry DefaultEntry;
public bool AllVariants;
public bool OnlyAttributes;
public FullPath? FindBestMatch(Utf8GamePath gamePath)
@ -97,28 +98,36 @@ public class ImcModGroup(Mod mod) : IModGroup
public IModGroupEditDrawer EditDrawer(ModGroupEditDrawer editDrawer)
=> new ImcModGroupEditDrawer(editDrawer, this);
public ImcEntry GetEntry(ushort mask)
=> DefaultEntry with { AttributeMask = mask };
private ImcEntry GetEntry(Variant variant, ushort mask)
{
if (!OnlyAttributes)
return DefaultEntry with { AttributeMask = mask };
var defaultEntry = ImcChecker.GetDefaultEntry(Identifier with { Variant = variant }, true);
if (defaultEntry.VariantExists)
return defaultEntry.Entry with { AttributeMask = mask };
return DefaultEntry with { AttributeMask = mask };
}
public void AddData(Setting setting, Dictionary<Utf8GamePath, FullPath> redirections, MetaDictionary manipulations)
{
if (IsDisabled(setting))
return;
var mask = GetCurrentMask(setting);
var entry = GetEntry(mask);
var mask = GetCurrentMask(setting);
if (AllVariants)
{
var count = ImcChecker.GetVariantCount(Identifier);
if (count == 0)
manipulations.TryAdd(Identifier, entry);
manipulations.TryAdd(Identifier, GetEntry(Identifier.Variant, mask));
else
for (var i = 0; i <= count; ++i)
manipulations.TryAdd(Identifier with { Variant = (Variant)i }, entry);
manipulations.TryAdd(Identifier with { Variant = (Variant)i }, GetEntry((Variant)i, mask));
}
else
{
manipulations.TryAdd(Identifier, entry);
manipulations.TryAdd(Identifier, GetEntry(Identifier.Variant, mask));
}
}
@ -138,6 +147,8 @@ public class ImcModGroup(Mod mod) : IModGroup
serializer.Serialize(jWriter, DefaultEntry);
jWriter.WritePropertyName(nameof(AllVariants));
jWriter.WriteValue(AllVariants);
jWriter.WritePropertyName(nameof(OnlyAttributes));
jWriter.WriteValue(OnlyAttributes);
jWriter.WritePropertyName("Options");
jWriter.WriteStartArray();
foreach (var option in OptionData)
@ -170,8 +181,9 @@ public class ImcModGroup(Mod mod) : IModGroup
var identifier = ImcIdentifier.FromJson(json[nameof(Identifier)] as JObject);
var ret = new ImcModGroup(mod)
{
DefaultEntry = json[nameof(DefaultEntry)]?.ToObject<ImcEntry>() ?? new ImcEntry(),
AllVariants = json[nameof(AllVariants)]?.ToObject<bool>() ?? false,
DefaultEntry = json[nameof(DefaultEntry)]?.ToObject<ImcEntry>() ?? new ImcEntry(),
AllVariants = json[nameof(AllVariants)]?.ToObject<bool>() ?? false,
OnlyAttributes = json[nameof(OnlyAttributes)]?.ToObject<bool>() ?? false,
};
if (!ModSaveGroup.ReadJsonBase(json, ret))
return null;

View file

@ -89,6 +89,16 @@ public sealed class ImcModGroupEditor(CommunicatorService communicator, SaveServ
Communicator.ModOptionChanged.Invoke(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, -1);
}
public void ChangeOnlyAttributes(ImcModGroup group, bool onlyAttributes, SaveType saveType = SaveType.Queue)
{
if (group.OnlyAttributes == onlyAttributes)
return;
group.OnlyAttributes = onlyAttributes;
SaveService.Save(saveType, new ModSaveGroup(group, Config.ReplaceNonAsciiOnImport));
Communicator.ModOptionChanged.Invoke(ModOptionChangeType.OptionMetaChanged, group.Mod, group, null, null, -1);
}
public void ChangeCanBeDisabled(ImcModGroup group, bool canBeDisabled, SaveType saveType = SaveType.Queue)
{
if (group.CanBeDisabled == canBeDisabled)

View file

@ -25,8 +25,7 @@ public partial class ModCreator(
Configuration config,
ModDataEditor dataEditor,
MetaFileManager metaFileManager,
GamePathParser gamePathParser,
ImcChecker imcChecker) : IService
GamePathParser gamePathParser) : IService
{
public readonly Configuration Config = config;
@ -86,7 +85,7 @@ public partial class ModCreator(
{
foreach (var container in mod.AllDataContainers)
{
if (ModMetaEditor.DeleteDefaultValues(metaFileManager, imcChecker, container.Manipulations))
if (ModMetaEditor.DeleteDefaultValues(metaFileManager, container.Manipulations))
saveService.ImmediateSaveSync(new ModSaveGroup(container, Config.ReplaceNonAsciiOnImport));
}
}
@ -235,7 +234,7 @@ public partial class ModCreator(
DeleteDeleteList(deleteList, delete);
var changes = oldSize < option.Manipulations.Count;
if (deleteDefault && !Config.KeepDefaultMetaChanges)
changes |= ModMetaEditor.DeleteDefaultValues(metaFileManager, imcChecker, option.Manipulations);
changes |= ModMetaEditor.DeleteDefaultValues(metaFileManager, option.Manipulations);
return (changes, deleteList);
}