Turn Settings and Priority into their own types.

This commit is contained in:
Ottermandias 2024-04-05 16:35:55 +02:00
parent 77bf441e62
commit b1ca073276
29 changed files with 422 additions and 298 deletions

View file

@ -694,7 +694,7 @@ public class ItemSwapTab : IDisposable, ITab
UpdateMod(_mod, _mod.Index < newCollection.Settings.Count ? newCollection[_mod.Index].Settings : null);
}
private void OnSettingChange(ModCollection collection, ModSettingChange type, Mod? mod, int oldValue, int groupIdx, bool inherited)
private void OnSettingChange(ModCollection collection, ModSettingChange type, Mod? mod, Setting oldValue, int groupIdx, bool inherited)
{
if (collection != _collectionManager.Active.Current || mod != _mod)
return;

View file

@ -74,7 +74,7 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
// @formatter:on
SetFilterTooltip();
SelectionChanged += OnSelectionChange;
SelectionChanged += OnSelectionChange;
if (_config.Ephemeral.LastModPath.Length > 0)
{
var mod = _modManager.FirstOrDefault(m
@ -92,7 +92,7 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
OnCollectionChange(CollectionType.Current, null, _collectionManager.Active.Current, "");
}
private static readonly string[] ValidModExtensions =
private static readonly string[] ValidModExtensions =
[
".ttmp",
".ttmp2",
@ -191,15 +191,15 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
}
}
if (state.Priority != 0 && !_config.HidePrioritiesInSelector)
if (!state.Priority.IsDefault && !_config.HidePrioritiesInSelector)
{
var line = ImGui.GetItemRectMin().Y;
var itemPos = ImGui.GetItemRectMax().X;
var maxWidth = ImGui.GetWindowPos().X + ImGui.GetWindowContentRegionMax().X;
var priorityString = $"[{state.Priority}]";
var Size = ImGui.CalcTextSize(priorityString).X;
var size = ImGui.CalcTextSize(priorityString).X;
var remainingSpace = maxWidth - itemPos;
var offset = remainingSpace - Size;
var offset = remainingSpace - size;
if (ImGui.GetScrollMaxY() == 0)
offset -= ImGui.GetStyle().ItemInnerSpacing.X;
@ -427,7 +427,7 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
#region Automatic cache update functions.
private void OnSettingChange(ModCollection collection, ModSettingChange type, Mod? mod, int oldValue, int groupIdx, bool inherited)
private void OnSettingChange(ModCollection collection, ModSettingChange type, Mod? mod, Setting oldValue, int groupIdx, bool inherited)
{
if (collection != _collectionManager.Active.Current)
return;
@ -517,8 +517,8 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct ModState
{
public ColorId Color;
public int Priority;
public ColorId Color;
public ModPriority Priority;
}
private const StringComparison IgnoreCase = StringComparison.OrdinalIgnoreCase;
@ -744,7 +744,7 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
state = new ModState
{
Color = ColorId.EnabledMod,
Priority = settings?.Priority ?? 0,
Priority = settings?.Priority ?? ModPriority.Default,
};
if (ApplyStringFilters(leaf, mod))
return true;

View file

@ -9,38 +9,30 @@ using Penumbra.Collections.Manager;
using Penumbra.Meta.Manipulations;
using Penumbra.Mods;
using Penumbra.Mods.Editor;
using Penumbra.Mods.Subclasses;
using Penumbra.String.Classes;
using Penumbra.UI.Classes;
namespace Penumbra.UI.ModsTab;
public class ModPanelConflictsTab : ITab
public class ModPanelConflictsTab(CollectionManager collectionManager, ModFileSystemSelector selector) : ITab
{
private readonly ModFileSystemSelector _selector;
private readonly CollectionManager _collectionManager;
public ModPanelConflictsTab(CollectionManager collectionManager, ModFileSystemSelector selector)
{
_collectionManager = collectionManager;
_selector = selector;
}
private int? _currentPriority = null;
private int? _currentPriority;
public ReadOnlySpan<byte> Label
=> "Conflicts"u8;
public bool IsVisible
=> _collectionManager.Active.Current.Conflicts(_selector.Selected!).Count > 0;
=> collectionManager.Active.Current.Conflicts(selector.Selected!).Count > 0;
private readonly ConditionalWeakTable<IMod, object> _expandedMods = new();
private readonly ConditionalWeakTable<IMod, object> _expandedMods = [];
private int GetPriority(ModConflicts conflicts)
private ModPriority GetPriority(ModConflicts conflicts)
{
if (conflicts.Mod2.Index < 0)
return conflicts.Mod2.Priority;
return _collectionManager.Active.Current[conflicts.Mod2.Index].Settings?.Priority ?? 0;
return collectionManager.Active.Current[conflicts.Mod2.Index].Settings?.Priority ?? ModPriority.Default;
}
public void DrawContent()
@ -63,8 +55,8 @@ public class ModPanelConflictsTab : ITab
DrawCurrentRow(priorityWidth);
// Can not be null because otherwise the tab bar is never drawn.
var mod = _selector.Selected!;
foreach (var (conflict, index) in _collectionManager.Active.Current.Conflicts(mod).OrderByDescending(GetPriority)
var mod = selector.Selected!;
foreach (var (conflict, index) in collectionManager.Active.Current.Conflicts(mod).OrderByDescending(GetPriority)
.ThenBy(c => c.Mod2.Name.Lower).WithIndex())
{
using var id = ImRaii.PushId(index);
@ -77,18 +69,18 @@ public class ModPanelConflictsTab : ITab
ImGui.TableNextColumn();
using var c = ImRaii.PushColor(ImGuiCol.Text, ColorId.FolderLine.Value());
ImGui.AlignTextToFramePadding();
ImGui.TextUnformatted(_selector.Selected!.Name);
ImGui.TextUnformatted(selector.Selected!.Name);
ImGui.TableNextColumn();
var priority = _collectionManager.Active.Current[_selector.Selected!.Index].Settings!.Priority;
var priority = collectionManager.Active.Current[selector.Selected!.Index].Settings!.Priority.Value;
ImGui.SetNextItemWidth(priorityWidth);
if (ImGui.InputInt("##priority", ref priority, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue))
_currentPriority = priority;
if (ImGui.IsItemDeactivatedAfterEdit() && _currentPriority.HasValue)
{
if (_currentPriority != _collectionManager.Active.Current[_selector.Selected!.Index].Settings!.Priority)
_collectionManager.Editor.SetModPriority(_collectionManager.Active.Current, (Mod)_selector.Selected!,
_currentPriority.Value);
if (_currentPriority != collectionManager.Active.Current[selector.Selected!.Index].Settings!.Priority.Value)
collectionManager.Editor.SetModPriority(collectionManager.Active.Current, selector.Selected!,
new ModPriority(_currentPriority.Value));
_currentPriority = null;
}
@ -104,7 +96,7 @@ public class ModPanelConflictsTab : ITab
{
ImGui.AlignTextToFramePadding();
if (ImGui.Selectable(conflict.Mod2.Name) && conflict.Mod2 is Mod otherMod)
_selector.SelectByValue(otherMod);
selector.SelectByValue(otherMod);
var hovered = ImGui.IsItemHovered();
var rightClicked = ImGui.IsItemClicked(ImGuiMouseButton.Right);
if (conflict.Mod2 is Mod otherMod2)
@ -112,7 +104,7 @@ public class ModPanelConflictsTab : ITab
if (hovered)
ImGui.SetTooltip("Click to jump to mod, Control + Right-Click to disable mod.");
if (rightClicked && ImGui.GetIO().KeyCtrl)
_collectionManager.Editor.SetModState(_collectionManager.Active.Current, otherMod2, false);
collectionManager.Editor.SetModState(collectionManager.Active.Current, otherMod2, false);
}
}
@ -146,7 +138,7 @@ public class ModPanelConflictsTab : ITab
ImGui.TableNextColumn();
var conflictPriority = DrawPriorityInput(conflict, priorityWidth);
ImGui.SameLine();
var selectedPriority = _collectionManager.Active.Current[_selector.Selected!.Index].Settings!.Priority;
var selectedPriority = collectionManager.Active.Current[selector.Selected!.Index].Settings!.Priority.Value;
DrawPriorityButtons(conflict.Mod2 as Mod, conflictPriority, selectedPriority, buttonSize);
ImGui.TableNextColumn();
DrawExpandButton(conflict.Mod2, expanded, buttonSize);
@ -171,7 +163,7 @@ public class ModPanelConflictsTab : ITab
using var color = ImRaii.PushColor(ImGuiCol.Text,
conflict.HasPriority ? ColorId.HandledConflictMod.Value() : ColorId.ConflictingMod.Value());
using var disabled = ImRaii.Disabled(conflict.Mod2.Index < 0);
var priority = _currentPriority ?? GetPriority(conflict);
var priority = _currentPriority ?? GetPriority(conflict).Value;
ImGui.SetNextItemWidth(priorityWidth);
if (ImGui.InputInt("##priority", ref priority, 0, 0, ImGuiInputTextFlags.EnterReturnsTrue))
@ -179,8 +171,9 @@ public class ModPanelConflictsTab : ITab
if (ImGui.IsItemDeactivatedAfterEdit() && _currentPriority.HasValue)
{
if (_currentPriority != GetPriority(conflict))
_collectionManager.Editor.SetModPriority(_collectionManager.Active.Current, (Mod)conflict.Mod2, _currentPriority.Value);
if (_currentPriority != GetPriority(conflict).Value)
collectionManager.Editor.SetModPriority(collectionManager.Active.Current, (Mod)conflict.Mod2,
new ModPriority(_currentPriority.Value));
_currentPriority = null;
}
@ -195,12 +188,14 @@ public class ModPanelConflictsTab : ITab
private void DrawPriorityButtons(Mod? conflict, int conflictPriority, int selectedPriority, Vector2 buttonSize)
{
if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.SortNumericUpAlt.ToIconString(), buttonSize,
$"Set the priority of the currently selected mod to this mods priority plus one. ({selectedPriority} -> {conflictPriority + 1})", selectedPriority > conflictPriority, true))
_collectionManager.Editor.SetModPriority(_collectionManager.Active.Current, _selector.Selected!, conflictPriority + 1);
$"Set the priority of the currently selected mod to this mods priority plus one. ({selectedPriority} -> {conflictPriority + 1})",
selectedPriority > conflictPriority, true))
collectionManager.Editor.SetModPriority(collectionManager.Active.Current, selector.Selected!,
new ModPriority(conflictPriority + 1));
ImGui.SameLine();
if (ImGuiUtil.DrawDisabledButton(FontAwesomeIcon.SortNumericDownAlt.ToIconString(), buttonSize,
$"Set the priority of this mod to the currently selected mods priority minus one. ({conflictPriority} -> {selectedPriority - 1})",
selectedPriority > conflictPriority || conflict == null, true))
_collectionManager.Editor.SetModPriority(_collectionManager.Active.Current, conflict!, selectedPriority - 1);
collectionManager.Editor.SetModPriority(collectionManager.Active.Current, conflict!, new ModPriority(selectedPriority - 1));
}
}

View file

@ -502,18 +502,16 @@ public class ModPanelEditTab(
if (group.Type == GroupType.Single)
{
if (ImGui.RadioButton("##default", group.DefaultSettings == optionIdx))
panel._modManager.OptionEditor.ChangeModGroupDefaultOption(panel._mod, groupIdx, (uint)optionIdx);
if (ImGui.RadioButton("##default", group.DefaultSettings.AsIndex == optionIdx))
panel._modManager.OptionEditor.ChangeModGroupDefaultOption(panel._mod, groupIdx, Setting.Single(optionIdx));
ImGuiUtil.HoverTooltip($"Set {option.Name} as the default choice for this group.");
}
else
{
var isDefaultOption = ((group.DefaultSettings >> optionIdx) & 1) != 0;
var isDefaultOption = group.DefaultSettings.HasFlag(optionIdx);
if (ImGui.Checkbox("##default", ref isDefaultOption))
panel._modManager.OptionEditor.ChangeModGroupDefaultOption(panel._mod, groupIdx, isDefaultOption
? group.DefaultSettings | (1u << optionIdx)
: group.DefaultSettings & ~(1u << optionIdx));
panel._modManager.OptionEditor.ChangeModGroupDefaultOption(panel._mod, groupIdx, group.DefaultSettings.SetBit(optionIdx, isDefaultOption));
ImGuiUtil.HoverTooltip($"{(isDefaultOption ? "Disable" : "Enable")} {option.Name} per default in this group.");
}

View file

@ -26,7 +26,7 @@ public class ModPanelSettingsTab : ITab
private ModSettings _settings = null!;
private ModCollection _collection = null!;
private bool _empty;
private int? _currentPriority = null;
private int? _currentPriority;
public ModPanelSettingsTab(CollectionManager collectionManager, ModManager modManager, ModFileSystemSelector selector,
TutorialService tutorial, CommunicatorService communicator, Configuration config)
@ -136,15 +136,15 @@ public class ModPanelSettingsTab : ITab
private void DrawPriorityInput()
{
using var group = ImRaii.Group();
var priority = _currentPriority ?? _settings.Priority;
var priority = _currentPriority ?? _settings.Priority.Value;
ImGui.SetNextItemWidth(50 * UiHelpers.Scale);
if (ImGui.InputInt("##Priority", ref priority, 0, 0))
_currentPriority = priority;
if (ImGui.IsItemDeactivatedAfterEdit() && _currentPriority.HasValue)
{
if (_currentPriority != _settings.Priority)
_collectionManager.Editor.SetModPriority(_collectionManager.Active.Current, _selector.Selected!, _currentPriority.Value);
if (_currentPriority != _settings.Priority.Value)
_collectionManager.Editor.SetModPriority(_collectionManager.Active.Current, _selector.Selected!, new ModPriority(_currentPriority.Value));
_currentPriority = null;
}
@ -179,7 +179,7 @@ public class ModPanelSettingsTab : ITab
private void DrawSingleGroupCombo(IModGroup group, int groupIdx)
{
using var id = ImRaii.PushId(groupIdx);
var selectedOption = _empty ? (int)group.DefaultSettings : (int)_settings.Settings[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))
{
@ -189,7 +189,8 @@ public class ModPanelSettingsTab : ITab
id.Push(idx2);
var option = group[idx2];
if (ImGui.Selectable(option.Name, idx2 == selectedOption))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, (uint)idx2);
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx,
Setting.Single(idx2));
if (option.Description.Length > 0)
ImGuiUtil.SelectableHelpMarker(option.Description);
@ -210,8 +211,8 @@ public class ModPanelSettingsTab : ITab
private void DrawSingleGroupRadio(IModGroup group, int groupIdx)
{
using var id = ImRaii.PushId(groupIdx);
var selectedOption = _empty ? (int)group.DefaultSettings : (int)_settings.Settings[groupIdx];
var minWidth = Widget.BeginFramedGroup(group.Name, description:group.Description);
var selectedOption = _empty ? group.DefaultSettings.AsIndex : _settings.Settings[groupIdx].AsIndex;
var minWidth = Widget.BeginFramedGroup(group.Name, group.Description);
DrawCollapseHandling(group, minWidth, DrawOptions);
@ -225,7 +226,8 @@ public class ModPanelSettingsTab : ITab
using var i = ImRaii.PushId(idx);
var option = group[idx];
if (ImGui.RadioButton(option.Name, selectedOption == idx))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, (uint)idx);
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx,
Setting.Single(idx));
if (option.Description.Length <= 0)
continue;
@ -291,7 +293,17 @@ public class ModPanelSettingsTab : ITab
{
using var id = ImRaii.PushId(groupIdx);
var flags = _empty ? group.DefaultSettings : _settings.Settings[groupIdx];
var minWidth = Widget.BeginFramedGroup(group.Name, description: group.Description);
var minWidth = Widget.BeginFramedGroup(group.Name, group.Description);
DrawCollapseHandling(group, minWidth, DrawOptions);
Widget.EndFramedGroup();
var label = $"##multi{groupIdx}";
if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
ImGui.OpenPopup($"##multi{groupIdx}");
DrawMultiPopup(group, groupIdx, label);
return;
void DrawOptions()
{
@ -299,12 +311,11 @@ public class ModPanelSettingsTab : ITab
{
using var i = ImRaii.PushId(idx);
var option = group[idx];
var flag = 1u << idx;
var setting = (flags & flag) != 0;
var setting = flags.HasFlag(idx);
if (ImGui.Checkbox(option.Name, ref setting))
{
flags = setting ? flags | flag : flags & ~flag;
flags = flags.SetBit(idx, setting);
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, flags);
}
@ -315,14 +326,10 @@ public class ModPanelSettingsTab : ITab
}
}
}
}
DrawCollapseHandling(group, minWidth, DrawOptions);
Widget.EndFramedGroup();
var label = $"##multi{groupIdx}";
if (ImGui.IsItemClicked(ImGuiMouseButton.Right))
ImGui.OpenPopup($"##multi{groupIdx}");
private void DrawMultiPopup(IModGroup group, int groupIdx, string label)
{
using var style = ImRaii.PushStyle(ImGuiStyleVar.PopupBorderSize, 1);
using var popup = ImRaii.Popup(label);
if (!popup)
@ -331,12 +338,10 @@ public class ModPanelSettingsTab : ITab
ImGui.TextUnformatted(group.Name);
ImGui.Separator();
if (ImGui.Selectable("Enable All"))
{
flags = group.Count == 32 ? uint.MaxValue : (1u << group.Count) - 1u;
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, flags);
}
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx,
Setting.AllBits(group.Count));
if (ImGui.Selectable("Disable All"))
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, 0);
_collectionManager.Editor.SetModSetting(_collectionManager.Active.Current, _selector.Selected!, groupIdx, Setting.Zero);
}
}

View file

@ -211,7 +211,7 @@ public class DebugTab : Window, ITab
color.Pop();
foreach (var (mod, paths, manips) in collection._cache!.ModData.Data.OrderBy(t => t.Item1.Name))
{
using var id = mod is TemporaryMod t ? PushId(t.Priority) : PushId(((Mod)mod).ModPath.Name);
using var id = mod is TemporaryMod t ? PushId(t.Priority.Value) : PushId(((Mod)mod).ModPath.Name);
using var node2 = TreeNode(mod.Name.Text);
if (!node2)
continue;