diff --git a/app/core.cpp b/app/core.cpp index fa19a60ad..61381f8aa 100644 --- a/app/core.cpp +++ b/app/core.cpp @@ -451,7 +451,7 @@ void Core::AddOpenProject(Project* p) emit ProjectOpened(p); } -void Core::AddOpenProjectFromTask(Task *task) +bool Core::AddOpenProjectFromTask(Task *task) { ProjectLoadBaseTask* load_task = static_cast(task); @@ -461,8 +461,12 @@ void Core::AddOpenProjectFromTask(Task *task) if (ValidateFootageInLoadedProject(project, load_task->GetFilenameProjectWasSavedAs())) { AddOpenProject(project); main_window_->LoadLayout(layout); + + return true; } else { delete project; + + return false; } } @@ -627,6 +631,26 @@ void Core::OpenStartupProject() } } +void Core::AddRecoveryProjectFromTask(Task *task) +{ + if (AddOpenProjectFromTask(task)) { + ProjectLoadBaseTask* load_task = static_cast(task); + + Project* project = load_task->GetLoadedProject(); + + // Clearing the filename will force the user to re-save it somewhere else + project->set_filename(QString()); + + // Forcing a UUID regeneration will prevent it from saving auto-recoveries in the same place + // the original project did + project->RegenerateUuid(); + + // Setting modified will ensure that the program doesn't close and lose the project without + // prompting the user first + project->set_modified(true); + } +} + void Core::StartGUI(bool full_screen) { // Set UI style @@ -1031,7 +1055,7 @@ void Core::ShowStatusBarMessage(const QString &s) void Core::OpenRecoveryProject(const QString &filename) { - OpenProjectInternal(filename); + OpenProjectInternal(filename, true); } void Core::CheckForAutoRecoveries() @@ -1119,7 +1143,7 @@ void Core::PushRecentlyOpenedProject(const QString& s) emit OpenRecentListChanged(); } -void Core::OpenProjectInternal(const QString &filename) +void Core::OpenProjectInternal(const QString &filename, bool recovery_project) { // See if this project is open already foreach (Project* p, open_projects_) { @@ -1150,7 +1174,11 @@ void Core::OpenProjectInternal(const QString &filename) TaskDialog* task_dialog = new TaskDialog(load_task, tr("Load Project"), main_window()); - connect(task_dialog, &TaskDialog::TaskSucceeded, this, &Core::AddOpenProjectFromTask); + if (recovery_project) { + connect(task_dialog, &TaskDialog::TaskSucceeded, this, &Core::AddRecoveryProjectFromTask); + } else { + connect(task_dialog, &TaskDialog::TaskSucceeded, this, &Core::AddOpenProjectFromTask); + } task_dialog->open(); } diff --git a/app/core.h b/app/core.h index 2fbeb7b92..c339d9781 100644 --- a/app/core.h +++ b/app/core.h @@ -572,7 +572,7 @@ private slots: */ void AddOpenProject(olive::Project* p); - void AddOpenProjectFromTask(Task* task); + bool AddOpenProjectFromTask(Task* task); void ImportTaskComplete(Task *task); @@ -584,10 +584,12 @@ private slots: void OpenStartupProject(); + void AddRecoveryProjectFromTask(Task* task); + /** * @brief Internal project open */ - void OpenProjectInternal(const QString& filename); + void OpenProjectInternal(const QString& filename, bool recovery_project = false); }; diff --git a/app/project/project.cpp b/app/project/project.cpp index 69adafbbe..979f87f24 100644 --- a/app/project/project.cpp +++ b/app/project/project.cpp @@ -37,7 +37,7 @@ Project::Project() : autorecovery_saved_(true) { // Generate UUID for this project - uuid_ = QUuid::createUuid(); + RegenerateUuid(); // Adds a color manager "node" to this project so that it synchronizes color_manager_ = new ColorManager(); @@ -288,6 +288,11 @@ QString Project::cache_path() const return DiskManager::instance()->GetDefaultCachePath(); } +void Project::RegenerateUuid() +{ + uuid_ = QUuid::createUuid(); +} + void Project::ColorManagerValueChanged(const NodeInput &input, const TimeRange &range) { Q_UNUSED(range) diff --git a/app/project/project.h b/app/project/project.h index 85834a001..c0bbb0c4b 100644 --- a/app/project/project.h +++ b/app/project/project.h @@ -83,6 +83,8 @@ public: return uuid_; } + void RegenerateUuid(); + signals: void NameChanged();