From e79aecc023f41deb0d1db4855db1c9ecceca07c8 Mon Sep 17 00:00:00 2001 From: Frog Date: Fri, 30 Jan 2026 01:04:09 -0800 Subject: [PATCH] Fixes bug with toggling dark mode - Fixes issue with toggling dark mode after having added a game to the list, the store identifier / proxy toggle would not properly change colors. --- CreamInstaller/Components/CustomTreeView.cs | 20 ++++++++++++++++---- CreamInstaller/Utility/ThemeManager.cs | 14 ++++++++++++++ 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/CreamInstaller/Components/CustomTreeView.cs b/CreamInstaller/Components/CustomTreeView.cs index e1649d3..e048c15 100644 --- a/CreamInstaller/Components/CustomTreeView.cs +++ b/CreamInstaller/Components/CustomTreeView.cs @@ -29,6 +29,7 @@ internal sealed class CustomTreeView : TreeView private readonly Dictionary selectionBounds = []; private SolidBrush backBrush; + private Color lastBackColor; // Tracks the last background color private ToolStripDropDown comboBoxDropDown; private Font comboBoxFont; private Form form; @@ -65,6 +66,9 @@ internal sealed class CustomTreeView : TreeView checkBoxBounds.Clear(); comboBoxBounds.Clear(); selectionBounds.Clear(); + backBrush?.Dispose(); + backBrush = null; + lastBackColor = Color.Empty; } private void DrawTreeNode(object sender, DrawTreeNodeEventArgs e) @@ -76,7 +80,15 @@ internal sealed class CustomTreeView : TreeView bool highlighted = (e.State & TreeNodeStates.Selected) == TreeNodeStates.Selected && Focused; Graphics graphics = e.Graphics; - backBrush ??= new(BackColor); + + // Recreate brush if background color changed + if (backBrush == null || lastBackColor != BackColor) + { + backBrush?.Dispose(); + backBrush = new(BackColor); + lastBackColor = BackColor; + } + Font font = node.NodeFont ?? Font; Brush brush = highlighted ? SystemBrushes.Highlight : backBrush; Rectangle bounds = node.Bounds; @@ -95,7 +107,7 @@ internal sealed class CustomTreeView : TreeView Color color = highlighted ? C1 : Enabled - ? C2 + ? ThemeManager.CustomTreeViewPlatformColor : C3; string text; if (dlcType is not DLCType.None) @@ -117,7 +129,7 @@ internal sealed class CustomTreeView : TreeView color = highlighted ? C4 : Enabled - ? C5 + ? ThemeManager.CustomTreeViewIdColor : C6; text = id; size = TextRenderer.MeasureText(graphics, text, font); @@ -163,7 +175,7 @@ internal sealed class CustomTreeView : TreeView checkBoxBounds = new(checkBoxBounds.Location, checkBoxBounds.Size + bounds.Size with { Height = 0 }); graphics.FillRectangle(backBrush, bounds); point = new(bounds.Location.X - 1 + left, bounds.Location.Y + 1); - TextRenderer.DrawText(graphics, text, font, point, Enabled ? C7 : C8, TextFormatFlags.Default); + TextRenderer.DrawText(graphics, text, font, point, Enabled ? ThemeManager.CustomTreeViewProxyColor : C8, TextFormatFlags.Default); this.checkBoxBounds[selection] = RectangleToClient(checkBoxBounds); diff --git a/CreamInstaller/Utility/ThemeManager.cs b/CreamInstaller/Utility/ThemeManager.cs index 03f8ad6..cd082d4 100644 --- a/CreamInstaller/Utility/ThemeManager.cs +++ b/CreamInstaller/Utility/ThemeManager.cs @@ -20,6 +20,18 @@ internal static class ThemeManager private static readonly Color LightFore = SystemColors.ControlText; private static readonly Color LightBorder = SystemColors.ControlDark; + internal static Color CustomTreeViewPlatformColor => Program.DarkModeEnabled + ? ColorTranslator.FromHtml("#FFFF99") // Light yellow for dark mode + : ColorTranslator.FromHtml("#696900"); // Dark yellow for light mode + + internal static Color CustomTreeViewIdColor => Program.DarkModeEnabled + ? ColorTranslator.FromHtml("#99FFFF") // Light cyan for dark mode + : ColorTranslator.FromHtml("#006969"); // Dark cyan for light mode + + internal static Color CustomTreeViewProxyColor => Program.DarkModeEnabled + ? ColorTranslator.FromHtml("#99FF99") // Light green for dark mode + : ColorTranslator.FromHtml("#006900"); // Dark green for light mode + internal static void ToggleDarkMode(Form anyForm) { Program.DarkModeEnabled = !Program.DarkModeEnabled; @@ -85,6 +97,7 @@ internal static class ThemeManager tv.BackColor = DarkBackAlt; tv.ForeColor = DarkFore; tv.LineColor = DarkBorder; + tv.Invalidate(); // Forces a redraw break; case RichTextBox rtb: rtb.BackColor = DarkBackAlt; @@ -135,6 +148,7 @@ internal static class ThemeManager tv.BackColor = LightBack; tv.ForeColor = LightFore; tv.LineColor = LightBorder; + tv.Invalidate(); // Forces a redraw break; case RichTextBox rtb: rtb.BackColor = LightBack;