Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dark Mode Styling #1325

Draft
wants to merge 14 commits into
base: master
Choose a base branch
from
140 changes: 140 additions & 0 deletions XrmToolBox.Extensibility/CustomTheme.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,140 @@
using System;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace XrmToolBox.Extensibility
{
public class CustomTheme
{
private static CustomTheme theme;

public CustomTheme()
{
}

public static CustomTheme Instance
{
get
{
if (theme == null)
{
theme = new CustomTheme();
}
return theme;
}
}

public Color Background1 { get; protected set; }
public Color Background2 { get; protected set; }
public Color Background3 { get; protected set; }
public Color Background4 { get; protected set; }
public Color Background5 { get; protected set; }
public Color ForeColor1 { get; protected set; }
public Color ForeColor2 { get; protected set; }
public Color ForeColor3 { get; protected set; }
public Color ForeColor4 { get; protected set; }
public Color ForeColor5 { get; protected set; }
public Color HighlightColor { get; protected set; }
public bool IsActive { get; private set; }
public ProfessionalColorTable MenuColorTable { get; protected set; }

public void ApplyTheme(Control control)
{
if (!IsActive) return;

UpdateChildControlsTheme(control);

foreach (var ts in control.Controls.OfType<ToolStrip>())
{
ts.Renderer = new ToolStripProfessionalRenderer(MenuColorTable);

UpdateDropdownItemsTheme(ts.Items);
}
}

public void SetTheme(CustomTheme customTheme)
{
theme = customTheme;
theme.IsActive = customTheme != null;
}

private void UpdateChildControlsTheme(Control control)
{
control.ForeColor = ForeColor1;
control.BackColor = Background1;

if (control is TextBox
|| control is ComboBox
|| control is RichTextBox
)
{
control.BackColor = Background2;
control.ForeColor = ForeColor2;
}
else if (control is LinkLabel ll)
{
ll.ActiveLinkColor = HighlightColor;
ll.DisabledLinkColor = ForeColor5;
ll.ForeColor = HighlightColor;
ll.LinkColor = HighlightColor;
}
else if (control is Button b)
{
if (b.FlatAppearance.BorderSize > 0)
{
b.BackColor = Background2;
b.ForeColor = ForeColor2;
b.FlatStyle = FlatStyle.Flat;
}
}

if (control is TextBox tb)
{
tb.BorderStyle = BorderStyle.FixedSingle;
}

if (control is RichTextBox rtb && rtb.ReadOnly)
{
control.BackColor = Background1;
control.ForeColor = ForeColor1;
}

foreach (Control childControl in control.Controls)
{
UpdateChildControlsTheme(childControl);
}
}

private void UpdateDropdownItemsTheme(ToolStripItemCollection items)
{
foreach (ToolStripItem item in items)
{
item.ForeColor = ForeColor1;
item.BackColor = Background1;

if (item is ToolStripMenuItem tsmi)
{
UpdateDropdownItemsTheme(tsmi.DropDownItems);
}

if (item is ToolStripTextBox tstb)
{
tstb.TextBox.BackColor = Background2;
tstb.TextBox.ForeColor = ForeColor2;
}

if (item is ToolStripComboBox tstc)
{
tstc.ComboBox.BackColor = Background2;
tstc.ComboBox.ForeColor = ForeColor2;
}

if (item is ToolStripDropDownButton tsddb)
{
UpdateDropdownItemsTheme(tsddb.DropDownItems);
}
}
}
}
}
126 changes: 126 additions & 0 deletions XrmToolBox.Extensibility/DarkTheme.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
using System;
using System.Drawing;
using System.Windows.Forms;

namespace XrmToolBox.Extensibility
{
public class DarkProfessionalColors : ProfessionalColorTable
{
private Color Background;
private Color LightColor;
private Color MenuBackground;
private Color MenuItemBackground;
private Color MenuItemSelectedBackground;

public DarkProfessionalColors(CustomTheme theme)
{
Background = theme.Background1;
MenuBackground = theme.Background1;
MenuItemBackground = theme.Background1;
MenuItemSelectedBackground = theme.HighlightColor;
LightColor = theme.ForeColor1;
}

public override Color ButtonCheckedGradientBegin => MenuBackground;
public override Color ButtonCheckedGradientEnd => MenuBackground;
public override Color ButtonCheckedGradientMiddle => MenuBackground;
public override Color ButtonCheckedHighlight => MenuBackground;
public override Color ButtonCheckedHighlightBorder => MenuBackground;
public override Color ButtonPressedBorder => MenuBackground;
public override Color ButtonPressedGradientBegin => MenuBackground;
public override Color ButtonPressedGradientEnd => MenuBackground;
public override Color ButtonPressedGradientMiddle => MenuBackground;
public override Color ButtonPressedHighlight => MenuBackground;
public override Color ButtonPressedHighlightBorder => MenuBackground;
public override Color ButtonSelectedBorder => MenuBackground;
public override Color ButtonSelectedGradientBegin => MenuBackground;
public override Color ButtonSelectedGradientEnd => MenuBackground;
public override Color ButtonSelectedGradientMiddle => MenuBackground;
public override Color ButtonSelectedHighlight => MenuBackground;
public override Color ButtonSelectedHighlightBorder => MenuBackground;
public override Color CheckBackground => MenuBackground;
public override Color CheckPressedBackground => MenuBackground;
public override Color CheckSelectedBackground => MenuBackground;
public override Color GripDark => MenuBackground;
public override Color GripLight => MenuBackground;
public override Color ImageMarginGradientBegin => MenuItemBackground;

public override Color ImageMarginGradientEnd => MenuItemBackground;

public override Color ImageMarginGradientMiddle => MenuItemBackground;

public override Color ImageMarginRevealedGradientBegin => MenuItemBackground;

public override Color ImageMarginRevealedGradientEnd => MenuItemBackground;

public override Color ImageMarginRevealedGradientMiddle => MenuItemBackground;

public override Color MenuBorder => MenuItemBackground;

public override Color MenuItemBorder => MenuItemBackground;

public override Color MenuItemPressedGradientBegin => MenuItemBackground;

public override Color MenuItemPressedGradientEnd => MenuItemBackground;

public override Color MenuItemPressedGradientMiddle => MenuItemBackground;

public override Color MenuItemSelected => MenuItemSelectedBackground;

public override Color MenuItemSelectedGradientBegin => MenuItemBackground;

public override Color MenuItemSelectedGradientEnd => MenuItemBackground;

public override Color MenuStripGradientBegin => MenuItemBackground;

public override Color MenuStripGradientEnd => MenuItemBackground;

public override Color OverflowButtonGradientBegin => MenuBackground;
public override Color OverflowButtonGradientEnd => MenuBackground;
public override Color OverflowButtonGradientMiddle => MenuBackground;
public override Color RaftingContainerGradientBegin => MenuBackground;
public override Color RaftingContainerGradientEnd => MenuBackground;
public override Color SeparatorDark => LightColor;
public override Color SeparatorLight => MenuBackground;
public override Color StatusStripGradientBegin => MenuBackground;
public override Color StatusStripGradientEnd => MenuBackground;
public override Color ToolStripBorder => Background;

public override Color ToolStripContentPanelGradientBegin => MenuBackground;

public override Color ToolStripContentPanelGradientEnd => MenuBackground;

public override Color ToolStripDropDownBackground => MenuItemBackground;

public override Color ToolStripGradientBegin => MenuBackground;

public override Color ToolStripGradientEnd => MenuBackground;

public override Color ToolStripGradientMiddle => MenuBackground;

public override Color ToolStripPanelGradientBegin => MenuBackground;
public override Color ToolStripPanelGradientEnd => MenuBackground;
}

public class DarkTheme : CustomTheme
{
public DarkTheme()
{
Background1 = ColorTranslator.FromHtml("#212121");
Background2 = ColorTranslator.FromHtml("#424242");
Background3 = ColorTranslator.FromHtml("#616161");
Background4 = ColorTranslator.FromHtml("#757575");
Background5 = ColorTranslator.FromHtml("#9E9E9E");

ForeColor1 = ColorTranslator.FromHtml("#BDBDBD");
ForeColor2 = ColorTranslator.FromHtml("#E0E0E0");
ForeColor3 = ColorTranslator.FromHtml("#EEEEEE");
ForeColor4 = ColorTranslator.FromHtml("#F5F5F5");
ForeColor5 = ColorTranslator.FromHtml("#FAFAFA");

HighlightColor = ColorTranslator.FromHtml("#007ACC");

MenuColorTable = new DarkProfessionalColors(this);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

41 changes: 41 additions & 0 deletions XrmToolBox.Extensibility/UserControls/NotificationArea.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Diagnostics;
using System.Drawing;
using System.Windows.Forms;

namespace XrmToolBox.Extensibility.UserControls
Expand All @@ -11,6 +12,46 @@ public partial class NotificationArea : UserControl
public NotificationArea()
{
InitializeComponent();


AddBackcolorChangedEvent(this);
AddForecolorChangedEvent(this);
}

private void AddBackcolorChangedEvent(Control control)
{
control.BackColorChanged += NotificationArea_BackColorChanged;
foreach (Control childControl in control.Controls)
{
childControl.BackColorChanged += NotificationArea_BackColorChanged;
AddBackcolorChangedEvent(childControl);
}
}

private void AddForecolorChangedEvent(Control control)
{
control.ForeColorChanged += NotificationArea_ForeColorChanged;
foreach (Control childControl in control.Controls)
{
childControl.ForeColorChanged += NotificationArea_ForeColorChanged;
AddForecolorChangedEvent(childControl);
}
}

private void NotificationArea_ForeColorChanged(object sender, EventArgs e)
{
var ctrl = (Control)sender;
ctrl.ForeColorChanged -= NotificationArea_ForeColorChanged;
ctrl.ForeColor = SystemColors.ControlText;
ctrl.ForeColorChanged += NotificationArea_ForeColorChanged;
}

private void NotificationArea_BackColorChanged(object sender, EventArgs e)
{
var ctrl = (Control)sender;
ctrl.BackColorChanged -= NotificationArea_BackColorChanged;
ctrl.BackColor = SystemColors.Info;
ctrl.BackColorChanged += NotificationArea_BackColorChanged;
}

private void Initialize(string message, Uri infoUri, int height = 30)
Expand Down
2 changes: 2 additions & 0 deletions XrmToolBox.Extensibility/XrmToolBox.Extensibility.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,8 @@
<Compile Include="Args\DuplicateToolArgs.cs" />
<Compile Include="Args\DuplicateToolWithConnectionArgs.cs" />
<Compile Include="Args\StatusBarMessageEventArgs.cs" />
<Compile Include="DarkTheme.cs" />
<Compile Include="CustomTheme.cs" />
<Compile Include="Extensions.cs">
<SubType>Code</SubType>
</Compile>
Expand Down
2 changes: 2 additions & 0 deletions XrmToolBox.ToolLibrary/Forms/ToolLibraryForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ public ToolLibraryForm(ToolLibrary toolLibrary, IToolLibrarySettings settings)
cbbToolSort.SelectedIndex = 0;

ShowRestartButton();

CustomTheme.Instance.ApplyTheme(this);
}

public event EventHandler PluginsClosingRequested;
Expand Down
3 changes: 3 additions & 0 deletions XrmToolBox.ToolLibrary/UserControls/ToolPackageProperties.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
using System.Net.Http;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using XrmToolBox.Extensibility;
using XrmToolBox.ToolLibrary.AppCode;

namespace XrmToolBox.ToolLibrary.UserControls
Expand Down Expand Up @@ -37,6 +38,8 @@ public ToolPackageCtrl(XtbPlugin plugin, Version xrmToolBoxLastBreakVersion, Too
InitializeComponent();
SetControlsDisplay();
GetVersions();

CustomTheme.Instance.ApplyTheme(this);
}

public event EventHandler OnToolOpenRequested;
Expand Down
Loading