diff --git a/Dalamud/Interface/ImGuiHelpers.cs b/Dalamud/Interface/ImGuiHelpers.cs index 396a3b007..2356d90e2 100644 --- a/Dalamud/Interface/ImGuiHelpers.cs +++ b/Dalamud/Interface/ImGuiHelpers.cs @@ -5,6 +5,7 @@ using System.Diagnostics.CodeAnalysis; using System.Numerics; using Dalamud.Game.ClientState.Keys; +using Dalamud.Interface.Raii; using ImGuiNET; using ImGuiScene; @@ -161,9 +162,10 @@ public static class ImGuiHelpers /// The text to write. public static void SafeTextColoredWrapped(Vector4 color, string text) { - ImGui.PushStyleColor(ImGuiCol.Text, color); - ImGui.TextWrapped(text.Replace("%", "%%")); - ImGui.PopStyleColor(); + using (ImRaii.PushColor(ImGuiCol.Text, color)) + { + ImGui.TextWrapped(text.Replace("%", "%%")); + } } /// diff --git a/Dalamud/Interface/Internal/DalamudInterface.cs b/Dalamud/Interface/Internal/DalamudInterface.cs index 45b31e7a8..8848cd481 100644 --- a/Dalamud/Interface/Internal/DalamudInterface.cs +++ b/Dalamud/Interface/Internal/DalamudInterface.cs @@ -20,6 +20,7 @@ using Dalamud.Interface.Internal.Windows.PluginInstaller; using Dalamud.Interface.Internal.Windows.SelfTest; using Dalamud.Interface.Internal.Windows.Settings; using Dalamud.Interface.Internal.Windows.StyleEditor; +using Dalamud.Interface.Raii; using Dalamud.Interface.Style; using Dalamud.Interface.Windowing; using Dalamud.Logging; @@ -522,7 +523,8 @@ internal class DalamudInterface : IDisposable, IServiceType private void DrawCreditsDarkeningAnimation() { - ImGui.PushStyleVar(ImGuiStyleVar.WindowRounding, 0f); + using var style = ImRaii.PushStyle(ImGuiStyleVar.WindowRounding, 0f); + ImGui.SetNextWindowPos(new Vector2(0, 0)); ImGui.SetNextWindowSize(ImGuiHelpers.MainViewport.Size); ImGuiHelpers.ForceNextWindowMainViewport(); @@ -536,8 +538,6 @@ internal class DalamudInterface : IDisposable, IServiceType ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoBringToFrontOnFocus | ImGuiWindowFlags.NoNav); ImGui.End(); - - ImGui.PopStyleVar(); } private void DrawHiddenDevMenuOpener() @@ -546,18 +546,17 @@ internal class DalamudInterface : IDisposable, IServiceType if (!this.isImGuiDrawDevMenu && !condition.Any()) { - ImGui.PushStyleColor(ImGuiCol.Button, Vector4.Zero); - ImGui.PushStyleColor(ImGuiCol.ButtonActive, Vector4.Zero); - ImGui.PushStyleColor(ImGuiCol.ButtonHovered, Vector4.Zero); - ImGui.PushStyleColor(ImGuiCol.TextSelectedBg, new Vector4(0, 0, 0, 1)); - ImGui.PushStyleColor(ImGuiCol.Border, new Vector4(0, 0, 0, 1)); - ImGui.PushStyleColor(ImGuiCol.BorderShadow, new Vector4(0, 0, 0, 1)); - ImGui.PushStyleColor(ImGuiCol.WindowBg, new Vector4(0, 0, 0, 1)); + using var color = ImRaii.PushColor(ImGuiCol.Button, Vector4.Zero); + color.Push(ImGuiCol.ButtonActive, Vector4.Zero); + color.Push(ImGuiCol.ButtonHovered, Vector4.Zero); + color.Push(ImGuiCol.TextSelectedBg, new Vector4(0, 0, 0, 1)); + color.Push(ImGuiCol.Border, new Vector4(0, 0, 0, 1)); + color.Push(ImGuiCol.BorderShadow, new Vector4(0, 0, 0, 1)); + color.Push(ImGuiCol.WindowBg, new Vector4(0, 0, 0, 1)); - ImGui.PushStyleVar(ImGuiStyleVar.WindowPadding, Vector2.Zero); - ImGui.PushStyleVar(ImGuiStyleVar.FramePadding, Vector2.Zero); - ImGui.PushStyleVar(ImGuiStyleVar.WindowBorderSize, 0); - ImGui.PushStyleVar(ImGuiStyleVar.FrameBorderSize, 0); + using var style = ImRaii.PushStyle(ImGuiStyleVar.WindowPadding, Vector2.Zero); + style.Push(ImGuiStyleVar.WindowBorderSize, 0); + style.Push(ImGuiStyleVar.FrameBorderSize, 0); var windowPos = ImGui.GetMainViewport().Pos + new Vector2(20); ImGui.SetNextWindowPos(windowPos, ImGuiCond.Always); @@ -589,9 +588,6 @@ internal class DalamudInterface : IDisposable, IServiceType ImGui.End(); } - - ImGui.PopStyleVar(4); - ImGui.PopStyleColor(7); } } diff --git a/Dalamud/Interface/Internal/Windows/Settings/SettingsWindow.cs b/Dalamud/Interface/Internal/Windows/Settings/SettingsWindow.cs index 519a0dc58..6dbf902eb 100644 --- a/Dalamud/Interface/Internal/Windows/Settings/SettingsWindow.cs +++ b/Dalamud/Interface/Internal/Windows/Settings/SettingsWindow.cs @@ -5,6 +5,7 @@ using CheapLoc; using Dalamud.Configuration.Internal; using Dalamud.Interface.Colors; using Dalamud.Interface.Internal.Windows.Settings.Tabs; +using Dalamud.Interface.Raii; using Dalamud.Interface.Windowing; using Dalamud.Plugin.Internal; using Dalamud.Utility; @@ -159,33 +160,27 @@ internal class SettingsWindow : Window if (ImGui.BeginChild("###settingsFinishButton")) { - ImGui.PushStyleVar(ImGuiStyleVar.FrameRounding, 100f); - ImGui.PushFont(InterfaceManager.IconFont); + using var disabled = ImRaii.Disabled(this.tabs.Any(x => x.Entries.Any(y => !y.IsValid))); - var invalid = this.tabs.Any(x => x.Entries.Any(y => !y.IsValid)); - if (invalid) - ImGui.BeginDisabled(); - - if (ImGui.Button(FontAwesomeIcon.Save.ToIconString(), new Vector2(40))) + using (ImRaii.PushStyle(ImGuiStyleVar.FrameRounding, 100f)) { - this.Save(); + using var font = ImRaii.PushFont(InterfaceManager.IconFont); - if (!ImGui.IsKeyDown(ImGuiKey.ModShift)) - this.IsOpen = false; + if (ImGui.Button(FontAwesomeIcon.Save.ToIconString(), new Vector2(40))) + { + this.Save(); + + if (!ImGui.IsKeyDown(ImGuiKey.ModShift)) + this.IsOpen = false; + } } - ImGui.PopStyleVar(); - ImGui.PopFont(); - if (ImGui.IsItemHovered()) { ImGui.SetTooltip(!ImGui.IsKeyDown(ImGuiKey.ModShift) ? Loc.Localize("DalamudSettingsSaveAndExit", "Save changes and close") : Loc.Localize("DalamudSettingsSaveAndExit", "Save changes")); } - - if (invalid) - ImGui.EndDisabled(); } ImGui.EndChild(); diff --git a/Dalamud/Interface/Internal/Windows/Settings/Tabs/SettingsTabAbout.cs b/Dalamud/Interface/Internal/Windows/Settings/Tabs/SettingsTabAbout.cs index b0f3e7e02..325d0b8b7 100644 --- a/Dalamud/Interface/Internal/Windows/Settings/Tabs/SettingsTabAbout.cs +++ b/Dalamud/Interface/Internal/Windows/Settings/Tabs/SettingsTabAbout.cs @@ -8,6 +8,7 @@ using System.Numerics; using CheapLoc; using Dalamud.Game.Gui; using Dalamud.Interface.GameFonts; +using Dalamud.Interface.Raii; using Dalamud.Plugin.Internal; using Dalamud.Utility; using FFXIVClientStructs.FFXIV.Client.Game.UI; @@ -243,46 +244,45 @@ Contribute at: https://github.com/goatcorp/Dalamud this.resetNow = false; } - ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, Vector2.Zero); - - ImGuiHelpers.ScaledDummy(0, windowSize.Y + 20f); - ImGui.Text(string.Empty); - - const float imageSize = 190f; - ImGui.SameLine((ImGui.GetWindowWidth() / 2) - (imageSize / 2)); - ImGui.Image(this.logoTexture.ImGuiHandle, ImGuiHelpers.ScaledVector2(imageSize)); - - ImGuiHelpers.ScaledDummy(0, 20f); - - var windowX = ImGui.GetWindowSize().X; - - foreach (var creditsLine in this.creditsText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None)) + using (ImRaii.PushStyle(ImGuiStyleVar.ItemSpacing, Vector2.Zero)) { - var lineLenX = ImGui.CalcTextSize(creditsLine).X; + ImGuiHelpers.ScaledDummy(0, windowSize.Y + 20f); + ImGui.Text(string.Empty); - ImGui.Dummy(new Vector2((windowX / 2) - (lineLenX / 2), 0f)); - ImGui.SameLine(); - ImGui.TextUnformatted(creditsLine); + const float imageSize = 190f; + ImGui.SameLine((ImGui.GetWindowWidth() / 2) - (imageSize / 2)); + ImGui.Image(this.logoTexture.ImGuiHandle, ImGuiHelpers.ScaledVector2(imageSize)); + + ImGuiHelpers.ScaledDummy(0, 20f); + + var windowX = ImGui.GetWindowSize().X; + + foreach (var creditsLine in this.creditsText.Split(new[] { "\r\n", "\r", "\n" }, StringSplitOptions.None)) + { + var lineLenX = ImGui.CalcTextSize(creditsLine).X; + + ImGui.Dummy(new Vector2((windowX / 2) - (lineLenX / 2), 0f)); + ImGui.SameLine(); + ImGui.TextUnformatted(creditsLine); + } + + ImGuiHelpers.ScaledDummy(0, 40f); + + if (this.thankYouFont != null) + { + ImGui.PushFont(this.thankYouFont.ImFont); + var thankYouLenX = ImGui.CalcTextSize(ThankYouText).X; + + ImGui.Dummy(new Vector2((windowX / 2) - (thankYouLenX / 2), 0f)); + ImGui.SameLine(); + ImGui.TextUnformatted(ThankYouText); + + ImGui.PopFont(); + } + + ImGuiHelpers.ScaledDummy(0, windowSize.Y + 50f); } - ImGuiHelpers.ScaledDummy(0, 40f); - - if (this.thankYouFont != null) - { - ImGui.PushFont(this.thankYouFont.ImFont); - var thankYouLenX = ImGui.CalcTextSize(ThankYouText).X; - - ImGui.Dummy(new Vector2((windowX / 2) - (thankYouLenX / 2), 0f)); - ImGui.SameLine(); - ImGui.TextUnformatted(ThankYouText); - - ImGui.PopFont(); - } - - ImGuiHelpers.ScaledDummy(0, windowSize.Y + 50f); - - ImGui.PopStyleVar(); - if (this.creditsThrottler.Elapsed.TotalMilliseconds > (1000.0f / CreditFps)) { var curY = ImGui.GetScrollY(); diff --git a/Dalamud/Interface/Internal/Windows/Settings/Widgets/DevPluginsSettingsEntry.cs b/Dalamud/Interface/Internal/Windows/Settings/Widgets/DevPluginsSettingsEntry.cs index b1a231335..1973a305e 100644 --- a/Dalamud/Interface/Internal/Windows/Settings/Widgets/DevPluginsSettingsEntry.cs +++ b/Dalamud/Interface/Internal/Windows/Settings/Widgets/DevPluginsSettingsEntry.cs @@ -10,6 +10,7 @@ using Dalamud.Configuration; using Dalamud.Configuration.Internal; using Dalamud.Interface.Colors; using Dalamud.Interface.Components; +using Dalamud.Interface.Raii; using Dalamud.Plugin.Internal; using ImGuiNET; @@ -57,10 +58,11 @@ public class DevPluginsSettingsEntry : SettingsEntry ImGui.Text(this.Name); if (this.devPluginLocationsChanged) { - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.HealerGreen); - ImGui.SameLine(); - ImGui.Text(Loc.Localize("DalamudSettingsChanged", "(Changed)")); - ImGui.PopStyleColor(); + using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.HealerGreen)) + { + ImGui.SameLine(); + ImGui.Text(Loc.Localize("DalamudSettingsChanged", "(Changed)")); + } } ImGuiHelpers.SafeTextColoredWrapped(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingsDevPluginLocationsHint", "Add additional dev plugin load locations.\nThese can be either the directory or DLL path.")); diff --git a/Dalamud/Interface/Internal/Windows/Settings/Widgets/SettingsEntry{T}.cs b/Dalamud/Interface/Internal/Windows/Settings/Widgets/SettingsEntry{T}.cs index c8ebfca88..5937ea706 100644 --- a/Dalamud/Interface/Internal/Windows/Settings/Widgets/SettingsEntry{T}.cs +++ b/Dalamud/Interface/Internal/Windows/Settings/Widgets/SettingsEntry{T}.cs @@ -7,6 +7,7 @@ using System.Linq; using Dalamud.Configuration.Internal; using Dalamud.Interface.Colors; +using Dalamud.Interface.Raii; using Dalamud.Utility; using ImGuiNET; @@ -121,9 +122,11 @@ internal sealed class SettingsEntry : SettingsEntry } } - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudGrey); - ImGuiHelpers.SafeTextWrapped(this.Description); - ImGui.PopStyleColor(); + using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudGrey)) + { + ImGuiHelpers.SafeTextWrapped(this.Description); + ImGui.PopStyleColor(); + } if (this.CheckValidity != null) { @@ -132,9 +135,11 @@ internal sealed class SettingsEntry : SettingsEntry if (!this.IsValid) { - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed); - ImGui.Text(validityMsg); - ImGui.PopStyleColor(); + using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudRed)) + { + ImGui.Text(validityMsg); + ImGui.PopStyleColor(); + } } } else @@ -146,9 +151,11 @@ internal sealed class SettingsEntry : SettingsEntry if (warningMessage != null) { - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.DalamudRed); - ImGui.Text(warningMessage); - ImGui.PopStyleColor(); + using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.DalamudRed)) + { + ImGui.Text(warningMessage); + ImGui.PopStyleColor(); + } } } diff --git a/Dalamud/Interface/Internal/Windows/Settings/Widgets/ThirdRepoSettingsEntry.cs b/Dalamud/Interface/Internal/Windows/Settings/Widgets/ThirdRepoSettingsEntry.cs index 37876811f..3a1601e14 100644 --- a/Dalamud/Interface/Internal/Windows/Settings/Widgets/ThirdRepoSettingsEntry.cs +++ b/Dalamud/Interface/Internal/Windows/Settings/Widgets/ThirdRepoSettingsEntry.cs @@ -10,6 +10,7 @@ using Dalamud.Configuration; using Dalamud.Configuration.Internal; using Dalamud.Interface.Colors; using Dalamud.Interface.Components; +using Dalamud.Interface.Raii; using Dalamud.Plugin.Internal; using ImGuiNET; @@ -53,10 +54,11 @@ public class ThirdRepoSettingsEntry : SettingsEntry ImGui.Text(Loc.Localize("DalamudSettingsCustomRepo", "Custom Plugin Repositories")); if (this.thirdRepoListChanged) { - ImGui.PushStyleColor(ImGuiCol.Text, ImGuiColors.HealerGreen); - ImGui.SameLine(); - ImGui.Text(Loc.Localize("DalamudSettingsChanged", "(Changed)")); - ImGui.PopStyleColor(); + using (ImRaii.PushColor(ImGuiCol.Text, ImGuiColors.HealerGreen)) + { + ImGui.SameLine(); + ImGui.Text(Loc.Localize("DalamudSettingsChanged", "(Changed)")); + } } ImGuiHelpers.SafeTextColoredWrapped(ImGuiColors.DalamudGrey, Loc.Localize("DalamudSettingCustomRepoHint", "Add custom plugin repositories.")); diff --git a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs index 284559a4e..3c70c644c 100644 --- a/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs +++ b/Dalamud/Interface/Internal/Windows/TitleScreenMenuWindow.cs @@ -9,6 +9,7 @@ using Dalamud.Game; using Dalamud.Game.ClientState; using Dalamud.Game.Gui; using Dalamud.Interface.Animation.EasingFunctions; +using Dalamud.Interface.Raii; using Dalamud.Interface.Windowing; using ImGuiNET; using ImGuiScene; @@ -169,23 +170,22 @@ internal class TitleScreenMenuWindow : Window, IDisposable this.fadeOutEasing.Update(); - ImGui.PushStyleVar(ImGuiStyleVar.Alpha, (float)this.fadeOutEasing.Value); - - for (var i = 0; i < tsm.Entries.Count; i++) + using (ImRaii.PushStyle(ImGuiStyleVar.Alpha, (float)this.fadeOutEasing.Value)) { - var entry = tsm.Entries[i]; + for (var i = 0; i < tsm.Entries.Count; i++) + { + var entry = tsm.Entries[i]; - var finalPos = (i + 1) * this.shadeTexture.Height * scale; + var finalPos = (i + 1) * this.shadeTexture.Height * scale; - this.DrawEntry(entry, i != 0, true, i == 0, false, false); + this.DrawEntry(entry, i != 0, true, i == 0, false, false); - var cursor = ImGui.GetCursorPos(); - cursor.Y = finalPos; - ImGui.SetCursorPos(cursor); + var cursor = ImGui.GetCursorPos(); + cursor.Y = finalPos; + ImGui.SetCursorPos(cursor); + } } - ImGui.PopStyleVar(); - var isHover = ImGui.IsWindowHovered(ImGuiHoveredFlags.RootAndChildWindows | ImGuiHoveredFlags.AllowWhenBlockedByActiveItem); @@ -254,9 +254,11 @@ internal class TitleScreenMenuWindow : Window, IDisposable var initialCursor = ImGui.GetCursorPos(); - ImGui.PushStyleVar(ImGuiStyleVar.Alpha, (float)shadeEasing.Value); - ImGui.Image(this.shadeTexture.ImGuiHandle, new Vector2(this.shadeTexture.Width * scale, this.shadeTexture.Height * scale)); - ImGui.PopStyleVar(); + + using (ImRaii.PushStyle(ImGuiStyleVar.Alpha, (float)shadeEasing.Value)) + { + ImGui.Image(this.shadeTexture.ImGuiHandle, new Vector2(this.shadeTexture.Width * scale, this.shadeTexture.Height * scale)); + } var isHover = ImGui.IsItemHovered(); if (isHover && (!shadeEasing.IsRunning || (shadeEasing.IsDone && shadeEasing.IsInverse)) && !inhibitFadeout) @@ -331,15 +333,15 @@ internal class TitleScreenMenuWindow : Window, IDisposable } // Drop shadow - ImGui.PushStyleColor(ImGuiCol.Text, 0xFF000000); - for (int i = 0, i_ = (int)Math.Ceiling(1 * scale); i < i_; i++) + using (ImRaii.PushColor(ImGuiCol.Text, 0xFF000000)) { - ImGui.SetCursorPos(new Vector2(cursor.X, cursor.Y + i)); - ImGui.Text(entry.Name); + for (int i = 0, i_ = (int)Math.Ceiling(1 * scale); i < i_; i++) + { + ImGui.SetCursorPos(new Vector2(cursor.X, cursor.Y + i)); + ImGui.Text(entry.Name); + } } - ImGui.PopStyleColor(); - ImGui.SetCursorPos(cursor); ImGui.Text(entry.Name);