public double AdjustStartTime(WindowState state, ItemsPerTrack itemsGroup, double time) { var track = itemsGroup.targetTrack; if (track == null) { return(time); } double start; double end; if (EditModeUtils.IsInfiniteTrack(track)) { EditModeUtils.GetInfiniteClipBoundaries(track, out start, out end); } else { var siblings = ItemsUtils.GetItemsExcept(track, itemsGroup.items); var firstIntersectedItem = EditModeUtils.GetFirstIntersectedItem(siblings, time); if (firstIntersectedItem == null) { return(time); } start = firstIntersectedItem.start; end = firstIntersectedItem.end; } var closestTime = Math.Abs(time - start) < Math.Abs(time - end) ? start : end; var pixelTime = state.TimeToPixel(time); var pixelClosestTime = state.TimeToPixel(closestTime); if (Math.Abs(pixelTime - pixelClosestTime) < k_SnapToEdgeDistance) { return(closestTime); } return(time); }
public bool ValidateMove(ItemsPerTrack itemsGroup) { var track = itemsGroup.targetTrack; var items = itemsGroup.items; if (EditModeUtils.IsInfiniteTrack(track)) { double startTime; double stopTime; EditModeUtils.GetInfiniteClipBoundaries(track, out startTime, out stopTime); return(items.All(item => !EditModeUtils.IsItemWithinRange(item, startTime, stopTime) && !EditModeUtils.IsRangeWithinItem(startTime, stopTime, item))); } var siblings = ItemsUtils.GetItemsExcept(itemsGroup.targetTrack, items); return(items.All(item => EditModeMixUtils.GetPlacementValidity(item, siblings) == PlacementValidity.Valid)); }