#region Imports using DPumpHydr.WinFrmUI.RLT.Colors; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Drawing; using System.Threading; using System.Windows.Forms; #endregion namespace DPumpHydr.WinFrmUI.RLT.Util { #region RoyalUtil public abstract class ControlRoyalBase : Control { private Thread animationThread; private readonly double framesPerSecond = 1000 / 15; protected delegate void MoveControlDelegate(Point location); protected delegate void ResizeControlDelegate(Size size); protected delegate void SetControlBackColorDelegate(Color c); protected delegate void RefreshControlDelegate(); public event EventHandler EffectStarted; public event EventHandler EffectEnded; public bool AnimateBackColorChange = false; public double SecondsToChange = 0.5; public override Color BackColor { get => base.BackColor; set { if (AnimateBackColorChange) { SetBackgroundColor(value, SecondsToChange); } else { base.BackColor = value; } } } public ControlRoyalBase() { SetStyle(ControlStyles.AllPaintingInWmPaint, true); SetStyle(ControlStyles.OptimizedDoubleBuffer, true); EffectStarted = new EventHandler(OnEffectStarted); EffectEnded = new EventHandler(OnEffectEnded); } public new void Move(Point location, double seconds) { animationThread = new(new ThreadStart(delegate () { MoveControl(location, seconds); })); animationThread.Start(); } public new void Resize(Size size, double seconds) { animationThread = new(new ThreadStart(delegate () { ResizeControl(size, seconds); })); animationThread.Start(); } public void SetBackgroundColor(Color backColor, double seconds) { animationThread = new(new ThreadStart(delegate () { FadeToColor(backColor, seconds); })); animationThread.Start(); } private void MoveControl(Point location, double seconds) { double x = location.X - Location.X; double y = location.Y - Location.Y; double xStepDist = x / (framesPerSecond * seconds); double yStepDist = y / (framesPerSecond * seconds); double ox = Location.X; double oy = Location.Y; try { for (int i = 0; i < (seconds * framesPerSecond); i++) { ox += xStepDist; oy += yStepDist; Point p = new((int)ox, (int)oy); if (InvokeRequired) { Invoke(new MoveControlDelegate(SetControlLocation), p); Invoke(new RefreshControlDelegate(RefreshControl)); } else { Location = p; Refresh(); } Thread.Sleep(10); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void ResizeControl(Size size, double seconds) { double x = size.Width - Width; double y = size.Height - Height; double xStepDist = x / (framesPerSecond * seconds); double yStepDist = y / (framesPerSecond * seconds); double ox = Width; double oy = Height; try { for (int i = 0; i < (seconds * framesPerSecond); i++) { ox += xStepDist; oy += yStepDist; Size s = new((int)ox, (int)oy); if (InvokeRequired) { Invoke(new ResizeControlDelegate(SetControlSize), s); Invoke(new RefreshControlDelegate(RefreshControl)); } else { Size = s; Refresh(); } Thread.Sleep(10); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } private void FadeToColor(Color color, double seconds) { double r = color.R - BackColor.R; double g = color.G - BackColor.G; double b = color.B - BackColor.B; double rStep = r / (framesPerSecond * seconds); double gStep = g / (framesPerSecond * seconds); double bStep = b / (framesPerSecond * seconds); double or = BackColor.R; double og = BackColor.G; double ob = BackColor.B; try { for (int i = 0; i < (seconds * framesPerSecond); i++) { or += rStep; og += gStep; ob += gStep; Color c = Color.FromArgb((int)or, (int)og, (int)ob); if (InvokeRequired) { Invoke(new SetControlBackColorDelegate(SetControlBackColor), c); Invoke(new RefreshControlDelegate(RefreshControl)); } else { BackColor = c; Refresh(); } Thread.Sleep(10); } } catch (Exception ex) { Console.WriteLine(ex.Message); } } protected void SetControlLocation(Point location) { Location = location; } protected void SetControlSize(Size size) { Size = size; } protected void SetControlBackColor(Color c) { BackColor = c; } protected void RefreshControl() { Refresh(); } protected virtual void OnEffectStarted(object sender, EventArgs e) { } protected virtual void OnEffectEnded(object sender, EventArgs e) { } } public class RoyalListBoxItemCollection : Collection { public event EventHandler ItemAdded; public event EventHandler ItemRemoved; public RoyalListBoxItemCollection() { ItemAdded = new EventHandler(OnItemAdded); ItemRemoved = new EventHandler(OnItemRemoved); } public void AddRange(IEnumerable items) { foreach (object item in items) { Items.Add(item); } } protected override void InsertItem(int index, object item) { base.InsertItem(index, item); ItemAdded(this, EventArgs.Empty); } protected override void RemoveItem(int index) { base.RemoveItem(index); ItemRemoved(this, EventArgs.Empty); } protected virtual void OnItemAdded(object sender, EventArgs e) { } protected virtual void OnItemRemoved(object sender, EventArgs e) { } } public class RoyalListBoxSelectedItemCollection : Collection { public RoyalListBoxSelectedItemCollection() { } } public class RoyalListBoxSelectedIndexCollection : Collection { public RoyalListBoxSelectedIndexCollection() { } } public class RoyalToolStripRenderer : ToolStripRenderer { public static Color ForeColor { get => RoyalColors.ForeColor; set => RoyalColors.ForeColor = value; } public static Color PressedForeColor { get => RoyalColors.PressedForeColor; set => RoyalColors.PressedForeColor = value; } public static Color BackColor { get => RoyalColors.BackColor; set => RoyalColors.BackColor = value; } public static Color SelectedColor { get => RoyalColors.HotTrackColor; set => RoyalColors.HotTrackColor = value; } public static Color PressedColor { get => RoyalColors.AccentColor; set => RoyalColors.AccentColor = value; } public RoyalToolStripRenderer() { } protected override void Initialize(ToolStrip toolStrip) { toolStrip.ForeColor = RoyalColors.ForeColor; toolStrip.BackColor = RoyalColors.BackColor; base.Initialize(toolStrip); } protected override void OnRenderArrow(ToolStripArrowRenderEventArgs e) { //e.Graphics.FillRectangle(new SolidBrush(foreColor), e.ArrowRectangle); base.OnRenderArrow(e); } protected override void OnRenderButtonBackground(ToolStripItemRenderEventArgs e) { base.OnRenderButtonBackground(e); Rectangle rect = new(0, 0, e.Item.Width, e.Item.Height); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), rect); } protected override void OnRenderDropDownButtonBackground(ToolStripItemRenderEventArgs e) { base.OnRenderDropDownButtonBackground(e); Rectangle rect = new(0, 0, e.Item.Width, e.Item.Height); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), rect); } protected override void OnRenderItemBackground(ToolStripItemRenderEventArgs e) { base.OnRenderItemBackground(e); Rectangle rect = new(0, 0, e.Item.Width, e.Item.Height); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), rect); } protected override void OnRenderMenuItemBackground(ToolStripItemRenderEventArgs e) { base.OnRenderMenuItemBackground(e); Rectangle rect = new(0, 0, e.Item.Width, e.Item.Height); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), rect); } protected override void OnRenderLabelBackground(ToolStripItemRenderEventArgs e) { base.OnRenderLabelBackground(e); Rectangle rect = new(0, 0, e.Item.Width, e.Item.Height); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), rect); } protected override void OnRenderGrip(ToolStripGripRenderEventArgs e) { base.OnRenderGrip(e); e.Graphics.DrawString("GRIP", SystemFonts.MenuFont, Brushes.Black, e.GripBounds); } protected override void OnRenderToolStripBackground(ToolStripRenderEventArgs e) { base.OnRenderToolStripBackground(e); e.Graphics.FillRectangle(new SolidBrush(BackColor), e.AffectedBounds); } protected override void OnRenderItemText(ToolStripItemTextRenderEventArgs e) { base.OnRenderItemText(e); Color foreColor = RoyalColors.ForeColor; if (e.Item.Pressed) { foreColor = RoyalColors.PressedForeColor; } TextRenderer.DrawText(e.Graphics, e.Text, e.TextFont, e.TextRectangle, foreColor, Color.Transparent, TextFormatFlags.Left | TextFormatFlags.VerticalCenter); } protected override void OnRenderImageMargin(ToolStripRenderEventArgs e) { base.OnRenderImageMargin(e); } protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) { //base.OnRenderItemCheck(e); e.Graphics.DrawImage(Properties.Resources.Check, e.ImageRectangle); } protected override void OnRenderItemImage(ToolStripItemImageRenderEventArgs e) { base.OnRenderItemImage(e); } protected override void OnRenderOverflowButtonBackground(ToolStripItemRenderEventArgs e) { base.OnRenderOverflowButtonBackground(e); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), e.Item.Bounds); } protected override void OnRenderSeparator(ToolStripSeparatorRenderEventArgs e) { base.OnRenderSeparator(e); Rectangle itemRect = e.Item.Bounds; if (e.Vertical) { e.Graphics.DrawLine(Pens.Gainsboro, new Point(0, 0), new Point(0, itemRect.Height)); e.Graphics.DrawLine(Pens.WhiteSmoke, new Point(1, 0), new Point(1, itemRect.Height)); } else { //e.Graphics.DrawLine(Pens.Gainsboro, new Point(0, 0), new Point(itemRect.Width, 0)); //e.Graphics.DrawLine(Pens.WhiteSmoke, new Point(0, 1), new Point(itemRect.Width, 1)); e.Graphics.DrawLine(new(Color.Gainsboro, 2), new Point(0, 0), new Point(itemRect.Width, 0)); } } protected override void OnRenderSplitButtonBackground(ToolStripItemRenderEventArgs e) { base.OnRenderSplitButtonBackground(e); Color color = BackColor; if (e.Item.Selected && !e.Item.Pressed) { color = SelectedColor; } else if (e.Item.Pressed) { color = PressedColor; } e.Graphics.FillRectangle(new SolidBrush(color), e.Item.Bounds); } protected override void OnRenderStatusStripSizingGrip(ToolStripRenderEventArgs e) { base.OnRenderStatusStripSizingGrip(e); } protected override void OnRenderToolStripBorder(ToolStripRenderEventArgs e) { base.OnRenderToolStripBorder(e); if (e.ToolStrip.IsDropDown) { Rectangle rect = new(0, 0, e.AffectedBounds.Width - 1, e.AffectedBounds.Height - 1); e.Graphics.DrawRectangle(Pens.Gainsboro, rect); } } protected override void OnRenderToolStripContentPanelBackground(ToolStripContentPanelRenderEventArgs e) { base.OnRenderToolStripContentPanelBackground(e); } protected override void OnRenderToolStripPanelBackground(ToolStripPanelRenderEventArgs e) { base.OnRenderToolStripPanelBackground(e); } protected override void OnRenderToolStripStatusLabelBackground(ToolStripItemRenderEventArgs e) { base.OnRenderToolStripStatusLabelBackground(e); } } public enum RoyalLayoutFlags { TextOnly, ImageOnly, ImageBeforeText, TextBeforeImage, TextAboveImage, ImageAboveText }; #endregion }