#region Imports
|
|
using System;
|
using System.ComponentModel;
|
using System.Drawing;
|
using System.Drawing.Drawing2D;
|
using System.Windows.Forms;
|
|
#endregion
|
|
namespace DPumpHydr.WinFrmUI.RLT.Controls
|
{
|
#region DungeonToggleButton
|
|
[DefaultEvent("ToggledChanged")]
|
public class DungeonToggleButton : Control
|
{
|
|
#region Enums
|
|
public enum _Type
|
{
|
OnOff,
|
YesNo,
|
IO
|
}
|
|
#endregion
|
#region Variables
|
|
public delegate void ToggledChangedEventHandler();
|
private ToggledChangedEventHandler ToggledChangedEvent;
|
|
public event ToggledChangedEventHandler ToggledChanged
|
{
|
add => ToggledChangedEvent = (ToggledChangedEventHandler)Delegate.Combine(ToggledChangedEvent, value);
|
remove => ToggledChangedEvent = (ToggledChangedEventHandler)Delegate.Remove(ToggledChangedEvent, value);
|
}
|
|
private bool _Toggled;
|
private _Type ToggleType;
|
private Rectangle Bar;
|
|
#endregion
|
#region Properties
|
|
public Color ToggledBackColorA { get; set; } = Color.FromArgb(253, 253, 253);
|
|
public Color ToggledBackColorB { get; set; } = Color.FromArgb(240, 238, 237);
|
|
public Color ToggledColorA { get; set; } = Color.FromArgb(231, 108, 58);
|
|
public Color ToggledBorderColorA { get; set; } = Color.FromArgb(185, 89, 55);
|
|
public Color ToggledColorB { get; set; } = Color.FromArgb(236, 113, 63);
|
|
public Color ToggledBorderColorB { get; set; } = Color.FromArgb(185, 89, 55);
|
|
public Color ToggledColorC { get; set; } = Color.FromArgb(208, 208, 208);
|
|
public Color ToggledBorderColorC { get; set; } = Color.FromArgb(181, 181, 181);
|
|
public Color ToggledColorD { get; set; } = Color.FromArgb(226, 226, 226);
|
|
public Color ToggledBorderColorD { get; set; } = Color.FromArgb(181, 181, 181);
|
|
public Color ToggledOnOffColorA { get; set; } = Color.WhiteSmoke;
|
|
public Color ToggledOnOffColorB { get; set; } = Color.DimGray;
|
|
public Color ToggledYesNoColorA { get; set; } = Color.WhiteSmoke;
|
|
public Color ToggledYesNoColorB { get; set; } = Color.DimGray;
|
|
public Color ToggledIOColorA { get; set; } = Color.WhiteSmoke;
|
|
public Color ToggledIOColorB { get; set; } = Color.DimGray;
|
|
public bool Toggled
|
{
|
get => _Toggled;
|
set
|
{
|
_Toggled = value;
|
Invalidate();
|
ToggledChangedEvent?.Invoke();
|
}
|
}
|
|
public _Type Type
|
{
|
get => ToggleType;
|
set
|
{
|
ToggleType = value;
|
Invalidate();
|
}
|
}
|
|
#endregion
|
#region EventArgs
|
|
protected override void OnResize(EventArgs e)
|
{
|
base.OnResize(e);
|
Width = 79;
|
Height = 27;
|
}
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
{
|
base.OnMouseUp(e);
|
Toggled = !Toggled;
|
Focus();
|
}
|
|
#endregion
|
|
public DungeonToggleButton()
|
{
|
SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.DoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
|
Cursor = Cursors.Hand;
|
}
|
|
protected override void OnPaint(PaintEventArgs e)
|
{
|
base.OnPaint(e);
|
Graphics G = e.Graphics;
|
|
G.SmoothingMode = SmoothingMode.HighQuality;
|
G.Clear(Parent.BackColor);
|
|
int SwitchXLoc = 3;
|
Rectangle ControlRectangle = new(0, 0, Width - 1, Height - 1);
|
GraphicsPath ControlPath = RoundRectangle.RoundRect(ControlRectangle, 4);
|
|
LinearGradientBrush BackgroundLGB;
|
if (_Toggled)
|
{
|
SwitchXLoc = 37;
|
BackgroundLGB = new(ControlRectangle, ToggledColorA, ToggledColorB, 90.0F);
|
}
|
else
|
{
|
SwitchXLoc = 0;
|
BackgroundLGB = new(ControlRectangle, ToggledColorC, ToggledColorD, 90.0F);
|
}
|
|
// Fill inside background gradient
|
G.FillPath(BackgroundLGB, ControlPath);
|
|
// Draw string
|
switch (ToggleType)
|
{
|
case _Type.OnOff:
|
if (Toggled)
|
{
|
G.DrawString("ON", new Font("Segoe UI", 12, FontStyle.Regular), new SolidBrush(ToggledOnOffColorA), Bar.X + 18, (float)(Bar.Y + 13.5), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
}
|
else
|
{
|
G.DrawString("OFF", new Font("Segoe UI", 12, FontStyle.Regular), new SolidBrush(ToggledOnOffColorB), Bar.X + 59, (float)(Bar.Y + 13.5), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
}
|
|
break;
|
case _Type.YesNo:
|
if (Toggled)
|
{
|
G.DrawString("YES", new Font("Segoe UI", 12, FontStyle.Regular), new SolidBrush(ToggledYesNoColorA), Bar.X + 18, (float)(Bar.Y + 13.5), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
}
|
else
|
{
|
G.DrawString("NO", new Font("Segoe UI", 12, FontStyle.Regular), new SolidBrush(ToggledYesNoColorB), Bar.X + 59, (float)(Bar.Y + 13.5), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
}
|
|
break;
|
case _Type.IO:
|
if (Toggled)
|
{
|
G.DrawString("I", new Font("Segoe UI", 12, FontStyle.Regular), new SolidBrush(ToggledIOColorA), Bar.X + 18, (float)(Bar.Y + 13.5), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
}
|
else
|
{
|
G.DrawString("O", new Font("Segoe UI", 12, FontStyle.Regular), new SolidBrush(ToggledIOColorB), Bar.X + 59, (float)(Bar.Y + 13.5), new StringFormat() { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
|
}
|
|
break;
|
}
|
|
Rectangle SwitchRectangle = new(SwitchXLoc, 0, Width - 38, Height);
|
GraphicsPath SwitchPath = RoundRectangle.RoundRect(SwitchRectangle, 4);
|
LinearGradientBrush SwitchButtonLGB = new(SwitchRectangle, ToggledBackColorA, ToggledBackColorB, LinearGradientMode.Vertical);
|
|
// Fill switch background gradient
|
G.FillPath(SwitchButtonLGB, SwitchPath);
|
|
// Draw borders
|
if (_Toggled == true)
|
{
|
G.DrawPath(new(ToggledBorderColorA), SwitchPath);
|
G.DrawPath(new(ToggledBorderColorB), ControlPath);
|
}
|
else
|
{
|
G.DrawPath(new(ToggledBorderColorC), SwitchPath);
|
G.DrawPath(new(ToggledBorderColorD), ControlPath);
|
}
|
}
|
}
|
|
#endregion
|
}
|