Some more.

This commit is contained in:
Ottermandias 2024-04-05 23:19:41 +02:00
parent b1ca073276
commit e94cdaec46
11 changed files with 70 additions and 55 deletions

View file

@ -153,7 +153,7 @@ public partial class TexToolsImporter
// Iterate through all pages // Iterate through all pages
var options = new List<ISubMod>(); var options = new List<ISubMod>();
var groupPriority = 0; var groupPriority = ModPriority.Default;
var groupNames = new HashSet<string>(); var groupNames = new HashSet<string>();
foreach (var page in modList.ModPackPages) foreach (var page in modList.ModPackPages)
{ {
@ -209,9 +209,9 @@ public partial class TexToolsImporter
} }
} }
_modManager.Creator.CreateOptionGroup(_currentModDirectory, group.SelectionType, name, groupPriority, groupPriority, _modManager.Creator.CreateOptionGroup(_currentModDirectory, group.SelectionType, name, groupPriority, groupPriority.Value,
defaultSettings ?? Setting.Zero, group.Description, options); defaultSettings ?? Setting.Zero, group.Description, options);
++groupPriority; groupPriority += 1;
} }
} }
} }

View file

@ -61,10 +61,9 @@ public static partial class ModMigration
if (fileVersion > 0) if (fileVersion > 0)
return false; return false;
var swaps = json["FileSwaps"]?.ToObject<Dictionary<Utf8GamePath, FullPath>>() var swaps = json["FileSwaps"]?.ToObject<Dictionary<Utf8GamePath, FullPath>>() ?? [];
?? new Dictionary<Utf8GamePath, FullPath>(); var groups = json["Groups"]?.ToObject<Dictionary<string, OptionGroupV0>>() ?? [];
var groups = json["Groups"]?.ToObject<Dictionary<string, OptionGroupV0>>() ?? new Dictionary<string, OptionGroupV0>(); var priority = new ModPriority(1);
var priority = 1;
var seenMetaFiles = new HashSet<FullPath>(); var seenMetaFiles = new HashSet<FullPath>();
foreach (var group in groups.Values) foreach (var group in groups.Values)
ConvertGroup(creator, mod, group, ref priority, seenMetaFiles); ConvertGroup(creator, mod, group, ref priority, seenMetaFiles);
@ -116,7 +115,8 @@ public static partial class ModMigration
return true; return true;
} }
private static void ConvertGroup(ModCreator creator, Mod mod, OptionGroupV0 group, ref int priority, HashSet<FullPath> seenMetaFiles) private static void ConvertGroup(ModCreator creator, Mod mod, OptionGroupV0 group, ref ModPriority priority,
HashSet<FullPath> seenMetaFiles)
{ {
if (group.Options.Count == 0) if (group.Options.Count == 0)
return; return;
@ -125,7 +125,7 @@ public static partial class ModMigration
{ {
case GroupType.Multi: case GroupType.Multi:
var optionPriority = 0; var optionPriority = ModPriority.Default;
var newMultiGroup = new MultiModGroup() var newMultiGroup = new MultiModGroup()
{ {
Name = group.GroupName, Name = group.GroupName,

View file

@ -34,8 +34,6 @@ public enum ModOptionChangeType
public class ModOptionEditor(CommunicatorService communicator, SaveService saveService, Configuration config) public class ModOptionEditor(CommunicatorService communicator, SaveService saveService, Configuration config)
{ {
/// <summary> Change the type of a group given by mod and index to type, if possible. </summary> /// <summary> Change the type of a group given by mod and index to type, if possible. </summary>
public void ChangeModGroupType(Mod mod, int groupIdx, GroupType type) public void ChangeModGroupType(Mod mod, int groupIdx, GroupType type)
{ {
@ -86,7 +84,7 @@ public class ModOptionEditor(CommunicatorService communicator, SaveService saveS
if (!VerifyFileName(mod, null, newName, true)) if (!VerifyFileName(mod, null, newName, true))
return; return;
var maxPriority = mod.Groups.Count == 0 ? 0 : mod.Groups.Max(o => o.Priority) + 1; var maxPriority = mod.Groups.Count == 0 ? ModPriority.Default : mod.Groups.Max(o => o.Priority) + 1;
mod.Groups.Add(type == GroupType.Multi mod.Groups.Add(type == GroupType.Multi
? new MultiModGroup ? new MultiModGroup
@ -169,7 +167,7 @@ public class ModOptionEditor(CommunicatorService communicator, SaveService saveS
} }
/// <summary> Change the internal priority of the given option group. </summary> /// <summary> Change the internal priority of the given option group. </summary>
public void ChangeGroupPriority(Mod mod, int groupIdx, int newPriority) public void ChangeGroupPriority(Mod mod, int groupIdx, ModPriority newPriority)
{ {
var group = mod.Groups[groupIdx]; var group = mod.Groups[groupIdx];
if (group.Priority == newPriority) if (group.Priority == newPriority)
@ -186,7 +184,7 @@ public class ModOptionEditor(CommunicatorService communicator, SaveService saveS
} }
/// <summary> Change the internal priority of the given option. </summary> /// <summary> Change the internal priority of the given option. </summary>
public void ChangeOptionPriority(Mod mod, int groupIdx, int optionIdx, int newPriority) public void ChangeOptionPriority(Mod mod, int groupIdx, int optionIdx, ModPriority newPriority)
{ {
switch (mod.Groups[groupIdx]) switch (mod.Groups[groupIdx])
{ {
@ -240,7 +238,7 @@ public class ModOptionEditor(CommunicatorService communicator, SaveService saveS
s.OptionData.Add(subMod); s.OptionData.Add(subMod);
break; break;
case MultiModGroup m: case MultiModGroup m:
m.PrioritizedOptions.Add((subMod, 0)); m.PrioritizedOptions.Add((subMod, ModPriority.Default));
break; break;
} }
@ -263,8 +261,12 @@ public class ModOptionEditor(CommunicatorService communicator, SaveService saveS
return ((SubMod)group[^1], true); return ((SubMod)group[^1], true);
} }
/// <summary> Add an existing option to a given group with default priority. </summary>
public void AddOption(Mod mod, int groupIdx, ISubMod option)
=> AddOption(mod, groupIdx, option, ModPriority.Default);
/// <summary> Add an existing option to a given group with a given priority. </summary> /// <summary> Add an existing option to a given group with a given priority. </summary>
public void AddOption(Mod mod, int groupIdx, ISubMod option, int priority = 0) public void AddOption(Mod mod, int groupIdx, ISubMod option, ModPriority priority)
{ {
if (option is not SubMod o) if (option is not SubMod o)
return; return;

View file

@ -235,7 +235,7 @@ public partial class ModCreator(SaveService _saveService, Configuration config,
/// <summary> Create a file for an option group from given data. </summary> /// <summary> Create a file for an option group from given data. </summary>
public void CreateOptionGroup(DirectoryInfo baseFolder, GroupType type, string name, public void CreateOptionGroup(DirectoryInfo baseFolder, GroupType type, string name,
int priority, int index, Setting defaultSettings, string desc, IEnumerable<ISubMod> subMods) ModPriority priority, int index, Setting defaultSettings, string desc, IEnumerable<ISubMod> subMods)
{ {
switch (type) switch (type)
{ {
@ -248,7 +248,7 @@ public partial class ModCreator(SaveService _saveService, Configuration config,
Priority = priority, Priority = priority,
DefaultSettings = defaultSettings, DefaultSettings = defaultSettings,
}; };
group.PrioritizedOptions.AddRange(subMods.OfType<SubMod>().Select((s, idx) => (s, idx))); group.PrioritizedOptions.AddRange(subMods.OfType<SubMod>().Select((s, idx) => (s, new ModPriority(idx))));
_saveService.ImmediateSaveSync(new ModSaveGroup(baseFolder, group, index, Config.ReplaceNonAsciiOnImport)); _saveService.ImmediateSaveSync(new ModSaveGroup(baseFolder, group, index, Config.ReplaceNonAsciiOnImport));
break; break;
} }

View file

@ -8,13 +8,13 @@ public interface IModGroup : IEnumerable<ISubMod>
{ {
public const int MaxMultiOptions = 32; public const int MaxMultiOptions = 32;
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 int Priority { get; } public ModPriority Priority { get; }
public Setting DefaultSettings { get; set; } public Setting DefaultSettings { get; set; }
public int OptionPriority(Index optionIdx); public ModPriority OptionPriority(Index optionIdx);
public ISubMod this[Index idx] { get; } public ISubMod this[Index idx] { get; }
@ -94,7 +94,11 @@ public readonly struct ModSaveGroup : ISavable
j.WritePropertyName("Options"); j.WritePropertyName("Options");
j.WriteStartArray(); j.WriteStartArray();
for (var idx = 0; idx < _group.Count; ++idx) for (var idx = 0; idx < _group.Count; ++idx)
ISubMod.WriteSubMod(j, serializer, _group[idx], _basePath, _group.Type == GroupType.Multi ? _group.OptionPriority(idx) : null); ISubMod.WriteSubMod(j, serializer, _group[idx], _basePath, _group.Type switch
{
GroupType.Multi => _group.OptionPriority(idx),
_ => null,
});
j.WriteEndArray(); j.WriteEndArray();
j.WriteEndObject(); j.WriteEndObject();

View file

@ -16,7 +16,7 @@ public interface ISubMod
public bool IsDefault { get; } public bool IsDefault { get; }
public static void WriteSubMod(JsonWriter j, JsonSerializer serializer, ISubMod mod, DirectoryInfo basePath, int? priority) public static void WriteSubMod(JsonWriter j, JsonSerializer serializer, ISubMod mod, DirectoryInfo basePath, ModPriority? priority)
{ {
j.WriteStartObject(); j.WriteStartObject();
j.WritePropertyName(nameof(Name)); j.WritePropertyName(nameof(Name));
@ -26,7 +26,7 @@ public interface ISubMod
if (priority != null) if (priority != null)
{ {
j.WritePropertyName(nameof(IModGroup.Priority)); j.WritePropertyName(nameof(IModGroup.Priority));
j.WriteValue(priority.Value); j.WriteValue(priority.Value.Value);
} }
j.WritePropertyName(nameof(mod.Files)); j.WritePropertyName(nameof(mod.Files));

View file

@ -8,7 +8,9 @@ public readonly record struct ModPriority(int Value) :
IAdditionOperators<ModPriority, ModPriority, ModPriority>, IAdditionOperators<ModPriority, ModPriority, ModPriority>,
IAdditionOperators<ModPriority, int, ModPriority>, IAdditionOperators<ModPriority, int, ModPriority>,
ISubtractionOperators<ModPriority, ModPriority, ModPriority>, ISubtractionOperators<ModPriority, ModPriority, ModPriority>,
ISubtractionOperators<ModPriority, int, ModPriority> ISubtractionOperators<ModPriority, int, ModPriority>,
IIncrementOperators<ModPriority>,
IComparable<ModPriority>
{ {
public static readonly ModPriority Default = new(0); public static readonly ModPriority Default = new(0);
public static readonly ModPriority MaxValue = new(int.MaxValue); public static readonly ModPriority MaxValue = new(int.MaxValue);
@ -58,4 +60,10 @@ public readonly record struct ModPriority(int Value) :
public static ModPriority operator -(ModPriority left, int right) public static ModPriority operator -(ModPriority left, int right)
=> new(left.Value - right); => new(left.Value - right);
public static ModPriority operator ++(ModPriority value)
=> new(value.Value + 1);
public int CompareTo(ModPriority other)
=> Value.CompareTo(other.Value);
} }

View file

@ -14,12 +14,12 @@ public sealed class MultiModGroup : IModGroup
public GroupType Type public GroupType Type
=> GroupType.Multi; => GroupType.Multi;
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 int Priority { get; set; } public ModPriority Priority { get; set; }
public Setting DefaultSettings { get; set; } public Setting DefaultSettings { get; set; }
public int OptionPriority(Index idx) public ModPriority OptionPriority(Index idx)
=> PrioritizedOptions[idx].Priority; => PrioritizedOptions[idx].Priority;
public ISubMod this[Index idx] public ISubMod this[Index idx]
@ -29,7 +29,7 @@ public sealed class MultiModGroup : IModGroup
public int Count public int Count
=> PrioritizedOptions.Count; => PrioritizedOptions.Count;
public readonly List<(SubMod Mod, int Priority)> PrioritizedOptions = new(); public readonly List<(SubMod Mod, ModPriority Priority)> PrioritizedOptions = [];
public IEnumerator<ISubMod> GetEnumerator() public IEnumerator<ISubMod> GetEnumerator()
=> PrioritizedOptions.Select(o => o.Mod).GetEnumerator(); => PrioritizedOptions.Select(o => o.Mod).GetEnumerator();
@ -43,7 +43,7 @@ public sealed class MultiModGroup : IModGroup
{ {
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<int>() ?? 0, 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)

View file

@ -12,14 +12,14 @@ public sealed class SingleModGroup : IModGroup
public GroupType Type public GroupType Type
=> GroupType.Single; => GroupType.Single;
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 int Priority { get; set; } public ModPriority Priority { get; set; }
public Setting DefaultSettings { get; set; } public Setting DefaultSettings { get; set; }
public readonly List<SubMod> OptionData = []; public readonly List<SubMod> OptionData = [];
public int OptionPriority(Index _) public ModPriority OptionPriority(Index _)
=> Priority; => Priority;
public ISubMod this[Index idx] public ISubMod this[Index idx]
@ -42,7 +42,7 @@ public sealed class SingleModGroup : IModGroup
{ {
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<int>() ?? 0, 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)
@ -72,9 +72,9 @@ public sealed class SingleModGroup : IModGroup
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.PrioritizedOptions.AddRange(OptionData.Select((o, i) => (o, i))); multi.PrioritizedOptions.AddRange(OptionData.Select((o, i) => (o, new ModPriority(i))));
return multi; return multi;
default: throw new ArgumentOutOfRangeException(nameof(type), type, null); default: throw new ArgumentOutOfRangeException(nameof(type), type, null);
} }

View file

@ -53,7 +53,7 @@ public sealed class SubMod : ISubMod
OptionIdx = optionIdx; OptionIdx = optionIdx;
} }
public void Load(DirectoryInfo basePath, JToken json, out int priority) public void Load(DirectoryInfo basePath, JToken json, out ModPriority priority)
{ {
FileData.Clear(); FileData.Clear();
FileSwapData.Clear(); FileSwapData.Clear();
@ -62,7 +62,7 @@ public sealed class SubMod : ISubMod
// Every option has a name, but priorities are only relevant for multi group options. // Every option has a name, but priorities are only relevant for multi group options.
Name = json[nameof(ISubMod.Name)]?.ToObject<string>() ?? string.Empty; Name = json[nameof(ISubMod.Name)]?.ToObject<string>() ?? string.Empty;
Description = json[nameof(ISubMod.Description)]?.ToObject<string>() ?? string.Empty; Description = json[nameof(ISubMod.Description)]?.ToObject<string>() ?? string.Empty;
priority = json[nameof(IModGroup.Priority)]?.ToObject<int>() ?? 0; priority = json[nameof(IModGroup.Priority)]?.ToObject<ModPriority>() ?? ModPriority.Default;
var files = (JObject?)json[nameof(Files)]; var files = (JObject?)json[nameof(Files)];
if (files != null) if (files != null)

View file

@ -511,7 +511,8 @@ public class ModPanelEditTab(
{ {
var isDefaultOption = group.DefaultSettings.HasFlag(optionIdx); var isDefaultOption = group.DefaultSettings.HasFlag(optionIdx);
if (ImGui.Checkbox("##default", ref isDefaultOption)) if (ImGui.Checkbox("##default", ref isDefaultOption))
panel._modManager.OptionEditor.ChangeModGroupDefaultOption(panel._mod, groupIdx, group.DefaultSettings.SetBit(optionIdx, isDefaultOption)); panel._modManager.OptionEditor.ChangeModGroupDefaultOption(panel._mod, groupIdx,
group.DefaultSettings.SetBit(optionIdx, isDefaultOption));
ImGuiUtil.HoverTooltip($"{(isDefaultOption ? "Disable" : "Enable")} {option.Name} per default in this group."); ImGuiUtil.HoverTooltip($"{(isDefaultOption ? "Disable" : "Enable")} {option.Name} per default in this group.");
} }
@ -669,10 +670,10 @@ public class ModPanelEditTab(
public const int Description = -7; public const int Description = -7;
// Temporary strings // Temporary strings
private static string? _currentEdit; private static string? _currentEdit;
private static int? _currentGroupPriority; private static ModPriority? _currentGroupPriority;
private static int _currentField = None; private static int _currentField = None;
private static int _optionIndex = None; private static int _optionIndex = None;
public static void Reset() public static void Reset()
{ {
@ -705,13 +706,13 @@ public class ModPanelEditTab(
return false; return false;
} }
public static bool Priority(string label, int field, int option, int oldValue, out int value, float width) public static bool Priority(string label, int field, int option, ModPriority oldValue, out ModPriority value, float width)
{ {
var tmp = field == _currentField && option == _optionIndex ? _currentGroupPriority ?? oldValue : oldValue; var tmp = (field == _currentField && option == _optionIndex ? _currentGroupPriority ?? oldValue : oldValue).Value;
ImGui.SetNextItemWidth(width); ImGui.SetNextItemWidth(width);
if (ImGui.InputInt(label, ref tmp, 0, 0)) if (ImGui.InputInt(label, ref tmp, 0, 0))
{ {
_currentGroupPriority = tmp; _currentGroupPriority = new ModPriority(tmp);
_optionIndex = option; _optionIndex = option;
_currentField = field; _currentField = field;
} }
@ -724,7 +725,7 @@ public class ModPanelEditTab(
return ret; return ret;
} }
value = 0; value = ModPriority.Default;
return false; return false;
} }
} }