Add new Mod Collections tab.

This commit is contained in:
Ottermandias 2023-04-18 18:42:33 +02:00
parent 835020229c
commit e9fc57022e
5 changed files with 126 additions and 10 deletions

@ -1 +1 @@
Subproject commit 8ebcbf3e78ed498be35fa2b9a13d9765d109c428
Subproject commit 51c350b5f129b53afda3a51b057c228e152a6b88

View file

@ -10,7 +10,6 @@ using Penumbra.Mods;
using Penumbra.UI.Classes;
using Penumbra.UI.Tabs;
using Penumbra.Util;
namespace Penumbra.UI;
public sealed class ConfigWindow : Window
@ -45,7 +44,7 @@ public sealed class ConfigWindow : Window
RespectCloseHotkey = true;
SizeConstraints = new WindowSizeConstraints()
{
MinimumSize = new Vector2(800, 600),
MinimumSize = new Vector2(900, 600),
MaximumSize = new Vector2(4096, 2160),
};
tutorial.UpdateTutorialStep();
@ -112,9 +111,12 @@ public sealed class ConfigWindow : Window
var text = e.ToString();
if (text == _lastException)
return;
_lastException = text;
}
else
{
_lastException = e.ToString();
}
Penumbra.Log.Error($"Exception thrown during UI Render:\n{_lastException}");
}

View file

@ -0,0 +1,107 @@
using System;
using System.Collections.Generic;
using Dalamud.Interface;
using ImGuiNET;
using Lumina.Data.Parsing.Layer;
using OtterGui;
using OtterGui.Raii;
using OtterGui.Widgets;
using Penumbra.Collections;
using Penumbra.Collections.Manager;
using Penumbra.Mods;
using Penumbra.UI.Classes;
namespace Penumbra.UI.ModsTab;
public class ModPanelCollectionsTab : ITab
{
private readonly Configuration _config;
private readonly ModFileSystemSelector _selector;
private readonly CollectionStorage _collections;
private readonly List<(ModCollection, ModCollection, uint, string)> _cache = new();
public ModPanelCollectionsTab(Configuration config, CollectionStorage storage, ModFileSystemSelector selector)
{
_config = config;
_collections = storage;
_selector = selector;
}
public ReadOnlySpan<byte> Label
=> "Collections"u8;
public void DrawContent()
{
var (direct, inherited) = CountUsage(_selector.Selected!);
ImGui.NewLine();
if (direct == 1)
ImGui.TextUnformatted("This Mod is directly configured in 1 collection.");
else if (direct == 0)
ImGuiUtil.TextColored(Colors.RegexWarningBorder, "This mod is entirely unused.");
else
ImGui.TextUnformatted($"This Mod is directly configured in {direct} collections.");
if (inherited > 0)
{
ImGui.TextUnformatted($"It is also implicitly used in {inherited} {(inherited == 1 ? "collection" : "collections")} through inheritance.");
}
ImGui.NewLine();
ImGui.Separator();
ImGui.NewLine();
using var table = ImRaii.Table("##modCollections", 3, ImGuiTableFlags.SizingFixedFit | ImGuiTableFlags.RowBg);
if (!table)
return;
var size = ImGui.CalcTextSize("Unconfigured").X + 20 * ImGuiHelpers.GlobalScale;
var collectionSize = 200 * ImGuiHelpers.GlobalScale;
ImGui.TableSetupColumn("Collection", ImGuiTableColumnFlags.WidthFixed, collectionSize);
ImGui.TableSetupColumn("State", ImGuiTableColumnFlags.WidthFixed, size);
ImGui.TableSetupColumn("Inherited From", ImGuiTableColumnFlags.WidthFixed, collectionSize);
ImGui.TableHeadersRow();
foreach (var (collection, parent, color, text) in _cache)
{
ImGui.TableNextColumn();
ImGui.TextUnformatted(collection.Name);
ImGui.TableNextColumn();
using (var c = ImRaii.PushColor(ImGuiCol.Text, color))
{
ImGui.TextUnformatted(text);
}
ImGui.TableNextColumn();
ImGui.TextUnformatted(parent == collection ? string.Empty : parent.Name);
}
}
private (int Direct, int Inherited) CountUsage(Mod mod)
{
_cache.Clear();
var undefined = ColorId.UndefinedMod.Value(_config);
var enabled = ColorId.EnabledMod.Value(_config);
var inherited = ColorId.InheritedMod.Value(_config);
var disabled = ColorId.DisabledMod.Value(_config);
var disInherited = ColorId.InheritedDisabledMod.Value(_config);
var directCount = 0;
var inheritedCount = 0;
foreach (var collection in _collections)
{
var (settings, parent) = collection[mod.Index];
var (color, text) = settings == null
? (undefined, "Unconfigured")
: settings.Enabled
? (parent == collection ? enabled : inherited, "Enabled")
: (parent == collection ? disabled : disInherited, "Disabled");
_cache.Add((collection, parent, color, text));
if (color == enabled)
++directCount;
else if (color == inherited)
++inheritedCount;
}
return (directCount, inheritedCount);
}
}

View file

@ -198,13 +198,13 @@ public class ModPanelEditTab : ITab
_delayedActions.Enqueue(() => DescriptionEdit.OpenPopup(_filenames, _mod, Input.Description));
ImGui.SameLine();
var fileExists = File.Exists(_modManager.DataEditor.MetaFile(_mod));
var fileExists = File.Exists(_filenames.ModMetaPath(_mod));
var tt = fileExists
? "Open the metadata json file in the text editor of your choice."
: "The metadata json file does not exist.";
if (ImGuiUtil.DrawDisabledButton($"{FontAwesomeIcon.FileExport.ToIconString()}##metaFile", UiHelpers.IconButtonSize, tt,
!fileExists, true))
Process.Start(new ProcessStartInfo(_modManager.DataEditor.MetaFile(_mod)) { UseShellExecute = true });
Process.Start(new ProcessStartInfo(_filenames.ModMetaPath(_mod)) { UseShellExecute = true });
}
/// <summary> Do some edits outside of iterations. </summary>

View file

@ -19,11 +19,13 @@ public class ModPanelTabBar
Settings,
ChangedItems,
Conflicts,
Collections,
Edit,
};
public readonly ModPanelSettingsTab Settings;
public readonly ModPanelDescriptionTab Description;
public readonly ModPanelCollectionsTab Collections;
public readonly ModPanelConflictsTab Conflicts;
public readonly ModPanelChangedItemsTab ChangedItems;
public readonly ModPanelEditTab Edit;
@ -37,7 +39,7 @@ public class ModPanelTabBar
public ModPanelTabBar(ModEditWindow modEditWindow, ModPanelSettingsTab settings, ModPanelDescriptionTab description,
ModPanelConflictsTab conflicts, ModPanelChangedItemsTab changedItems, ModPanelEditTab edit, ModManager modManager,
TutorialService tutorial)
TutorialService tutorial, ModPanelCollectionsTab collections)
{
_modEditWindow = modEditWindow;
Settings = settings;
@ -47,6 +49,7 @@ public class ModPanelTabBar
Edit = edit;
_modManager = modManager;
_tutorial = tutorial;
Collections = collections;
Tabs = new ITab[]
{
@ -54,6 +57,7 @@ public class ModPanelTabBar
Description,
Conflicts,
ChangedItems,
Collections,
Edit,
};
}
@ -83,6 +87,7 @@ public class ModPanelTabBar
ModPanelTabType.Settings => Settings.Label,
ModPanelTabType.ChangedItems => ChangedItems.Label,
ModPanelTabType.Conflicts => Conflicts.Label,
ModPanelTabType.Collections => Collections.Label,
ModPanelTabType.Edit => Edit.Label,
_ => ReadOnlySpan<byte>.Empty,
};
@ -97,6 +102,8 @@ public class ModPanelTabBar
return ModPanelTabType.ChangedItems;
if (label == Conflicts.Label)
return ModPanelTabType.Conflicts;
if (label == Collections.Label)
return ModPanelTabType.Collections;
if (label == Edit.Label)
return ModPanelTabType.Edit;