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

@ -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);