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
5 changes: 3 additions & 2 deletions OpenUtau/Strings/Strings.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,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.messagebox.cancel">Cancel</system:String>
<system:String x:Key="dialogs.messagebox.copy">Copy error to clipboard</system:String>
<system:String x:Key="dialogs.messagebox.no">No</system:String>
Expand Down
18 changes: 13 additions & 5 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));

AddHandler(DragDrop.DropEvent, OnDrop);

Expand Down Expand Up @@ -1302,18 +1302,18 @@ public void OnWelcomeRecovery(object sender, RoutedEventArgs args) {
viewModel.OpenProject(new string[] { viewModel.RecoveryPath });
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"),
ThemeManager.GetString("dialogs.merge.caption"),
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 @@ -1360,6 +1360,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"),
ThemeManager.GetString("dialogs.merge.caption"),
MessageBox.MessageBoxButtons.YesNo);
if (res == MessageBox.MessageBoxResult.No) { return; }
}
DocManager.Inst.StartUndoGroup();
for (int i = selectedParts.Count - 1; i >= 0; i--) {
// The index will shift by removing a part on each loop
Expand Down
Loading