mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-13 20:24:16 +01:00
refactor: new code style in UiBuilder.cs
This commit is contained in:
parent
a52f54774e
commit
f5830cf09a
3 changed files with 143 additions and 106 deletions
|
|
@ -35,9 +35,9 @@ namespace Dalamud.Interface {
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
if (ImGui.Button("Reset")) {
|
if (ImGui.Button("Reset")) {
|
||||||
foreach (var a in this.pluginManager.Plugins) {
|
foreach (var a in this.pluginManager.Plugins) {
|
||||||
a.PluginInterface.UiBuilder.lastDrawTime = -1;
|
a.PluginInterface.UiBuilder.LastDrawTime = -1;
|
||||||
a.PluginInterface.UiBuilder.maxDrawTime = -1;
|
a.PluginInterface.UiBuilder.MaxDrawTime = -1;
|
||||||
a.PluginInterface.UiBuilder.drawTimeHistory.Clear();
|
a.PluginInterface.UiBuilder.DrawTimeHistory.Clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,12 +59,12 @@ namespace Dalamud.Interface {
|
||||||
foreach (var a in this.pluginManager.Plugins) {
|
foreach (var a in this.pluginManager.Plugins) {
|
||||||
ImGui.Text(a.Definition.Name);
|
ImGui.Text(a.Definition.Name);
|
||||||
ImGui.NextColumn();
|
ImGui.NextColumn();
|
||||||
ImGui.Text($"{a.PluginInterface.UiBuilder.lastDrawTime/10000f:F4}ms");
|
ImGui.Text($"{a.PluginInterface.UiBuilder.LastDrawTime/10000f:F4}ms");
|
||||||
ImGui.NextColumn();
|
ImGui.NextColumn();
|
||||||
ImGui.Text($"{a.PluginInterface.UiBuilder.maxDrawTime/10000f:F4}ms");
|
ImGui.Text($"{a.PluginInterface.UiBuilder.MaxDrawTime/10000f:F4}ms");
|
||||||
ImGui.NextColumn();
|
ImGui.NextColumn();
|
||||||
if (a.PluginInterface.UiBuilder.drawTimeHistory.Count > 0) {
|
if (a.PluginInterface.UiBuilder.DrawTimeHistory.Count > 0) {
|
||||||
ImGui.Text($"{a.PluginInterface.UiBuilder.drawTimeHistory.Average()/10000f:F4}ms");
|
ImGui.Text($"{a.PluginInterface.UiBuilder.DrawTimeHistory.Average()/10000f:F4}ms");
|
||||||
} else {
|
} else {
|
||||||
ImGui.Text("-");
|
ImGui.Text("-");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,7 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using Dalamud.Game.ClientState;
|
using Dalamud.Game.ClientState;
|
||||||
using Dalamud.Game.Internal.Gui;
|
|
||||||
using ImGuiNET;
|
using ImGuiNET;
|
||||||
using ImGuiScene;
|
using ImGuiScene;
|
||||||
using Serilog;
|
using Serilog;
|
||||||
|
|
@ -16,27 +13,28 @@ namespace Dalamud.Interface
|
||||||
/// This class represents the Dalamud UI that is drawn on top of the game.
|
/// This class represents the Dalamud UI that is drawn on top of the game.
|
||||||
/// It can be used to draw custom windows and overlays.
|
/// It can be used to draw custom windows and overlays.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class UiBuilder : IDisposable {
|
public class UiBuilder : IDisposable
|
||||||
|
{
|
||||||
private readonly string namespaceName;
|
private readonly string namespaceName;
|
||||||
|
private readonly Dalamud dalamud;
|
||||||
|
private readonly System.Diagnostics.Stopwatch stopwatch;
|
||||||
|
|
||||||
|
private bool hasErrorWindow;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The game's active Direct3D device.
|
/// Initializes a new instance of the <see cref="UiBuilder"/> class and registers it.
|
||||||
|
/// You do not have to call this manually.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Device Device => this.dalamud.InterfaceManager.Device;
|
/// <param name="dalamud">The dalamud to register on.</param>
|
||||||
|
/// <param name="namespaceName">The plugin namespace.</param>
|
||||||
/// <summary>
|
internal UiBuilder(Dalamud dalamud, string namespaceName)
|
||||||
/// The game's main window handle.
|
{
|
||||||
/// </summary>
|
this.namespaceName = namespaceName;
|
||||||
public IntPtr WindowHandlePtr => this.dalamud.InterfaceManager.WindowHandlePtr;
|
|
||||||
|
|
||||||
/// <summary>
|
this.dalamud = dalamud;
|
||||||
/// The default Dalamud font based on Noto Sans CJK Medium in 17pt - supporting all game languages and icons.
|
this.dalamud.InterfaceManager.OnDraw += this.OnDraw;
|
||||||
/// </summary>
|
this.stopwatch = new System.Diagnostics.Stopwatch();
|
||||||
public static ImFontPtr DefaultFont => InterfaceManager.DefaultFont;
|
}
|
||||||
/// <summary>
|
|
||||||
/// The default Dalamud icon font based on FontAwesome 5 Free solid in 17pt.
|
|
||||||
/// </summary>
|
|
||||||
public static ImFontPtr IconFont => InterfaceManager.IconFont;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The delegate that gets called when Dalamud is ready to draw your windows or overlays.
|
/// The delegate that gets called when Dalamud is ready to draw your windows or overlays.
|
||||||
|
|
@ -45,69 +43,104 @@ namespace Dalamud.Interface
|
||||||
public event RawDX11Scene.BuildUIDelegate OnBuildUi;
|
public event RawDX11Scene.BuildUIDelegate OnBuildUi;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Choose if this plugin should hide its UI automatically when the game's UI is hidden.
|
/// Event that is fired when the plugin should open its configuration interface.
|
||||||
|
/// </summary>
|
||||||
|
public event EventHandler OnOpenConfigUi;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the default Dalamud font based on Noto Sans CJK Medium in 17pt - supporting all game languages and icons.
|
||||||
|
/// </summary>
|
||||||
|
public static ImFontPtr DefaultFont => InterfaceManager.DefaultFont;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the default Dalamud icon font based on FontAwesome 5 Free solid in 17pt.
|
||||||
|
/// </summary>
|
||||||
|
public static ImFontPtr IconFont => InterfaceManager.IconFont;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the game's active Direct3D device.
|
||||||
|
/// </summary>
|
||||||
|
public Device Device => this.dalamud.InterfaceManager.Device;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the game's main window handle.
|
||||||
|
/// </summary>
|
||||||
|
public IntPtr WindowHandlePtr => this.dalamud.InterfaceManager.WindowHandlePtr;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether this plugin should hide its UI automatically when the game's UI is hidden.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DisableAutomaticUiHide { get; set; } = false;
|
public bool DisableAutomaticUiHide { get; set; } = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Choose if this plugin should hide its UI automatically when the user toggles the UI.
|
/// Gets or sets a value indicating whether this plugin should hide its UI automatically when the user toggles the UI.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DisableUserUiHide { get; set; } = false;
|
public bool DisableUserUiHide { get; set; } = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Choose if this plugin should hide its UI automatically during cutscenes.
|
/// Gets or sets a value indicating whether this plugin should hide its UI automatically during cutscenes.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DisableCutsceneUiHide { get; set; } = false;
|
public bool DisableCutsceneUiHide { get; set; } = false;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Choose if this plugin should hide its UI automatically while gpose is active.
|
/// Gets or sets a value indicating whether this plugin should hide its UI automatically while gpose is active.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool DisableGposeUiHide { get; set; } = false;
|
public bool DisableGposeUiHide { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets an action that is called any time ImGui fonts need to be rebuilt.<br/>
|
||||||
|
/// Any ImFontPtr objects that you store <strong>can be invalidated</strong> when fonts are rebuilt
|
||||||
|
/// (at any time), so you should both reload your custom fonts and restore those
|
||||||
|
/// pointers inside this handler.<br/>
|
||||||
|
/// <strong>PLEASE remove this handler inside Dispose, or when you no longer need your fonts!</strong>
|
||||||
|
/// </summary>
|
||||||
|
public Action OnBuildFonts
|
||||||
|
{
|
||||||
|
get => this.dalamud.InterfaceManager.OnBuildFonts;
|
||||||
|
set => this.dalamud.InterfaceManager.OnBuildFonts = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether statistics about UI draw time should be collected.
|
||||||
|
/// </summary>
|
||||||
|
#if DEBUG
|
||||||
|
internal static bool DoStats { get; set; } = true;
|
||||||
|
#else
|
||||||
|
internal static bool DoStats { get; set; } = false;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a value indicating whether this UiBuilder has a configuration UI registered.
|
||||||
|
/// </summary>
|
||||||
|
internal bool HasConfigUi => this.OnOpenConfigUi != null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the time this plugin took to draw on the last frame.
|
||||||
|
/// </summary>
|
||||||
|
internal long LastDrawTime { get; set; } = -1;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the longest amount of time this plugin ever took to draw.
|
||||||
|
/// </summary>
|
||||||
|
internal long MaxDrawTime { get; set; } = -1;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a history of the last draw times, used to calculate an average.
|
||||||
|
/// </summary>
|
||||||
|
internal List<long> DrawTimeHistory { get; set; } = new List<long>();
|
||||||
|
|
||||||
private bool CutsceneActive => this.dalamud.ClientState != null &&
|
private bool CutsceneActive => this.dalamud.ClientState != null &&
|
||||||
(this.dalamud.ClientState.Condition[ConditionFlag.OccupiedInCutSceneEvent] ||
|
(this.dalamud.ClientState.Condition[ConditionFlag.OccupiedInCutSceneEvent] ||
|
||||||
this.dalamud.ClientState.Condition[ConditionFlag.WatchingCutscene78]);
|
this.dalamud.ClientState.Condition[ConditionFlag.WatchingCutscene78]);
|
||||||
|
|
||||||
private bool GposeActive => this.dalamud.ClientState != null &&
|
private bool GposeActive => this.dalamud.ClientState != null &&
|
||||||
this.dalamud.ClientState.Condition[ConditionFlag.WatchingCutscene];
|
this.dalamud.ClientState.Condition[ConditionFlag.WatchingCutscene];
|
||||||
|
|
||||||
private Dalamud dalamud;
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
internal static bool DoStats { get; set; } = true;
|
|
||||||
#else
|
|
||||||
internal static bool DoStats { get; set; } = false;
|
|
||||||
#endif
|
|
||||||
private System.Diagnostics.Stopwatch stopwatch;
|
|
||||||
internal long lastDrawTime = -1;
|
|
||||||
internal long maxDrawTime = -1;
|
|
||||||
internal List<long> drawTimeHistory = new List<long>();
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Create a new UiBuilder and register it. You do not have to call this manually.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="interfaceManager">The interface manager to register on.</param>
|
|
||||||
/// <param name="namespaceName">The plugin namespace.</param>
|
|
||||||
internal UiBuilder(Dalamud dalamud, string namespaceName) {
|
|
||||||
this.namespaceName = namespaceName;
|
|
||||||
|
|
||||||
this.dalamud = dalamud;
|
|
||||||
this.dalamud.InterfaceManager.OnDraw += OnDraw;
|
|
||||||
this.stopwatch = new System.Diagnostics.Stopwatch();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Unregister the UiBuilder. Do not call this in plugin code.
|
|
||||||
/// </summary>
|
|
||||||
public void Dispose() {
|
|
||||||
this.dalamud.InterfaceManager.OnDraw -= OnDraw;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Loads an image from the specified file.
|
/// Loads an image from the specified file.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="filePath">The full filepath to the image.</param>
|
/// <param name="filePath">The full filepath to the image.</param>
|
||||||
/// <returns>A <see cref="TextureWrap"/> object wrapping the created image. Use <see cref="TextureWrap.ImGuiHandle"/> inside ImGui.Image()</returns>
|
/// <returns>A <see cref="TextureWrap"/> object wrapping the created image. Use <see cref="TextureWrap.ImGuiHandle"/> inside ImGui.Image().</returns>
|
||||||
public TextureWrap LoadImage(string filePath) =>
|
public TextureWrap LoadImage(string filePath) =>
|
||||||
this.dalamud.InterfaceManager.LoadImage(filePath);
|
this.dalamud.InterfaceManager.LoadImage(filePath);
|
||||||
|
|
||||||
|
|
@ -115,7 +148,7 @@ namespace Dalamud.Interface
|
||||||
/// Loads an image from a byte stream, such as a png downloaded into memory.
|
/// Loads an image from a byte stream, such as a png downloaded into memory.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="imageData">A byte array containing the raw image data.</param>
|
/// <param name="imageData">A byte array containing the raw image data.</param>
|
||||||
/// <returns>A <see cref="TextureWrap"/> object wrapping the created image. Use <see cref="TextureWrap.ImGuiHandle"/> inside ImGui.Image()</returns>
|
/// <returns>A <see cref="TextureWrap"/> object wrapping the created image. Use <see cref="TextureWrap.ImGuiHandle"/> inside ImGui.Image().</returns>
|
||||||
public TextureWrap LoadImage(byte[] imageData) =>
|
public TextureWrap LoadImage(byte[] imageData) =>
|
||||||
this.dalamud.InterfaceManager.LoadImage(imageData);
|
this.dalamud.InterfaceManager.LoadImage(imageData);
|
||||||
|
|
||||||
|
|
@ -126,23 +159,10 @@ namespace Dalamud.Interface
|
||||||
/// <param name="width">The width of the image contained in <paramref name="imageData"/>.</param>
|
/// <param name="width">The width of the image contained in <paramref name="imageData"/>.</param>
|
||||||
/// <param name="height">The height of the image contained in <paramref name="imageData"/>.</param>
|
/// <param name="height">The height of the image contained in <paramref name="imageData"/>.</param>
|
||||||
/// <param name="numChannels">The number of channels (bytes per pixel) of the image contained in <paramref name="imageData"/>. This should usually be 4.</param>
|
/// <param name="numChannels">The number of channels (bytes per pixel) of the image contained in <paramref name="imageData"/>. This should usually be 4.</param>
|
||||||
/// <returns>A <see cref="TextureWrap"/> object wrapping the created image. Use <see cref="TextureWrap.ImGuiHandle"/> inside ImGui.Image()</returns>
|
/// <returns>A <see cref="TextureWrap"/> object wrapping the created image. Use <see cref="TextureWrap.ImGuiHandle"/> inside ImGui.Image().</returns>
|
||||||
public TextureWrap LoadImageRaw(byte[] imageData, int width, int height, int numChannels) =>
|
public TextureWrap LoadImageRaw(byte[] imageData, int width, int height, int numChannels) =>
|
||||||
this.dalamud.InterfaceManager.LoadImageRaw(imageData, width, height, numChannels);
|
this.dalamud.InterfaceManager.LoadImageRaw(imageData, width, height, numChannels);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// An event that is called any time ImGui fonts need to be rebuilt.<br/>
|
|
||||||
/// Any ImFontPtr objects that you store <strong>can be invalidated</strong> when fonts are rebuilt
|
|
||||||
/// (at any time), so you should both reload your custom fonts and restore those
|
|
||||||
/// pointers inside this handler.<br/>
|
|
||||||
/// <strong>PLEASE remove this handler inside Dispose, or when you no longer need your fonts!</strong>
|
|
||||||
/// </summary>
|
|
||||||
public Action OnBuildFonts
|
|
||||||
{
|
|
||||||
get { return this.dalamud.InterfaceManager.OnBuildFonts; }
|
|
||||||
set { this.dalamud.InterfaceManager.OnBuildFonts = value; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Call this to queue a rebuild of the font atlas.<br/>
|
/// Call this to queue a rebuild of the font atlas.<br/>
|
||||||
/// This will invoke any <see cref="OnBuildFonts"/> handlers and ensure that any loaded fonts are
|
/// This will invoke any <see cref="OnBuildFonts"/> handlers and ensure that any loaded fonts are
|
||||||
|
|
@ -155,53 +175,70 @@ namespace Dalamud.Interface
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Event that is fired when the plugin should open its configuration interface.
|
/// Unregister the UiBuilder. Do not call this in plugin code.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public EventHandler OnOpenConfigUi;
|
public void Dispose()
|
||||||
|
{
|
||||||
|
this.dalamud.InterfaceManager.OnDraw -= this.OnDraw;
|
||||||
|
}
|
||||||
|
|
||||||
private bool hasErrorWindow;
|
/// <summary>
|
||||||
|
/// Open the registered configuration UI, if it exists.
|
||||||
|
/// </summary>
|
||||||
|
internal void OpenConfigUi()
|
||||||
|
{
|
||||||
|
this.OnOpenConfigUi?.Invoke(this, null);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnDraw() {
|
private void OnDraw()
|
||||||
|
{
|
||||||
if (this.dalamud.Framework.Gui.GameUiHidden && this.dalamud.Configuration.ToggleUiHide && !(DisableUserUiHide || DisableAutomaticUiHide) ||
|
if ((this.dalamud.Framework.Gui.GameUiHidden && this.dalamud.Configuration.ToggleUiHide && !(this.DisableUserUiHide || this.DisableAutomaticUiHide)) ||
|
||||||
CutsceneActive && this.dalamud.Configuration.ToggleUiHideDuringCutscenes && !(DisableCutsceneUiHide || DisableAutomaticUiHide) ||
|
(this.CutsceneActive && this.dalamud.Configuration.ToggleUiHideDuringCutscenes && !(this.DisableCutsceneUiHide || this.DisableAutomaticUiHide)) ||
|
||||||
GposeActive && this.dalamud.Configuration.ToggleUiHideDuringGpose && !(DisableGposeUiHide || DisableAutomaticUiHide))
|
(this.GposeActive && this.dalamud.Configuration.ToggleUiHideDuringGpose && !(this.DisableGposeUiHide || this.DisableAutomaticUiHide)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ImGui.PushID(this.namespaceName);
|
ImGui.PushID(this.namespaceName);
|
||||||
if (DoStats) {
|
if (DoStats)
|
||||||
|
{
|
||||||
this.stopwatch.Restart();
|
this.stopwatch.Restart();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.hasErrorWindow && ImGui.Begin(string.Format("{0} Error", this.namespaceName), ref this.hasErrorWindow,
|
if (this.hasErrorWindow && ImGui.Begin($"{this.namespaceName} Error", ref this.hasErrorWindow, ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoResize))
|
||||||
ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoResize)) {
|
{
|
||||||
ImGui.Text(string.Format("The plugin {0} ran into an error.\nContact the plugin developer for support.\n\nPlease try restarting your game.", this.namespaceName));
|
ImGui.Text(
|
||||||
|
$"The plugin {this.namespaceName} ran into an error.\nContact the plugin developer for support.\n\nPlease try restarting your game.");
|
||||||
ImGui.Spacing();
|
ImGui.Spacing();
|
||||||
|
|
||||||
if (ImGui.Button("OK")) {
|
if (ImGui.Button("OK"))
|
||||||
|
{
|
||||||
this.hasErrorWindow = false;
|
this.hasErrorWindow = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.End();
|
ImGui.End();
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try
|
||||||
OnBuildUi?.Invoke();
|
{
|
||||||
} catch (Exception ex) {
|
this.OnBuildUi?.Invoke();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
Log.Error(ex, "[{0}] UiBuilder OnBuildUi caught exception", this.namespaceName);
|
Log.Error(ex, "[{0}] UiBuilder OnBuildUi caught exception", this.namespaceName);
|
||||||
OnBuildUi = null;
|
this.OnBuildUi = null;
|
||||||
OnOpenConfigUi = null;
|
this.OnOpenConfigUi = null;
|
||||||
|
|
||||||
this.hasErrorWindow = true;
|
this.hasErrorWindow = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (DoStats) {
|
if (DoStats)
|
||||||
|
{
|
||||||
this.stopwatch.Stop();
|
this.stopwatch.Stop();
|
||||||
this.lastDrawTime = this.stopwatch.ElapsedTicks;
|
this.LastDrawTime = this.stopwatch.ElapsedTicks;
|
||||||
this.maxDrawTime = Math.Max(this.lastDrawTime, this.maxDrawTime);
|
this.MaxDrawTime = Math.Max(this.LastDrawTime, this.MaxDrawTime);
|
||||||
this.drawTimeHistory.Add(lastDrawTime);
|
this.DrawTimeHistory.Add(this.LastDrawTime);
|
||||||
while (drawTimeHistory.Count > 100) drawTimeHistory.RemoveAt(0);
|
while (this.DrawTimeHistory.Count > 100) this.DrawTimeHistory.RemoveAt(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui.PopID();
|
ImGui.PopID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -439,11 +439,11 @@ namespace Dalamud.Plugin
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (installedPlugin.PluginInterface.UiBuilder.OnOpenConfigUi != null) {
|
if (installedPlugin.PluginInterface.UiBuilder.HasConfigUi) {
|
||||||
ImGui.SameLine();
|
ImGui.SameLine();
|
||||||
|
|
||||||
if (ImGui.Button(Loc.Localize("InstallerOpenConfig", "Open Configuration")))
|
if (ImGui.Button(Loc.Localize("InstallerOpenConfig", "Open Configuration")))
|
||||||
installedPlugin.PluginInterface.UiBuilder.OnOpenConfigUi?.Invoke(null, null);
|
installedPlugin.PluginInterface.UiBuilder.OpenConfigUi();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(installedPlugin.Definition.RepoUrl)) {
|
if (!string.IsNullOrEmpty(installedPlugin.Definition.RepoUrl)) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue