Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions OpenUtau.Core/Util/PianoRollEditTool.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;

namespace OpenUtau.Core.Util {
public enum EditTools {
CursorTool = 0,
PenTool = 10,
PenPlusTool = 11,
EraserTool = 20,
DrawPitchTool = 30,
OverwritePitchTool = 31,
DrawLinePitchTool = 40,
OverwriteLinePitchTool = 41,
KnifeTool = 50
}

public class EditTool {
public int BaseTool { get; set; } = 1;
public int PenToolVariation { get; set; } = 0;
public int DrawPitchToolVariation { get; set; } = 0;
public int DrawLinePitchToolVariation { get; set; } = 0;

[JsonIgnore]
public EditTools CurrentTool {
get {
switch (BaseTool) {
case 1:
if (PenToolVariation == 1) {
return EditTools.PenPlusTool;
} else {
return EditTools.PenTool;
}
case 3:
if (DrawPitchToolVariation == 1) {
return EditTools.OverwritePitchTool;
} else {
return EditTools.DrawPitchTool;
}
case 4:
if (DrawLinePitchToolVariation == 1) {
return EditTools.OverwriteLinePitchTool;
} else {
return EditTools.DrawLinePitchTool;
}
default:
return (EditTools)(BaseTool * 10);
}
}
}
[JsonIgnore] public bool IsPitchTool => BaseTool == 3 || BaseTool == 4;
public bool IsMatch(IEnumerable<EditTools> tools) => tools.Contains(CurrentTool);
}
}
2 changes: 1 addition & 1 deletion OpenUtau.Core/Util/Preferences.cs
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,6 @@ public class SerializablePreferences {
public bool ShowPrefs = true;
public bool ShowTips = true;
public string ThemeName = "Light";
public bool PenPlusDefault = false;
public int DegreeStyle;
public bool UseTrackColor = false;
public bool ClearCacheOnQuit = false;
Expand Down Expand Up @@ -181,6 +180,7 @@ public class SerializablePreferences {
public bool ShowPortrait = true;
public bool ShowIcon = true;
public bool ShowGhostNotes = true;
public EditTool EditTool = new EditTool();
public bool PlayTone = true;
public bool ShowVibrato = true;
public bool ShowPitch = true;
Expand Down
243 changes: 58 additions & 185 deletions OpenUtau/Controls/PianoRoll.axaml

Large diffs are not rendered by default.

125 changes: 82 additions & 43 deletions OpenUtau/Controls/PianoRoll.axaml.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Reactive;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Avalonia;
using Avalonia.Controls;
Expand Down Expand Up @@ -50,6 +49,12 @@ public PianoRoll(PianoRollViewModel model) {
InitializeComponent();
DataContext = ViewModel = model;
ValueTip.IsVisible = false;
SetPenToolIcon();
SetDrawPitchToolIcon();
SetDrawLinePitchToolIcon();
penTool.AddHandler(PointerPressedEvent, OnToolButtonPointerPressed, RoutingStrategies.Tunnel | RoutingStrategies.Bubble, true);
drawPitchTool.AddHandler(PointerPressedEvent, OnToolButtonPointerPressed, RoutingStrategies.Tunnel | RoutingStrategies.Bubble, true);
drawLinePitchTool.AddHandler(PointerPressedEvent, OnToolButtonPointerPressed, RoutingStrategies.Tunnel | RoutingStrategies.Bubble, true);
}

public void InitializePianoRollWindowAsync() {
Expand Down Expand Up @@ -325,6 +330,56 @@ void OnMenuHidePianoRoll(object sender, RoutedEventArgs args) {
}
}

// Edit Tools
private CancellationTokenSource? _longPressCts;
private async void OnToolButtonPointerPressed(object? sender, PointerPressedEventArgs args) {
if (!args.GetCurrentPoint(this).Properties.IsLeftButtonPressed) return;

if (sender is Control control) {
_longPressCts = new CancellationTokenSource();
try {
await Task.Delay(500, _longPressCts.Token);
if (_longPressCts != null && !_longPressCts.IsCancellationRequested) {
FlyoutBase.ShowAttachedFlyout(control);
}
} catch {
// don't open the flyout
}
}
}
private void OnToolButtonPointerReleased(object? sender, PointerReleasedEventArgs args) {
_longPressCts?.Cancel();
_longPressCts?.Dispose();
_longPressCts = null;
}
void PenToolListBox_PointerReleased(object? sender, PointerReleasedEventArgs args) {
FlyoutBase.GetAttachedFlyout(penTool)?.Hide(); ;
SetPenToolIcon();
}
void DrawPitchToolListBox_PointerReleased(object? sender, PointerReleasedEventArgs args) {
FlyoutBase.GetAttachedFlyout(drawPitchTool)?.Hide();
SetDrawPitchToolIcon();
}
void DrawLinePitchToolListBox_PointerReleased(object? sender, PointerReleasedEventArgs args) {
FlyoutBase.GetAttachedFlyout(drawLinePitchTool)?.Hide();
SetDrawLinePitchToolIcon();
}
void SetPenToolIcon() {
penTool.Classes.Remove("penTool");
penTool.Classes.Remove("penPlusTool");
penTool.Classes.Add(ViewModel.EditTool.PenToolVariation == 1 ? "penPlusTool" : "penTool");
}
void SetDrawPitchToolIcon() {
drawPitchTool.Classes.Remove("drawPitchTool");
drawPitchTool.Classes.Remove("overwritePitchTool");
drawPitchTool.Classes.Add(ViewModel.EditTool.DrawPitchToolVariation == 1 ? "overwritePitchTool" : "drawPitchTool");
}
void SetDrawLinePitchToolIcon() {
drawLinePitchTool.Classes.Remove("drawLinePitchTool");
drawLinePitchTool.Classes.Remove("overwriteLinePitchTool");
drawLinePitchTool.Classes.Add(ViewModel.EditTool.DrawLinePitchToolVariation == 1 ? "overwriteLinePitchTool" : "drawLinePitchTool");
}

void SearchNote() {
if (ViewModel.NotesViewModel.Part == null || ViewModel.NotesViewModel.Part.notes.Count == 0) {
return;
Expand Down Expand Up @@ -591,25 +646,25 @@ public void NotesCanvasPointerPressed(object sender, PointerPressedEventArgs arg
}

private void NotesCanvasLeftPointerPressed(Control control, PointerPoint point, PointerPressedEventArgs args) {
if (ViewModel.NotesViewModel.DrawPitchTool || ViewModel.NotesViewModel.DrawLinePitchTool || ViewModel.NotesViewModel.OverwritePitchTool || ViewModel.NotesViewModel.OverwriteLinePitchTool) {
if (ViewModel.EditTool.IsPitchTool) {
ViewModel.NotesViewModel.DeselectNotes();
if (args.KeyModifiers == KeyModifiers.Alt) {
editState = new SmoothenPitchState(control, ViewModel, this);
return;
} else if (args.KeyModifiers != cmdKey) {
if (ViewModel.NotesViewModel.DrawPitchTool) {
if (ViewModel.EditTool.CurrentTool == EditTools.DrawPitchTool) {
editState = new DrawPitchState(control, ViewModel, this);
} else if (ViewModel.NotesViewModel.DrawLinePitchTool) {
} else if (ViewModel.EditTool.CurrentTool == EditTools.DrawLinePitchTool) {
editState = new DrawLinePitchState(control, ViewModel, this);
} else if (ViewModel.NotesViewModel.OverwritePitchTool) {
} else if (ViewModel.EditTool.CurrentTool == EditTools.OverwritePitchTool) {
editState = new OverwritePitchState(control, ViewModel, this);
} else if (ViewModel.NotesViewModel.OverwriteLinePitchTool) {
} else if (ViewModel.EditTool.CurrentTool == EditTools.OverwriteLinePitchTool) {
editState = new OverwriteAdaptivePitchState(control, ViewModel, this);
}
return;
}
}
if (ViewModel.NotesViewModel.EraserTool && args.KeyModifiers != cmdKey) {
if (ViewModel.EditTool.CurrentTool == EditTools.EraserTool && args.KeyModifiers != cmdKey) {
ViewModel.NotesViewModel.DeselectNotes();
editState = new NoteEraseEditState(control, ViewModel, this, MouseButton.Left);
Cursor = ViewConstants.cursorNo;
Expand Down Expand Up @@ -666,7 +721,7 @@ private void NotesCanvasLeftPointerPressed(Control control, PointerPoint point,
ViewModel.NotesViewModel.ToggleSelectNote(noteHitInfo.note);
} else if (args.KeyModifiers == KeyModifiers.Shift) {
ViewModel.NotesViewModel.SelectNotesUntil(noteHitInfo.note);
} else if (ViewModel.NotesViewModel.KnifeTool) {
} else if (ViewModel.EditTool.CurrentTool == EditTools.KnifeTool) {
ViewModel.NotesViewModel.DeselectNotes();
editState = new NoteSplitEditState(
control, ViewModel, this, noteHitInfo.note);
Expand All @@ -676,7 +731,7 @@ private void NotesCanvasLeftPointerPressed(Control control, PointerPoint point,
}
return;
}
if (ViewModel.NotesViewModel.CursorTool || args.KeyModifiers == cmdKey) {
if (ViewModel.EditTool.CurrentTool == EditTools.CursorTool || args.KeyModifiers == cmdKey) {
if (args.KeyModifiers == KeyModifiers.None) {
// New selection.
ViewModel.NotesViewModel.DeselectNotes();
Expand All @@ -691,8 +746,7 @@ private void NotesCanvasLeftPointerPressed(Control control, PointerPoint point,
return;
}
ViewModel.NotesViewModel.DeselectNotes();
} else if (ViewModel.NotesViewModel.PenTool ||
ViewModel.NotesViewModel.PenPlusTool) {
} else if (ViewModel.EditTool.IsMatch([EditTools.PenTool, EditTools.PenPlusTool])) {
ViewModel.NotesViewModel.DeselectNotes();
editState = new NoteDrawEditState(control, ViewModel, this, ViewModel.NotesViewModel.PlayTone);
}
Expand All @@ -703,7 +757,7 @@ private void NotesCanvasRightPointerPressed(Control control, PointerPoint point,
ViewModel.NotesContextMenuItems.Clear();
}
var selectedNotes = ViewModel.NotesViewModel.Selection.ToList();
if (ViewModel.NotesViewModel.DrawPitchTool || ViewModel.NotesViewModel.DrawLinePitchTool || ViewModel.NotesViewModel.OverwritePitchTool || ViewModel.NotesViewModel.OverwriteLinePitchTool) {
if (ViewModel.EditTool.IsPitchTool) {
editState = new ResetPitchState(control, ViewModel, this);
return;
}
Expand Down Expand Up @@ -767,7 +821,7 @@ private void NotesCanvasRightPointerPressed(Control control, PointerPoint point,
return;
}
}
if (ViewModel.NotesViewModel.CursorTool || ViewModel.NotesViewModel.PenTool || ViewModel.NotesViewModel.KnifeTool) {
if (ViewModel.EditTool.IsMatch([EditTools.CursorTool, EditTools.PenTool, EditTools.KnifeTool])) {
var hitInfo = ViewModel.NotesViewModel.HitTest.HitTestNote(point.Position);
var vibHitInfo = ViewModel.NotesViewModel.HitTest.HitTestVibrato(point.Position);
if ((hitInfo.hitBody && hitInfo.note != null) || vibHitInfo.hit) {
Expand Down Expand Up @@ -831,7 +885,7 @@ private void NotesCanvasRightPointerPressed(Control control, PointerPoint point,
} else {
ViewModel.NotesViewModel.DeselectNotes();
}
} else if (ViewModel.NotesViewModel.EraserTool || ViewModel.NotesViewModel.PenPlusTool) {
} else if (ViewModel.EditTool.IsMatch([EditTools.EraserTool, EditTools.PenPlusTool])) {
ViewModel.NotesViewModel.DeselectNotes();
editState = new NoteEraseEditState(control, ViewModel, this, MouseButton.Right);
Cursor = ViewConstants.cursorNo;
Expand All @@ -856,7 +910,7 @@ public void NotesCanvasPointerMoved(object sender, PointerEventArgs args) {
if (ViewModel?.NotesViewModel?.HitTest == null) {
return;
}
if((ViewModel.NotesViewModel.DrawPitchTool || ViewModel.NotesViewModel.DrawLinePitchTool || ViewModel.NotesViewModel.OverwritePitchTool || ViewModel.NotesViewModel.OverwriteLinePitchTool || ViewModel.NotesViewModel.EraserTool) && args.KeyModifiers != cmdKey) {
if (ViewModel.EditTool.IsMatch([EditTools.DrawPitchTool, EditTools.DrawLinePitchTool, EditTools.OverwritePitchTool, EditTools.OverwriteLinePitchTool, EditTools.EraserTool]) && args.KeyModifiers != cmdKey) {
Cursor = null;
return;
}
Expand All @@ -881,7 +935,7 @@ public void NotesCanvasPointerMoved(object sender, PointerEventArgs args) {
Cursor = ViewConstants.cursorSizeWE;
return;
}
if (!noteHitInfo.hitBody && (ViewModel.NotesViewModel.CursorTool || args.KeyModifiers == cmdKey)) {
if (!noteHitInfo.hitBody && (ViewModel.EditTool.CurrentTool == EditTools.CursorTool || args.KeyModifiers == cmdKey)) {
Cursor = ViewConstants.cursorCross;
return;
}
Expand Down Expand Up @@ -1327,9 +1381,6 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
return true;
}

string mainPenIdx = Preferences.Default.PenPlusDefault ? "2+" : "2";
string altPenIdx = Preferences.Default.PenPlusDefault ? "2" : "2+";

switch (args.Key) {
#region document keys
case Key.Space:
Expand Down Expand Up @@ -1388,7 +1439,7 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
// TOOL SELECT
case Key.D1:
if (isNone) {
notesVm.SelectToolCommand?.Execute("1").Subscribe();
ViewModel.ToolIndex = 0;
return true;
}
if (isAlt) {
Expand All @@ -1398,21 +1449,17 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
break;
case Key.D2:
if (isNone) {
notesVm.SelectToolCommand?.Execute(mainPenIdx).Subscribe();
ViewModel.ToolIndex = 1;
return true;
}
if (isAlt) {
expSelector2?.SelectExp();
return true;
}
if (isCtrl) {
notesVm.SelectToolCommand?.Execute(altPenIdx).Subscribe();
return true;
}
break;
case Key.D3:
if (isNone) {
notesVm.SelectToolCommand?.Execute("3").Subscribe();
ViewModel.ToolIndex = 2;
return true;
}
if (isAlt) {
Expand All @@ -1422,29 +1469,17 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
break;
case Key.D4:
if (isNone) {
notesVm.SelectToolCommand?.Execute("4").Subscribe();
ViewModel.ToolIndex = 3;
return true;
}
if (isAlt) {
expSelector4?.SelectExp();
return true;
}
if (isBoth) {
notesVm.SelectToolCommand?.Execute("4+++").Subscribe();
return true;
}
if (isCtrl) {
notesVm.SelectToolCommand?.Execute("4+").Subscribe();
return true;
}
if (isShift) {
notesVm.SelectToolCommand?.Execute("4++").Subscribe();
return true;
}
break;
case Key.D5:
if (isNone) {
notesVm.SelectToolCommand?.Execute("5").Subscribe();
ViewModel.ToolIndex = 4;
return true;
}
if (isAlt) {
Expand All @@ -1453,6 +1488,10 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
}
break;
case Key.D6:
if (isNone) {
ViewModel.ToolIndex = 5;
return true;
}
if (isAlt) {
expSelector6?.SelectExp();
return true;
Expand Down Expand Up @@ -1890,14 +1929,14 @@ bool OnKeyExtendedHandler(KeyEventArgs args) {
}
}
break;
case Key.PageDown: {
case Key.PageDown: {
if (isNone) {
MoveToNextPart(true);
return true;
}
}
break;
#endregion
#endregion
}
return false;
}
Expand Down
Loading
Loading