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
 | 
						|
    }
 | 
						|
}
 |