Improve mod filters.

This commit is contained in:
Ottermandias 2024-08-29 21:13:33 +02:00
parent 2a7d2ef0d5
commit 176001195b
4 changed files with 41 additions and 35 deletions

@ -1 +1 @@
Subproject commit 17bd4b75b6d7750c92b65caf09715886d4df57cf
Subproject commit 3e6b085749741f35dd6732c33d0720c6a51ebb97

View file

@ -9,6 +9,8 @@ using OtterGui.Filesystem;
using OtterGui.FileSystem.Selector;
using OtterGui.Raii;
using OtterGui.Services;
using OtterGui.Text;
using OtterGui.Text.Widget;
using Penumbra.Api.Enums;
using Penumbra.Collections;
using Penumbra.Collections.Manager;
@ -703,8 +705,6 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
using var style = ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing,
ImGui.GetStyle().ItemSpacing with { Y = 3 * UiHelpers.Scale });
var flags = (int)_stateFilter;
if (ImGui.Checkbox("Everything", ref everything))
{
@ -713,11 +713,18 @@ public sealed class ModFileSystemSelector : FileSystemSelector<Mod, ModFileSyste
}
ImGui.Dummy(new Vector2(0, 5 * UiHelpers.Scale));
foreach (ModFilter flag in Enum.GetValues(typeof(ModFilter)))
foreach (var (onFlag, offFlag, name) in ModFilterExtensions.TriStatePairs)
{
if (ImGui.CheckboxFlags(flag.ToName(), ref flags, (int)flag))
if (TriStateCheckbox.Instance.Draw(name, ref _stateFilter, onFlag, offFlag))
SetFilterDirty();
}
foreach (var group in ModFilterExtensions.Groups)
{
_stateFilter = (ModFilter)flags;
ImGui.Separator();
foreach (var (flag, name) in group)
{
if (ImUtf8.Checkbox(name, ref _stateFilter, flag))
SetFilterDirty();
}
}

View file

@ -29,29 +29,28 @@ public static class ModFilterExtensions
{
public const ModFilter UnfilteredStateMods = (ModFilter)((1 << 20) - 1);
public static string ToName(this ModFilter filter)
=> filter switch
{
ModFilter.Enabled => "Enabled",
ModFilter.Disabled => "Disabled",
ModFilter.Favorite => "Favorite",
ModFilter.NotFavorite => "No Favorite",
ModFilter.NoConflict => "No Conflicts",
ModFilter.SolvedConflict => "Solved Conflicts",
ModFilter.UnsolvedConflict => "Unsolved Conflicts",
ModFilter.HasNoMetaManipulations => "No Meta Manipulations",
ModFilter.HasMetaManipulations => "Meta Manipulations",
ModFilter.HasNoFileSwaps => "No File Swaps",
ModFilter.HasFileSwaps => "File Swaps",
ModFilter.HasNoConfig => "No Configuration",
ModFilter.HasConfig => "Configuration",
ModFilter.HasNoFiles => "No Files",
ModFilter.HasFiles => "Files",
ModFilter.IsNew => "Newly Imported",
ModFilter.NotNew => "Not Newly Imported",
ModFilter.Inherited => "Inherited Configuration",
ModFilter.Uninherited => "Own Configuration",
ModFilter.Undefined => "Not Configured",
_ => throw new ArgumentOutOfRangeException(nameof(filter), filter, null),
};
public static IReadOnlyList<(ModFilter On, ModFilter Off, string Name)> TriStatePairs =
[
(ModFilter.Enabled, ModFilter.Disabled, "Enabled"),
(ModFilter.IsNew, ModFilter.NotNew, "Newly Imported"),
(ModFilter.Favorite, ModFilter.NotFavorite, "Favorite"),
(ModFilter.HasConfig, ModFilter.HasNoConfig, "Has Options"),
(ModFilter.HasFiles, ModFilter.HasNoFiles, "Has Redirections"),
(ModFilter.HasMetaManipulations, ModFilter.HasNoMetaManipulations, "Has Meta Manipulations"),
(ModFilter.HasFileSwaps, ModFilter.HasNoFileSwaps, "Has File Swaps"),
];
public static IReadOnlyList<IReadOnlyList<(ModFilter Filter, string Name)>> Groups =
[
[
(ModFilter.NoConflict, "Has No Conflicts"),
(ModFilter.SolvedConflict, "Has Solved Conflicts"),
(ModFilter.UnsolvedConflict, "Has Unsolved Conflicts"),
],
[
(ModFilter.Undefined, "Not Configured"),
(ModFilter.Inherited, "Inherited Configuration"),
(ModFilter.Uninherited, "Own Configuration"),
],
];
}