public virtual void ShiftTracks(int delta, GuiLabs.Undo.ActionManager am = null) { var oldIndices = Tracks.Select(t => t.GetIndex()).ToList(); var newIndices = oldIndices.Select(i => i + delta).ToList(); if (newIndices.Any(i => i < 0 || i >= timeline.Tracks.Count)) { throw new ArgumentException("shifting tracks would move them out of range", "delta"); } // runtime complexity is horrendeous, but we don't have that many tracks ... foreach (int i in newIndices) { if (!oldIndices.Contains(i)) { am.RecordAdd(Tracks, timeline.Tracks[i]); } } foreach (int i in oldIndices) { if (!newIndices.Contains(i)) { am.RecordRemove(Tracks, timeline.Tracks[i]); } } }
public override bool RemoveFromTrack(Track track, GuiLabs.Undo.ActionManager am = null) { if (base.RemoveFromTrack(track, am)) { foreach (var child in _children.Where(b => b.Tracks.Contains(track)).Reverse().ToArray()) { if (child.Tracks.Count > 1) { am.RecordRemove(child.Tracks, track); } else { am.RecordRemove(_children, child); } } // since the base method already removed the track from the group block, // this call should in theory be redundant RecalcTracks(); return(true); } return(false); }
public virtual bool RemoveFromTrack(Track track, GuiLabs.Undo.ActionManager am = null) { if (Tracks.Count <= 1) { return(false); } if (!Tracks.Contains(track)) { throw new InvalidOperationException("block is not part of track"); } am.RecordRemove(Tracks, track); return(true); }