// COPYRIGHT (C) Tom. ALL RIGHTS RESERVED.
// THE AntdUI PROJECT IS AN WINFORM LIBRARY LICENSED UNDER THE Apache-2.0 License.
// LICENSED UNDER THE Apache License, VERSION 2.0 (THE "License")
// YOU MAY NOT USE THIS FILE EXCEPT IN COMPLIANCE WITH THE License.
// YOU MAY OBTAIN A COPY OF THE LICENSE AT
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE
// DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
// SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND
// LIMITATIONS UNDER THE License.
// GITEE: https://gitee.com/antdui/AntdUI
// GITHUB: https://github.com/AntdUI/AntdUI
// CSDN: https://blog.csdn.net/v_132
// QQ: 17379620
using System.Drawing;
using System.Drawing.Drawing2D;
namespace AntdUI
{
partial class Table
{
internal static void PaintButton(Graphics g, Font font, int gap, Rectangle rect_read, CellButton btn)
{
float _radius = (btn.Shape == TShape.Round || btn.Shape == TShape.Circle) ? rect_read.Height : btn.Radius * Config.Dpi;
if (btn.Type == TTypeMini.Default)
{
Color _fore = Style.Db.DefaultColor, _color = Style.Db.Primary, _back_hover, _back_active;
if (btn.BorderWidth > 0)
{
_back_hover = Style.Db.PrimaryHover;
_back_active = Style.Db.PrimaryActive;
}
else
{
_back_hover = Style.Db.FillSecondary;
_back_active = Style.Db.Fill;
}
if (btn.Fore.HasValue) _fore = btn.Fore.Value;
if (btn.BackHover.HasValue) _back_hover = btn.BackHover.Value;
if (btn.BackActive.HasValue) _back_active = btn.BackActive.Value;
using (var path = PathButton(rect_read, btn, _radius))
{
#region 动画
if (btn.AnimationClick)
{
float maxw = rect_read.Width + (gap * btn.AnimationClickValue), maxh = rect_read.Height + (gap * btn.AnimationClickValue),
alpha = 100 * (1F - btn.AnimationClickValue);
using (var brush = new SolidBrush(Helper.ToColor(alpha, _color)))
{
using (var path_click = new RectangleF(rect_read.X + (rect_read.Width - maxw) / 2F, rect_read.Y + (rect_read.Height - maxh) / 2F, maxw, maxh).RoundPath(_radius, btn.Shape))
{
path_click.AddPath(path, false);
g.FillPath(brush, path_click);
}
}
}
#endregion
if (btn.Enabled)
{
if (!btn.Ghost)
{
#region 绘制阴影
if (btn.Enabled)
{
using (var path_shadow = new RectangleF(rect_read.X, rect_read.Y + 3, rect_read.Width, rect_read.Height).RoundPath(_radius))
{
path_shadow.AddPath(path, false);
using (var brush = new SolidBrush(Style.Db.FillQuaternary))
{
g.FillPath(brush, path_shadow);
}
}
}
#endregion
using (var brush = new SolidBrush(btn.DefaultBack ?? Style.Db.DefaultBg))
{
g.FillPath(brush, path);
}
}
if (btn.BorderWidth > 0)
{
float border = btn.BorderWidth * Config.Dpi;
if (btn.ExtraMouseDown)
{
using (var brush = new Pen(_back_active, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _back_active, rect_read);
}
else if (btn.AnimationHover)
{
var colorHover = Helper.ToColor(btn.AnimationHoverValue, _back_hover);
using (var brush = new Pen(Style.Db.DefaultBorder, border))
{
g.DrawPath(brush, path);
}
using (var brush = new Pen(colorHover, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _fore, colorHover, rect_read);
}
else if (btn.ExtraMouseHover)
{
using (var brush = new Pen(_back_hover, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _back_hover, rect_read);
}
else
{
using (var brush = new Pen(btn.DefaultBorderColor ?? Style.Db.DefaultBorder, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _fore, rect_read);
}
}
else
{
if (btn.ExtraMouseDown)
{
using (var brush = new SolidBrush(_back_active))
{
g.FillPath(brush, path);
}
}
else if (btn.AnimationHover)
{
using (var brush = new SolidBrush(Helper.ToColor(btn.AnimationHoverValue, _back_hover)))
{
g.FillPath(brush, path);
}
}
else if (btn.ExtraMouseHover)
{
using (var brush = new SolidBrush(_back_hover))
{
g.FillPath(brush, path);
}
}
PaintButton(g, font, btn, _fore, rect_read);
}
}
else
{
if (btn.BorderWidth > 0)
{
using (var brush = new SolidBrush(Style.Db.FillTertiary))
{
g.FillPath(brush, path);
}
}
PaintButton(g, font, btn, Style.Db.TextQuaternary, rect_read);
}
}
}
else
{
Color _fore, _back, _back_hover, _back_active;
switch (btn.Type)
{
case TTypeMini.Error:
_back = Style.Db.Error;
_fore = Style.Db.ErrorColor;
_back_hover = Style.Db.ErrorHover;
_back_active = Style.Db.ErrorActive;
break;
case TTypeMini.Success:
_back = Style.Db.Success;
_fore = Style.Db.SuccessColor;
_back_hover = Style.Db.SuccessHover;
_back_active = Style.Db.SuccessActive;
break;
case TTypeMini.Info:
_back = Style.Db.Info;
_fore = Style.Db.InfoColor;
_back_hover = Style.Db.InfoHover;
_back_active = Style.Db.InfoActive;
break;
case TTypeMini.Warn:
_back = Style.Db.Warning;
_fore = Style.Db.WarningColor;
_back_hover = Style.Db.WarningHover;
_back_active = Style.Db.WarningActive;
break;
case TTypeMini.Primary:
default:
_back = Style.Db.Primary;
_fore = Style.Db.PrimaryColor;
_back_hover = Style.Db.PrimaryHover;
_back_active = Style.Db.PrimaryActive;
break;
}
if (btn.Fore.HasValue) _fore = btn.Fore.Value;
if (btn.Back.HasValue) _back = btn.Back.Value;
if (btn.BackHover.HasValue) _back_hover = btn.BackHover.Value;
if (btn.BackActive.HasValue) _back_active = btn.BackActive.Value;
using (var path = PathButton(rect_read, btn, _radius))
{
#region 动画
if (btn.AnimationClick)
{
float maxw = rect_read.Width + (gap * btn.AnimationClickValue), maxh = rect_read.Height + (gap * btn.AnimationClickValue),
alpha = 100 * (1F - btn.AnimationClickValue);
using (var brush = new SolidBrush(Helper.ToColor(alpha, _back)))
{
using (var path_click = new RectangleF(rect_read.X + (rect_read.Width - maxw) / 2F, rect_read.Y + (rect_read.Height - maxh) / 2F, maxw, maxh).RoundPath(_radius, btn.Shape))
{
path_click.AddPath(path, false);
g.FillPath(brush, path_click);
}
}
}
#endregion
if (btn.Ghost)
{
#region 绘制背景
if (btn.BorderWidth > 0)
{
float border = btn.BorderWidth * Config.Dpi;
if (btn.ExtraMouseDown)
{
using (var brush = new Pen(_back_active, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _back_active, rect_read);
}
else if (btn.AnimationHover)
{
var colorHover = Helper.ToColor(btn.AnimationHoverValue, _back_hover);
using (var brush = new Pen(btn.Enabled ? _back : Style.Db.FillTertiary, border))
{
g.DrawPath(brush, path);
}
using (var brush = new Pen(colorHover, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _back, colorHover, rect_read);
}
else if (btn.ExtraMouseHover)
{
using (var brush = new Pen(_back_hover, border))
{
g.DrawPath(brush, path);
}
PaintButton(g, font, btn, _back_hover, rect_read);
}
else
{
if (btn.Enabled)
{
using (var brushback = btn.BackExtend.BrushEx(rect_read, _back))
{
using (var brush = new Pen(brushback, border))
{
g.DrawPath(brush, path);
}
}
}
else
{
using (var brush = new Pen(Style.Db.FillTertiary, border))
{
g.DrawPath(brush, path);
}
}
PaintButton(g, font, btn, btn.Enabled ? _back : Style.Db.TextQuaternary, rect_read);
}
}
else PaintButton(g, font, btn, btn.Enabled ? _back : Style.Db.TextQuaternary, rect_read);
#endregion
}
else
{
#region 绘制阴影
if (btn.Enabled)
{
using (var path_shadow = new RectangleF(rect_read.X, rect_read.Y + 3, rect_read.Width, rect_read.Height).RoundPath(_radius))
{
path_shadow.AddPath(path, false);
using (var brush = new SolidBrush(_back.rgba(Config.Mode == TMode.Dark ? 0.15F : 0.1F)))
{
g.FillPath(brush, path_shadow);
}
}
}
#endregion
#region 绘制背景
if (btn.Enabled)
{
using (var brush = btn.BackExtend.BrushEx(rect_read, _back))
{
g.FillPath(brush, path);
}
}
else
{
using (var brush = new SolidBrush(Style.Db.FillTertiary))
{
g.FillPath(brush, path);
}
}
if (btn.ExtraMouseDown)
{
using (var brush = new SolidBrush(_back_active))
{
g.FillPath(brush, path);
}
}
else if (btn.AnimationHover)
{
var colorHover = Helper.ToColor(btn.AnimationHoverValue, _back_hover);
using (var brush = new SolidBrush(colorHover))
{
g.FillPath(brush, path);
}
}
else if (btn.ExtraMouseHover)
{
using (var brush = new SolidBrush(_back_hover))
{
g.FillPath(brush, path);
}
}
#endregion
PaintButton(g, font, btn, btn.Enabled ? _fore : Style.Db.TextQuaternary, rect_read);
}
}
}
}
#region 渲染帮助
static GraphicsPath PathButton(RectangleF rect_read, CellButton btn, float _radius)
{
if (btn.Shape == TShape.Circle)
{
var path = new GraphicsPath();
path.AddEllipse(rect_read);
return path;
}
return rect_read.RoundPath(_radius);
}
static void PaintButton(Graphics g, Font font, CellButton btn, Color color, Rectangle rect_read)
{
if (string.IsNullOrEmpty(btn.Text))
{
var font_size = g.MeasureString(Config.NullText, font).Size();
//没有文字
var rect = PaintButtonImageRectCenter(btn, font_size, rect_read);
if (PaintButtonImageNoText(g, btn, color, rect) && btn.ShowArrow)
{
int size = (int)(font_size.Height * btn.IconRatio);
var rect_arrow = new Rectangle(rect_read.X + (rect_read.Width - size) / 2, rect_read.Y + (rect_read.Height - size) / 2, size, size);
using (var pen = new Pen(color, 2F * Config.Dpi))
{
pen.StartCap = pen.EndCap = LineCap.Round;
if (btn.IsLink)
{
var state = g.Save();
int size_arrow = rect_arrow.Width / 2;
g.TranslateTransform(rect_arrow.X + size_arrow, rect_arrow.Y + size_arrow);
g.RotateTransform(-90F);
g.DrawLines(pen, new Rectangle(-size_arrow, -size_arrow, rect_arrow.Width, rect_arrow.Height).TriangleLines(btn.ArrowProg));
g.ResetTransform();
g.Restore(state);
}
else g.DrawLines(pen, rect_arrow.TriangleLines(btn.ArrowProg));
}
}
}
else
{
var font_size = g.MeasureString(btn.Text ?? Config.NullText, font).Size();
bool has_left = btn.HasIcon, has_right = btn.ShowArrow;
Rectangle rect_text;
if (has_left || has_right)
{
if (has_left && has_right)
{
rect_text = IButton.RectAlignLR(g, btn.textLine, font, btn.IconPosition, btn.IconRatio, font_size, rect_read, out var rect_l, out var rect_r);
PaintButtonPaintImage(g, btn, color, rect_l);
#region ARROW
using (var pen = new Pen(color, 2F * Config.Dpi))
{
pen.StartCap = pen.EndCap = LineCap.Round;
if (btn.IsLink)
{
var state = g.Save();
int size_arrow = rect_r.Width / 2;
g.TranslateTransform(rect_r.X + size_arrow, rect_r.Y + size_arrow);
g.RotateTransform(-90F);
g.DrawLines(pen, new Rectangle(-size_arrow, -size_arrow, rect_r.Width, rect_r.Height).TriangleLines(btn.ArrowProg));
g.ResetTransform();
g.Restore(state);
}
else
{
g.DrawLines(pen, rect_r.TriangleLines(btn.ArrowProg));
}
}
#endregion
}
else if (has_left)
{
rect_text = IButton.RectAlignL(g, btn.textLine, font, btn.IconPosition, btn.IconRatio, font_size, rect_read, out var rect_l);
PaintButtonPaintImage(g, btn, color, rect_l);
}
else
{
rect_text = IButton.RectAlignR(g, btn.textLine, font, btn.IconPosition, btn.IconRatio, font_size, rect_read, out var rect_r);
#region ARROW
using (var pen = new Pen(color, 2F * Config.Dpi))
{
pen.StartCap = pen.EndCap = LineCap.Round;
if (btn.IsLink)
{
var state = g.Save();
int size_arrow = rect_r.Width / 2;
g.TranslateTransform(rect_r.X + size_arrow, rect_r.Y + size_arrow);
g.RotateTransform(-90F);
g.DrawLines(pen, new Rectangle(-size_arrow, -size_arrow, rect_r.Width, rect_r.Height).TriangleLines(btn.ArrowProg));
g.ResetTransform();
g.Restore(state);
}
else
{
g.DrawLines(pen, rect_r.TriangleLines(btn.ArrowProg));
}
}
#endregion
}
}
else
{
int sps = (int)(font_size.Height * .4F), sps2 = sps * 2;
rect_text = new Rectangle(rect_read.X + sps, rect_read.Y + sps, rect_read.Width - sps2, rect_read.Height - sps2);
PaintButtonTextAlign(btn, rect_read, ref rect_text);
}
using (var brush = new SolidBrush(color))
{
g.DrawStr(btn.Text, font, brush, rect_text, btn.stringFormat);
}
}
}
static void PaintButton(Graphics g, Font font, CellButton btn, Color color, Color colorHover, Rectangle rect_read)
{
if (string.IsNullOrEmpty(btn.Text))
{
var font_size = g.MeasureString(Config.NullText, font).Size();
var rect = PaintButtonImageRectCenter(btn, font_size, rect_read);
if (PaintButtonImageNoText(g, btn, color, rect))
{
if (btn.ShowArrow)
{
int size = (int)(font_size.Height * btn.IconRatio);
var rect_arrow = new Rectangle(rect_read.X + (rect_read.Width - size) / 2, rect_read.Y + (rect_read.Height - size) / 2, size, size);
using (var pen = new Pen(color, 2F * Config.Dpi))
using (var penHover = new Pen(colorHover, pen.Width))
{
pen.StartCap = pen.EndCap = LineCap.Round;
if (btn.IsLink)
{
var state = g.Save();
int size_arrow = rect_arrow.Width / 2;
g.TranslateTransform(rect_arrow.X + size_arrow, rect_arrow.Y + size_arrow);
g.RotateTransform(-90F);
var rect_arrow_lines = new Rectangle(-size_arrow, -size_arrow, rect_arrow.Width, rect_arrow.Height).TriangleLines(btn.ArrowProg);
g.DrawLines(pen, rect_arrow_lines);
g.DrawLines(penHover, rect_arrow_lines);
g.ResetTransform();
g.Restore(state);
}
else
{
var rect_arrow_lines = rect_arrow.TriangleLines(btn.ArrowProg);
g.DrawLines(pen, rect_arrow_lines);
g.DrawLines(penHover, rect_arrow_lines);
}
}
}
}
else PaintButtonImageNoText(g, btn, colorHover, rect);
}
else
{
var font_size = g.MeasureString(btn.Text ?? Config.NullText, font).Size();
bool has_left = btn.HasIcon, has_right = btn.ShowArrow;
Rectangle rect_text;
if (has_left || has_right)
{
if (has_left && has_right)
{
rect_text = IButton.RectAlignLR(g, btn.textLine, font, btn.IconPosition, btn.IconRatio, font_size, rect_read, out var rect_l, out var rect_r);
PaintButtonPaintImage(g, btn, color, rect_l);
PaintButtonPaintImage(g, btn, colorHover, rect_l);
#region ARROW
using (var pen = new Pen(color, 2F * Config.Dpi))
using (var penHover = new Pen(colorHover, pen.Width))
{
penHover.StartCap = penHover.EndCap = pen.StartCap = pen.EndCap = LineCap.Round;
if (btn.IsLink)
{
var state = g.Save();
int size_arrow = rect_r.Width / 2;
g.TranslateTransform(rect_r.X + size_arrow, rect_r.Y + size_arrow);
g.RotateTransform(-90F);
var rect_arrow = new Rectangle(-size_arrow, -size_arrow, rect_r.Width, rect_r.Height).TriangleLines(btn.ArrowProg);
g.DrawLines(pen, rect_arrow);
g.DrawLines(penHover, rect_arrow);
g.ResetTransform();
g.Restore(state);
}
else
{
var rect_arrow = rect_r.TriangleLines(btn.ArrowProg);
g.DrawLines(pen, rect_arrow);
g.DrawLines(penHover, rect_arrow);
}
}
#endregion
}
else if (has_left)
{
rect_text = IButton.RectAlignL(g, btn.textLine, font, btn.IconPosition, btn.IconRatio, font_size, rect_read, out var rect_l);
PaintButtonPaintImage(g, btn, color, rect_l);
PaintButtonPaintImage(g, btn, colorHover, rect_l);
}
else
{
rect_text = IButton.RectAlignR(g, btn.textLine, font, btn.IconPosition, btn.IconRatio, font_size, rect_read, out var rect_r);
#region ARROW
using (var pen = new Pen(color, 2F * Config.Dpi))
using (var penHover = new Pen(colorHover, pen.Width))
{
penHover.StartCap = penHover.EndCap = pen.StartCap = pen.EndCap = LineCap.Round;
if (btn.IsLink)
{
var state = g.Save();
int size_arrow = rect_r.Width / 2;
g.TranslateTransform(rect_r.X + size_arrow, rect_r.Y + size_arrow);
g.RotateTransform(-90F);
var rect_arrow = new Rectangle(-size_arrow, -size_arrow, rect_r.Width, rect_r.Height).TriangleLines(btn.ArrowProg);
g.DrawLines(pen, rect_arrow);
g.DrawLines(penHover, rect_arrow);
g.ResetTransform();
g.Restore(state);
}
else
{
var rect_arrow = rect_r.TriangleLines(btn.ArrowProg);
g.DrawLines(pen, rect_arrow);
g.DrawLines(penHover, rect_arrow);
}
}
#endregion
}
}
else
{
int sps = (int)(font_size.Height * .4F), sps2 = sps * 2;
rect_text = new Rectangle(rect_read.X + sps, rect_read.Y + sps, rect_read.Width - sps2, rect_read.Height - sps2);
PaintButtonTextAlign(btn, rect_read, ref rect_text);
}
using (var brush = new SolidBrush(color))
using (var brushHover = new SolidBrush(colorHover))
{
g.DrawStr(btn.Text, font, brush, rect_text, btn.stringFormat);
g.DrawStr(btn.Text, font, brushHover, rect_text, btn.stringFormat);
}
}
}
static void PaintButtonTextAlign(CellButton btn, Rectangle rect_read, ref Rectangle rect_text)
{
switch (btn.TextAlign)
{
case ContentAlignment.MiddleCenter:
case ContentAlignment.MiddleLeft:
case ContentAlignment.MiddleRight:
rect_text.Y = rect_read.Y;
rect_text.Height = rect_read.Height;
break;
case ContentAlignment.TopLeft:
case ContentAlignment.TopRight:
case ContentAlignment.TopCenter:
rect_text.Height = rect_read.Height - rect_text.Y;
break;
}
}
///
/// 渲染图片(没有文字)
///
/// GDI
/// 颜色
/// 区域
static bool PaintButtonImageNoText(Graphics g, CellButton btn, Color? color, Rectangle rect)
{
if (btn.AnimationImageHover)
{
PaintButtonCoreImage(g, btn, rect, color, 1F - btn.AnimationImageHoverValue);
PaintButtonCoreImageHover(g, btn, rect, color, btn.AnimationImageHoverValue);
return false;
}
else
{
if (btn.ExtraMouseHover)
{
if (PaintButtonCoreImageHover(g, btn, rect, color)) return false;
}
if (PaintButtonCoreImage(g, btn, rect, color)) return false;
}
return true;
}
static bool PaintButtonCoreImage(Graphics g, CellButton btn, Rectangle rect, Color? color, float opacity = 1F)
{
if (btn.IconSvg != null)
{
using (var _bmp = SvgExtend.GetImgExtend(btn.IconSvg, rect, color))
{
if (_bmp != null)
{
g.DrawImage(_bmp, rect, opacity);
return true;
}
}
}
else if (btn.Icon != null)
{
g.DrawImage(btn.Icon, rect, opacity);
return true;
}
return false;
}
static bool PaintButtonCoreImageHover(Graphics g, CellButton btn, Rectangle rect, Color? color, float opacity = 1F)
{
if (btn.IconHoverSvg != null)
{
using (var _bmp = SvgExtend.GetImgExtend(btn.IconHoverSvg, rect, color))
{
if (_bmp != null)
{
g.DrawImage(_bmp, rect, opacity);
return true;
}
}
}
else if (btn.IconHover != null)
{
g.DrawImage(btn.IconHover, rect, opacity);
return true;
}
return false;
}
static Rectangle PaintButtonImageRectCenter(CellButton btn, Size font_size, Rectangle rect_read)
{
int w = (int)(font_size.Height * btn.IconRatio * 1.125F);
return new Rectangle(rect_read.X + (rect_read.Width - w) / 2, rect_read.Y + (rect_read.Height - w) / 2, w, w);
}
///
/// 渲染图片
///
/// GDI
/// 颜色
/// 图标区域
static void PaintButtonPaintImage(Graphics g, CellButton btn, Color? color, Rectangle rectl)
{
if (btn.AnimationImageHover)
{
PaintButtonCoreImage(g, btn, rectl, color, 1F - btn.AnimationImageHoverValue);
PaintButtonCoreImageHover(g, btn, rectl, color, btn.AnimationImageHoverValue);
return;
}
else
{
if (btn.ExtraMouseHover)
{
if (PaintButtonCoreImageHover(g, btn, rectl, color)) return;
}
PaintButtonCoreImage(g, btn, rectl, color);
}
}
#endregion
internal static void PaintLink(Graphics g, Font font, Rectangle rect_read, CellLink link)
{
if (link.ExtraMouseDown)
{
using (var brush = new SolidBrush(Style.Db.PrimaryActive))
{
g.DrawStr(link.Text, font, brush, rect_read, link.stringFormat);
}
}
else if (link.AnimationHover)
{
var colorHover = Helper.ToColor(link.AnimationHoverValue, Style.Db.PrimaryHover);
using (var brush = new SolidBrush(Style.Db.Primary))
{
g.DrawStr(link.Text, font, brush, rect_read, link.stringFormat);
}
using (var brush = new SolidBrush(colorHover))
{
g.DrawStr(link.Text, font, brush, rect_read, link.stringFormat);
}
}
else if (link.ExtraMouseHover)
{
using (var brush = new SolidBrush(Style.Db.PrimaryHover))
{
g.DrawStr(link.Text, font, brush, rect_read, link.stringFormat);
}
}
else
{
using (var brush = new SolidBrush(link.Enabled ? Style.Db.Primary : Style.Db.TextQuaternary))
{
g.DrawStr(link.Text, font, brush, rect_read, link.stringFormat);
}
}
}
}
}