mirror of
https://github.com/xivdev/Penumbra.git
synced 2026-02-21 07:17:53 +01:00
Rework options, pre-submod types.
This commit is contained in:
parent
792a04337f
commit
07afbfb229
25 changed files with 620 additions and 300 deletions
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue