BigLitho/Large.Lito.Database/Make3_Treko3D/ControlLibrary/Renderers/ToggleSwitchAndroidRenderer.cs

296 lines
13 KiB
C#

using System;
using System.Drawing;
//using ToggleSwitch;
namespace ControlLibrary.Renderers
{
public class ToggleSwitchAndroidRenderer : ToggleSwitchRendererBase
{
#region Constructor
public ToggleSwitchAndroidRenderer()
{
BorderColor = Color.FromArgb(255, 166, 166, 166);
BackColor = Color.FromArgb(255, 32, 32, 32);
LeftSideColor = Color.FromArgb(255, 32, 32, 32);
RightSideColor = Color.FromArgb(255, 32, 32, 32);
OffButtonColor = Color.FromArgb(255, 70, 70, 70);
OnButtonColor = Color.FromArgb(255, 27, 161, 226);
OffButtonBorderColor = Color.FromArgb(255, 70, 70, 70);
OnButtonBorderColor = Color.FromArgb(255, 27, 161, 226);
SlantAngle = 39;
}
#endregion Constructor
#region Public Properties
public Color BorderColor { get; set; }
public Color BackColor { get; set; }
public Color LeftSideColor { get; set; }
public Color RightSideColor { get; set; }
public Color OffButtonColor { get; set; }
public Color OnButtonColor { get; set; }
public Color OffButtonBorderColor { get; set; }
public Color OnButtonBorderColor { get; set; }
public int SlantAngle { get; set; }
#endregion Public Properties
#region Render Method Implementations
public override void RenderBorder(Graphics g, Rectangle borderRectangle)
{
Color borderColor = !ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled ? BorderColor.ToGrayScale() : BorderColor;
g.SetClip(borderRectangle);
using (Pen borderPen = new Pen(borderColor))
{
g.DrawRectangle(borderPen, borderRectangle.X, borderRectangle.Y, borderRectangle.Width - 1, borderRectangle.Height - 1);
}
}
public override void RenderLeftToggleField(Graphics g, Rectangle leftRectangle, int totalToggleFieldWidth)
{
Color leftColor = LeftSideColor;
if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
leftColor = leftColor.ToGrayScale();
Rectangle controlRectangle = GetInnerControlRectangle();
g.SetClip(controlRectangle);
int halfCathetusLength = GetHalfCathetusLengthBasedOnAngle();
Rectangle adjustedLeftRect = new Rectangle(leftRectangle.X, leftRectangle.Y, leftRectangle.Width + halfCathetusLength, leftRectangle.Height);
g.IntersectClip(adjustedLeftRect);
using (Brush leftBrush = new SolidBrush(leftColor))
{
g.FillRectangle(leftBrush, adjustedLeftRect);
}
g.ResetClip();
}
public override void RenderRightToggleField(Graphics g, Rectangle rightRectangle, int totalToggleFieldWidth)
{
Color rightColor = RightSideColor;
if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
rightColor = rightColor.ToGrayScale();
Rectangle controlRectangle = GetInnerControlRectangle();
g.SetClip(controlRectangle);
int halfCathetusLength = GetHalfCathetusLengthBasedOnAngle();
Rectangle adjustedRightRect = new Rectangle(rightRectangle.X - halfCathetusLength, rightRectangle.Y, rightRectangle.Width + halfCathetusLength, rightRectangle.Height);
g.IntersectClip(adjustedRightRect);
using (Brush rightBrush = new SolidBrush(rightColor))
{
g.FillRectangle(rightBrush, adjustedRightRect);
}
g.ResetClip();
}
public override void RenderButton(Graphics g, Rectangle buttonRectangle)
{
Rectangle controlRectangle = GetInnerControlRectangle();
g.SetClip(controlRectangle);
int fullCathetusLength = GetCathetusLengthBasedOnAngle();
int dblFullCathetusLength = 2 * fullCathetusLength;
Point[] polygonPoints = new Point[4];
Rectangle adjustedButtonRect = new Rectangle(buttonRectangle.X - fullCathetusLength, controlRectangle.Y, buttonRectangle.Width + dblFullCathetusLength, controlRectangle.Height);
if (SlantAngle > 0)
{
polygonPoints[0] = new Point(adjustedButtonRect.X + fullCathetusLength, adjustedButtonRect.Y);
polygonPoints[1] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - 1, adjustedButtonRect.Y);
polygonPoints[2] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - fullCathetusLength - 1, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
polygonPoints[3] = new Point(adjustedButtonRect.X, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
}
else
{
polygonPoints[0] = new Point(adjustedButtonRect.X, adjustedButtonRect.Y);
polygonPoints[1] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - fullCathetusLength - 1, adjustedButtonRect.Y);
polygonPoints[2] = new Point(adjustedButtonRect.X + adjustedButtonRect.Width - 1, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
polygonPoints[3] = new Point(adjustedButtonRect.X + fullCathetusLength, adjustedButtonRect.Y + adjustedButtonRect.Height - 1);
}
g.IntersectClip(adjustedButtonRect);
Color buttonColor = ToggleSwitch.Checked ? OnButtonColor : OffButtonColor;
Color buttonBorderColor = ToggleSwitch.Checked ? OnButtonBorderColor : OffButtonBorderColor;
if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
{
buttonColor = buttonColor.ToGrayScale();
buttonBorderColor = buttonBorderColor.ToGrayScale();
}
using (Pen buttonPen = new Pen(buttonBorderColor))
{
g.DrawPolygon(buttonPen, polygonPoints);
}
using (Brush buttonBrush = new SolidBrush(buttonColor))
{
g.FillPolygon(buttonBrush, polygonPoints);
}
Image buttonImage = ToggleSwitch.ButtonImage ?? (ToggleSwitch.Checked ? ToggleSwitch.OnButtonImage : ToggleSwitch.OffButtonImage);
string buttonText = ToggleSwitch.Checked ? ToggleSwitch.OnText : ToggleSwitch.OffText;
if (buttonImage != null || !string.IsNullOrEmpty(buttonText))
{
ToggleSwitch.ToggleSwitchButtonAlignment alignment = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonAlignment : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonAlignment : ToggleSwitch.OffButtonAlignment);
if (buttonImage != null)
{
Size imageSize = buttonImage.Size;
Rectangle imageRectangle;
int imageXPos = adjustedButtonRect.X;
bool scaleImage = ToggleSwitch.ButtonImage != null ? ToggleSwitch.ButtonScaleImageToFit : (ToggleSwitch.Checked ? ToggleSwitch.OnButtonScaleImageToFit : ToggleSwitch.OffButtonScaleImageToFit);
if (scaleImage)
{
Size canvasSize = adjustedButtonRect.Size;
Size resizedImageSize = ImageHelper.RescaleImageToFit(imageSize, canvasSize);
if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
{
imageXPos = (int)((float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)resizedImageSize.Width) / 2));
}
else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
{
imageXPos = (int)((float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)resizedImageSize.Width);
}
imageRectangle = new Rectangle(imageXPos, (int)((float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)resizedImageSize.Height) / 2)), resizedImageSize.Width, resizedImageSize.Height);
if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
else
g.DrawImage(buttonImage, imageRectangle);
}
else
{
if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
{
imageXPos = (int)((float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - (float)imageSize.Width) / 2));
}
else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
{
imageXPos = (int)((float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - (float)imageSize.Width);
}
imageRectangle = new Rectangle(imageXPos, (int)((float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - (float)imageSize.Height) / 2)), imageSize.Width, imageSize.Height);
if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
g.DrawImage(buttonImage, imageRectangle, 0, 0, buttonImage.Width, buttonImage.Height, GraphicsUnit.Pixel, ImageHelper.GetGrayscaleAttributes());
else
g.DrawImageUnscaled(buttonImage, imageRectangle);
}
}
else if (!string.IsNullOrEmpty(buttonText))
{
Font buttonFont = ToggleSwitch.Checked ? ToggleSwitch.OnFont : ToggleSwitch.OffFont;
Color buttonForeColor = ToggleSwitch.Checked ? ToggleSwitch.OnForeColor : ToggleSwitch.OffForeColor;
if (!ToggleSwitch.Enabled && ToggleSwitch.GrayWhenDisabled)
buttonForeColor = buttonForeColor.ToGrayScale();
SizeF textSize = g.MeasureString(buttonText, buttonFont);
float textXPos = adjustedButtonRect.X;
if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Center)
{
textXPos = (float)adjustedButtonRect.X + (((float)adjustedButtonRect.Width - textSize.Width) / 2);
}
else if (alignment == ToggleSwitch.ToggleSwitchButtonAlignment.Right)
{
textXPos = (float)adjustedButtonRect.X + (float)adjustedButtonRect.Width - textSize.Width;
}
RectangleF textRectangle = new RectangleF(textXPos, (float)adjustedButtonRect.Y + (((float)adjustedButtonRect.Height - textSize.Height) / 2), textSize.Width, textSize.Height);
using (Brush textBrush = new SolidBrush(buttonForeColor))
{
g.DrawString(buttonText, buttonFont, textBrush, textRectangle);
}
}
}
g.ResetClip();
}
#endregion Render Method Implementations
#region Helper Method Implementations
public Rectangle GetInnerControlRectangle()
{
return new Rectangle(1, 1, ToggleSwitch.Width - 2, ToggleSwitch.Height - 2);
}
public int GetCathetusLengthBasedOnAngle()
{
if (SlantAngle == 0)
return 0;
double degrees = Math.Abs(SlantAngle);
double radians = degrees * (Math.PI / 180);
double length = Math.Tan(radians) * ToggleSwitch.Height;
return (int)length;
}
public int GetHalfCathetusLengthBasedOnAngle()
{
if (SlantAngle == 0)
return 0;
double degrees = Math.Abs(SlantAngle);
double radians = degrees * (Math.PI / 180);
double length = (Math.Tan(radians) * ToggleSwitch.Height) / 2;
return (int)length;
}
public override int GetButtonWidth()
{
double buttonWidth = (double)ToggleSwitch.Width / 2;
return (int)buttonWidth;
}
public override Rectangle GetButtonRectangle()
{
int buttonWidth = GetButtonWidth();
return GetButtonRectangle(buttonWidth);
}
public override Rectangle GetButtonRectangle(int buttonWidth)
{
Rectangle buttonRect = new Rectangle(ToggleSwitch.ButtonValue, 0, buttonWidth, ToggleSwitch.Height);
return buttonRect;
}
#endregion Helper Method Implementations
}
}