Skip to content

Commit

Permalink
fix tool strip border in dark theme (#8899)
Browse files Browse the repository at this point in the history
  • Loading branch information
NikolayXHD committed Feb 28, 2021
1 parent b4cbe02 commit deaefda
Show file tree
Hide file tree
Showing 18 changed files with 193 additions and 63 deletions.
9 changes: 9 additions & 0 deletions GitExtUtils/GitUI/IMenuItemBackgroundFilter.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Windows.Forms;

namespace GitExtUtils.GitUI
{
public interface IMenuItemBackgroundFilter
{
bool ShouldRenderMenuItemBackground(ToolStripItemRenderEventArgs e);
}
}
10 changes: 10 additions & 0 deletions GitExtUtils/GitUI/IToolStripEx.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace GitUI
{
public interface IToolStripEx
{
/// <summary>
/// Gets or sets whether the toolstrip control has a border drawn around it.
/// </summary>
bool DrawBorder { get; set; }
}
}
25 changes: 0 additions & 25 deletions GitExtUtils/GitUI/Theming/ThemeAwareToolStripRenderer.cs

This file was deleted.

5 changes: 3 additions & 2 deletions GitExtUtils/GitUI/Theming/ThemeFix.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,14 +74,15 @@ private static void SetupTextBoxBase(TextBoxBase textBox)

private static void SetupToolStrip(ToolStrip strip)
{
strip.Renderer = new ThemeAwareToolStripRenderer();
strip.EnableTheming(enable: true);

strip.Items.OfType<ToolStripLabel>()
.ForEach(SetupToolStripLabel);
}

private static void SetupContextMenu(ContextMenuStrip strip)
{
strip.Renderer = new ThemeAwareToolStripRenderer();
strip.EnableTheming(enable: true);
}

private static void SetupToolStripLabel(ToolStripLabel label)
Expand Down
24 changes: 24 additions & 0 deletions GitExtUtils/GitUI/ToolStripExRenderer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
using System.Windows.Forms;

namespace GitUI
{
internal sealed class ToolStripExRenderer : ToolStripSystemRenderer
{
protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
{
if (e.ToolStrip.GetMenuItemBackgroundFilter()?.ShouldRenderMenuItemBackground(e) != false)
{
base.OnRenderMenuItemBackground(e);
}
}

protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
if (e.ToolStrip is not IToolStripEx { DrawBorder: false })
{
// render border
base.OnRenderToolStripBorder(e);
}
}
}
}
47 changes: 47 additions & 0 deletions GitExtUtils/GitUI/ToolStripExThemeAwareRenderer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
using System.Drawing;
using System.Runtime.CompilerServices;
using System.Windows.Forms;
using GitExtUtils.GitUI.Theming;

namespace GitUI
{
internal sealed class ToolStripExThemeAwareRenderer : ToolStripProfessionalRenderer
{
private static readonly ConditionalWeakTable<Bitmap, Bitmap> AdaptedImagesCache = new();

public ToolStripExThemeAwareRenderer()
{
RoundedEdges = false;
}

protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e)
{
var image = (Bitmap)e.Image;
if (!AdaptedImagesCache.TryGetValue(image, out var adapted))
{
adapted = image.AdaptLightness();
AdaptedImagesCache.Add(image, adapted);
}

base.OnRenderItemCheck(new ToolStripItemImageRenderEventArgs(
e.Graphics, e.Item, adapted, e.ImageRectangle));
}

protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e)
{
if (e.ToolStrip.GetMenuItemBackgroundFilter()?.ShouldRenderMenuItemBackground(e) != false)
{
base.OnRenderMenuItemBackground(e);
}
}

protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e)
{
if (e.ToolStrip is not IToolStripEx { DrawBorder: false })
{
// render border
base.OnRenderToolStripBorder(e);
}
}
}
}
61 changes: 61 additions & 0 deletions GitExtUtils/GitUI/ToolStripExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
using System.Runtime.CompilerServices;
using System.Windows.Forms;
using GitExtUtils.GitUI;

namespace GitUI
{
public static class ToolStripExtensions
{
private static ConditionalWeakTable<ToolStrip, IMenuItemBackgroundFilter> MenuItemBackgroundFilters = new();
private static ConditionalWeakTable<ToolStrip, ToolStripExRenderer> Renderers = new();
private static ConditionalWeakTable<ToolStrip, ToolStripExThemeAwareRenderer> RenderersThemeAware = new();

public static void AttachMenuItemBackgroundFilter(this ToolStrip toolStrip, IMenuItemBackgroundFilter? value)
{
toolStrip.UseCustomRenderer();
MenuItemBackgroundFilters.Remove(toolStrip);

if (value is not null)
{
MenuItemBackgroundFilters.Add(toolStrip, value);
}
}

public static void UseCustomRenderer(this ToolStrip toolStrip)
{
// use either ToolStripExRenderer or ToolStripExThemeAwareRenderer
toolStrip.EnableTheming(enable: toolStrip.IsThemingEnabled());
}

internal static void EnableTheming(this ToolStrip toolStrip, bool enable)
{
if (enable)
{
if (toolStrip.Renderer is not ToolStripExThemeAwareRenderer)
{
toolStrip.Renderer = RenderersThemeAware.GetOrCreateValue(toolStrip);
}
}
else
{
if (toolStrip.Renderer is not ToolStripExRenderer)
{
toolStrip.Renderer = Renderers.GetOrCreateValue(toolStrip);
}
}
}

internal static IMenuItemBackgroundFilter? GetMenuItemBackgroundFilter(this ToolStrip toolStrip)
{
if (MenuItemBackgroundFilters.TryGetValue(toolStrip, out var filter))
{
return filter;
}

return null;
}

internal static bool IsThemingEnabled(this ToolStrip toolStrip) =>
toolStrip.Renderer is ToolStripExThemeAwareRenderer;
}
}
1 change: 1 addition & 0 deletions GitUI/BranchTreePanel/RepoObjectsTree.Designer.cs

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

3 changes: 3 additions & 0 deletions GitUI/CommandsDialogs/FormBrowse.Designer.cs

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

4 changes: 4 additions & 0 deletions GitUI/CommandsDialogs/FormCommit.Designer.cs

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

3 changes: 2 additions & 1 deletion GitUI/CommandsDialogs/FormEditor.Designer.cs

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

4 changes: 2 additions & 2 deletions GitUI/CommandsDialogs/FormFileHistory.Designer.cs

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

3 changes: 2 additions & 1 deletion GitUI/CommandsDialogs/FormStash.Designer.cs

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

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

4 changes: 2 additions & 2 deletions GitUI/Editor/FileViewer.Designer.cs

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

5 changes: 4 additions & 1 deletion GitUI/UserControls/MenuStripEx.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace GitUI
Expand All @@ -15,7 +16,9 @@ public class MenuStripEx : MenuStrip
/// <remarks>
/// Default value is false, which is the same behavior provided by the base ToolStrip class.
/// </remarks>
public bool ClickThrough { get; set; } = true;
[Category("Behavior")]
[DefaultValue(false)]
public bool ClickThrough { get; set; }

protected override void WndProc(ref Message m)
{
Expand Down

0 comments on commit deaefda

Please sign in to comment.