117 lines
No EOL
3.4 KiB
C#
117 lines
No EOL
3.4 KiB
C#
using System.Drawing;
|
|
using JD.Audio.SoundPlayer;
|
|
using JD.Kernel.Structs;
|
|
using JD.Sequencers.Windowlesses;
|
|
using TeaBox;
|
|
using TeaBox.Core.Source.Gui;
|
|
|
|
namespace JD.Application.View.WindowLess
|
|
{
|
|
/// <summary>
|
|
/// Responsible of painting a loop indicator
|
|
/// </summary>
|
|
public class LoopWidget : WindowlessControl, IResizable
|
|
{
|
|
private readonly PlayerLoop _model;
|
|
private readonly global::JD.Sequencers.Times.Timeline _timeline;
|
|
private readonly Brush _boundsBrush = new SolidBrush(Color.FromArgb(75, Color.DodgerBlue));
|
|
|
|
public LoopWidget(PlayerLoop model, global::JD.Sequencers.Times.Timeline timeline)
|
|
{
|
|
_model = model;
|
|
_timeline = timeline;
|
|
_model.RangeChanged += updateBounds;
|
|
_timeline.PixelsPerTimeChanged += updateBounds;
|
|
_timeline.TimeOffsetChanged += updateBounds;
|
|
|
|
updateBounds(null, null);
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
|
|
_model.RangeChanged -= updateBounds;
|
|
_timeline.PixelsPerTimeChanged -= updateBounds;
|
|
_timeline.TimeOffsetChanged -= updateBounds;
|
|
}
|
|
|
|
void updateBounds(object sender, System.EventArgs e)
|
|
{
|
|
if (Parent != null && _model.Range.HasValue)
|
|
{
|
|
float min = _timeline.TimeToPixel(_model.Range.Value.Min);
|
|
float max = _timeline.TimeToPixel(_model.Range.Value.Max);
|
|
|
|
var bounds = Bounds;
|
|
bounds.Y = Parent.Bounds.Y;
|
|
bounds.Height = Parent.Bounds.Height;
|
|
bounds.X = (int) min;
|
|
bounds.Width = (int)(max - min);
|
|
Bounds = bounds;
|
|
IsVisible = true;
|
|
}
|
|
else if (IsVisible)
|
|
{
|
|
Invalidate();
|
|
IsVisible = false;
|
|
}
|
|
}
|
|
|
|
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
|
|
if (IsVisible)
|
|
{
|
|
e.Graphics.FillRectangle(_boundsBrush, Bounds);
|
|
}
|
|
}
|
|
|
|
#region Resize/Move
|
|
|
|
public bool IsMoveAllowed
|
|
{
|
|
get { return true; }
|
|
}
|
|
|
|
public void Snap_Self(float originalDelta, ref float snappedDelta, ref float diff)
|
|
{
|
|
}
|
|
|
|
public void Snap_Bounds(float originalDelta, ref float snappedDelta, ref float diff)
|
|
{
|
|
}
|
|
|
|
public void Move(float delta)
|
|
{
|
|
if (_model.Range.HasValue)
|
|
{
|
|
_model.Range = new Range<float>(_model.Range.Value.Min + delta, _model.Range.Value.Max + delta);
|
|
}
|
|
}
|
|
|
|
public void Resize(Edge resizeEdge, float delta)
|
|
{
|
|
if (_model.Range.HasValue)
|
|
{
|
|
if (resizeEdge == Edge.Left)
|
|
{
|
|
_model.Range = new Range<float>(_model.Range.Value.Min + delta, _model.Range.Value.Max);
|
|
}
|
|
else if (resizeEdge == Edge.Right)
|
|
{
|
|
_model.Range = new Range<float>(_model.Range.Value.Min + delta, _model.Range.Value.Max);
|
|
}
|
|
}
|
|
}
|
|
|
|
public bool IsResizeAllowed { get { return true; } }
|
|
|
|
public void ResizeByValue(Edge resizeEdge, float value)
|
|
{
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |