Rework options, pre-submod types.

This commit is contained in:
Ottermandias 2024-04-23 17:41:55 +02:00
parent 792a04337f
commit 07afbfb229
25 changed files with 620 additions and 300 deletions

View file

@ -253,7 +253,7 @@ public class ItemSwapTab : IDisposable, ITab
_subModValid = _mod != null
&& _newGroupName.Length > 0
&& _newOptionName.Length > 0
&& (_selectedGroup?.All(o => o.Name != _newOptionName) ?? true);
&& (_selectedGroup?.Options.All(o => o.Name != _newOptionName) ?? true);
}
private void CreateMod()
@ -275,7 +275,7 @@ public class ItemSwapTab : IDisposable, ITab
var groupCreated = false;
var dirCreated = false;
var optionCreated = false;
var optionCreated = -1;
DirectoryInfo? optionFolderName = null;
try
{
@ -294,14 +294,17 @@ public class ItemSwapTab : IDisposable, ITab
groupCreated = true;
}
_modManager.OptionEditor.AddOption(_mod, _mod.Groups.IndexOf(_selectedGroup), _newOptionName);
optionCreated = true;
var optionIdx = _modManager.OptionEditor.AddOption(_mod, _mod.Groups.IndexOf(_selectedGroup), _newOptionName);
if (optionIdx < 0)
throw new Exception($"Failure creating mod option.");
optionCreated = optionIdx;
optionFolderName = Directory.CreateDirectory(optionFolderName.FullName);
dirCreated = true;
if (!_swapData.WriteMod(_modManager, _mod,
_useFileSwaps ? ItemSwapContainer.WriteType.UseSwaps : ItemSwapContainer.WriteType.NoSwaps,
optionFolderName,
_mod.Groups.IndexOf(_selectedGroup), _selectedGroup.Count - 1))
_mod.Groups.IndexOf(_selectedGroup), optionIdx))
throw new Exception("Failure writing files for mod swap.");
}
}
@ -310,8 +313,8 @@ public class ItemSwapTab : IDisposable, ITab
Penumbra.Messager.NotificationMessage(e, "Could not create new Swap Option.", NotificationType.Error, false);
try
{
if (optionCreated && _selectedGroup != null)
_modManager.OptionEditor.DeleteOption(_mod, _mod.Groups.IndexOf(_selectedGroup), _selectedGroup.Count - 1);
if (optionCreated >= 0 && _selectedGroup != null)
_modManager.OptionEditor.DeleteOption(_mod, _mod.Groups.IndexOf(_selectedGroup), optionCreated);
if (groupCreated)
{

View file

@ -78,7 +78,10 @@ public partial class ModEditWindow : Window, IDisposable
}
public void ChangeOption(SubMod? subMod)
=> _editor.LoadOption(subMod?.GroupIdx ?? -1, subMod?.OptionIdx ?? 0);
{
var (groupIdx, optionIdx) = subMod?.GetIndices() ?? (-1, 0);
_editor.LoadOption(groupIdx, optionIdx);
}
public void UpdateModels()
{
@ -428,7 +431,8 @@ public partial class ModEditWindow : Window, IDisposable
using var id = ImRaii.PushId(idx);
if (ImGui.Selectable(option.FullName, option == _editor.Option))
{
_editor.LoadOption(option.GroupIdx, option.OptionIdx);
var (groupIdx, optionIdx) = option.GetIndices();
_editor.LoadOption(groupIdx, optionIdx);
ret = true;
}
}
@ -565,7 +569,7 @@ public partial class ModEditWindow : Window, IDisposable
}
if (Mod != null)
foreach (var option in Mod.Groups.SelectMany(g => g).Append(Mod.Default))
foreach (var option in Mod.AllSubMods)
{
foreach (var path in option.Files.Keys)
{

View file

@ -71,7 +71,7 @@ public class ModMergeTab(ModMerger modMerger)
color = color == Colors.DiscordColor
? Colors.DiscordColor
: group == null || group.Any(o => o.Name == modMerger.OptionName)
: group == null || group.Options.Any(o => o.Name == modMerger.OptionName)
? Colors.PressEnterWarningBg
: Colors.DiscordColor;
c.Push(ImGuiCol.Border, color);
@ -184,18 +184,26 @@ public class ModMergeTab(ModMerger modMerger)
else
{
ImGuiUtil.DrawTableColumn(option.Name);
var group = option.ParentMod.Groups[option.GroupIdx];
var group = option.Group;
var optionEnumerator = group switch
{
SingleModGroup single => single.OptionData,
MultiModGroup multi => multi.PrioritizedOptions.Select(o => o.Mod),
_ => [],
};
ImGui.TableNextColumn();
ImGui.Selectable(group.Name, false);
if (ImGui.BeginPopupContextItem("##groupContext"))
{
if (ImGui.MenuItem("Select All"))
foreach (var opt in group)
Handle((SubMod)opt, true);
// ReSharper disable once PossibleMultipleEnumeration
foreach (var opt in optionEnumerator)
Handle(opt, true);
if (ImGui.MenuItem("Unselect All"))
foreach (var opt in group)
Handle((SubMod)opt, false);
// ReSharper disable once PossibleMultipleEnumeration
foreach (var opt in optionEnumerator)
Handle(opt, false);
ImGui.EndPopup();
}
}

View file

@ -324,7 +324,7 @@ public class ModPanelEditTab(
? mod.Description
: optionIdx < 0
? mod.Groups[groupIdx].Description
: mod.Groups[groupIdx][optionIdx].Description;
: mod.Groups[groupIdx].Options[optionIdx].Description;
_oldDescription = _newDescription;
_mod = mod;
@ -479,17 +479,24 @@ public class ModPanelEditTab(
ImGui.TableSetupColumn("delete", ImGuiTableColumnFlags.WidthFixed, UiHelpers.IconButtonSize.X);
ImGui.TableSetupColumn("priority", ImGuiTableColumnFlags.WidthFixed, 50 * UiHelpers.Scale);
var group = panel._mod.Groups[groupIdx];
for (var optionIdx = 0; optionIdx < group.Count; ++optionIdx)
EditOption(panel, group, groupIdx, optionIdx);
switch (panel._mod.Groups[groupIdx])
{
case SingleModGroup single:
for (var optionIdx = 0; optionIdx < single.OptionData.Count; ++optionIdx)
EditOption(panel, single, groupIdx, optionIdx);
break;
case MultiModGroup multi:
for (var optionIdx = 0; optionIdx < multi.PrioritizedOptions.Count; ++optionIdx)
EditOption(panel, multi, groupIdx, optionIdx);
break;
}
DrawNewOption(panel, groupIdx, UiHelpers.IconButtonSize);
}
/// <summary> Draw a line for a single option. </summary>
private static void EditOption(ModPanelEditTab panel, IModGroup group, int groupIdx, int optionIdx)
{
var option = group[optionIdx];
var option = group.Options[optionIdx];
using var id = ImRaii.PushId(optionIdx);
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
@ -547,10 +554,16 @@ public class ModPanelEditTab(
{
var mod = panel._mod;
var group = mod.Groups[groupIdx];
var count = group switch
{
SingleModGroup single => single.OptionData.Count,
MultiModGroup multi => multi.PrioritizedOptions.Count,
_ => throw new Exception($"Dragging options to an option group of type {group.GetType()} is not supported."),
};
ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding();
ImGui.Selectable($"Option #{group.Count + 1}");
Target(panel, group, groupIdx, group.Count);
ImGui.Selectable($"Option #{count + 1}");
Target(panel, group, groupIdx, count);
ImGui.TableNextColumn();
ImGui.TableNextColumn();
ImGui.SetNextItemWidth(-1);
@ -562,7 +575,7 @@ public class ModPanelEditTab(
}
ImGui.TableNextColumn();
var canAddGroup = mod.Groups[groupIdx].Type != GroupType.Multi || mod.Groups[groupIdx].Count < IModGroup.MaxMultiOptions;
var canAddGroup = mod.Groups[groupIdx].Type != GroupType.Multi || count < IModGroup.MaxMultiOptions;
var validName = _newOptionName.Length > 0 && _newOptionNameIdx == groupIdx;
var tt = canAddGroup
? validName ? "Add a new option to this group." : "Please enter a name for the new option."
@ -588,7 +601,7 @@ public class ModPanelEditTab(
_dragDropOptionIdx = optionIdx;
}
ImGui.TextUnformatted($"Dragging option {group[optionIdx].Name} from group {group.Name}...");
ImGui.TextUnformatted($"Dragging option {group.Options[optionIdx].Name} from group {group.Name}...");
}
private static void Target(ModPanelEditTab panel, IModGroup group, int groupIdx, int optionIdx)
@ -611,12 +624,17 @@ public class ModPanelEditTab(
var sourceGroupIdx = _dragDropGroupIdx;
var sourceOption = _dragDropOptionIdx;
var sourceGroup = panel._mod.Groups[sourceGroupIdx];
var currentCount = group.Count;
var option = sourceGroup[sourceOption];
var priority = sourceGroup switch
var currentCount = group switch
{
MultiModGroup multi => multi.PrioritizedOptions[_dragDropOptionIdx].Priority,
_ => ModPriority.Default,
SingleModGroup single => single.OptionData.Count,
MultiModGroup multi => multi.PrioritizedOptions.Count,
_ => throw new Exception($"Dragging options to an option group of type {group.GetType()} is not supported."),
};
var (option, priority) = sourceGroup switch
{
SingleModGroup single => (single.OptionData[_dragDropOptionIdx], ModPriority.Default),
MultiModGroup multi => multi.PrioritizedOptions[_dragDropOptionIdx],
_ => throw new Exception($"Dragging options from an option group of type {sourceGroup.GetType()} is not supported."),
};
panel._delayedActions.Enqueue(() =>
{
@ -651,7 +669,7 @@ public class ModPanelEditTab(
if (ImGui.Selectable(GroupTypeName(GroupType.Single), group.Type == GroupType.Single))
_modManager.OptionEditor.ChangeModGroupType(_mod, groupIdx, GroupType.Single);
var canSwitchToMulti = group.Count <= IModGroup.MaxMultiOptions;
var canSwitchToMulti = group.Options.Count <= IModGroup.MaxMultiOptions;
using var style = ImRaii.PushStyle(ImGuiStyleVar.Alpha, 0.5f, !canSwitchToMulti);
if (ImGui.Selectable(GroupTypeName(GroupType.Multi), group.Type == GroupType.Multi) && canSwitchToMulti)
_modManager.OptionEditor.ChangeModGroupType(_mod, groupIdx, GroupType.Multi);

View file

@ -75,7 +75,7 @@ public class ModPanelSettingsTab : ITab
{
var useDummy = true;
foreach (var (group, idx) in _selector.Selected!.Groups.WithIndex()
.Where(g => g.Value.Type == GroupType.Single && g.Value.Count > _config.SingleGroupRadioMax))
.Where(g => g.Value.Type == GroupType.Single && g.Value.Options.Count > _config.SingleGroupRadioMax))
{
ImGuiUtil.Dummy(UiHelpers.DefaultSpace, useDummy);
useDummy = false;
@ -92,7 +92,7 @@ public class ModPanelSettingsTab : ITab
case GroupType.Multi:
DrawMultiGroup(group, idx);
break;
case GroupType.Single when group.Count <= _config.SingleGroupRadioMax:
case GroupType.Single when group.Options.Count <= _config.SingleGroupRadioMax:
DrawSingleGroupRadio(group, idx);
break;
}
@ -181,13 +181,14 @@ public class ModPanelSettingsTab : ITab
using var id = ImRaii.PushId(groupIdx);
var selectedOption = _empty ? group.DefaultSettings.AsIndex : _settings.Settings[groupIdx].AsIndex;
ImGui.SetNextItemWidth(UiHelpers.InputTextWidth.X * 3 / 4);
using (var combo = ImRaii.Combo(string.Empty, group[selectedOption].Name))
var options = group.Options;
using (var combo = ImRaii.Combo(string.Empty, options[selectedOption].Name))
{
if (combo)
for (var idx2 = 0; idx2 < group.Count; ++idx2)
for (var idx2 = 0; idx2 < options.Count; ++idx2)
{
id.Push(idx2);
var option = group[idx2];
var option = options[idx2];
if (ImGui.Selectable(option.Name, idx2 == selectedOption))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx,
Setting.Single(idx2));
@ -213,18 +214,18 @@ public class ModPanelSettingsTab : ITab
using var id = ImRaii.PushId(groupIdx);
var selectedOption = _empty ? group.DefaultSettings.AsIndex : _settings.Settings[groupIdx].AsIndex;
var minWidth = Widget.BeginFramedGroup(group.Name, group.Description);
DrawCollapseHandling(group, minWidth, DrawOptions);
var options = group.Options;
DrawCollapseHandling(options, minWidth, DrawOptions);
Widget.EndFramedGroup();
return;
void DrawOptions()
{
for (var idx = 0; idx < group.Count; ++idx)
for (var idx = 0; idx < group.Options.Count; ++idx)
{
using var i = ImRaii.PushId(idx);
var option = group[idx];
var option = options[idx];
if (ImGui.RadioButton(option.Name, selectedOption == idx))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx,
Setting.Single(idx));
@ -239,9 +240,9 @@ public class ModPanelSettingsTab : ITab
}
private void DrawCollapseHandling(IModGroup group, float minWidth, Action draw)
private void DrawCollapseHandling(IReadOnlyList<IModOption> options, float minWidth, Action draw)
{
if (group.Count <= _config.OptionGroupCollapsibleMin)
if (options.Count <= _config.OptionGroupCollapsibleMin)
{
draw();
}
@ -249,8 +250,8 @@ public class ModPanelSettingsTab : ITab
{
var collapseId = ImGui.GetID("Collapse");
var shown = ImGui.GetStateStorage().GetBool(collapseId, true);
var buttonTextShow = $"Show {group.Count} Options";
var buttonTextHide = $"Hide {group.Count} Options";
var buttonTextShow = $"Show {options.Count} Options";
var buttonTextHide = $"Hide {options.Count} Options";
var buttonWidth = Math.Max(ImGui.CalcTextSize(buttonTextShow).X, ImGui.CalcTextSize(buttonTextHide).X)
+ 2 * ImGui.GetStyle().FramePadding.X;
minWidth = Math.Max(buttonWidth, minWidth);
@ -274,7 +275,7 @@ public class ModPanelSettingsTab : ITab
}
else
{
var optionWidth = group.Max(o => ImGui.CalcTextSize(o.Name).X)
var optionWidth = options.Max(o => ImGui.CalcTextSize(o.Name).X)
+ ImGui.GetStyle().ItemInnerSpacing.X
+ ImGui.GetFrameHeight()
+ ImGui.GetStyle().FramePadding.X;
@ -294,8 +295,8 @@ public class ModPanelSettingsTab : ITab
using var id = ImRaii.PushId(groupIdx);
var flags = _empty ? group.DefaultSettings : _settings.Settings[groupIdx];
var minWidth = Widget.BeginFramedGroup(group.Name, group.Description);
DrawCollapseHandling(group, minWidth, DrawOptions);
var options = group.Options;
DrawCollapseHandling(options, minWidth, DrawOptions);
Widget.EndFramedGroup();
var label = $"##multi{groupIdx}";
@ -307,10 +308,10 @@ public class ModPanelSettingsTab : ITab
void DrawOptions()
{
for (var idx = 0; idx < group.Count; ++idx)
for (var idx = 0; idx < options.Count; ++idx)
{
using var i = ImRaii.PushId(idx);
var option = group[idx];
var option = options[idx];
var setting = flags.HasFlag(idx);
if (ImGui.Checkbox(option.Name, ref setting))
@ -339,7 +340,7 @@ public class ModPanelSettingsTab : ITab
ImGui.Separator();
if (ImGui.Selectable("Enable All"))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx,
Setting.AllBits(group.Count));
Setting.AllBits(group.Options.Count));
if (ImGui.Selectable("Disable All"))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, Setting.Zero);