#region Imports using DPumpHydr.WinFrmUI.RLT.Colors; using DPumpHydr.WinFrmUI.RLT.Util; using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Text; using System.Windows.Forms; #endregion namespace DPumpHydr.WinFrmUI.RLT.Controls { #region HopeTrackBar public class HopeTrackBar : Control { #region Variables private RectangleF valueBar = new(7, 5, 0, 6); private RectangleF valueRect = new(0, 1, 14, 14); private bool mouseFlat = false; #endregion #region Settings private int _minValue = 0; public int MinValue { get => _minValue; set { if (value > _maxValue || value > _value) { return; } _minValue = value; Invalidate(); } } private int _maxValue = 10; public int MaxValue { get => _maxValue; set { if (value < _minValue || value < _value) { return; } _maxValue = value; Invalidate(); } } private int _value = 0; public int Value { get => _value; set { _value = value >= _minValue && value <= _maxValue ? value : _minValue; Invalidate(); } } private bool _showValue = false; public bool ShowValue { get => _showValue; set { _showValue = value; Invalidate(); } } private bool _AlwaysValueVisible = false; public bool AlwaysValueVisible { get => _AlwaysValueVisible; set { _AlwaysValueVisible = value; Invalidate(); } } private int ValueWidth => Convert.ToInt32(_value * (Width - 30) / (_maxValue - _minValue)); private Color _themeColor = HopeColors.PrimaryColor; public Color ThemeColor { get => _themeColor; set { _themeColor = value; Invalidate(); } } private Color _BaseColor = Color.FromArgb(44, 55, 66); public Color BaseColor { get => _BaseColor; set { _BaseColor = value; Invalidate(); } } private Color _BarColor = RoundRectangle.BackColor; public Color BarColor { get => _BarColor; set { _BarColor = value; Invalidate(); } } private Color _BallonColor = HopeColors.PrimaryColor; public Color BallonColor { get => _BallonColor; set { _BallonColor = value; Invalidate(); } } private Color _BallonArrowColor = HopeColors.PrimaryColor; public Color BallonArrowColor { get => _BallonArrowColor; set { _BallonArrowColor = value; Invalidate(); } } private Color _FillBarColor = HopeColors.PrimaryColor; public Color FillBarColor { get => _FillBarColor; set { _FillBarColor = value; Invalidate(); } } private Color _HeadBorderColor = Color.DodgerBlue; public Color HeadBorderColor { get => _HeadBorderColor; set { _HeadBorderColor = value; Invalidate(); } } private Color _HeadColor = Color.Black; public Color HeadColor { get => _HeadColor; set { _HeadColor = value; Invalidate(); } } private Color _UnknownColor = Color.White; public Color UnknownColor { get => _UnknownColor; set { _UnknownColor = value; Invalidate(); } } #endregion #region Events protected override void OnResize(EventArgs e) { base.OnResize(e); Height = _showValue ? 45 : 16; } protected override void OnMouseDown(MouseEventArgs e) { base.OnMouseDown(e); if (e.Button == MouseButtons.Left) { mouseFlat = new RectangleF(ValueWidth + 7, Height - 15, 14, 14).Contains(e.Location); Invalidate(); } } protected override void OnMouseMove(MouseEventArgs e) { base.OnMouseMove(e); if (mouseFlat && e.X > -1 && e.X < (Width + 1)) { _value = _minValue + Convert.ToInt32((_maxValue - _minValue) * (e.X / (float)Width)); Invalidate(); } } protected override void OnMouseUp(MouseEventArgs e) { base.OnMouseUp(e); mouseFlat = false; Invalidate(); } #endregion protected override void OnPaint(PaintEventArgs e) { Graphics graphics = e.Graphics; graphics.SmoothingMode = SmoothingMode.HighQuality; graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit; graphics.Clear(_BaseColor); if (ShowValue && (mouseFlat || _AlwaysValueVisible)) { graphics.FillEllipse(new SolidBrush(_BallonColor), new RectangleF(ValueWidth - 2 + 5, 1, 18, 18)); graphics.FillPolygon(new SolidBrush(_BallonArrowColor), new PointF[] { new(ValueWidth + 1.305F - 2 + 5,13.5F + 1), new(ValueWidth + 7.794F + 9-2 + 5,13.5F + 1), new(ValueWidth + 9-2 + 5,28F) }); graphics.DrawString(_value.ToString(), Font, new SolidBrush(ForeColor), new RectangleF(ValueWidth - 2 + 5, 2, 18, 18), HopeStringAlign.Center); } graphics.FillRectangle(new SolidBrush(_BarColor), new RectangleF(15, Height - 10, Width - 30, 4)); graphics.FillRectangle(new SolidBrush(_UnknownColor), new RectangleF(15, Height - 10, ValueWidth, 4)); graphics.FillRectangle(new SolidBrush(_FillBarColor), new RectangleF(15, Height - 10, ValueWidth, 4)); graphics.FillEllipse(new SolidBrush(_HeadBorderColor), new RectangleF(ValueWidth + 5, Height - 17, 16, 16)); graphics.FillEllipse(new SolidBrush(_HeadColor), new RectangleF(ValueWidth + 8, Height - 14, 10, 10)); } public HopeTrackBar() { SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true); DoubleBuffered = true; Height = 45; Font = new("Segoe UI", 8F); ForeColor = Color.White; Cursor = Cursors.Hand; } } #endregion }