-
-
Notifications
You must be signed in to change notification settings - Fork 2.1k
Commit
- Loading branch information
There are no files selected for viewing
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); | ||
} | ||
} |
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; } | ||
} | ||
} |
This file was deleted.
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); | ||
} | ||
} | ||
} | ||
} |
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); | ||
} | ||
} | ||
} | ||
} |
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; | ||
} | ||
} |
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.
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.
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.
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.