DotNet 4.8.1 build of DotNetBar
This commit is contained in:
@@ -0,0 +1,143 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using DevComponents.DotNetBar.Metro.ColorTables;
|
||||
using System.Drawing;
|
||||
using System.Drawing.Imaging;
|
||||
|
||||
namespace DevComponents.DotNetBar.Metro.Rendering
|
||||
{
|
||||
internal class MetroTabItemPainter : MetroRenderer
|
||||
{
|
||||
public override void Render(MetroRendererInfo renderingInfo)
|
||||
{
|
||||
MetroTabItem tab = (MetroTabItem)renderingInfo.Control;
|
||||
Graphics g = renderingInfo.PaintEventArgs.Graphics;
|
||||
MetroTabItemColorTable cti = renderingInfo.ColorTable.MetroTab.MetroTabItem;
|
||||
MetroTabItemStateColorTable color = cti.Default;
|
||||
if (!tab.Enabled)
|
||||
color = cti.Disabled;
|
||||
else if (tab.Checked)
|
||||
color = cti.Selected;
|
||||
else if (tab.IsMouseDown && cti.Pressed != null)
|
||||
color = cti.Pressed;
|
||||
else if (tab.IsMouseOver && cti.MouseOver != null)
|
||||
color = cti.MouseOver;
|
||||
|
||||
Rectangle bounds = tab.Bounds;
|
||||
Rectangle textBounds = tab.TextRenderBounds;
|
||||
Rectangle imageBounds = tab.ImageRenderBounds;
|
||||
CompositeImage image = tab.GetImage();
|
||||
|
||||
if (color.Background != null)
|
||||
{
|
||||
Font font = renderingInfo.DefaultFont;
|
||||
if (!tab.Checked && font.Bold && renderingInfo.DefaultPlainFont != null)
|
||||
font = renderingInfo.DefaultPlainFont;
|
||||
ElementStyleDisplayInfo di = new ElementStyleDisplayInfo(color.Background, g, bounds);
|
||||
ElementStyleDisplay.Paint(di);
|
||||
|
||||
if (image != null && tab.ButtonStyle != eButtonStyle.TextOnlyAlways)
|
||||
{
|
||||
if (imageBounds.IsEmpty)
|
||||
imageBounds = GetImageRectangle(tab, image);
|
||||
if (textBounds.IsEmpty)
|
||||
textBounds = GetTextRectangle(tab, image, imageBounds);
|
||||
|
||||
}
|
||||
else if (textBounds.IsEmpty)
|
||||
textBounds = bounds;
|
||||
|
||||
if (tab.TextMarkupBody == null)
|
||||
{
|
||||
di.Bounds = textBounds;
|
||||
|
||||
ElementStyleDisplay.PaintText(di, tab.Text, font);
|
||||
}
|
||||
else
|
||||
{
|
||||
eTextFormat stringFormat = eTextFormat.HorizontalCenter | eTextFormat.VerticalCenter;
|
||||
TextMarkup.MarkupDrawContext d = new TextMarkup.MarkupDrawContext(g, font, color.Background.TextColor, renderingInfo.RightToLeft);
|
||||
d.HotKeyPrefixVisible = !((stringFormat & eTextFormat.HidePrefix) == eTextFormat.HidePrefix);
|
||||
d.ContextObject = tab;
|
||||
Rectangle mr = new Rectangle(textBounds.X, textBounds.Y + (textBounds.Height - tab.TextMarkupBody.Bounds.Height) / 2 + 1, tab.TextMarkupBody.Bounds.Width, tab.TextMarkupBody.Bounds.Height);
|
||||
if ((stringFormat & eTextFormat.HorizontalCenter) != 0)
|
||||
mr.Offset((textBounds.Width - mr.Width) / 2, 0);
|
||||
if (tab._FixedSizeCenterText) mr.Y--;
|
||||
tab.TextMarkupBody.Bounds = mr;
|
||||
tab.TextMarkupBody.Render(d);
|
||||
}
|
||||
tab.TextRenderBounds = textBounds;
|
||||
tab.ImageRenderBounds = imageBounds;
|
||||
}
|
||||
|
||||
if (image != null)
|
||||
{
|
||||
if (!tab.IsMouseOver && tab.HotTrackingStyle == eHotTrackingStyle.Color)
|
||||
{
|
||||
// Draw gray-scale image for this hover style...
|
||||
float[][] array = new float[5][];
|
||||
array[0] = new float[5] { 0.2125f, 0.2125f, 0.2125f, 0, 0 };
|
||||
array[1] = new float[5] { 0.5f, 0.5f, 0.5f, 0, 0 };
|
||||
array[2] = new float[5] { 0.0361f, 0.0361f, 0.0361f, 0, 0 };
|
||||
array[3] = new float[5] { 0, 0, 0, 1, 0 };
|
||||
array[4] = new float[5] { 0.2f, 0.2f, 0.2f, 0, 1 };
|
||||
ColorMatrix grayMatrix = new ColorMatrix(array);
|
||||
ImageAttributes att = new ImageAttributes();
|
||||
att.SetColorMatrix(grayMatrix);
|
||||
image.DrawImage(g, imageBounds, 0, 0, image.ActualWidth, image.ActualHeight, GraphicsUnit.Pixel, att);
|
||||
}
|
||||
else
|
||||
{
|
||||
image.DrawImage(g, imageBounds);
|
||||
}
|
||||
}
|
||||
|
||||
//g.FillRectangle(Brushes.Red, bounds);
|
||||
}
|
||||
|
||||
private Rectangle GetImageRectangle(MetroTabItem tab, CompositeImage image)
|
||||
{
|
||||
Rectangle imageRect = Rectangle.Empty;
|
||||
// Calculate image position
|
||||
if (image != null)
|
||||
{
|
||||
Size imageSize = tab.ImageSize;
|
||||
|
||||
if (tab.ImagePosition == eImagePosition.Top || tab.ImagePosition == eImagePosition.Bottom)
|
||||
imageRect = new Rectangle(tab.ImageDrawRect.X, tab.ImageDrawRect.Y, tab.DisplayRectangle.Width, tab.ImageDrawRect.Height);
|
||||
else if(tab.ImagePosition == eImagePosition.Left)
|
||||
imageRect = new Rectangle(tab.ImageDrawRect.X+4, tab.ImageDrawRect.Y, tab.ImageDrawRect.Width, tab.ImageDrawRect.Height);
|
||||
else if (tab.ImagePosition == eImagePosition.Right)
|
||||
imageRect = new Rectangle(tab.ImageDrawRect.X + tab.ImagePaddingHorizontal+4, tab.ImageDrawRect.Y, tab.ImageDrawRect.Width, tab.ImageDrawRect.Height);
|
||||
imageRect.Offset(tab.DisplayRectangle.Left, tab.DisplayRectangle.Top);
|
||||
imageRect.Offset((imageRect.Width - imageSize.Width) / 2, (imageRect.Height - imageSize.Height) / 2);
|
||||
|
||||
imageRect.Width = imageSize.Width;
|
||||
imageRect.Height = imageSize.Height;
|
||||
}
|
||||
|
||||
return imageRect;
|
||||
}
|
||||
|
||||
private Rectangle GetTextRectangle(MetroTabItem tab, CompositeImage image, Rectangle imageBounds)
|
||||
{
|
||||
Rectangle itemRect = tab.DisplayRectangle;
|
||||
Rectangle textRect = tab.TextDrawRect;
|
||||
|
||||
if (tab.ImagePosition == eImagePosition.Top || tab.ImagePosition == eImagePosition.Bottom)
|
||||
{
|
||||
textRect = new Rectangle(1, textRect.Y, itemRect.Width - 2, textRect.Height);
|
||||
}
|
||||
textRect.Offset(itemRect.Left, itemRect.Top);
|
||||
|
||||
if (tab.ImagePosition == eImagePosition.Left)
|
||||
textRect.X = imageBounds.Right + tab.ImagePaddingHorizontal;
|
||||
|
||||
if (textRect.Right > itemRect.Right)
|
||||
textRect.Width = itemRect.Right - textRect.Left;
|
||||
|
||||
return textRect;
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user