diff --git a/ContextMenuManager/BluePointLilac.Controls/MyListBox.cs b/ContextMenuManager/BluePointLilac.Controls/MyListBox.cs index 1aeea2a5..3d751c49 100644 --- a/ContextMenuManager/BluePointLilac.Controls/MyListBox.cs +++ b/ContextMenuManager/BluePointLilac.Controls/MyListBox.cs @@ -11,7 +11,7 @@ public class MyListBox : Panel public MyListBox() { this.AutoScroll = true; - this.BackColor = Color.FromArgb(250, 250, 250); + this.BackColor = ContextMenuManager.Methods.AppTheme.FormBack; } protected override void OnMouseWheel(MouseEventArgs e) @@ -52,14 +52,14 @@ public MyListItem HoveredItem if(hoveredItem == value) return; if(hoveredItem != null) { - hoveredItem.ForeColor = Color.FromArgb(90, 90, 90); + hoveredItem.ForeColor = ContextMenuManager.Methods.AppTheme.PanelFore; //hoveredItem.BackColor = Color.FromArgb(250, 250, 250); //hoveredItem.Font = new Font(hoveredItem.Font, FontStyle.Regular); } hoveredItem = value; if(hoveredItem != null) { - value.ForeColor = Color.FromArgb(0, 138, 217); + value.ForeColor = ContextMenuManager.Methods.AppTheme.ItemSelected; //value.BackColor = Color.FromArgb(200, 230, 250); //value.Font = new Font(hoveredItem.Font, FontStyle.Bold); value.Focus(); @@ -154,8 +154,8 @@ public MyListItem() this.Height = 50.DpiZoom(); this.Margin = new Padding(0); this.Font = SystemFonts.IconTitleFont; - this.ForeColor = Color.FromArgb(80, 80, 80); - this.BackColor = Color.FromArgb(250, 250, 250); + this.ForeColor = ContextMenuManager.Methods.AppTheme.Text; + this.BackColor = ContextMenuManager.Methods.AppTheme.FormBack; this.Controls.AddRange(new Control[] { lblSeparator, flpControls, lblText, picImage }); this.Resize += (Sender, e) => pnlScrollbar.Height = this.ClientSize.Height; flpControls.MouseClick += (sender, e) => this.OnMouseClick(e); @@ -224,7 +224,7 @@ public bool HasImage }; private readonly Label lblSeparator = new Label { - BackColor = Color.FromArgb(220, 220, 220), + BackColor = ContextMenuManager.Methods.AppTheme.Separator, Dock = DockStyle.Bottom, Name = "Separator", Height = 1 diff --git a/ContextMenuManager/BluePointLilac.Controls/MyMainForm.cs b/ContextMenuManager/BluePointLilac.Controls/MyMainForm.cs index 1e5a1d0d..0391eb3f 100644 --- a/ContextMenuManager/BluePointLilac.Controls/MyMainForm.cs +++ b/ContextMenuManager/BluePointLilac.Controls/MyMainForm.cs @@ -11,8 +11,8 @@ public MyMainForm() { this.SuspendLayout(); this.Text = Application.ProductName; - this.ForeColor = Color.FromArgb(80, 80, 80); - this.BackColor = Color.FromArgb(250, 250, 250); + this.ForeColor = ContextMenuManager.Methods.AppTheme.FormFore; + this.BackColor = ContextMenuManager.Methods.AppTheme.FormBack; this.StartPosition = FormStartPosition.CenterScreen; this.Icon = Icon.ExtractAssociatedIcon(Application.ExecutablePath); this.Controls.AddRange(new Control[] { MainBody, SideBar, StatusBar, ToolBar }); diff --git a/ContextMenuManager/BluePointLilac.Controls/MySideBar.cs b/ContextMenuManager/BluePointLilac.Controls/MySideBar.cs index 8dc75ebc..7b5d9ce4 100644 --- a/ContextMenuManager/BluePointLilac.Controls/MySideBar.cs +++ b/ContextMenuManager/BluePointLilac.Controls/MySideBar.cs @@ -13,8 +13,8 @@ public MySideBar() this.ItemHeight = 30.DpiZoom(); this.Font = SystemFonts.MenuFont; this.Font = new Font(this.Font.FontFamily, this.Font.Size + 1F); - this.ForeColor = Color.FromArgb(80, 80, 80); - this.BackColor = Color.FromArgb(245, 245, 245); + this.ForeColor = ContextMenuManager.Methods.AppTheme.PanelFore; + this.BackColor = ContextMenuManager.Methods.AppTheme.PanelBack; this.BackgroundImageLayout = ImageLayout.None; this.Controls.AddRange(new Control[] { LblSeparator, PnlSelected, PnlHovered }); PnlHovered.Paint += PaintItem; @@ -81,19 +81,19 @@ public Color HoveredForeColor readonly Panel PnlSelected = new Panel { - BackColor = Color.FromArgb(40, 140, 210), + BackColor = ContextMenuManager.Methods.AppTheme.ItemSelected, ForeColor = Color.White, Enabled = false }; readonly Panel PnlHovered = new Panel { - BackColor = Color.FromArgb(80, 180, 250), + BackColor = ContextMenuManager.Methods.AppTheme.ItemHover, ForeColor = Color.White, Enabled = false }; readonly Label LblSeparator = new Label { - BackColor = Color.FromArgb(220, 220, 220), + BackColor = ContextMenuManager.Methods.AppTheme.Separator, Dock = DockStyle.Right, Width = 1, }; diff --git a/ContextMenuManager/BluePointLilac.Controls/MyToolBar.cs b/ContextMenuManager/BluePointLilac.Controls/MyToolBar.cs index 6a2cf839..a3ecff6a 100644 --- a/ContextMenuManager/BluePointLilac.Controls/MyToolBar.cs +++ b/ContextMenuManager/BluePointLilac.Controls/MyToolBar.cs @@ -12,7 +12,10 @@ public MyToolBar() this.Height = 80.DpiZoom(); this.Dock = DockStyle.Top; this.DoubleBuffered = true; - this.BackColor = Color.FromArgb(85, 145, 215); + if (ContextMenuManager.Methods.AppConfig.DarkTheme) + this.BackColor = Color.FromArgb(45, 45, 48); // Darker blue/grey for dark theme + else + this.BackColor = Color.FromArgb(85, 145, 215); } private MyToolBarButton selectedButton; diff --git a/ContextMenuManager/Controls/AppSettingBox.cs b/ContextMenuManager/Controls/AppSettingBox.cs index 209293ba..056ba93d 100644 --- a/ContextMenuManager/Controls/AppSettingBox.cs +++ b/ContextMenuManager/Controls/AppSettingBox.cs @@ -28,6 +28,7 @@ public AppSettingBox() mliOpenMoreExplorer.AddCtr(chkOpenMoreExplorer); mliHideDisabledItems.AddCtr(chkHideDisabledItems); mliHideSysStoreItems.AddCtr(chkHideSysStoreItems); + mliDarkTheme.AddCtr(chkDarkTheme); ToolTipBox.SetToolTip(btnUpdate, AppString.Tip.ImmediatelyCheck); ToolTipBox.SetToolTip(cmbConfigDir, AppString.Tip.ConfigPath); @@ -70,9 +71,23 @@ public AppSettingBox() cmbUpdate.SelectionChangeCommitted += (sender, e) => ChangeUpdateFrequency(); cmbConfigDir.SelectionChangeCommitted += (sender, e) => ChangeConfigDir(); cmbEngine.SelectionChangeCommitted += (sender, e) => ChangeEngineUrl(); + chkDarkTheme.CheckChanged += () => + { + AppConfig.DarkTheme = chkDarkTheme.Checked; + if (AppMessageBox.Show(AppString.Message.RestartApp, MessageBoxButtons.OKCancel) == DialogResult.OK) + { + SingleInstance.Restart(); + } + }; this.ResumeLayout(); } + readonly MyListItem mliDarkTheme = new MyListItem + { + Text = "Dark Theme (Dark Mode)" // Using hardcoded string as AppString is not updated yet for this demo + }; + readonly MyCheckBox chkDarkTheme = new MyCheckBox(); + readonly MyListItem mliConfigDir = new MyListItem { Text = AppString.Other.ConfigPath @@ -163,7 +178,7 @@ public override void ClearItems() public void LoadItems() { - this.AddItems(new[] { mliConfigDir, mliUpdate, mliRepo, mliEngine, mliBackup, mliTopMost, mliProtect, mliShowFilePath, + this.AddItems(new[] { mliConfigDir, mliUpdate, mliRepo, mliEngine, mliBackup, mliDarkTheme, mliTopMost, mliProtect, mliShowFilePath, mliHideDisabledItems, mliHideSysStoreItems, mliOpenMoreRegedit, mliOpenMoreExplorer, mliWinXSortable }); foreach(MyListItem item in this.Controls) item.HasImage = false; cmbConfigDir.SelectedIndex = AppConfig.SaveToAppDir ? 1 : 0; @@ -179,6 +194,7 @@ public void LoadItems() chkOpenMoreExplorer.Checked = AppConfig.OpenMoreExplorer; chkHideDisabledItems.Checked = AppConfig.HideDisabledItems; chkHideSysStoreItems.Checked = AppConfig.HideSysStoreItems; + chkDarkTheme.Checked = AppConfig.DarkTheme; } private void ChangeConfigDir() diff --git a/ContextMenuManager/Methods/AppConfig.cs b/ContextMenuManager/Methods/AppConfig.cs index dc51d2b7..11184ba2 100644 --- a/ContextMenuManager/Methods/AppConfig.cs +++ b/ContextMenuManager/Methods/AppConfig.cs @@ -261,6 +261,12 @@ public static bool TopMost set => SetWindowValue("TopMost", value ? 1 : 0); } + public static bool DarkTheme + { + get => GetGeneralValue("DarkTheme") == "1"; + set => SetGeneralValue("DarkTheme", value ? 1 : 0); + } + public static Size MainFormSize { get @@ -276,4 +282,47 @@ public static Size MainFormSize set => SetWindowValue("MainFormSize", value.Width + "," + value.Height); } } + + public static class AppTheme + { + public static Color FormBack { get; private set; } + public static Color FormFore { get; private set; } + public static Color PanelBack { get; private set; } + public static Color PanelFore { get; private set; } + public static Color ItemHover { get; private set; } + public static Color ItemSelected { get; private set; } + public static Color Separator { get; private set; } + public static Color Text { get; private set; } + + static AppTheme() + { + Load(); + } + + public static void Load() + { + if (AppConfig.DarkTheme) + { + FormBack = Color.FromArgb(30, 30, 30); + FormFore = Color.FromArgb(240, 240, 240); + PanelBack = Color.FromArgb(45, 45, 48); + PanelFore = Color.FromArgb(240, 240, 240); + ItemHover = Color.FromArgb(60, 60, 60); + ItemSelected = Color.FromArgb(0, 122, 204); + Separator = Color.FromArgb(80, 80, 80); + Text = Color.FromArgb(220, 220, 220); + } + else + { + FormBack = Color.FromArgb(250, 250, 250); + FormFore = Color.FromArgb(80, 80, 80); + PanelBack = Color.FromArgb(245, 245, 245); + PanelFore = Color.FromArgb(80, 80, 80); + ItemHover = Color.FromArgb(80, 180, 250); + ItemSelected = Color.FromArgb(40, 140, 210); + Separator = Color.FromArgb(220, 220, 220); + Text = Color.FromArgb(80, 80, 80); + } + } + } } \ No newline at end of file