diff --git a/OpenUtau/Controls/PianoRoll.axaml.cs b/OpenUtau/Controls/PianoRoll.axaml.cs index 1d5a660fe..da70d5d53 100644 --- a/OpenUtau/Controls/PianoRoll.axaml.cs +++ b/OpenUtau/Controls/PianoRoll.axaml.cs @@ -682,6 +682,10 @@ public void NotesCanvasPointerPressed(object sender, PointerPressedEventArgs arg Cursor = ViewConstants.cursorHand; } if (editState != null) { + editState.altShiftHeld = args.KeyModifiers == (KeyModifiers.Alt | KeyModifiers.Shift); + editState.shiftHeld = args.KeyModifiers == KeyModifiers.Shift; + editState.ctrlHeld = args.KeyModifiers == cmdKey; + editState.altHeld = args.KeyModifiers == KeyModifiers.Alt; editState.Begin(point.Pointer, point.Position); editState.Update(point.Pointer, point.Position); } diff --git a/OpenUtau/Views/NoteEditStates.cs b/OpenUtau/Views/NoteEditStates.cs index 2b0c6c20a..73a103c39 100644 --- a/OpenUtau/Views/NoteEditStates.cs +++ b/OpenUtau/Views/NoteEditStates.cs @@ -379,7 +379,7 @@ public override void Update(IPointer pointer, Point point) { return; } // Resize neighbor note - if (resizeNeighbor && neighborNote != null) { + if (resizeNeighbor && neighborNote != null && !shiftHeld) { int cutDuration = deltaDuration; if (!this.resizeNeighbor && deltaDuration < 0) { cutDuration = Math.Max(deltaDuration, neighborNote.duration - neighborNoteLength); @@ -398,6 +398,9 @@ public override void Update(IPointer pointer, Point point) { if (notesVm.Selection.Count <= 1) { if (fromStart) { DocManager.Inst.ExecuteCmd(new MoveNoteCommand(part, note, -deltaDuration, 0)); + } else if (shiftHeld) { + var rippleNotes = part.notes.Where(n => n.position > note.position).ToList(); + DocManager.Inst.ExecuteCmd(new MoveNoteCommand(part, rippleNotes, deltaDuration, 0)); } DocManager.Inst.ExecuteCmd(new ResizeNoteCommand(part, note, deltaDuration)); } else {