diff --git a/Dalamud/Game/ChatHandlers.cs b/Dalamud/Game/ChatHandlers.cs
index d2f4b30c7..890cd0439 100644
--- a/Dalamud/Game/ChatHandlers.cs
+++ b/Dalamud/Game/ChatHandlers.cs
@@ -251,10 +251,9 @@ internal class ChatHandlers : IServiceType
Type = XivChatType.Notice,
});
- if (string.IsNullOrEmpty(this.configuration.LastChangelogMajorMinor) || (!ChangelogWindow.WarrantsChangelogForMajorMinor.StartsWith(this.configuration.LastChangelogMajorMinor) && assemblyVersion.StartsWith(ChangelogWindow.WarrantsChangelogForMajorMinor)))
+ if (ChangelogWindow.WarrantsChangelog())
{
dalamudInterface.OpenChangelogWindow();
- this.configuration.LastChangelogMajorMinor = ChangelogWindow.WarrantsChangelogForMajorMinor;
}
this.configuration.LastVersion = assemblyVersion;
diff --git a/Dalamud/Interface/Animation/Easing.cs b/Dalamud/Interface/Animation/Easing.cs
index 2ac040143..54c41c16d 100644
--- a/Dalamud/Interface/Animation/Easing.cs
+++ b/Dalamud/Interface/Animation/Easing.cs
@@ -109,6 +109,14 @@ public abstract class Easing
this.animationTimer.Restart();
}
+ ///
+ /// Resets the animation.
+ ///
+ public void Reset()
+ {
+ this.animationTimer.Reset();
+ }
+
///
/// Updates the animation.
///
diff --git a/Dalamud/Interface/ColorHelpers.cs b/Dalamud/Interface/ColorHelpers.cs
index b2b489004..74561f9ef 100644
--- a/Dalamud/Interface/ColorHelpers.cs
+++ b/Dalamud/Interface/ColorHelpers.cs
@@ -259,6 +259,15 @@ public static class ColorHelpers
hsv.A -= amount;
return HsvToRgb(hsv);
}
+
+ ///
+ /// Set alpha of a color.
+ ///
+ /// The color.
+ /// The alpha value to set.
+ /// The color with the set alpha value.
+ public static Vector4 WithAlpha(this Vector4 color, float alpha)
+ => color with { W = alpha };
///
/// Fade a color.
diff --git a/Dalamud/Interface/Components/ImGuiComponents.IconButton.cs b/Dalamud/Interface/Components/ImGuiComponents.IconButton.cs
index 116b04bd2..719f470b8 100644
--- a/Dalamud/Interface/Components/ImGuiComponents.IconButton.cs
+++ b/Dalamud/Interface/Components/ImGuiComponents.IconButton.cs
@@ -209,4 +209,25 @@ public static partial class ImGuiComponents
return button;
}
+
+ ///
+ /// Get width of IconButtonWithText component.
+ ///
+ /// Icon to use.
+ /// Text to use.
+ /// Width.
+ internal static float GetIconButtonWithTextWidth(FontAwesomeIcon icon, string text)
+ {
+ ImGui.PushFont(UiBuilder.IconFont);
+ var iconSize = ImGui.CalcTextSize(icon.ToIconString());
+ ImGui.PopFont();
+
+ var textSize = ImGui.CalcTextSize(text);
+ var dl = ImGui.GetWindowDrawList();
+ var cursor = ImGui.GetCursorScreenPos();
+
+ var iconPadding = 3 * ImGuiHelpers.GlobalScale;
+
+ return iconSize.X + textSize.X + (ImGui.GetStyle().FramePadding.X * 2) + iconPadding;
+ }
}
diff --git a/Dalamud/Interface/Internal/DalamudInterface.cs b/Dalamud/Interface/Internal/DalamudInterface.cs
index a7b1e80b5..fc11f3f4b 100644
--- a/Dalamud/Interface/Internal/DalamudInterface.cs
+++ b/Dalamud/Interface/Internal/DalamudInterface.cs
@@ -94,8 +94,7 @@ internal class DalamudInterface : IDisposable, IServiceType
{
var interfaceManager = interfaceManagerWithScene.Manager;
this.WindowSystem = new WindowSystem("DalamudCore");
-
- this.changelogWindow = new ChangelogWindow() { IsOpen = false };
+
this.colorDemoWindow = new ColorDemoWindow() { IsOpen = false };
this.componentDemoWindow = new ComponentDemoWindow() { IsOpen = false };
this.dataWindow = new DataWindow() { IsOpen = false };
@@ -108,6 +107,7 @@ internal class DalamudInterface : IDisposable, IServiceType
this.selfTestWindow = new SelfTestWindow() { IsOpen = false };
this.styleEditorWindow = new StyleEditorWindow() { IsOpen = false };
this.titleScreenMenuWindow = new TitleScreenMenuWindow() { IsOpen = false };
+ this.changelogWindow = new ChangelogWindow(this.titleScreenMenuWindow) { IsOpen = false };
this.profilerWindow = new ProfilerWindow() { IsOpen = false };
this.branchSwitcherWindow = new BranchSwitcherWindow() { IsOpen = false };
this.hitchSettingsWindow = new HitchSettingsWindow() { IsOpen = false };
diff --git a/Dalamud/Interface/Internal/Windows/ChangelogWindow.cs b/Dalamud/Interface/Internal/Windows/ChangelogWindow.cs
index cd4618f24..1c0d3fa02 100644
--- a/Dalamud/Interface/Internal/Windows/ChangelogWindow.cs
+++ b/Dalamud/Interface/Internal/Windows/ChangelogWindow.cs
@@ -1,13 +1,18 @@
-using System;
using System.IO;
+using System.Linq;
using System.Numerics;
+using Dalamud.Configuration.Internal;
+using Dalamud.Interface.Animation.EasingFunctions;
using Dalamud.Interface.Colors;
+using Dalamud.Interface.Components;
+using Dalamud.Interface.GameFonts;
using Dalamud.Interface.Utility;
+using Dalamud.Interface.Utility.Raii;
using Dalamud.Interface.Windowing;
+using Dalamud.Plugin.Internal;
using Dalamud.Utility;
using ImGuiNET;
-using ImGuiScene;
namespace Dalamud.Interface.Internal.Windows;
@@ -16,141 +21,349 @@ namespace Dalamud.Interface.Internal.Windows;
///
internal sealed class ChangelogWindow : Window, IDisposable
{
- ///
- /// Whether the latest update warrants a changelog window.
- ///
- public const string WarrantsChangelogForMajorMinor = "7.4.";
-
+ private const string WarrantsChangelogForMajorMinor = "9.0.";
+
private const string ChangeLog =
- @"• Updated Dalamud for compatibility with Patch 6.3
-• Made things more speedy by updating to .NET 7
-
-If you note any issues or need help, please check the FAQ, and reach out on our Discord if you need help.
-Thanks and have fun!";
-
- private const string UpdatePluginsInfo =
- @"• All of your plugins were disabled automatically, due to this update. This is normal.
-• Open the plugin installer, then click 'update plugins'. Updated plugins should update and then re-enable themselves.
- => Please keep in mind that not all of your plugins may already be updated for the new version.
- => If some plugins are displayed with a red cross in the 'Installed Plugins' tab, they may not yet be available.";
-
- private readonly string assemblyVersion = Util.AssemblyVersion;
-
+ @"• Updated Dalamud for compatibility with Patch 6.5
+• A lot of behind-the-scenes changes to make Dalamud and plugins more stable and reliable
+• Added plugin collections, allowing you to create lists of plugins that can be enabled or disabled together
+• Plugins can now add tooltips and interaction to the server info bar
+• The Dalamud/plugin installer UI has been refreshed
+";
+
+ private readonly TitleScreenMenuWindow tsmWindow;
private readonly IDalamudTextureWrap logoTexture;
+
+ private readonly InOutCubic windowFade = new(TimeSpan.FromSeconds(2.5f))
+ {
+ Point1 = Vector2.Zero,
+ Point2 = new Vector2(2f),
+ };
+
+ private readonly InOutCubic bodyFade = new(TimeSpan.FromSeconds(1f))
+ {
+ Point1 = Vector2.Zero,
+ Point2 = Vector2.One,
+ };
+
+ private IDalamudTextureWrap? apiBumpExplainerTexture;
+ private GameFontHandle? bannerFont;
+
+ private State state = State.WindowFadeIn;
+ private bool needFadeRestart = false;
+
///
/// Initializes a new instance of the class.
///
- public ChangelogWindow()
- : base("What's new in Dalamud?", ImGuiWindowFlags.AlwaysAutoResize | ImGuiWindowFlags.NoResize)
+ /// TSM window.
+ public ChangelogWindow(TitleScreenMenuWindow tsmWindow)
+ : base("What's new in Dalamud?##ChangelogWindow", ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoTitleBar | ImGuiWindowFlags.NoScrollbar | ImGuiWindowFlags.NoScrollWithMouse, true)
{
+ this.tsmWindow = tsmWindow;
this.Namespace = "DalamudChangelogWindow";
- this.Size = new Vector2(885, 463);
- this.SizeCondition = ImGuiCond.Appearing;
-
this.logoTexture = Service.Get().Logo;
+
+ // If we are going to show a changelog, make sure we have the font ready, otherwise it will hitch
+ if (WarrantsChangelog())
+ this.MakeFont();
+ }
+
+ private enum State
+ {
+ WindowFadeIn,
+ ExplainerIntro,
+ ExplainerApiBump,
+ Links,
+ }
+
+ ///
+ /// Check if a changelog should be shown.
+ ///
+ /// True if a changelog should be shown.
+ public static bool WarrantsChangelog()
+ {
+ var configuration = Service.Get();
+ var pm = Service.GetNullable();
+ var pmWantsChangelog = pm?.InstalledPlugins.Any() ?? true;
+ return (string.IsNullOrEmpty(configuration.LastChangelogMajorMinor) ||
+ (!WarrantsChangelogForMajorMinor.StartsWith(configuration.LastChangelogMajorMinor) &&
+ Util.AssemblyVersion.StartsWith(WarrantsChangelogForMajorMinor))) && pmWantsChangelog;
+ }
+
+ ///
+ public override void OnOpen()
+ {
+ Service.Get().SetCreditsDarkeningAnimation(true);
+ this.tsmWindow.AllowDrawing = false;
+
+ this.MakeFont();
+
+ this.state = State.WindowFadeIn;
+ this.windowFade.Reset();
+ this.bodyFade.Reset();
+ this.needFadeRestart = true;
+
+ if (this.apiBumpExplainerTexture == null)
+ {
+ var dalamud = Service.Get();
+ var tm = Service.Get();
+ this.apiBumpExplainerTexture = tm.GetTextureFromFile(new FileInfo(Path.Combine(dalamud.AssetDirectory.FullName, "UIRes", "changelogApiBump.png")))
+ ?? throw new Exception("Could not load api bump explainer.");
+ }
+
+ base.OnOpen();
+ }
+
+ ///
+ public override void OnClose()
+ {
+ base.OnClose();
+
+ this.tsmWindow.AllowDrawing = true;
+ Service.Get().SetCreditsDarkeningAnimation(false);
+ }
+
+ ///
+ public override void PreDraw()
+ {
+ ImGui.PushStyleVar(ImGuiStyleVar.WindowBorderSize, 0);
+ ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, Vector2.Zero);
+ ImGui.PushStyleVar(ImGuiStyleVar.WindowRounding, 10f);
+
+ base.PreDraw();
+
+ if (this.needFadeRestart)
+ {
+ this.windowFade.Restart();
+ this.needFadeRestart = false;
+ }
+
+ this.windowFade.Update();
+ ImGui.SetNextWindowBgAlpha(Math.Clamp(this.windowFade.EasedPoint.X, 0, 0.9f));
+
+ this.Size = new Vector2(900, 400);
+ this.SizeCondition = ImGuiCond.Always;
+
+ // Center the window on the main viewport
+ var viewportSize = ImGuiHelpers.MainViewport.Size;
+ var windowSize = this.Size!.Value * ImGuiHelpers.GlobalScale;
+ ImGui.SetNextWindowPos(new Vector2(viewportSize.X / 2 - windowSize.X / 2, viewportSize.Y / 2 - windowSize.Y / 2));
+ }
+
+ ///
+ public override void PostDraw()
+ {
+ ImGui.PopStyleVar(3);
+ base.PostDraw();
}
///
public override void Draw()
{
- ImGui.Text($"Dalamud has been updated to version D{this.assemblyVersion}.");
-
- ImGuiHelpers.ScaledDummy(10);
-
- ImGui.Text("The following changes were introduced:");
-
+ void Dismiss()
+ {
+ var configuration = Service.Get();
+ configuration.LastChangelogMajorMinor = WarrantsChangelogForMajorMinor;
+ configuration.QueueSave();
+ }
+
+ var windowSize = ImGui.GetWindowSize();
+
+ var dummySize = 10 * ImGuiHelpers.GlobalScale;
+ ImGui.Dummy(new Vector2(dummySize));
ImGui.SameLine();
- ImGuiHelpers.ScaledDummy(0);
- var imgCursor = ImGui.GetCursorPos();
-
- ImGui.TextWrapped(ChangeLog);
-
- ImGuiHelpers.ScaledDummy(5);
-
- ImGui.TextColored(ImGuiColors.DalamudRed, " !!! ATTENTION !!!");
-
- ImGui.TextWrapped(UpdatePluginsInfo);
-
- ImGuiHelpers.ScaledDummy(10);
-
- // ImGui.Text("Thank you for using our tools!");
-
- // ImGuiHelpers.ScaledDummy(10);
-
- ImGui.PushFont(UiBuilder.IconFont);
-
- if (ImGui.Button(FontAwesomeIcon.Download.ToIconString()))
+
+ var logoContainerSize = new Vector2(this.Size!.Value.X * 0.2f - dummySize, this.Size!.Value.Y);
+ using (var child = ImRaii.Child("###logoContainer", logoContainerSize, false))
{
- Service.Get().OpenPluginInstaller();
- }
+ if (!child)
+ return;
- if (ImGui.IsItemHovered())
- {
- ImGui.PopFont();
- ImGui.SetTooltip("Open Plugin Installer");
- ImGui.PushFont(UiBuilder.IconFont);
+ var logoSize = new Vector2(logoContainerSize.X);
+
+ // Center the logo in the container
+ ImGui.SetCursorPos(new Vector2(logoContainerSize.X / 2 - logoSize.X / 2, logoContainerSize.Y / 2 - logoSize.Y / 2));
+
+ using (ImRaii.PushStyle(ImGuiStyleVar.Alpha, Math.Clamp(this.windowFade.EasedPoint.X - 0.5f, 0f, 1f)))
+ {
+ ImGui.Image(this.logoTexture.ImGuiHandle, logoSize);
+ }
}
-
+
ImGui.SameLine();
-
- if (ImGui.Button(FontAwesomeIcon.LaughBeam.ToIconString()))
- {
- Util.OpenLink("https://discord.gg/3NMcUV5");
- }
-
- if (ImGui.IsItemHovered())
- {
- ImGui.PopFont();
- ImGui.SetTooltip("Join our Discord server");
- ImGui.PushFont(UiBuilder.IconFont);
- }
-
+ ImGui.Dummy(new Vector2(dummySize));
ImGui.SameLine();
-
- if (ImGui.Button(FontAwesomeIcon.Globe.ToIconString()))
+
+ using (var child = ImRaii.Child("###textContainer", new Vector2((this.Size!.Value.X * 0.8f) - dummySize * 4, this.Size!.Value.Y), false))
{
- Util.OpenLink("https://goatcorp.github.io/faq/");
+ if (!child)
+ return;
+
+ ImGuiHelpers.ScaledDummy(20);
+
+ using (ImRaii.PushStyle(ImGuiStyleVar.Alpha, Math.Clamp(this.windowFade.EasedPoint.X - 1f, 0f, 1f)))
+ {
+ using var font = ImRaii.PushFont(this.bannerFont!.ImFont);
+
+ switch (this.state)
+ {
+ case State.WindowFadeIn:
+ case State.ExplainerIntro:
+ ImGuiHelpers.CenteredText("New And Improved");
+ break;
+
+ case State.ExplainerApiBump:
+ ImGuiHelpers.CenteredText("Plugin Updates");
+ break;
+
+ case State.Links:
+ ImGuiHelpers.CenteredText("Enjoy!");
+ break;
+ }
+ }
+
+ ImGuiHelpers.ScaledDummy(8);
+
+ if (this.state == State.WindowFadeIn && this.windowFade.EasedPoint.X > 1.5f)
+ {
+ this.state = State.ExplainerIntro;
+ this.bodyFade.Restart();
+ }
+
+ this.bodyFade.Update();
+ using (ImRaii.PushStyle(ImGuiStyleVar.Alpha, Math.Clamp(this.bodyFade.EasedPoint.X, 0, 1f)))
+ {
+ void DrawNextButton(State nextState)
+ {
+ // Draw big, centered next button at the bottom of the window
+ var buttonHeight = 30 * ImGuiHelpers.GlobalScale;
+ var buttonText = "Next";
+ var buttonWidth = ImGui.CalcTextSize(buttonText).X + 40 * ImGuiHelpers.GlobalScale;
+ ImGui.SetCursorPosY(windowSize.Y - buttonHeight - (20 * ImGuiHelpers.GlobalScale));
+ ImGuiHelpers.CenterCursorFor((int)buttonWidth);
+
+ if (ImGui.Button(buttonText, new Vector2(buttonWidth, buttonHeight)))
+ {
+ this.state = nextState;
+ this.bodyFade.Restart();
+ }
+ }
+
+ switch (this.state)
+ {
+ case State.WindowFadeIn:
+ case State.ExplainerIntro:
+ ImGui.TextWrapped($"Welcome to Dalamud v{Util.AssemblyVersion}!");
+ ImGuiHelpers.ScaledDummy(5);
+ ImGui.TextWrapped(ChangeLog);
+
+ DrawNextButton(State.ExplainerApiBump);
+ break;
+
+ case State.ExplainerApiBump:
+ ImGui.TextWrapped("Take care! Due to changes in this patch, all of your plugins need to be updated and were disabled automatically.");
+ ImGui.TextWrapped("This is normal and required for major game updates.");
+ ImGuiHelpers.ScaledDummy(5);
+ ImGui.TextWrapped("To update your plugins, open the plugin installer and click 'update plugins'. Updated plugins should update and then re-enable themselves.");
+ ImGuiHelpers.ScaledDummy(5);
+ ImGui.TextWrapped("Please keep in mind that not all of your plugins may already be updated for the new version.");
+ ImGui.TextWrapped("If some plugins are displayed with a red cross in the 'Installed Plugins' tab, they may not yet be available.");
+
+ ImGuiHelpers.ScaledDummy(15);
+
+ ImGuiHelpers.CenterCursorFor(this.apiBumpExplainerTexture!.Width);
+ ImGui.Image(this.apiBumpExplainerTexture.ImGuiHandle, this.apiBumpExplainerTexture.Size);
+
+ DrawNextButton(State.Links);
+ break;
+
+ case State.Links:
+ ImGui.TextWrapped("If you note any issues or need help, please check the FAQ, and reach out on our Discord if you need help.");
+ ImGui.TextWrapped("Enjoy your time with the game and Dalamud!");
+
+ ImGuiHelpers.ScaledDummy(45);
+
+ bool CenteredIconButton(FontAwesomeIcon icon, string text)
+ {
+ var buttonWidth = ImGuiComponents.GetIconButtonWithTextWidth(icon, text);
+ ImGuiHelpers.CenterCursorFor((int)buttonWidth);
+ return ImGuiComponents.IconButtonWithText(icon, text);
+ }
+
+ if (CenteredIconButton(FontAwesomeIcon.Download, "Open Plugin Installer"))
+ {
+ Service.Get().OpenPluginInstaller();
+ this.IsOpen = false;
+ Dismiss();
+ }
+
+ ImGuiHelpers.ScaledDummy(5);
+
+ ImGuiHelpers.CenterCursorFor(
+ (int)(ImGuiComponents.GetIconButtonWithTextWidth(FontAwesomeIcon.Globe, "See the FAQ") +
+ ImGuiComponents.GetIconButtonWithTextWidth(FontAwesomeIcon.LaughBeam, "Join our Discord server") +
+ (5 * ImGuiHelpers.GlobalScale) +
+ (ImGui.GetStyle().ItemSpacing.X * 4)));
+ if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.Globe, "See the FAQ"))
+ {
+ Util.OpenLink("https://goatcorp.github.io/faq/");
+ }
+
+ ImGui.SameLine();
+ ImGuiHelpers.ScaledDummy(5);
+ ImGui.SameLine();
+
+ if (ImGuiComponents.IconButtonWithText(FontAwesomeIcon.LaughBeam, "Join our Discord server"))
+ {
+ Util.OpenLink("https://discord.gg/3NMcUV5");
+ }
+
+ ImGuiHelpers.ScaledDummy(5);
+
+ if (CenteredIconButton(FontAwesomeIcon.Heart, "Support what we care about"))
+ {
+ Util.OpenLink("https://goatcorp.github.io/faq/support");
+ }
+
+ var buttonHeight = 30 * ImGuiHelpers.GlobalScale;
+ var buttonText = "Close";
+ var buttonWidth = ImGui.CalcTextSize(buttonText).X + 40 * ImGuiHelpers.GlobalScale;
+ ImGui.SetCursorPosY(windowSize.Y - buttonHeight - (20 * ImGuiHelpers.GlobalScale));
+ ImGuiHelpers.CenterCursorFor((int)buttonWidth);
+
+ if (ImGui.Button(buttonText, new Vector2(buttonWidth, buttonHeight)))
+ {
+ this.IsOpen = false;
+ Dismiss();
+ }
+
+ break;
+ }
+ }
+
+ // Draw close button in the top right corner
+ ImGui.PushStyleVar(ImGuiStyleVar.FrameRounding, 100f);
+ var btnAlpha = Math.Clamp(this.windowFade.EasedPoint.X - 0.5f, 0f, 1f);
+ ImGui.PushStyleColor(ImGuiCol.Button, ImGuiColors.DalamudRed.WithAlpha(btnAlpha).Desaturate(0.3f));
+ ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudWhite.WithAlpha(btnAlpha));
+
+ var childSize = ImGui.GetWindowSize();
+ var closeButtonSize = 15 * ImGuiHelpers.GlobalScale;
+ ImGui.SetCursorPos(new Vector2(childSize.X - closeButtonSize - (5 * ImGuiHelpers.GlobalScale), 10 * ImGuiHelpers.GlobalScale));
+ if (ImGuiComponents.IconButton(FontAwesomeIcon.Times))
+ {
+ Dismiss();
+ this.IsOpen = false;
+ }
+
+ ImGui.PopStyleColor(2);
+ ImGui.PopStyleVar();
+
+ if (ImGui.IsItemHovered())
+ ImGui.SetTooltip("I don't care about this");
}
-
- if (ImGui.IsItemHovered())
- {
- ImGui.PopFont();
- ImGui.SetTooltip("See the FAQ");
- ImGui.PushFont(UiBuilder.IconFont);
- }
-
- ImGui.SameLine();
-
- if (ImGui.Button(FontAwesomeIcon.Heart.ToIconString()))
- {
- Util.OpenLink("https://goatcorp.github.io/faq/support");
- }
-
- if (ImGui.IsItemHovered())
- {
- ImGui.PopFont();
- ImGui.SetTooltip("Support what we care about");
- ImGui.PushFont(UiBuilder.IconFont);
- }
-
- ImGui.PopFont();
-
- ImGui.SameLine();
- ImGuiHelpers.ScaledDummy(20, 0);
- ImGui.SameLine();
-
- if (ImGui.Button("Close"))
- {
- this.IsOpen = false;
- }
-
- imgCursor.X += 750;
- imgCursor.Y -= 30;
- ImGui.SetCursorPos(imgCursor);
-
- ImGui.Image(this.logoTexture.ImGuiHandle, new Vector2(100));
}
///
@@ -160,4 +373,13 @@ Thanks and have fun!";
{
this.logoTexture.Dispose();
}
+
+ private void MakeFont()
+ {
+ if (this.bannerFont == null)
+ {
+ var gfm = Service.Get();
+ this.bannerFont = gfm.NewFontRef(new GameFontStyle(GameFontFamilyAndSize.MiedingerMid18));
+ }
+ }
}
diff --git a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs
index e77a3db4e..a4ad62f4f 100644
--- a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs
+++ b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs
@@ -63,13 +63,18 @@ internal class TitleScreenMenuWindow : Window, IDisposable
var framework = Service.Get();
framework.Update += this.FrameworkOnUpdate;
}
-
+
private enum State
{
Hide,
Show,
FadeOut,
}
+
+ ///
+ /// Gets or sets a value indicating whether drawing is allowed.
+ ///
+ public bool AllowDrawing { get; set; } = true;
///
public override void PreDraw()
@@ -97,6 +102,9 @@ internal class TitleScreenMenuWindow : Window, IDisposable
///
public override void Draw()
{
+ if (!this.AllowDrawing)
+ return;
+
var scale = ImGui.GetIO().FontGlobalScale;
var entries = Service.Get().Entries
.OrderByDescending(x => x.IsInternal)
diff --git a/Dalamud/Interface/Windowing/Window.cs b/Dalamud/Interface/Windowing/Window.cs
index ad424f59a..f0914bb21 100644
--- a/Dalamud/Interface/Windowing/Window.cs
+++ b/Dalamud/Interface/Windowing/Window.cs
@@ -257,13 +257,7 @@ public abstract class Window
if (hasNamespace)
ImGui.PushID(this.Namespace);
-
- this.PreDraw();
- this.ApplyConditionals();
-
- if (this.ForceMainWindow)
- ImGuiHelpers.ForceNextWindowMainViewport();
-
+
if (this.internalLastIsOpen != this.internalIsOpen && this.internalIsOpen)
{
this.internalLastIsOpen = this.internalIsOpen;
@@ -272,6 +266,12 @@ public abstract class Window
if (doSoundEffects && !this.DisableWindowSounds) UIModule.PlaySound(this.OnOpenSfxId, 0, 0, 0);
}
+ this.PreDraw();
+ this.ApplyConditionals();
+
+ if (this.ForceMainWindow)
+ ImGuiHelpers.ForceNextWindowMainViewport();
+
var wasFocused = this.IsFocused;
if (wasFocused)
{