Skip to content
Open
Show file tree
Hide file tree
Changes from 3 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
5 changes: 3 additions & 2 deletions OpenUtau/Strings/Strings.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -99,8 +99,9 @@ OpenUtau aims to be an open source editing environment for UTAU community, with
<system:String x:Key="dialogs.installdependency.message">Installing </system:String>
<system:String x:Key="dialogs.installdll.caption">Installing phonemizer</system:String>
<system:String x:Key="dialogs.installdll.message">Installing </system:String>
<system:String x:Key="dialogs.merge.caption">Merging Parts</system:String>
<system:String x:Key="dialogs.merge.multitracks">Parts on different tracks cannot be merged.</system:String>
<system:String x:Key="dialogs.mergeparts.caption">Merging Parts</system:String>
<system:String x:Key="dialogs.mergeparts.multitracks">Parts on different tracks cannot be merged.</system:String>
<system:String x:Key="dialogs.mergeparts.overlap">Merged part will contain overlapping notes. Are you sure to continue?</system:String>
<system:String x:Key="dialogs.splitpart.caption">Splitting Part</system:String>
<system:String x:Key="dialogs.splitpart.intheway">There are one or more note(s) overlapping with the playhead.
Do you want to continue by splitting at the nearest position after current playhead with no notes in the way?</system:String>
Expand Down
16 changes: 12 additions & 4 deletions OpenUtau/Views/MainWindow.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public MainWindow() {
PartGotoFileCommand = ReactiveCommand.Create<UPart>(part => GotoFile(part));
PartReplaceAudioCommand = ReactiveCommand.Create<UPart>(part => ReplaceAudio(part));
PartTranscribeCommand = ReactiveCommand.Create<UPart>(part => Transcribe(part));
PartMergeCommand = ReactiveCommand.Create<UPart>(part => MergePart(part));
PartMergeCommand = ReactiveCommand.Create<UPart>(async part => await MergePart(part));
PartSplitCommand = ReactiveCommand.Create<UPart>(async part => await SplitPart(part));

AddHandler(DragDrop.DropEvent, OnDrop);
Expand Down Expand Up @@ -1568,17 +1568,17 @@ public void OnWelcomeRecovery(object sender, RoutedEventArgs args) {
viewModel.Page = 1;
}

void MergePart(UPart part) {
async Task MergePart(UPart part) {
List<UPart> selectedParts = viewModel.TracksViewModel.SelectedParts;
if (!selectedParts.All(p => p.trackNo.Equals(part.trackNo))) {
if (selectedParts.Count <= 1) { return; }
if (selectedParts.Any(p => p.trackNo != part.trackNo)) {
_ = MessageBox.Show(
this,
ThemeManager.GetString("dialogs.merge.multitracks"),
Comment thread
arx-ein marked this conversation as resolved.
Outdated
ThemeManager.GetString("dialogs.merge.caption"),
Comment thread
arx-ein marked this conversation as resolved.
Outdated
MessageBox.MessageBoxButtons.Ok);
return;
}
if (selectedParts.Count() <= 1) { return; }
List<UVoicePart> voiceParts = [];
foreach (UPart p in selectedParts) {
if (p is UVoicePart vp) {
Expand Down Expand Up @@ -1625,6 +1625,14 @@ void MergePart(UPart part) {
SkipPhonemizer = false
};
mergedPart.Validate(options, DocManager.Inst.Project, DocManager.Inst.Project.tracks[part.trackNo]);
if (mergedPart.notes.Any(n => n.OverlapError)) {
var res = await MessageBox.Show(
this,
ThemeManager.GetString("dialogs.merge.overlap"),
Comment thread
arx-ein marked this conversation as resolved.
Outdated
ThemeManager.GetString("dialogs.merge.caption"),
Comment thread
arx-ein marked this conversation as resolved.
Outdated
MessageBox.MessageBoxButtons.YesNo);
if (res == MessageBox.MessageBoxResult.No) { return; }
}
DocManager.Inst.StartUndoGroup("command.part.edit");
for (int i = selectedParts.Count - 1; i >= 0; i--) {
// The index will shift by removing a part on each loop
Expand Down
Loading