#region Imports
|
|
using DPumpHydr.WinFrmUI.RLT.Design.Metro;
|
using DPumpHydr.WinFrmUI.RLT.Enum.Metro;
|
using DPumpHydr.WinFrmUI.RLT.Extension.Metro;
|
using DPumpHydr.WinFrmUI.RLT.Interface.Metro;
|
using DPumpHydr.WinFrmUI.RLT.Manager;
|
using System;
|
using System.Collections.Generic;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Drawing.Text;
|
using System.Runtime.InteropServices;
|
using System.Windows.Forms;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Controls
|
{
|
#region MetroBadge
|
|
[ToolboxItem(true)]
|
[ToolboxBitmap(typeof(MetroBadge), "Bitmaps.Button.bmp")]
|
[Designer(typeof(MetroBadgeDesigner))]
|
[DefaultEvent("Click")]
|
[DefaultProperty("Text")]
|
[ComVisible(true)]
|
public class MetroBadge : Control, IMetroControl
|
{
|
#region Interfaces
|
|
[Category("Metro"), Description("Gets or sets the style associated with the control.")]
|
public Style Style
|
{
|
get => StyleManager?.Style ?? _style;
|
set
|
{
|
_style = value;
|
switch (value)
|
{
|
case Style.Light:
|
ApplyTheme();
|
break;
|
case Style.Dark:
|
ApplyTheme(Style.Dark);
|
break;
|
case Style.Custom:
|
ApplyTheme(Style.Custom);
|
break;
|
default:
|
ApplyTheme();
|
break;
|
}
|
Invalidate();
|
}
|
}
|
|
[Category("Metro"), Description("Gets or sets the The Author name associated with the theme.")]
|
public string ThemeAuthor { get; set; }
|
|
[Category("Metro"), Description("Gets or sets the The Theme name associated with the theme.")]
|
public string ThemeName { get; set; }
|
|
[Category("Metro"), Description("Gets or sets the Style Manager associated with the control.")]
|
public MetroStyleManager StyleManager
|
{
|
get => _styleManager;
|
set
|
{
|
_styleManager = value;
|
Invalidate();
|
}
|
}
|
|
#endregion Interfaces
|
|
#region Global Vars
|
|
private readonly Methods _mth;
|
private readonly Utilites _utl;
|
|
#endregion Global Vars
|
|
#region Internal Vars
|
|
private MouseMode _state;
|
private Style _style;
|
private MetroStyleManager _styleManager;
|
|
private bool _isDerivedStyle = true;
|
private BadgeAlign _badgeAlignment;
|
private string _badgeText;
|
private Color _normalColor;
|
private Color _normalBorderColor;
|
private Color _normalTextColor;
|
private Color _hoverColor;
|
private Color _hoverBorderColor;
|
private Color _hoverTextColor;
|
private Color _pressColor;
|
private Color _pressBorderColor;
|
private Color _pressTextColor;
|
private Color _disabledBackColor;
|
private Color _disabledForeColor;
|
private Color _disabledBorderColor;
|
private Color _normalBadgeColor;
|
private Color _normalBadgeTextColor;
|
private Color _hoverBadgeColor;
|
private Color _hoverBadgeTextColor;
|
private Color _pressBadgeColor;
|
private Color _pressBadgeTextColor;
|
|
#endregion Internal Vars
|
|
#region Constructors
|
|
public MetroBadge()
|
{
|
SetStyle
|
(
|
ControlStyles.AllPaintingInWmPaint |
|
ControlStyles.ResizeRedraw | ControlStyles.UserPaint |
|
ControlStyles.OptimizedDoubleBuffer |
|
ControlStyles.SupportsTransparentBackColor,
|
true
|
);
|
UpdateStyles();
|
Size = new Size(160, 85);
|
base.Font = MetroFonts.Light(10);
|
base.BackColor = Color.Transparent;
|
_badgeAlignment = BadgeAlign.TopRight;
|
_badgeText = "3";
|
_utl = new Utilites();
|
_mth = new Methods();
|
ApplyTheme();
|
}
|
|
#endregion Constructors
|
|
#region Properties
|
|
[Category("Metro"), Description("Gets or sets the badge alignment associated with the control.")]
|
public BadgeAlign BadgeAlignment
|
{
|
get => _badgeAlignment;
|
set
|
{
|
_badgeAlignment = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro"), Description("Gets or sets the badge text associated with the control.")]
|
public string BadgeText
|
{
|
get => _badgeText;
|
set
|
{
|
_badgeText = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
public new bool Enabled
|
{
|
get => base.Enabled;
|
set
|
{
|
base.Enabled = value;
|
if (value == false)
|
{
|
_state = MouseMode.Disabled;
|
}
|
|
Invalidate();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control background color in normal mouse sate.")]
|
public Color NormalColor
|
{
|
get => _normalColor;
|
set
|
{
|
_normalColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control border color in normal mouse sate.")]
|
public Color NormalBorderColor
|
{
|
get => _normalBorderColor;
|
set
|
{
|
_normalBorderColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control Text color in normal mouse sate.")]
|
public Color NormalTextColor
|
{
|
get => _normalTextColor;
|
set
|
{
|
_normalTextColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control background color in hover mouse sate.")]
|
public Color HoverColor
|
{
|
get => _hoverColor;
|
set
|
{
|
_hoverColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control border color in hover mouse sate.")]
|
public Color HoverBorderColor
|
{
|
get => _hoverBorderColor;
|
set
|
{
|
_hoverBorderColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control Text color in hover mouse sate.")]
|
public Color HoverTextColor
|
{
|
get => _hoverTextColor;
|
set
|
{
|
_hoverTextColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control background color in pushed mouse sate.")]
|
public Color PressColor
|
{
|
get => _pressColor;
|
set
|
{
|
_pressColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control border color in pushed mouse sate.")]
|
public Color PressBorderColor
|
{
|
get => _pressBorderColor;
|
set
|
{
|
_pressBorderColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the control Text color in pushed mouse sate.")]
|
public Color PressTextColor
|
{
|
get => _pressTextColor;
|
set
|
{
|
_pressTextColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets backcolor used by the control while disabled.")]
|
public Color DisabledBackColor
|
{
|
get => _disabledBackColor;
|
set
|
{
|
_disabledBackColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the forecolor of the control whenever while disabled.")]
|
public Color DisabledForeColor
|
{
|
get => _disabledForeColor;
|
set
|
{
|
_disabledForeColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the border color of the control while disabled.")]
|
public Color DisabledBorderColor
|
{
|
get => _disabledBorderColor;
|
set
|
{
|
_disabledBorderColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the Badge background color in normal mouse sate.")]
|
public Color NormalBadgeColor
|
{
|
get => _normalBadgeColor;
|
set
|
{
|
_normalBadgeColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the Badge Text color in normal mouse sate.")]
|
public Color NormalBadgeTextColor
|
{
|
get => _normalBadgeTextColor;
|
set
|
{
|
_normalBadgeTextColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the Badge background color in hover mouse sate.")]
|
public Color HoverBadgeColor
|
{
|
get => _hoverBadgeColor;
|
set
|
{
|
_hoverBadgeColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the Badge Text color in hover mouse sate.")]
|
public Color HoverBadgeTextColor
|
{
|
get => _hoverBadgeTextColor;
|
set
|
{
|
_hoverBadgeTextColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the Badge background color in pushed mouse sate.")]
|
public Color PressBadgeColor
|
{
|
get => _pressBadgeColor;
|
set
|
{
|
_pressBadgeColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the Badge Text color in pushed mouse sate.")]
|
public Color PressBadgeTextColor
|
{
|
get => _pressBadgeTextColor;
|
set
|
{
|
_pressBadgeTextColor = value;
|
Refresh();
|
}
|
}
|
|
[Category("Metro")]
|
[Description("Gets or sets the whether this control reflect to parent(s) style. \n " +
|
"Set it to false if you want the style of this control be independent. ")]
|
public bool IsDerivedStyle
|
{
|
get => _isDerivedStyle;
|
set
|
{
|
_isDerivedStyle = value;
|
Refresh();
|
}
|
}
|
|
#endregion Properties
|
|
#region Draw Control
|
|
protected override void OnPaint(PaintEventArgs e)
|
{
|
Graphics g = e.Graphics;
|
Rectangle r;
|
Rectangle badge;
|
g.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
|
|
switch (BadgeAlignment)
|
{
|
case BadgeAlign.Topleft:
|
r = new(18, 18, Width - 21, Height - 21);
|
badge = new(5, 5, 29, 29);
|
break;
|
case BadgeAlign.TopRight:
|
r = new(0, 18, Width - 18, Height - 21);
|
badge = new(Width - 35, 1, 29, 29);
|
break;
|
case BadgeAlign.BottmLeft:
|
r = new(18, 0, Width - 19, Height - 18);
|
badge = new(1, Height - 35, 29, 29);
|
break;
|
case BadgeAlign.BottomRight:
|
r = new(0, 0, Width - 19, Height - 18);
|
badge = new(Width - 35, Height - 35, 29, 29);
|
break;
|
default:
|
throw new ArgumentOutOfRangeException();
|
}
|
|
switch (_state)
|
{
|
case MouseMode.Normal:
|
|
using (SolidBrush bg = new(NormalColor))
|
using (Pen p = new(NormalBorderColor))
|
using (SolidBrush tb = new(NormalTextColor))
|
using (SolidBrush bdgBrush = new(NormalBadgeColor))
|
using (SolidBrush bdgtxtBrush = new(NormalBadgeTextColor))
|
{
|
g.FillRectangle(bg, r);
|
g.DrawRectangle(p, r);
|
g.DrawString(Text, Font, tb, r, _mth.SetPosition());
|
SmoothingType(g);
|
g.FillEllipse(bdgBrush, badge);
|
g.DrawString(BadgeText, Font, bdgtxtBrush, badge, _mth.SetPosition());
|
}
|
break;
|
case MouseMode.Hovered:
|
Cursor = Cursors.Hand;
|
using (SolidBrush bg = new(HoverColor))
|
using (Pen p = new(HoverBorderColor))
|
using (SolidBrush tb = new(HoverTextColor))
|
using (SolidBrush bdgBrush = new(HoverBadgeColor))
|
using (SolidBrush bdgtxtBrush = new(HoverBadgeTextColor))
|
{
|
g.FillRectangle(bg, r);
|
g.DrawRectangle(p, r);
|
g.DrawString(Text, Font, tb, r, _mth.SetPosition());
|
SmoothingType(g);
|
g.FillEllipse(bdgBrush, badge);
|
g.DrawString(BadgeText, Font, bdgtxtBrush, badge, _mth.SetPosition());
|
}
|
break;
|
case MouseMode.Pushed:
|
|
using (SolidBrush bg = new(PressColor))
|
using (Pen p = new(PressBorderColor))
|
using (SolidBrush tb = new(PressTextColor))
|
using (SolidBrush bdgBrush = new(PressBadgeColor))
|
using (SolidBrush bdgtxtBrush = new(PressBadgeTextColor))
|
{
|
g.FillRectangle(bg, r);
|
g.DrawRectangle(p, r);
|
g.DrawString(Text, Font, tb, r, _mth.SetPosition());
|
SmoothingType(g);
|
g.FillEllipse(bdgBrush, badge);
|
g.DrawString(BadgeText, Font, bdgtxtBrush, badge, _mth.SetPosition());
|
}
|
break;
|
case MouseMode.Disabled:
|
|
using (SolidBrush bg = new(DisabledBackColor))
|
using (Pen p = new(DisabledBorderColor))
|
using (SolidBrush tb = new(DisabledForeColor))
|
using (SolidBrush bdgBrush = new(PressBadgeColor))
|
using (SolidBrush bdgtxtBrush = new(PressBadgeTextColor))
|
{
|
g.FillRectangle(bg, r);
|
g.DrawRectangle(p, r);
|
g.DrawString(Text, Font, tb, r, _mth.SetPosition());
|
SmoothingType(g);
|
g.FillEllipse(bdgBrush, badge);
|
g.DrawString(BadgeText, Font, bdgtxtBrush, badge, _mth.SetPosition());
|
}
|
break;
|
}
|
}
|
|
#endregion Draw Control
|
|
#region ApplyTheme
|
|
private void ApplyTheme(Style style = Style.Light)
|
{
|
if (!IsDerivedStyle)
|
{
|
return;
|
}
|
|
switch (style)
|
{
|
case Style.Light:
|
NormalColor = Color.FromArgb(238, 238, 238);
|
NormalBorderColor = Color.FromArgb(204, 204, 204);
|
NormalTextColor = Color.Black;
|
HoverColor = Color.FromArgb(102, 102, 102);
|
HoverBorderColor = Color.FromArgb(102, 102, 102);
|
HoverTextColor = Color.White;
|
PressColor = Color.FromArgb(51, 51, 51);
|
PressBorderColor = Color.FromArgb(51, 51, 51);
|
PressTextColor = Color.White;
|
NormalBadgeColor = Color.FromArgb(65, 177, 225);
|
NormalBadgeTextColor = Color.White;
|
HoverBadgeColor = Color.FromArgb(85, 187, 245);
|
HoverBadgeTextColor = Color.White;
|
PressBadgeColor = Color.FromArgb(45, 147, 205);
|
PressBadgeTextColor = Color.White;
|
DisabledBackColor = Color.FromArgb(204, 204, 204);
|
DisabledBorderColor = Color.FromArgb(155, 155, 155);
|
DisabledForeColor = Color.FromArgb(136, 136, 136);
|
ThemeAuthor = "Taiizor";
|
ThemeName = "MetroLight";
|
break;
|
case Style.Dark:
|
NormalColor = Color.FromArgb(32, 32, 32);
|
NormalBorderColor = Color.FromArgb(64, 64, 64);
|
NormalTextColor = Color.FromArgb(204, 204, 204);
|
HoverColor = Color.FromArgb(170, 170, 170);
|
HoverBorderColor = Color.FromArgb(170, 170, 170);
|
HoverTextColor = Color.White;
|
PressColor = Color.FromArgb(240, 240, 240);
|
PressBorderColor = Color.FromArgb(240, 240, 240);
|
PressTextColor = Color.White;
|
NormalBadgeColor = Color.FromArgb(65, 177, 225);
|
NormalBadgeTextColor = Color.White;
|
HoverBadgeColor = Color.FromArgb(85, 187, 245);
|
HoverBadgeTextColor = Color.White;
|
PressBadgeColor = Color.FromArgb(45, 147, 205);
|
PressBadgeTextColor = Color.White;
|
DisabledBackColor = Color.FromArgb(80, 80, 80);
|
DisabledBorderColor = Color.FromArgb(109, 109, 109);
|
DisabledForeColor = Color.FromArgb(109, 109, 109);
|
ThemeAuthor = "Taiizor";
|
ThemeName = "MetroDark";
|
break;
|
case Style.Custom:
|
if (StyleManager != null)
|
{
|
foreach (KeyValuePair<string, object> varkey in StyleManager.BadgeDictionary)
|
{
|
if (varkey.Key == null)
|
{
|
return;
|
}
|
|
switch (varkey.Key)
|
{
|
case "NormalColor":
|
NormalColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "NormalBorderColor":
|
NormalBorderColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "NormalTextColor":
|
NormalTextColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "HoverColor":
|
HoverColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "HoverBorderColor":
|
HoverBorderColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "HoverTextColor":
|
HoverTextColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "PressColor":
|
PressColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "PressBorderColor":
|
PressBorderColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "PressTextColor":
|
PressTextColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "NormalBadgeColor":
|
NormalBadgeColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "NormalBadgeTextColor":
|
NormalBadgeTextColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "HoverBadgeColor":
|
HoverBadgeColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "HoverBadgeTextColor":
|
HoverBadgeTextColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "PressBadgeColor":
|
PressBadgeColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "PressBadgeTextColor":
|
PressBadgeTextColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "DisabledBackColor":
|
DisabledBackColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "DisabledBorderColor":
|
DisabledBorderColor = _utl.HexColor((string)varkey.Value);
|
break;
|
case "DisabledForeColor":
|
DisabledForeColor = _utl.HexColor((string)varkey.Value);
|
break;
|
}
|
}
|
}
|
|
Invalidate();
|
break;
|
default:
|
throw new ArgumentOutOfRangeException(nameof(style), style, null);
|
}
|
}
|
|
#endregion Theme Changing
|
|
#region Events
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
{
|
base.OnMouseUp(e);
|
_state = MouseMode.Hovered;
|
Invalidate();
|
}
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
{
|
base.OnMouseUp(e);
|
_state = MouseMode.Pushed;
|
Invalidate();
|
}
|
|
protected override void OnMouseEnter(EventArgs e)
|
{
|
base.OnMouseEnter(e);
|
_state = MouseMode.Hovered;
|
Invalidate();
|
}
|
|
protected override void OnMouseLeave(EventArgs e)
|
{
|
base.OnMouseEnter(e);
|
_state = MouseMode.Normal;
|
Invalidate();
|
}
|
|
#endregion Events
|
|
#region Methods
|
|
private static void SmoothingType(Graphics e, SmoothingMode state = SmoothingMode.HighQuality)
|
{
|
e.SmoothingMode = state;
|
}
|
|
#endregion Methods
|
}
|
|
#endregion
|
}
|