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.