Skip to content
Merged
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
20 changes: 20 additions & 0 deletions OpenUtau.Core/Commands/ExpCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,20 @@ public ExpCommand(UVoicePart part) {
}

public class SetNoteExpressionCommand : ExpCommand {
static readonly HashSet<string> needsPhonemizer = new HashSet<string> {
Format.Ustx.ALT, Format.Ustx.CLR, Format.Ustx.SHFT, Format.Ustx.VEL
};

public readonly UProject project;
public readonly UTrack track;
public readonly float?[] newValue;
public readonly float?[] oldValue;
public override ValidateOptions ValidateOptions
=> new ValidateOptions {
SkipTiming = true,
Part = Part,
SkipPhonemizer = !needsPhonemizer.Contains(Key),
};
public SetNoteExpressionCommand(UProject project, UTrack track, UVoicePart part, UNote note, string abbr, float?[] values) : base(part) {
this.project = project;
this.track = track;
Expand All @@ -39,11 +49,21 @@ public SetNoteExpressionCommand(UProject project, UTrack track, UVoicePart part,
}

public class SetNotesSameExpressionCommand : ExpCommand {
static readonly HashSet<string> needsPhonemizer = new HashSet<string> {
Format.Ustx.ALT, Format.Ustx.CLR, Format.Ustx.SHFT, Format.Ustx.VEL
};

public readonly UProject project;
public readonly UTrack track;
public readonly UNote[] notes;
public readonly float? newValue;
public readonly float?[][] oldValue;
public override ValidateOptions ValidateOptions
=> new ValidateOptions {
SkipTiming = true,
Part = Part,
SkipPhonemizer = !needsPhonemizer.Contains(Key),
};
public SetNotesSameExpressionCommand(UProject project, UTrack track, UVoicePart part, IEnumerable<UNote> notes, string abbr, float? value) : base(part) {
this.project = project;
this.track = track;
Expand Down
19 changes: 7 additions & 12 deletions OpenUtau.Core/Ustx/UNote.cs
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,8 @@ public void SetExpression(UProject project, UTrack track, string abbr, float?[]
return;
}

phonemeExpressions.RemoveAll(exp => exp.descriptor?.abbr == abbr);

int indexes = phonemeIndexes.LastOrDefault() + 1;
for (int i = 0; i < indexes; i++) {
if (i == 0 || phonemeIndexes.Contains(i)) {
Expand All @@ -229,21 +231,14 @@ public void SetExpression(UProject project, UTrack track, string abbr, float?[]
} else {
value = values.Last();
}

if (value == null) {
phonemeExpressions.RemoveAll(exp => exp.descriptor?.abbr == abbr && exp.index == i);
continue;
}
var phonemeExp = phonemeExpressions.FirstOrDefault(exp => exp.descriptor?.abbr == abbr && exp.index == i);
if (phonemeExp != null) {
phonemeExp.descriptor = trackExp.descriptor;
phonemeExp.value = (float)value;
} else {
phonemeExpressions.Add(new UExpression(trackExp.descriptor) {
index = i,
value = (float)value,
});
}

phonemeExpressions.Add(new UExpression(trackExp.descriptor) {
index = i,
value = (float)value,
});
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion OpenUtau.Core/Ustx/UPhoneme.cs
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ public void SetExpression(UProject project, UTrack track, string abbr, float? va
}
var note = Parent.Extends ?? Parent;
if (value == null) {
note.phonemeExpressions.RemoveAll(exp => exp.descriptor?.abbr == abbr && exp.index == index);
note.phonemeExpressions.RemoveAll(exp => exp.descriptor?.abbr == abbr && exp.index == index || (exp.index != null && !note.phonemeIndexes.Contains((int)exp.index)));
} else {
var phonemeExp = note.phonemeExpressions.FirstOrDefault(exp => exp.descriptor?.abbr == abbr && exp.index == index);
if (phonemeExp != null) {
Expand Down
3 changes: 2 additions & 1 deletion OpenUtau/Controls/NotePropertyExpression.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
Name="slider"/>
<ComboBox Grid.Column="1" Grid.ColumnSpan="4" ItemsSource="{Binding Options}"
SelectedIndex="{Binding SelectedOption}" MinWidth="120" IsVisible="{Binding IsOptions}" VerticalAlignment="Center" IsEnabled="{Binding IsNoteSelected}"
IsDropDownOpen="{Binding DropDownOpen, Mode=OneWayToSource}"/>
IsDropDownOpen="{Binding DropDownOpen, Mode=OneWayToSource}"
Name="comboBox"/>
</Grid>
</UserControl>
48 changes: 30 additions & 18 deletions OpenUtau/Controls/NotePropertyExpression.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,48 +14,39 @@ public NotePropertyExpression() {
slider.AddHandler(PointerPressedEvent, SliderPointerPressed, RoutingStrategies.Tunnel);
slider.AddHandler(PointerReleasedEvent, SliderPointerReleased, RoutingStrategies.Tunnel);
slider.AddHandler(PointerMovedEvent, SliderPointerMoved, RoutingStrategies.Tunnel);
comboBox.AddHandler(PointerPressedEvent, OnComboBoxPointerPressed, RoutingStrategies.Tunnel);
}

// textbox
private string textBoxValue = string.Empty;
void OnTextBoxGotFocus(object? sender, GotFocusEventArgs args) {
Log.Debug("Note property textbox got focus");
if (sender is TextBox text) {
textBoxValue = text.Text ?? string.Empty;
if (sender is TextBox textBox) {
textBoxValue = textBox.Text ?? string.Empty;
}
}
void OnTextBoxLostFocus(object? sender, RoutedEventArgs args) {
Log.Debug("Note property textbox lost focus");
if (sender is TextBox textBox && textBoxValue != textBox.Text) {
if (DataContext is NotePropertyExpViewModel ViewModel) {
DocManager.Inst.StartUndoGroup();
NotePropertiesViewModel.PanelControlPressed = true;
ViewModel.SetNumericalExpressions(textBox.Text);
NotePropertiesViewModel.PanelControlPressed = false;
DocManager.Inst.EndUndoGroup();
}
SetNumericalExpressions(textBox.Text);
}
}

// slider
void SliderPointerPressed(object? sender, PointerPressedEventArgs args) {
Log.Debug("Slider pressed");
Log.Debug("Note property slider pressed");
if (sender is Control control) {
var point = args.GetCurrentPoint(control);
if (point.Properties.IsLeftButtonPressed) {
DocManager.Inst.StartUndoGroup();
NotePropertiesViewModel.PanelControlPressed = true;
} else if (point.Properties.IsRightButtonPressed) {
if (DataContext is NotePropertyExpViewModel ViewModel) {
DocManager.Inst.StartUndoGroup();
NotePropertiesViewModel.PanelControlPressed = true;
ViewModel.SetNumericalExpressions(null);
NotePropertiesViewModel.PanelControlPressed = false;
DocManager.Inst.EndUndoGroup();
}
SetNumericalExpressions(null);
}
}
}
void SliderPointerReleased(object? sender, PointerReleasedEventArgs args) {
Log.Debug("Slider released");
Log.Debug("Note property slider released");
if (NotePropertiesViewModel.PanelControlPressed) {
if (sender is Slider slider && DataContext is NotePropertyExpViewModel ViewModel) {
ViewModel.SetNumericalExpressions((float)slider.Value);
Expand All @@ -69,5 +60,26 @@ void SliderPointerMoved(object? sender, PointerEventArgs args) {
ViewModel.SetNumericalExpressions((float)slider.Value);
}
}

void OnComboBoxPointerPressed(object? sender, PointerPressedEventArgs args) {
Log.Debug("Note property textbox pressed");
if (sender is ComboBox comboBox) {
var point = args.GetCurrentPoint(comboBox);
if (point.Properties.IsRightButtonPressed) {
SetNumericalExpressions(null);
args.Handled = true;
}
}
}

private void SetNumericalExpressions(string? expression) {
if (DataContext is NotePropertyExpViewModel viewModel) {
DocManager.Inst.StartUndoGroup();
NotePropertiesViewModel.PanelControlPressed = true;
viewModel.SetNumericalExpressions(expression);
NotePropertiesViewModel.PanelControlPressed = false;
DocManager.Inst.EndUndoGroup();
}
}
}
}
8 changes: 7 additions & 1 deletion OpenUtau/ViewModels/NotePropertiesViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ private void AttachExpressions() {

foreach (NotePropertyExpViewModel exp in Expressions) {
exp.IsNoteSelected = true;
var phonemeExpression = note.phonemeExpressions.FirstOrDefault(e => e.abbr == exp.abbr);
var phonemeExpression = note.phonemeExpressions.FirstOrDefault(e => e.abbr == exp.abbr && e.index == 0);
if (phonemeExpression != null) {
if (exp.IsNumerical) {
exp.Value = phonemeExpression.value;
Expand Down Expand Up @@ -470,12 +470,18 @@ public void SetVibratoEnable() {
public void SetNumericalExpressionsChanges(string abbr, float? value) {
if (AllowNoteEdit && Part != null && selectedNotes.Count > 0) {
var track = DocManager.Inst.Project.tracks[Part.trackNo];
if (track.TryGetExpression(DocManager.Inst.Project, abbr, out UExpression expression) && expression.value == value) {
value = null;
}
DocManager.Inst.ExecuteCmd(new SetNotesSameExpressionCommand(DocManager.Inst.Project, track, Part, selectedNotes, abbr, value));
}
}
public void SetOptionalExpressionsChanges(string abbr, int? value) {
if (!NoteLoading && Part != null && selectedNotes.Count > 0) {
var track = DocManager.Inst.Project.tracks[Part.trackNo];
if (track.TryGetExpression(DocManager.Inst.Project, abbr, out UExpression expression) && expression.value == value) {
value = null;
}
DocManager.Inst.StartUndoGroup();
DocManager.Inst.ExecuteCmd(new SetNotesSameExpressionCommand(DocManager.Inst.Project, track, Part, selectedNotes, abbr, value));
DocManager.Inst.EndUndoGroup();
Expand Down