diff --git a/ILSpy/Images/Images.cs b/ILSpy/Images/Images.cs index 3b1af7e21..8bbdf23e2 100644 --- a/ILSpy/Images/Images.cs +++ b/ILSpy/Images/Images.cs @@ -119,6 +119,7 @@ namespace ICSharpCode.ILSpy private static readonly ImageSource OverlayReference = Load("ReferenceOverlay"); private static readonly ImageSource OverlayStatic = Load("OverlayStatic"); + private static readonly ImageSource OverlayExtension = Load("OverlayExtension"); public static readonly ImageSource TypeReference = GetIcon("ShowPublicOnly", "ReferenceOverlay"); public static readonly ImageSource MethodReference = GetIcon("Method", "ReferenceOverlay"); @@ -203,16 +204,16 @@ namespace ICSharpCode.ILSpy private static readonly TypeIconCache typeIconCache = new TypeIconCache(); private static readonly MemberIconCache memberIconCache = new MemberIconCache(); - public static ImageSource GetIcon(TypeIcon icon, AccessOverlayIcon overlay, bool isStatic = false) + public static ImageSource GetIcon(TypeIcon icon, AccessOverlayIcon overlay, bool isStatic = false, bool isExtension = false) { lock (typeIconCache) - return typeIconCache.GetIcon(icon, overlay, isStatic); + return typeIconCache.GetIcon(icon, overlay, isStatic, isExtension); } - public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic) + public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic, bool isExtension) { lock (memberIconCache) - return memberIconCache.GetIcon(icon, overlay, isStatic); + return memberIconCache.GetIcon(icon, overlay, isStatic, isExtension); } public static AccessOverlayIcon GetOverlayIcon(Accessibility accessibility) @@ -236,30 +237,30 @@ namespace ICSharpCode.ILSpy } } - private static ImageSource GetIcon(string baseImage, string overlay = null, bool isStatic = false) + private static ImageSource GetIcon(string baseImage, string overlay = null, bool isStatic = false, bool isExtension = false) { ImageSource baseImageSource = Load(baseImage); ImageSource overlayImageSource = overlay != null ? Load(overlay) : null; - return CreateOverlayImage(baseImageSource, overlayImageSource, isStatic); + return CreateOverlayImage(baseImageSource, overlayImageSource, isStatic, isExtension); } - private static ImageSource CreateOverlayImage(ImageSource baseImage, ImageSource overlay, bool isStatic) + private static ImageSource CreateOverlayImage(ImageSource baseImage, ImageSource overlay, bool isStatic, bool isExtension) { var group = new DrawingGroup(); + var baseDrawingGroup = new DrawingGroup(); Drawing baseDrawing = new ImageDrawing(baseImage, iconRect); - if (overlay != null) + baseDrawingGroup.Children.Add(baseDrawing); + + if (isExtension) { - var nestedGroup = new DrawingGroup { Transform = new ScaleTransform(0.8, 0.8) }; - nestedGroup.Children.Add(baseDrawing); - group.Children.Add(nestedGroup); - group.Children.Add(new ImageDrawing(overlay, iconRect)); - } - else - { - group.Children.Add(baseDrawing); + var extensionGroup = new DrawingGroup(); + extensionGroup.Children.Add(baseDrawingGroup); + baseDrawingGroup.Transform = new ScaleTransform(0.8, 8.0); + extensionGroup.Children.Add(new ImageDrawing(Images.OverlayExtension, iconRect)); + baseDrawingGroup = extensionGroup; } if (isStatic) @@ -267,6 +268,14 @@ namespace ICSharpCode.ILSpy group.Children.Add(new ImageDrawing(Images.OverlayStatic, iconRect)); } + if (overlay != null) + { + baseDrawingGroup.Transform = new ScaleTransform(0.8, 0.8); + group.Children.Add(new ImageDrawing(overlay, iconRect)); + } + + group.Children.Add(baseDrawingGroup); + var image = new DrawingImage(group); if (image.CanFreeze) { @@ -330,7 +339,6 @@ namespace ICSharpCode.ILSpy PreloadPublicIconToCache(MemberIcon.Constructor, Images.Constructor); PreloadPublicIconToCache(MemberIcon.VirtualMethod, Images.VirtualMethod); PreloadPublicIconToCache(MemberIcon.Operator, Images.Operator); - PreloadPublicIconToCache(MemberIcon.ExtensionMethod, Images.ExtensionMethod); PreloadPublicIconToCache(MemberIcon.PInvokeMethod, Images.PInvokeMethod); PreloadPublicIconToCache(MemberIcon.Event, Images.Event); } @@ -370,9 +378,6 @@ namespace ICSharpCode.ILSpy case MemberIcon.Operator: baseImage = Images.Operator; break; - case MemberIcon.ExtensionMethod: - baseImage = Images.ExtensionMethod; - break; case MemberIcon.PInvokeMethod: baseImage = Images.PInvokeMethod; break; @@ -389,35 +394,35 @@ namespace ICSharpCode.ILSpy private abstract class IconCache { - private readonly Dictionary<(T, AccessOverlayIcon, bool), ImageSource> cache = new Dictionary<(T, AccessOverlayIcon, bool), ImageSource>(); + private readonly Dictionary<(T, AccessOverlayIcon, bool, bool), ImageSource> cache = new Dictionary<(T, AccessOverlayIcon, bool, bool), ImageSource>(); protected void PreloadPublicIconToCache(T icon, ImageSource image) { - var iconKey = (icon, AccessOverlayIcon.Public, false); + var iconKey = (icon, AccessOverlayIcon.Public, false, false); cache.Add(iconKey, image); } - public ImageSource GetIcon(T icon, AccessOverlayIcon overlay, bool isStatic) + public ImageSource GetIcon(T icon, AccessOverlayIcon overlay, bool isStatic, bool isExtension) { - var iconKey = (icon, overlay, isStatic); + var iconKey = (icon, overlay, isStatic, isExtension); if (cache.ContainsKey(iconKey)) { return cache[iconKey]; } else { - ImageSource result = BuildMemberIcon(icon, overlay, isStatic); + ImageSource result = BuildMemberIcon(icon, overlay, isStatic, isExtension); cache.Add(iconKey, result); return result; } } - private ImageSource BuildMemberIcon(T icon, AccessOverlayIcon overlay, bool isStatic) + private ImageSource BuildMemberIcon(T icon, AccessOverlayIcon overlay, bool isStatic, bool isExtension) { ImageSource baseImage = GetBaseImage(icon); ImageSource overlayImage = GetOverlayImage(overlay); - return CreateOverlayImage(baseImage, overlayImage, isStatic); + return CreateOverlayImage(baseImage, overlayImage, isStatic, isExtension); } protected abstract ImageSource GetBaseImage(T icon); diff --git a/ILSpy/Images/MemberIcon.cs b/ILSpy/Images/MemberIcon.cs index 89a9cb772..71214e7e0 100644 --- a/ILSpy/Images/MemberIcon.cs +++ b/ILSpy/Images/MemberIcon.cs @@ -30,7 +30,6 @@ namespace ICSharpCode.ILSpy Constructor, VirtualMethod, Operator, - ExtensionMethod, PInvokeMethod, Event } diff --git a/ILSpy/Images/OverlayExtension.svg b/ILSpy/Images/OverlayExtension.svg new file mode 100644 index 000000000..231935c44 --- /dev/null +++ b/ILSpy/Images/OverlayExtension.svg @@ -0,0 +1,51 @@ + + + + + + + + + diff --git a/ILSpy/Images/OverlayExtension.xaml b/ILSpy/Images/OverlayExtension.xaml new file mode 100644 index 000000000..94370168f --- /dev/null +++ b/ILSpy/Images/OverlayExtension.xaml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/ILSpy/TreeNodes/EventTreeNode.cs b/ILSpy/TreeNodes/EventTreeNode.cs index 219a5e17c..2714eef7f 100644 --- a/ILSpy/TreeNodes/EventTreeNode.cs +++ b/ILSpy/TreeNodes/EventTreeNode.cs @@ -68,7 +68,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IEvent @event) { - return Images.GetIcon(MemberIcon.Event, Images.GetOverlayIcon(@event.Accessibility), @event.IsStatic); + return Images.GetIcon(MemberIcon.Event, Images.GetOverlayIcon(@event.Accessibility), @event.IsStatic, false); } public override FilterResult Filter(LanguageSettings settings) diff --git a/ILSpy/TreeNodes/FieldTreeNode.cs b/ILSpy/TreeNodes/FieldTreeNode.cs index 86d56814f..0c55273bf 100644 --- a/ILSpy/TreeNodes/FieldTreeNode.cs +++ b/ILSpy/TreeNodes/FieldTreeNode.cs @@ -61,15 +61,15 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IField field) { if (field.DeclaringType.Kind == TypeKind.Enum && field.ReturnType.Kind == TypeKind.Enum) - return Images.GetIcon(MemberIcon.EnumValue, Images.GetOverlayIcon(field.Accessibility), false); + return Images.GetIcon(MemberIcon.EnumValue, Images.GetOverlayIcon(field.Accessibility), false, false); if (field.IsConst) - return Images.GetIcon(MemberIcon.Literal, Images.GetOverlayIcon(field.Accessibility), false); + return Images.GetIcon(MemberIcon.Literal, Images.GetOverlayIcon(field.Accessibility), false, false); if (field.IsReadOnly) - return Images.GetIcon(MemberIcon.FieldReadOnly, Images.GetOverlayIcon(field.Accessibility), field.IsStatic); + return Images.GetIcon(MemberIcon.FieldReadOnly, Images.GetOverlayIcon(field.Accessibility), field.IsStatic, false); - return Images.GetIcon(MemberIcon.Field, Images.GetOverlayIcon(field.Accessibility), field.IsStatic); + return Images.GetIcon(MemberIcon.Field, Images.GetOverlayIcon(field.Accessibility), field.IsStatic, false); } public override FilterResult Filter(LanguageSettings settings) diff --git a/ILSpy/TreeNodes/MethodTreeNode.cs b/ILSpy/TreeNodes/MethodTreeNode.cs index 39db2323a..8238ddcf2 100644 --- a/ILSpy/TreeNodes/MethodTreeNode.cs +++ b/ILSpy/TreeNodes/MethodTreeNode.cs @@ -61,19 +61,19 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IMethod method) { if (method.IsOperator) - return Images.GetIcon(MemberIcon.Operator, Images.GetOverlayIcon(method.Accessibility), false); + return Images.GetIcon(MemberIcon.Operator, Images.GetOverlayIcon(method.Accessibility), false, method.IsExtensionMethod); if (method.IsExtensionMethod) - return Images.GetIcon(MemberIcon.ExtensionMethod, Images.GetOverlayIcon(method.Accessibility), false); + return Images.GetIcon(MemberIcon.Method, Images.GetOverlayIcon(method.Accessibility), false, true); if (method.IsConstructor) - return Images.GetIcon(MemberIcon.Constructor, Images.GetOverlayIcon(method.Accessibility), method.IsStatic); + return Images.GetIcon(MemberIcon.Constructor, Images.GetOverlayIcon(method.Accessibility), method.IsStatic, false); if (!method.HasBody && method.HasAttribute(KnownAttribute.DllImport)) - return Images.GetIcon(MemberIcon.PInvokeMethod, Images.GetOverlayIcon(method.Accessibility), true); + return Images.GetIcon(MemberIcon.PInvokeMethod, Images.GetOverlayIcon(method.Accessibility), true, false); return Images.GetIcon(method.IsVirtual ? MemberIcon.VirtualMethod : MemberIcon.Method, - Images.GetOverlayIcon(method.Accessibility), method.IsStatic); + Images.GetOverlayIcon(method.Accessibility), method.IsStatic, false); } public override void Decompile(Language language, ITextOutput output, DecompilationOptions options) diff --git a/ILSpy/TreeNodes/PropertyTreeNode.cs b/ILSpy/TreeNodes/PropertyTreeNode.cs index b849e0407..437887069 100644 --- a/ILSpy/TreeNodes/PropertyTreeNode.cs +++ b/ILSpy/TreeNodes/PropertyTreeNode.cs @@ -71,7 +71,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public static ImageSource GetIcon(IProperty property) { return Images.GetIcon(property.IsIndexer ? MemberIcon.Indexer : MemberIcon.Property, - Images.GetOverlayIcon(property.Accessibility), property.IsStatic); + Images.GetOverlayIcon(property.Accessibility), property.IsStatic, false); } public override FilterResult Filter(LanguageSettings settings)