JD2022-TU1/main/tools/apps/ConductorDebugger/Source/View/ConductorViewControl.cs

90 lines
No EOL
2.4 KiB
C#

using System.Collections.Generic;
using System.Linq;
using ConductorDebugger.Source.Brick;
using ConductorDebugger.View;
using JD.Application.View;
using JD.Application.View.Tracks;
using TeaBox;
using TeaBox.Gui.Windowless;
namespace ConductorDebugger.Source.View
{
public class ConductorViewControl : WaveControl
{
#region Variables
private readonly BrickCollection _bricks;
private float maxBrickRange = 500;
#endregion
#region
public ConductorViewControl(BrickCollection bricks)
{
_bricks = bricks;
_bricks.CollectionChanged += BricksCollectionChanged;
RefreshBricks();
}
#endregion
protected override IEnumerable<WaveTrackBase> CreateWaveTracks()
{
yield break;
}
private void ClearTracks()
{
foreach (var track in TrackView.GetTracks())
{
if (!Equals(track.Tag, "ConductorDebuggerTracks"))
{
continue;
}
DisposableHelper.SafeDisposeList(track.Children);
track.Dispose();
TrackView.RemoveTrack(track);
}
}
private void RefreshBricks()
{
ClearTracks();
Dictionary<string, Track> trackDictionary = new Dictionary<string, Track>();
foreach (var type in _bricks.BrickTypes.OrderBy(x => x))
{
var track = new ConductorTrack();
track.Tag = "ConductorDebuggerTracks";
track.Text = type;
trackDictionary.Add(type, track);
TrackView.AddTrack(track);
}
foreach (var brick in _bricks.OrderBy(x => x.Type))
{
float brickLength = brick.AbsoluteStartBeat.Value + brick.Duration.Value;
maxBrickRange = System.Math.Max(brickLength, maxBrickRange);
trackDictionary[brick.Type].Children.Add(new BrickViewModel(brick));
}
UpdateRange();
}
void BricksCollectionChanged(object sender, TeaBox.Collections.CollectionChangedEventArgs<BrickModel> e)
{
if (!_bricks.IsUpdating)
{
RefreshBricks();
}
}
protected override void UpdateRange()
{
Timeline.TimeRange = new Range<float>(0, maxBrickRange);
}
}
}