diff --git a/OpenUtau/Strings/Strings.axaml b/OpenUtau/Strings/Strings.axaml index d0d52472b..4e78128c6 100644 --- a/OpenUtau/Strings/Strings.axaml +++ b/OpenUtau/Strings/Strings.axaml @@ -65,6 +65,10 @@ OpenUtau aims to be an open source editing environment for UTAU community, with Voice color remapping This singer has no voice color Applies to all notes in this track: + Project Import + Files to import: + Import as Project + Import as Tracks Error Error Details diff --git a/OpenUtau/Views/MainWindow.axaml.cs b/OpenUtau/Views/MainWindow.axaml.cs index 57c883109..d38910800 100644 --- a/OpenUtau/Views/MainWindow.axaml.cs +++ b/OpenUtau/Views/MainWindow.axaml.cs @@ -885,29 +885,83 @@ async void OnDrop(object? sender, DragEventArgs args) { //If multiple project/audio files are dropped, open/import them all. if (ProjectExts.Contains(FirstExt) || AudioExts.Contains(FirstExt)) { var projectFiles = supportedFiles.Where(file => ProjectExts.Contains(Path.GetExtension(file).ToLower())).ToArray(); - viewModel.Page = 1; if (projectFiles.Length > 0) { - try { - var loadedProjects = Formats.ReadProjects(files); - // Imports tempo for new projects, otherwise asks the user. - bool importTempo = DocManager.Inst.Project.parts.Count == 0; - if (!importTempo && loadedProjects[0].tempos.Count > 0) { - var tempoString = string.Join("\n", - loadedProjects[0].tempos - .Select(tempo => $"position: {tempo.position}, tempo: {tempo.bpm}") - ); - // Ask the user - var result = await MessageBox.Show( - this, - ThemeManager.GetString("dialogs.importtracks.importtempo") + "\n" + tempoString, - ThemeManager.GetString("dialogs.importtracks.caption"), - MessageBox.MessageBoxButtons.YesNo); - importTempo = result == MessageBox.MessageBoxResult.Yes; + bool openAsProject = true; + + if (viewModel.Page == 1) { + bool cancelled = true; + var openAs = new MessageBox() { + Title = ThemeManager.GetString("dialogs.projectimport.caption"), + Text = { + Text = $"{ThemeManager.GetString("dialogs.projectimport.message")}\n{string.Join("\n", projectFiles)}" + } + }; + + var btnAsProject = new Button() { + Content = ThemeManager.GetString("dialogs.projectimport.asproject") + }; + btnAsProject.Click += async (s, e) => { + await AskIfSaveAndContinue(); + cancelled = false; + openAsProject = true; + openAs.Close(); + }; + openAs.Buttons.Children.Add(btnAsProject); + + var btnAsTracks = new Button() { + Content = ThemeManager.GetString("dialogs.projectimport.astracks") + }; + btnAsTracks.Click += (s, e) => { + cancelled = false; + openAsProject = false; + openAs.Close(); + }; + openAs.Buttons.Children.Add(btnAsTracks); + + var tcs = new TaskCompletionSource(); + openAs.Closed += delegate { + if (cancelled) { + return; + } + tcs.SetResult(); + }; + openAs.Show(); + + await tcs.Task; + } + + if (openAsProject) { + try { + viewModel.OpenProject(projectFiles); + } catch (Exception e) { + Log.Error(e, $"Failed to open files {string.Join("\n", projectFiles)}"); + _ = await MessageBox.ShowError(this, + new MessageCustomizableException($"Failed to open files {string.Join("\n", projectFiles)}", + $":\n{string.Join("\n", projectFiles)}", e)); + } + } else { + try { + var loadedProjects = Formats.ReadProjects(projectFiles); + // Imports tempo for new projects, otherwise asks the user. + bool importTempo = DocManager.Inst.Project.parts.Count == 0; + if (!importTempo && loadedProjects[0].tempos.Count > 0) { + var tempoString = string.Join("\n", + loadedProjects[0].tempos + .Select(tempo => $"position: {tempo.position}, tempo: {tempo.bpm}") + ); + // Ask the user + var result = await MessageBox.Show( + this, + ThemeManager.GetString("dialogs.importtracks.importtempo") + "\n" + tempoString, + ThemeManager.GetString("dialogs.importtracks.caption"), + MessageBox.MessageBoxButtons.YesNo); + importTempo = result == MessageBox.MessageBoxResult.Yes; + } + viewModel.ImportTracks(loadedProjects, importTempo); + } catch (Exception e) { + Log.Error(e, "Failed to import project"); + _ = await MessageBox.ShowError(this, new MessageCustomizableException("Failed to import files", "", e)); } - viewModel.ImportTracks(loadedProjects, importTempo); - } catch (Exception e) { - Log.Error(e, "Failed to import project"); - _ = await MessageBox.ShowError(this, new MessageCustomizableException("Failed to import files", "", e)); } } var audioFiles = supportedFiles.Where(file => AudioExts.Contains(Path.GetExtension(file).ToLower())).ToArray(); @@ -919,6 +973,7 @@ async void OnDrop(object? sender, DragEventArgs args) { _ = await MessageBox.ShowError(this, new MessageCustomizableException("Failed to import audio", "", e)); } } + viewModel.Page = 1; return; } // Otherwise, only one installer file is handled at a time.