Fix the mod panels header not resetting data when a selected mod updates.

This commit is contained in:
Ottermandias 2023-12-24 14:36:21 +01:00
parent 28752e2630
commit f8331bc4d8
5 changed files with 32 additions and 10 deletions

View file

@ -21,8 +21,11 @@ public sealed class ModDataChanged : EventWrapper<Action<ModDataChangeType, Mod,
/// <seealso cref="Mods.Manager.ModCacheManager.OnModDataChange"/> /// <seealso cref="Mods.Manager.ModCacheManager.OnModDataChange"/>
ModCacheManager = 0, ModCacheManager = 0,
/// <seealso cref="Mods.Manager.ModFileSystem.OnDataChange"/> /// <seealso cref="Mods.Manager.ModFileSystem.OnModDataChange"/>
ModFileSystem = 0, ModFileSystem = 0,
/// <seealso cref="UI.ModsTab.ModPanelHeader.OnModDataChange"/>
ModPanelHeader = 0,
} }
public ModDataChanged() public ModDataChanged()

View file

@ -21,7 +21,7 @@ public sealed class ModFileSystem : FileSystem<Mod>, IDisposable, ISavable
Reload(); Reload();
Changed += OnChange; Changed += OnChange;
_communicator.ModDiscoveryFinished.Subscribe(Reload, ModDiscoveryFinished.Priority.ModFileSystem); _communicator.ModDiscoveryFinished.Subscribe(Reload, ModDiscoveryFinished.Priority.ModFileSystem);
_communicator.ModDataChanged.Subscribe(OnDataChange, ModDataChanged.Priority.ModFileSystem); _communicator.ModDataChanged.Subscribe(OnModDataChange, ModDataChanged.Priority.ModFileSystem);
_communicator.ModPathChanged.Subscribe(OnModPathChange, ModPathChanged.Priority.ModFileSystem); _communicator.ModPathChanged.Subscribe(OnModPathChange, ModPathChanged.Priority.ModFileSystem);
} }
@ -29,7 +29,7 @@ public sealed class ModFileSystem : FileSystem<Mod>, IDisposable, ISavable
{ {
_communicator.ModPathChanged.Unsubscribe(OnModPathChange); _communicator.ModPathChanged.Unsubscribe(OnModPathChange);
_communicator.ModDiscoveryFinished.Unsubscribe(Reload); _communicator.ModDiscoveryFinished.Unsubscribe(Reload);
_communicator.ModDataChanged.Unsubscribe(OnDataChange); _communicator.ModDataChanged.Unsubscribe(OnModDataChange);
} }
public struct ImportDate : ISortMode<Mod> public struct ImportDate : ISortMode<Mod>
@ -75,7 +75,7 @@ public sealed class ModFileSystem : FileSystem<Mod>, IDisposable, ISavable
} }
// Update sort order when defaulted mod names change. // Update sort order when defaulted mod names change.
private void OnDataChange(ModDataChangeType type, Mod mod, string? oldName) private void OnModDataChange(ModDataChangeType type, Mod mod, string? oldName)
{ {
if (!type.HasFlag(ModDataChangeType.Name) || oldName == null || !FindLeaf(mod, out var leaf)) if (!type.HasFlag(ModDataChangeType.Name) || oldName == null || !FindLeaf(mod, out var leaf))
return; return;

View file

@ -155,7 +155,6 @@ public partial class ModEditWindow
var file = tab.Mdl; var file = tab.Mdl;
var mesh = file.Meshes[meshIndex]; var mesh = file.Meshes[meshIndex];
// Mesh material // Mesh material
ImGui.TableNextColumn(); ImGui.TableNextColumn();
ImGui.AlignTextToFramePadding(); ImGui.AlignTextToFramePadding();
@ -171,7 +170,7 @@ public partial class ModEditWindow
return ret; return ret;
} }
private bool DrawMaterialCombo(MdlTab tab, int meshIndex, bool disabled) private static bool DrawMaterialCombo(MdlTab tab, int meshIndex, bool disabled)
{ {
var mesh = tab.Mdl.Meshes[meshIndex]; var mesh = tab.Mdl.Meshes[meshIndex];
using var _ = ImRaii.Disabled(disabled); using var _ = ImRaii.Disabled(disabled);

View file

@ -1,5 +1,6 @@
using Dalamud.Plugin; using Dalamud.Plugin;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Services;
using Penumbra.UI.AdvancedWindow; using Penumbra.UI.AdvancedWindow;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
@ -13,13 +14,13 @@ public class ModPanel : IDisposable
private readonly ModPanelTabBar _tabs; private readonly ModPanelTabBar _tabs;
public ModPanel(DalamudPluginInterface pi, ModFileSystemSelector selector, ModEditWindow editWindow, ModPanelTabBar tabs, public ModPanel(DalamudPluginInterface pi, ModFileSystemSelector selector, ModEditWindow editWindow, ModPanelTabBar tabs,
MultiModPanel multiModPanel) MultiModPanel multiModPanel, CommunicatorService communicator)
{ {
_selector = selector; _selector = selector;
_editWindow = editWindow; _editWindow = editWindow;
_tabs = tabs; _tabs = tabs;
_multiModPanel = multiModPanel; _multiModPanel = multiModPanel;
_header = new ModPanelHeader(pi); _header = new ModPanelHeader(pi, communicator);
_selector.SelectionChanged += OnSelectionChange; _selector.SelectionChanged += OnSelectionChange;
} }

View file

@ -3,7 +3,10 @@ using Dalamud.Plugin;
using ImGuiNET; using ImGuiNET;
using OtterGui; using OtterGui;
using OtterGui.Raii; using OtterGui.Raii;
using Penumbra.Communication;
using Penumbra.Mods; using Penumbra.Mods;
using Penumbra.Mods.Manager;
using Penumbra.Services;
using Penumbra.UI.Classes; using Penumbra.UI.Classes;
namespace Penumbra.UI.ModsTab; namespace Penumbra.UI.ModsTab;
@ -13,8 +16,14 @@ public class ModPanelHeader : IDisposable
/// <summary> We use a big, nice game font for the title. </summary> /// <summary> We use a big, nice game font for the title. </summary>
private readonly GameFontHandle _nameFont; private readonly GameFontHandle _nameFont;
public ModPanelHeader(DalamudPluginInterface pi) private readonly CommunicatorService _communicator;
=> _nameFont = pi.UiBuilder.GetGameFontHandle(new GameFontStyle(GameFontFamilyAndSize.Jupiter23));
public ModPanelHeader(DalamudPluginInterface pi, CommunicatorService communicator)
{
_communicator = communicator;
_nameFont = pi.UiBuilder.GetGameFontHandle(new GameFontStyle(GameFontFamilyAndSize.Jupiter23));
_communicator.ModDataChanged.Subscribe(OnModDataChange, ModDataChanged.Priority.ModPanelHeader);
}
/// <summary> /// <summary>
/// Draw the header for the current mod, /// Draw the header for the current mod,
@ -76,6 +85,7 @@ public class ModPanelHeader : IDisposable
public void Dispose() public void Dispose()
{ {
_nameFont.Dispose(); _nameFont.Dispose();
_communicator.ModDataChanged.Unsubscribe(OnModDataChange);
} }
// Header data. // Header data.
@ -218,4 +228,13 @@ public class ModPanelHeader : IDisposable
ImGui.TextUnformatted(_modWebsite); ImGui.TextUnformatted(_modWebsite);
} }
} }
/// <summary> Just update the data when any relevant field changes. </summary>
private void OnModDataChange(ModDataChangeType changeType, Mod mod, string? _2)
{
const ModDataChangeType relevantChanges =
ModDataChangeType.Author | ModDataChangeType.Name | ModDataChangeType.Website | ModDataChangeType.Version;
if ((changeType & relevantChanges) != 0)
UpdateModData(mod);
}
} }