177 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			9.0 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using System.Drawing;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Collections;
 | |
| using DevComponents.DotNetBar.Metro.Helpers;
 | |
| 
 | |
| namespace DevComponents.DotNetBar.Rendering
 | |
| {
 | |
|     internal class NotificationMarkPainter
 | |
|     {
 | |
|         #region Implementation
 | |
|         private static readonly Size MarkSize = new Size(16, 16);
 | |
|         private static readonly Point MarkOffset = new Point(3, 3);
 | |
|         private static readonly Color DefaultBackColor1 = ColorScheme.GetColor(0xE80000);
 | |
|         private static readonly Color DefaultBackColor2 = ColorScheme.GetColor(0xC50103);
 | |
|         private static readonly Color DefaultTextColor = Color.White;
 | |
| 
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text)
 | |
|         {
 | |
|             return Paint(g, targetBounds, pos, text, MarkSize, MarkOffset);
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, int markSize)
 | |
|         {
 | |
|             return Paint(g, targetBounds, pos, text, (markSize > 0 ? new Size(markSize, markSize) : MarkSize), MarkOffset);
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, int markSize, Color markColor)
 | |
|         {
 | |
|             if (markColor.IsEmpty)
 | |
|                 return Paint(g, targetBounds, pos, text, (markSize > 0 ? new Size(markSize, markSize) : MarkSize), MarkOffset, DefaultBackColor1, DefaultBackColor2, DefaultTextColor);
 | |
|             else
 | |
|             {
 | |
|                 Color textColor, backColor1, backColor2;
 | |
|                 CreateColors(markColor, out backColor1, out backColor2, out textColor);
 | |
|                 return Paint(g, targetBounds, pos, text, (markSize > 0 ? new Size(markSize, markSize) : MarkSize), MarkOffset, backColor1, backColor2, textColor);
 | |
|             }
 | |
|         }
 | |
|         private static void CreateColors(Color markColor, out Color backColor1, out Color backColor2, out Color textColor)
 | |
|         {
 | |
|             HSVColor baseHsv = ColorHelpers.ColorToHSV(markColor);
 | |
|             ColorFunctions.HLSColor hslColor = ColorFunctions.RGBToHSL(markColor);
 | |
|             textColor = hslColor.Lightness < .65 ? Color.White : Color.Black;
 | |
|             backColor1 = ColorHelpers.HSVToColor(baseHsv.Hue, baseHsv.Saturation, baseHsv.Value + .1f);
 | |
|             backColor2 = ColorHelpers.HSVToColor(baseHsv.Hue, baseHsv.Saturation, baseHsv.Value + .2f);
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, Size markSize, Point offset)
 | |
|         {
 | |
|             return Paint(g, targetBounds, pos, text, markSize, offset, DefaultBackColor1, DefaultBackColor2, DefaultTextColor);
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, Size markSize, Point offset, Color markColor)
 | |
|         {
 | |
|             if (markColor.IsEmpty)
 | |
|                 return Paint(g, targetBounds, pos, text, markSize, offset, DefaultBackColor1, DefaultBackColor2, DefaultTextColor);
 | |
|             else
 | |
|             {
 | |
|                 Color textColor, backColor1, backColor2;
 | |
|                 CreateColors(markColor, out backColor1, out backColor2, out textColor);
 | |
|                 return Paint(g, targetBounds, pos, text, markSize, offset, backColor1, backColor2, textColor);
 | |
|             }
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, Size markSize, Point offset, Color markColor, Rectangle containerClipRect)
 | |
|         {
 | |
|             if (markColor.IsEmpty)
 | |
|                 return Paint(g, targetBounds, pos, text, markSize, offset, DefaultBackColor1, DefaultBackColor2, DefaultTextColor, containerClipRect);
 | |
|             else
 | |
|             {
 | |
|                 Color textColor, backColor1, backColor2;
 | |
|                 CreateColors(markColor, out backColor1, out backColor2, out textColor);
 | |
|                 return Paint(g, targetBounds, pos, text, markSize, offset, backColor1, backColor2, textColor, containerClipRect);
 | |
|             }
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, Size markSize, Point offset, Color backColor1, Color backColor2, Color textColor)
 | |
|         {
 | |
|             return Paint(g, targetBounds, pos, text, markSize, offset, backColor1, backColor2, textColor, Rectangle.Empty);
 | |
|         }
 | |
|         public static Rectangle Paint(Graphics g, Rectangle targetBounds, eNotificationMarkPosition pos, string text, Size markSize, Point offset, Color backColor1, Color backColor2, Color textColor, Rectangle containerClipRect)
 | |
|         {
 | |
|             if (markSize.IsEmpty) markSize = MarkSize; // Default it if empty
 | |
|             Color borderColor = Color.White;
 | |
|             int borderSize = Dpi.Width2;
 | |
| 
 | |
|             markSize = Dpi.Size(markSize);
 | |
|             offset = Dpi.Size(offset);
 | |
|             //Color backColor1 = DefaultBackColor1;
 | |
|             //Color backColor2 = DefaultBackColor2;
 | |
|             //Color textColor = DefaultTextColor;
 | |
|             Font textFont = new Font("Microsoft Sans Serif", text.Length > 1 ? 6.75f : 8.25f, FontStyle.Bold);
 | |
| 
 | |
|             Rectangle r;
 | |
|             if (pos == eNotificationMarkPosition.TopRight)
 | |
|                 r = new Rectangle(targetBounds.Right - markSize.Width - 1 + offset.X, targetBounds.Y - offset.Y, markSize.Width, markSize.Height);
 | |
|             else if (pos == eNotificationMarkPosition.TopLeft)
 | |
|                 r = new Rectangle(targetBounds.X - offset.X, targetBounds.Y - offset.Y, markSize.Width, markSize.Height);
 | |
|             else if (pos == eNotificationMarkPosition.BottomLeft)
 | |
|                 r = new Rectangle(targetBounds.X - offset.X, targetBounds.Bottom - markSize.Height - 1 + offset.Y, markSize.Width, markSize.Height);
 | |
|             else // eNotificationMarkPosition.BottomRight
 | |
|                 r = new Rectangle(targetBounds.Right - markSize.Width - 1 + offset.X, targetBounds.Bottom - markSize.Height + offset.Y, markSize.Width, markSize.Height);
 | |
|             
 | |
|             SmoothingMode sm = g.SmoothingMode;
 | |
|             System.Drawing.Text.TextRenderingHint th = g.TextRenderingHint;
 | |
|             g.SmoothingMode = SmoothingMode.HighQuality;
 | |
|             g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
 | |
|             Region oldClip = g.Clip;
 | |
|             if (containerClipRect.IsEmpty)
 | |
|                 g.ResetClip();
 | |
|             else
 | |
|                 g.SetClip(containerClipRect);
 | |
| 
 | |
|             // Drop shadow
 | |
|             Rectangle shadow = r;
 | |
|             shadow.Inflate(1, 1);
 | |
|             shadow.Offset(0, 3);
 | |
|             using (GraphicsPath shadowPath = new GraphicsPath())
 | |
|             {
 | |
|                 shadowPath.AddEllipse(shadow);
 | |
|                 using (PathGradientBrush brush = new PathGradientBrush(shadowPath))
 | |
|                 {
 | |
|                     brush.CenterColor = Color.FromArgb(148, Color.Black);
 | |
|                     brush.SurroundColors = new Color[] { Color.FromArgb(4,Color.Black)};
 | |
|                     g.FillPath(brush, shadowPath);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             using (LinearGradientBrush brush = new LinearGradientBrush(r, backColor1, backColor2, 90))
 | |
|                 g.FillEllipse(brush, r);
 | |
| 
 | |
|             // Highlight
 | |
|             Rectangle hr = new Rectangle(r.X - (int)(r.Width * .15), r.Y - (int)(r.Height * .15), (int)(r.Width * 1.3), (int)(r.Height * 1.32) / 2);
 | |
|             using (LinearGradientBrush brush = new LinearGradientBrush(hr, Color.FromArgb(128, Color.White), Color.FromArgb(8, Color.White), 90))
 | |
|             {
 | |
|                 GraphicsPath clipPath = new GraphicsPath();
 | |
|                 clipPath.AddEllipse(r);
 | |
|                 if (containerClipRect.IsEmpty)
 | |
|                     g.SetClip(clipPath);
 | |
|                 else
 | |
|                     g.SetClip(clipPath, CombineMode.Intersect);
 | |
|                 g.FillEllipse(brush, hr);
 | |
|                 if(containerClipRect.IsEmpty)
 | |
|                     g.ResetClip();
 | |
|                 else
 | |
|                     g.SetClip(containerClipRect);
 | |
|                 clipPath.Dispose();
 | |
|             }
 | |
| 
 | |
|             // Border
 | |
|             using (Pen pen = new Pen(borderColor, borderSize))
 | |
|                 g.DrawEllipse(pen, r);
 | |
| 
 | |
|             if (!string.IsNullOrEmpty(text))
 | |
|             {
 | |
|                 // Text
 | |
|                 Rectangle textBounds = r;
 | |
|                 if (text.Length == 1)
 | |
|                     textBounds.Y++;
 | |
|                 using (StringFormat sf = (StringFormat)StringFormat.GenericDefault.Clone())
 | |
|                 {
 | |
| 
 | |
|                     sf.LineAlignment = StringAlignment.Center;
 | |
|                     sf.Alignment = StringAlignment.Center;
 | |
|                     using (SolidBrush brush = new SolidBrush(textColor))
 | |
|                         g.DrawString(text, textFont, brush, textBounds, sf);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             // Cleanup
 | |
|             g.Clip = oldClip; oldClip.Dispose();
 | |
|             textFont.Dispose();
 | |
|             g.SmoothingMode = sm;
 | |
|             g.TextRenderingHint = th;
 | |
| 
 | |
|             return r;
 | |
|         }
 | |
|         #endregion
 | |
|     }
 | |
| }
 |