mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +01:00
Use Lunas IndexedWindow and WindowFactory.
Some checks failed
.NET Build / build (push) Has been cancelled
Some checks failed
.NET Build / build (push) Has been cancelled
This commit is contained in:
parent
97c9f1c8c4
commit
cb275f57bf
7 changed files with 114 additions and 202 deletions
2
Luna
2
Luna
|
|
@ -1 +1 @@
|
||||||
Subproject commit ec5cc05211c5083f276e32816d8c3eb8c09d04b4
|
Subproject commit 7214f079cb9b8eeea6fa1a9fe1c6ca8118049969
|
||||||
|
|
@ -1,32 +1,35 @@
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
using OtterGui;
|
|
||||||
using Penumbra.Api;
|
|
||||||
using Penumbra.Api.Enums;
|
|
||||||
using Penumbra.Collections;
|
|
||||||
using Penumbra.Collections.Cache;
|
|
||||||
using Penumbra.Interop.PathResolving;
|
|
||||||
using Penumbra.Services;
|
|
||||||
using Penumbra.Interop.Services;
|
|
||||||
using Penumbra.Mods.Manager;
|
|
||||||
using Penumbra.Collections.Manager;
|
|
||||||
using Penumbra.UI.Tabs;
|
|
||||||
using ChangedItemClick = Penumbra.Communication.ChangedItemClick;
|
|
||||||
using ChangedItemHover = Penumbra.Communication.ChangedItemHover;
|
|
||||||
using OtterGui.Tasks;
|
|
||||||
using Penumbra.UI;
|
|
||||||
using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager;
|
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using ImSharp;
|
using ImSharp;
|
||||||
using Lumina.Excel.Sheets;
|
using Lumina.Excel.Sheets;
|
||||||
using Luna;
|
using Luna;
|
||||||
|
using OtterGui;
|
||||||
|
using OtterGui.Tasks;
|
||||||
|
using Penumbra.Api;
|
||||||
|
using Penumbra.Api.Enums;
|
||||||
|
using Penumbra.Collections;
|
||||||
|
using Penumbra.Collections.Cache;
|
||||||
|
using Penumbra.Collections.Manager;
|
||||||
using Penumbra.Communication;
|
using Penumbra.Communication;
|
||||||
using Penumbra.GameData.Data;
|
using Penumbra.GameData.Data;
|
||||||
using Penumbra.Interop;
|
using Penumbra.Interop;
|
||||||
using Penumbra.Interop.Hooks;
|
using Penumbra.Interop.Hooks;
|
||||||
using Penumbra.Interop.Hooks.PostProcessing;
|
using Penumbra.Interop.Hooks.PostProcessing;
|
||||||
|
using Penumbra.Interop.PathResolving;
|
||||||
|
using Penumbra.Interop.Services;
|
||||||
|
using Penumbra.Mods;
|
||||||
|
using Penumbra.Mods.Manager;
|
||||||
|
using Penumbra.Services;
|
||||||
|
using Penumbra.UI;
|
||||||
|
using Penumbra.UI.AdvancedWindow;
|
||||||
|
using Penumbra.UI.Tabs;
|
||||||
|
using static System.Collections.Specialized.BitVector32;
|
||||||
|
using ChangedItemClick = Penumbra.Communication.ChangedItemClick;
|
||||||
|
using ChangedItemHover = Penumbra.Communication.ChangedItemHover;
|
||||||
using DynamisIpc = OtterGui.Services.DynamisIpc;
|
using DynamisIpc = OtterGui.Services.DynamisIpc;
|
||||||
using MessageService = Penumbra.Services.MessageService;
|
using MessageService = Penumbra.Services.MessageService;
|
||||||
using MouseButton = Penumbra.Api.Enums.MouseButton;
|
using MouseButton = Penumbra.Api.Enums.MouseButton;
|
||||||
|
using ResidentResourceManager = Penumbra.Interop.Services.ResidentResourceManager;
|
||||||
|
|
||||||
namespace Penumbra;
|
namespace Penumbra;
|
||||||
|
|
||||||
|
|
@ -136,7 +139,11 @@ public class Penumbra : IDalamudPlugin
|
||||||
system.Window.Setup(this, _services.GetService<ConfigTabBar>());
|
system.Window.Setup(this, _services.GetService<ConfigTabBar>());
|
||||||
_services.GetService<CommandHandler>();
|
_services.GetService<CommandHandler>();
|
||||||
if (!_disposed)
|
if (!_disposed)
|
||||||
|
{
|
||||||
_windowSystem = system;
|
_windowSystem = system;
|
||||||
|
if (_config is { OpenWindowAtStart: true, Ephemeral.AdvancedEditingOpen: true } && _services.GetService<ModSelection>().Mod is {} mod)
|
||||||
|
_services.GetService<ModEditWindowFactory>().OpenForMod(mod);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
system.Dispose();
|
system.Dispose();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using Dalamud.Interface.Components;
|
using Dalamud.Interface.Components;
|
||||||
using Dalamud.Interface.DragDrop;
|
using Dalamud.Interface.DragDrop;
|
||||||
using Dalamud.Interface.Windowing;
|
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
using Dalamud.Bindings.ImGui;
|
using Dalamud.Bindings.ImGui;
|
||||||
using ImSharp;
|
using ImSharp;
|
||||||
|
using Luna;
|
||||||
using OtterGui;
|
using OtterGui;
|
||||||
using OtterGui.Raii;
|
using OtterGui.Raii;
|
||||||
using OtterGui.Text;
|
using OtterGui.Text;
|
||||||
|
|
@ -623,8 +623,8 @@ public partial class ModEditWindow : IndexedWindow, IDisposable
|
||||||
CommunicatorService communicator, TextureManager textures, ModelManager models, IDragDropManager dragDropManager,
|
CommunicatorService communicator, TextureManager textures, ModelManager models, IDragDropManager dragDropManager,
|
||||||
ResourceTreeViewerFactory resourceTreeViewerFactory, IFramework framework,
|
ResourceTreeViewerFactory resourceTreeViewerFactory, IFramework framework,
|
||||||
MetaDrawers metaDrawers,
|
MetaDrawers metaDrawers,
|
||||||
MtrlTabFactory mtrlTabFactory, WindowSystem windowSystem, int index)
|
MtrlTabFactory mtrlTabFactory, int index)
|
||||||
: base($"{WindowBaseLabel}{index}", windowSystem, index)
|
: base(WindowBaseLabel, index)
|
||||||
{
|
{
|
||||||
_itemSwapTab = itemSwapTab;
|
_itemSwapTab = itemSwapTab;
|
||||||
_gameData = gameData;
|
_gameData = gameData;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using Dalamud.Interface.DragDrop;
|
using Dalamud.Interface.DragDrop;
|
||||||
using Dalamud.Plugin.Services;
|
using Dalamud.Plugin.Services;
|
||||||
|
using Luna;
|
||||||
using Penumbra.Collections.Manager;
|
using Penumbra.Collections.Manager;
|
||||||
using Penumbra.Import.Models;
|
using Penumbra.Import.Models;
|
||||||
using Penumbra.Import.Textures;
|
using Penumbra.Import.Textures;
|
||||||
|
|
@ -10,31 +11,35 @@ using Penumbra.Mods.Editor;
|
||||||
using Penumbra.Services;
|
using Penumbra.Services;
|
||||||
using Penumbra.UI.AdvancedWindow.Materials;
|
using Penumbra.UI.AdvancedWindow.Materials;
|
||||||
using Penumbra.UI.AdvancedWindow.Meta;
|
using Penumbra.UI.AdvancedWindow.Meta;
|
||||||
using Penumbra.UI.Classes;
|
|
||||||
|
|
||||||
namespace Penumbra.UI.AdvancedWindow;
|
namespace Penumbra.UI.AdvancedWindow;
|
||||||
|
|
||||||
public class ModEditWindowFactory(FileDialogService fileDialog, ItemSwapTabFactory itemSwapTabFactory, IDataManager gameData,
|
public class ModEditWindowFactory(
|
||||||
Configuration config, ModEditorFactory editorFactory, ResourceTreeFactory resourceTreeFactory, MetaFileManager metaFileManager,
|
FileDialogService fileDialog,
|
||||||
ActiveCollections activeCollections, ModMergeTab modMergeTab,
|
ItemSwapTabFactory itemSwapTabFactory,
|
||||||
CommunicatorService communicator, TextureManager textures, ModelManager models, IDragDropManager dragDropManager,
|
IDataManager gameData,
|
||||||
ResourceTreeViewerFactory resourceTreeViewerFactory, IFramework framework,
|
Configuration config,
|
||||||
MtrlTabFactory mtrlTabFactory, ModSelection selection) : WindowFactory<ModEditWindow>, Luna.IUiService
|
ModEditorFactory editorFactory,
|
||||||
|
ResourceTreeFactory resourceTreeFactory,
|
||||||
|
MetaFileManager metaFileManager,
|
||||||
|
ActiveCollections activeCollections,
|
||||||
|
ModMergeTab modMergeTab,
|
||||||
|
CommunicatorService communicator,
|
||||||
|
TextureManager textures,
|
||||||
|
ModelManager models,
|
||||||
|
IDragDropManager dragDropManager,
|
||||||
|
ResourceTreeViewerFactory resourceTreeViewerFactory,
|
||||||
|
IFramework framework,
|
||||||
|
WindowSystem windowSystem,
|
||||||
|
Logger log,
|
||||||
|
MtrlTabFactory mtrlTabFactory) : WindowFactory<ModEditWindow>(log, windowSystem), IUiService
|
||||||
{
|
{
|
||||||
protected override void OnWindowSystemSet()
|
protected override ModEditWindow CreateWindow(int index)
|
||||||
{
|
|
||||||
if (config is { OpenWindowAtStart: true, Ephemeral.AdvancedEditingOpen: true } && selection.Mod is not null)
|
|
||||||
OpenForMod(selection.Mod);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected override ModEditWindow? DoCreateWindow()
|
|
||||||
{
|
{
|
||||||
var editor = editorFactory.Create();
|
var editor = editorFactory.Create();
|
||||||
|
return new ModEditWindow(fileDialog, itemSwapTabFactory.Create(), gameData, config, editor, resourceTreeFactory, metaFileManager,
|
||||||
return new(fileDialog, itemSwapTabFactory.Create(), gameData, config, editor, resourceTreeFactory, metaFileManager,
|
|
||||||
activeCollections, modMergeTab, communicator, textures, models, dragDropManager, resourceTreeViewerFactory, framework,
|
activeCollections, modMergeTab, communicator, textures, models, dragDropManager, resourceTreeViewerFactory, framework,
|
||||||
CreateMetaDrawers(editor.MetaEditor), mtrlTabFactory, WindowSystem ?? throw new InvalidOperationException("WindowSystem not set"),
|
CreateMetaDrawers(editor.MetaEditor), mtrlTabFactory, index);
|
||||||
GetFreeIndex());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private MetaDrawers CreateMetaDrawers(ModMetaEditor metaEditor)
|
private MetaDrawers CreateMetaDrawers(ModMetaEditor metaEditor)
|
||||||
|
|
@ -49,20 +54,23 @@ public class ModEditWindowFactory(FileDialogService fileDialog, ItemSwapTabFacto
|
||||||
var atch = new AtchMetaDrawer(metaEditor, metaFileManager);
|
var atch = new AtchMetaDrawer(metaEditor, metaFileManager);
|
||||||
var shp = new ShpMetaDrawer(metaEditor, metaFileManager);
|
var shp = new ShpMetaDrawer(metaEditor, metaFileManager);
|
||||||
var atr = new AtrMetaDrawer(metaEditor, metaFileManager);
|
var atr = new AtrMetaDrawer(metaEditor, metaFileManager);
|
||||||
|
|
||||||
return new(eqdp, eqp, est, globalEqp, gmp, imc, rsp, atch, shp, atr);
|
return new MetaDrawers(eqdp, eqp, est, globalEqp, gmp, imc, rsp, atch, shp, atr);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void OpenForMod(Mod mod)
|
public void OpenForMod(Mod mod)
|
||||||
{
|
{
|
||||||
var window = OpenWindows.FirstOrDefault(window => window.Mod == mod);
|
var window = Windows.FirstOrDefault(window => window.Mod == mod);
|
||||||
if (window is not null)
|
if (window is not null)
|
||||||
{
|
{
|
||||||
window.BringToFront();
|
window.BringToFront();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
window = CreateWindow()!;
|
window = CreateWindowInternal();
|
||||||
|
if (window is null)
|
||||||
|
return;
|
||||||
|
|
||||||
window.ChangeMod(mod);
|
window.ChangeMod(mod);
|
||||||
window.ChangeOption(mod.Default);
|
window.ChangeOption(mod.Default);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
using Dalamud.Interface.Windowing;
|
|
||||||
using ImSharp;
|
|
||||||
using Window = Luna.Window;
|
|
||||||
|
|
||||||
namespace Penumbra.UI.Classes;
|
|
||||||
|
|
||||||
public abstract class IndexedWindow : Window
|
|
||||||
{
|
|
||||||
private readonly WindowSystem _windowSystem;
|
|
||||||
private readonly int _index;
|
|
||||||
|
|
||||||
public int Index
|
|
||||||
=> _index;
|
|
||||||
|
|
||||||
public event EventHandler? Close;
|
|
||||||
|
|
||||||
protected IndexedWindow(string name, WindowSystem windowSystem, int index,
|
|
||||||
WindowFlags flags = WindowFlags.None, bool forceMainWindow = false) : base(
|
|
||||||
name, flags, forceMainWindow
|
|
||||||
)
|
|
||||||
{
|
|
||||||
_windowSystem = windowSystem;
|
|
||||||
_index = index;
|
|
||||||
}
|
|
||||||
|
|
||||||
public override void OnClose()
|
|
||||||
{
|
|
||||||
_windowSystem.RemoveWindow(this);
|
|
||||||
Close?.Invoke(this, EventArgs.Empty);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,70 +0,0 @@
|
||||||
using Dalamud.Interface.Windowing;
|
|
||||||
|
|
||||||
namespace Penumbra.UI.Classes;
|
|
||||||
|
|
||||||
public abstract class WindowFactory<T> where T : IndexedWindow
|
|
||||||
{
|
|
||||||
protected WindowSystem? WindowSystem;
|
|
||||||
|
|
||||||
private readonly HashSet<T> _openWindows = [];
|
|
||||||
private readonly HashSet<int> _reusableIndices = [];
|
|
||||||
private int _nextIndex = 0;
|
|
||||||
|
|
||||||
protected IEnumerable<T> OpenWindows
|
|
||||||
=> _openWindows;
|
|
||||||
|
|
||||||
internal void SetWindowSystem(WindowSystem windowSystem)
|
|
||||||
{
|
|
||||||
if (WindowSystem is not null)
|
|
||||||
throw new InvalidOperationException("WindowSystem is already set");
|
|
||||||
|
|
||||||
WindowSystem = windowSystem;
|
|
||||||
|
|
||||||
OnWindowSystemSet();
|
|
||||||
}
|
|
||||||
|
|
||||||
protected virtual void OnWindowSystemSet()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int GetFreeIndex()
|
|
||||||
{
|
|
||||||
foreach (var index in _reusableIndices) {
|
|
||||||
_reusableIndices.Remove(index);
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
return _nextIndex++;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected abstract T? DoCreateWindow();
|
|
||||||
|
|
||||||
protected T? CreateWindow()
|
|
||||||
{
|
|
||||||
var window = DoCreateWindow();
|
|
||||||
if (window is not null) {
|
|
||||||
SetupWindow(window);
|
|
||||||
}
|
|
||||||
|
|
||||||
return window;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void SetupWindow(T window)
|
|
||||||
{
|
|
||||||
window.Close += WindowClose;
|
|
||||||
WindowSystem?.AddWindow(window);
|
|
||||||
window.IsOpen = true;
|
|
||||||
_openWindows.Add(window);
|
|
||||||
window.BringToFront();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void WindowClose(object? sender, EventArgs e)
|
|
||||||
{
|
|
||||||
if (sender is not T window) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_openWindows.Remove(window);
|
|
||||||
_reusableIndices.Add(window.Index);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +1,57 @@
|
||||||
using Dalamud.Interface;
|
using Dalamud.Interface;
|
||||||
using Dalamud.Interface.Windowing;
|
using Dalamud.Plugin;
|
||||||
using Dalamud.Plugin;
|
using Luna;
|
||||||
using Penumbra.Interop.Services;
|
using Penumbra.Interop.Services;
|
||||||
using Penumbra.UI.AdvancedWindow;
|
using Penumbra.UI.AdvancedWindow;
|
||||||
using Penumbra.UI.Knowledge;
|
using Penumbra.UI.Knowledge;
|
||||||
using Penumbra.UI.Tabs.Debug;
|
using Penumbra.UI.Tabs.Debug;
|
||||||
|
|
||||||
namespace Penumbra.UI;
|
namespace Penumbra.UI;
|
||||||
|
|
||||||
public class PenumbraWindowSystem : IDisposable, Luna.IUiService
|
public class PenumbraWindowSystem : IDisposable, IUiService
|
||||||
{
|
{
|
||||||
private readonly IUiBuilder _uiBuilder;
|
private readonly IUiBuilder _uiBuilder;
|
||||||
internal readonly WindowSystem _windowSystem;
|
private readonly WindowSystem _windowSystem;
|
||||||
private readonly FileDialogService _fileDialog;
|
private readonly FileDialogService _fileDialog;
|
||||||
private readonly TextureArraySlicer _textureArraySlicer;
|
private readonly TextureArraySlicer _textureArraySlicer;
|
||||||
public readonly ConfigWindow Window;
|
public readonly ConfigWindow Window;
|
||||||
public readonly PenumbraChangelog Changelog;
|
public readonly PenumbraChangelog Changelog;
|
||||||
public readonly KnowledgeWindow KnowledgeWindow;
|
public readonly KnowledgeWindow KnowledgeWindow;
|
||||||
|
|
||||||
public PenumbraWindowSystem(IDalamudPluginInterface pi, Configuration config, PenumbraChangelog changelog, ConfigWindow window,
|
public PenumbraWindowSystem(IDalamudPluginInterface pi, Configuration config, PenumbraChangelog changelog, ConfigWindow window,
|
||||||
LaunchButton _, ModEditWindowFactory editWindowFactory, FileDialogService fileDialog, ImportPopup importPopup, DebugTab debugTab,
|
LaunchButton _, ModEditWindowFactory editWindowFactory, FileDialogService fileDialog, ImportPopup importPopup, DebugTab debugTab,
|
||||||
KnowledgeWindow knowledgeWindow, TextureArraySlicer textureArraySlicer)
|
KnowledgeWindow knowledgeWindow, TextureArraySlicer textureArraySlicer, WindowSystem windowSystem)
|
||||||
{
|
{
|
||||||
_uiBuilder = pi.UiBuilder;
|
_uiBuilder = pi.UiBuilder;
|
||||||
_fileDialog = fileDialog;
|
_fileDialog = fileDialog;
|
||||||
_textureArraySlicer = textureArraySlicer;
|
_textureArraySlicer = textureArraySlicer;
|
||||||
KnowledgeWindow = knowledgeWindow;
|
_windowSystem = windowSystem;
|
||||||
Changelog = changelog;
|
KnowledgeWindow = knowledgeWindow;
|
||||||
Window = window;
|
Changelog = changelog;
|
||||||
_windowSystem = new WindowSystem("Penumbra");
|
Window = window;
|
||||||
_windowSystem.AddWindow(changelog.Changelog);
|
_windowSystem.AddWindow(changelog.Changelog);
|
||||||
_windowSystem.AddWindow(window);
|
_windowSystem.AddWindow(window);
|
||||||
_windowSystem.AddWindow(importPopup);
|
_windowSystem.AddWindow(importPopup);
|
||||||
_windowSystem.AddWindow(debugTab);
|
_windowSystem.AddWindow(debugTab);
|
||||||
_windowSystem.AddWindow(KnowledgeWindow);
|
_windowSystem.AddWindow(KnowledgeWindow);
|
||||||
editWindowFactory.SetWindowSystem(_windowSystem);
|
_uiBuilder.OpenMainUi += Window.Toggle;
|
||||||
_uiBuilder.OpenMainUi += Window.Toggle;
|
_uiBuilder.OpenConfigUi += Window.OpenSettings;
|
||||||
_uiBuilder.OpenConfigUi += Window.OpenSettings;
|
_uiBuilder.Draw += _fileDialog.Draw;
|
||||||
_uiBuilder.Draw += _windowSystem.Draw;
|
_uiBuilder.Draw += _textureArraySlicer.Tick;
|
||||||
_uiBuilder.Draw += _fileDialog.Draw;
|
_uiBuilder.DisableGposeUiHide = !config.HideUiInGPose;
|
||||||
_uiBuilder.Draw += _textureArraySlicer.Tick;
|
_uiBuilder.DisableCutsceneUiHide = !config.HideUiInCutscenes;
|
||||||
_uiBuilder.DisableGposeUiHide = !config.HideUiInGPose;
|
_uiBuilder.DisableUserUiHide = !config.HideUiWhenUiHidden;
|
||||||
_uiBuilder.DisableCutsceneUiHide = !config.HideUiInCutscenes;
|
}
|
||||||
_uiBuilder.DisableUserUiHide = !config.HideUiWhenUiHidden;
|
|
||||||
}
|
public void ForceChangelogOpen()
|
||||||
|
=> Changelog.Changelog.ForceOpen = true;
|
||||||
public void ForceChangelogOpen()
|
|
||||||
=> Changelog.Changelog.ForceOpen = true;
|
public void Dispose()
|
||||||
|
{
|
||||||
public void Dispose()
|
_uiBuilder.OpenMainUi -= Window.Toggle;
|
||||||
{
|
_uiBuilder.OpenConfigUi -= Window.OpenSettings;
|
||||||
_uiBuilder.OpenMainUi -= Window.Toggle;
|
_uiBuilder.Draw -= _windowSystem.Draw;
|
||||||
_uiBuilder.OpenConfigUi -= Window.OpenSettings;
|
_uiBuilder.Draw -= _fileDialog.Draw;
|
||||||
_uiBuilder.Draw -= _windowSystem.Draw;
|
_uiBuilder.Draw -= _textureArraySlicer.Tick;
|
||||||
_uiBuilder.Draw -= _fileDialog.Draw;
|
}
|
||||||
_uiBuilder.Draw -= _textureArraySlicer.Tick;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue