From afe73441d22cb547ce2dbbf064c35c15734a9426 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 19 Nov 2018 09:51:36 +1100 Subject: [PATCH] improved autorecovery system --- mainwindow.cpp | 8 ++++---- mainwindow.h | 6 +++--- panels/project.cpp | 24 +++++++++++++++++++++--- panels/project.h | 3 ++- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/mainwindow.cpp b/mainwindow.cpp index bfb29e6a7..a0a584235 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -41,7 +41,7 @@ #include #include -QMainWindow* mainWindow; +MainWindow* mainWindow; #define OLIVE_FILE_FILTER "Olive Project (*.ove)" @@ -184,7 +184,7 @@ MainWindow::MainWindow(QWidget *parent) : if (QFile::exists(autorecovery_filename)) { if (QMessageBox::question(NULL, "Auto-recovery", "Olive didn't close properly and an autorecovery file was detected. Would you like to open it?", QMessageBox::Yes, QMessageBox::No) == QMessageBox::Yes) { updateTitle(autorecovery_filename); - panel_project->load_project(); + panel_project->load_project(true); } } autorecovery_timer.setInterval(60000); @@ -487,7 +487,7 @@ void MainWindow::on_action_Open_Project_triggered() QString fn = QFileDialog::getOpenFileName(this, "Open Project...", "", OLIVE_FILE_FILTER); if (!fn.isEmpty() && can_close_project()) { updateTitle(fn); - panel_project->load_project(); + panel_project->load_project(false); undo_stack.clear(); } } @@ -745,7 +745,7 @@ void MainWindow::load_recent_project() { } } else if (can_close_project()) { updateTitle(recent_url); - panel_project->load_project(); + panel_project->load_project(false); } } diff --git a/mainwindow.h b/mainwindow.h index be4b941d2..7c28588a9 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -8,8 +8,6 @@ class EffectControls; class Viewer; class Timeline; -extern QMainWindow* mainWindow; - namespace Ui { class MainWindow; } @@ -20,6 +18,7 @@ class MainWindow : public QMainWindow public: explicit MainWindow(QWidget *parent = 0); + void updateTitle(const QString &url); ~MainWindow(); public slots: @@ -212,7 +211,8 @@ private: bool save_project_as(); bool save_project(); bool can_close_project(); - void updateTitle(const QString &url); }; +extern MainWindow* mainWindow; + #endif // MAINWINDOW_H diff --git a/panels/project.cpp b/panels/project.cpp index c0a194c74..684aa3987 100644 --- a/panels/project.cpp +++ b/panels/project.cpp @@ -848,7 +848,8 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) { } } } else if (type == LOAD_TYPE_URL) { - internal_proj_dir = QFileInfo(stream.readElementText()).absoluteDir(); + internal_proj_url = stream.readElementText(); + internal_proj_dir = QFileInfo(internal_proj_url).absoluteDir(); } else { while (!(stream.name() == root_search && stream.isEndElement())) { stream.readNext(); @@ -1188,7 +1189,7 @@ bool Project::load_worker(QFile& f, QXmlStreamReader& stream, int type) { return true; } -void Project::load_project() { +void Project::load_project(bool autorecovery) { new_project(); /*LoadDialog ld; @@ -1207,6 +1208,7 @@ void Project::load_project() { */ proj_dir = QFileInfo(project_url).absoluteDir(); internal_proj_dir = QFileInfo(project_url).absoluteDir(); + internal_proj_url = project_url; QXmlStreamReader stream(&file); @@ -1240,6 +1242,22 @@ void Project::load_project() { // find project's internal URL cont = load_worker(file, stream, LOAD_TYPE_URL); + if (autorecovery) { + QString orig_filename = internal_proj_url; + int insert_index = internal_proj_url.lastIndexOf(".ove", -1, Qt::CaseInsensitive); + if (insert_index == -1) insert_index = internal_proj_url.length(); + int counter = 1; + while (QFileInfo::exists(orig_filename)) { + orig_filename = internal_proj_url; + QString recover_text = "recovered"; + if (counter > 1) { + recover_text += " " + QString::number(counter); + } + orig_filename.insert(insert_index, " (" + recover_text + ")"); + counter++; + } + mainWindow->updateTitle(orig_filename); + } // load folders first if (cont) { @@ -1290,7 +1308,7 @@ void Project::load_project() { if (open_seq != NULL) set_sequence(open_seq); update_ui(false); - mainWindow->setWindowModified(false); + mainWindow->setWindowModified(autorecovery); for (int i=0;i