JD2022-TU1/main/tools/framework/JD.Sequencers/Controls/TrackItem.cs

170 lines
4.1 KiB
C#

using System.Drawing;
using System.Drawing.Drawing2D;
using System.Linq;
using JD.Kernel.StaticHelpers;
using JD.Sequencers.Times;
using JD.Sequencers.Windowlesses;
namespace JD.Sequencers.Controls
{
/// <summary>
/// A single item in a track.
/// </summary>
public abstract class TrackItem : WindowlessControl, IMovable
{
#region Variables
private Color m_color = Color.DarkSlateBlue;
private bool m_useGradient = true;
private Track m_track;
private bool m_isMoveAllowed = true;
#endregion
#region Constructor
protected TrackItem()
{
Selectable = true;
}
#endregion
#region Properties
public Color Color
{
get { return m_color; }
set
{
if (m_color != value)
{
m_color = value;
Invalidate();
}
}
}
public Color GradientColor
{
get
{
return Color.FromArgb(Color.A, ModifyBrightness(Color, 1.25f));
}
}
public bool UseGradient
{
get { return m_useGradient; }
set
{
if (m_useGradient != value)
{
m_useGradient = value;
Invalidate();
}
}
}
public Track Track
{
get { return m_track; }
internal set
{
Throw.InvalidOperationIf(m_track != null && value != null, "Item is already owned by another track");
m_track = value;
}
}
public Timeline Timeline
{
get { return Track != null ? Track.Timeline : null; }
}
public TrackView TrackView
{
get { return Parents.OfType<TrackView>().FirstOrDefault(); }
}
/// <summary>
/// Whether this movable is movable :)
/// </summary>
public bool IsMoveAllowed
{
get { return m_isMoveAllowed; }
set { m_isMoveAllowed = value; }
}
#endregion
#region Methods
public virtual void Initialize()
{
}
#region Painting
protected override void OnPaintSelf(System.Windows.Forms.PaintEventArgs e)
{
base.OnPaintSelf(e);
Rectangle borderBounds = Bounds;
borderBounds.Height -= (int)Pens.White.Width;
borderBounds.Width -= (int)Pens.White.Width;
using (Brush fillBrush = CreateFillBrush())
{
e.Graphics.FillRectangle(fillBrush, Bounds);
e.Graphics.DrawRectangle(Selected ? Pens.White : Pens.Black, borderBounds);
}
}
protected virtual Brush CreateFillBrush()
{
if (UseGradient)
{
return new LinearGradientBrush(new Point(Bounds.Left, Bounds.Top), new Point(Bounds.Left, Bounds.Bottom), GradientColor, Color);
}
return new SolidBrush(Color);
}
#endregion
#region Layout
public abstract void OnVisibleRangeChanged();
public virtual bool HitTestFilter(Rectangle localZone)
{
return true;
}
#endregion
private Color ModifyBrightness(Color c1, float factor)
{
float r = ((c1.R * factor) > 255) ? 255 : (c1.R * factor);
float g = ((c1.G * factor) > 255) ? 255 : (c1.G * factor);
float b = ((c1.B * factor) > 255) ? 255 : (c1.B * factor);
Color c = Color.FromArgb(c1.A, (int)r, (int)g, (int)b);
return c;
}
#endregion
#region Implementation of IMovable
public abstract void Snap_Self(float originalDelta, ref float snappedDelta, ref float diff);
public abstract void Snap_Bounds(float originalDelta, ref float snappedDelta, ref float diff);
public abstract void Move(float delta);
#endregion
}
}