public void UpdatePastePoint(Point newMousePosition, Point mouseDelta) { if (!Chords.Any()) { return; } var mouseString = Owner.SnapToString(newMousePosition.Y); var offset = new Point(FirstChordOffset.X - mousePointBegin.X, mouseStringBegin - MinSelectionString); if (Owner.GridSnap) { var screenPoint = Owner.GetClientPointFromTick(Chords.GetTickPair()); var offsetPointLeft = new Point(newMousePosition.X + offset.X, mouseString - offset.Y); var offsetPointRight = new Point(newMousePosition.X + offset.X + screenPoint.TickLength, mouseString - offset.Y); int snapLeft; var snappedLeft = Owner.GetGridSnapPointFromClientPoint(offsetPointLeft, out snapLeft); int snapRight; var snappedRight = Owner.GetGridSnapPointFromClientPoint(offsetPointRight, out snapRight); if (snappedLeft && snappedRight) { if (mouseDelta.X < 0)// Math.Abs(offsetPointLeft.X - snapLeft) < Math.Abs(offsetPointRight.X - snapRight)) { newMousePosition.X = snapLeft - offset.X; } else { newMousePosition.X = snapRight - screenPoint.TickLength - offset.X; } } else if (snappedLeft) { newMousePosition.X = snapLeft - offset.X; } else if (snappedRight) { newMousePosition.X = snapRight - screenPoint.TickLength - offset.X; } } Owner.CurrentPastePoint.MousePos = new Point(newMousePosition.X, mouseString); Owner.CurrentPastePoint.MinChordX = newMousePosition.X; Owner.CurrentPastePoint.Offset = offset; Owner.CurrentPastePoint.MinNoteString = MinSelectionString; var pastePoint = Owner.CurrentPastePoint; var copyRange = Chords.GetTickPair(); var stringOffset = (pastePoint.MousePos.Y) - pastePoint.MinNoteString - pastePoint.Offset.Y; var startTick = Owner.GetTickFromClientPoint(pastePoint.MousePos.X + pastePoint.Offset.X); var pasteRange = new TickPair(startTick, startTick + copyRange.TickLength); var copyTime = Owner.GuitarTrack.TickToTime(copyRange); var pasteTime = Owner.GuitarTrack.TickToTime(pasteRange); pasteTime.TimeLength = copyTime.TimeLength; pasteRange.Up = Owner.GuitarTrack.TimeToTick(pasteTime.Up); pasteRange = Owner.SnapTickPairPro(pasteRange); foreach (var c in Chords) { var noteTime = Owner.GuitarTrack.TickToTime(c.TickPair); var delta = noteTime.Down - copyTime.Down; var startEndTick = new TickPair( Owner.GuitarTrack.TimeToTick(pasteTime.Down + delta), Owner.GuitarTrack.TimeToTick(pasteTime.Down + delta + c.TimeLength)); c.SetTicks(startEndTick); } }