From 8e10f16eb8f8d7a813725e807f6fbdf8c6e36c9b Mon Sep 17 00:00:00 2001 From: ed Date: Fri, 12 Aug 2016 10:08:27 +0100 Subject: [PATCH] Dialog window to ask whether to keep current project or re-load from disk when .jucer file changes --- .../Source/Application/jucer_MainWindow.cpp | 23 +++++++++++++++++++ .../Project Saving/jucer_ProjectSaver.h | 2 ++ .../Projucer/Source/Project/jucer_Project.cpp | 16 +++++++++++++ .../Projucer/Source/Project/jucer_Project.h | 6 +++++ 4 files changed, 47 insertions(+) diff --git a/extras/Projucer/Source/Application/jucer_MainWindow.cpp b/extras/Projucer/Source/Application/jucer_MainWindow.cpp index 1fe39637d2..8a934fa357 100644 --- a/extras/Projucer/Source/Application/jucer_MainWindow.cpp +++ b/extras/Projucer/Source/Application/jucer_MainWindow.cpp @@ -276,6 +276,29 @@ void MainWindow::activeWindowStatusChanged() pcc->updateMissingFileStatuses(); ProjucerApplication::getApp().openDocumentManager.reloadModifiedFiles(); + + if (Project* p = getProject()) + { + if (p->hasProjectBeenModified()) + { + const int r = AlertWindow::showOkCancelBox (AlertWindow::QuestionIcon, + TRANS (".jucer file has been modified since last save."), + TRANS ("Do you want to keep current project or re-load from disk?"), + TRANS ("Keep"), + TRANS ("Re-load from disk")); + + if (r == 0) + { + File projectFile = p->getFile(); + setProject (nullptr); + openFile (projectFile); + } + else if (r == 1) + { + ProjucerApplication::getApp().getCommandManager().invokeDirectly (CommandIDs::saveProject, true); + } + } + } } void MainWindow::updateTitle (const String& documentName) diff --git a/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.h b/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.h index 3c4255f3db..4d6f7dd106 100644 --- a/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.h +++ b/extras/Projucer/Source/Project Saving/jucer_ProjectSaver.h @@ -104,6 +104,8 @@ public: return Result::fail (errors[0]); } + project.updateModificationTime(); + return Result::ok(); } diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index 29be7e389a..686007bce7 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -59,6 +59,8 @@ Project::Project (const File& f) setChangedFlag (false); projectRoot.addListener (this); + + modificationTime = getFile().getLastModificationTime(); } Project::~Project() @@ -374,6 +376,20 @@ void Project::valueTreeChildRemoved (ValueTree&, ValueTree&, int) { changed(); void Project::valueTreeChildOrderChanged (ValueTree&, int, int) { changed(); } void Project::valueTreeParentChanged (ValueTree&) {} +//============================================================================== +bool Project::hasProjectBeenModified() +{ + Time newModificationTime = getFile().getLastModificationTime(); + + if (newModificationTime != modificationTime) + { + modificationTime = newModificationTime; + return true; + } + + return false; +} + //============================================================================== File Project::resolveFilename (String filename) const { diff --git a/extras/Projucer/Source/Project/jucer_Project.h b/extras/Projucer/Source/Project/jucer_Project.h index f0ac122aab..520c5cf6ae 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -311,6 +311,10 @@ public: //============================================================================== static const char* projectFileExtension; + //============================================================================== + bool hasProjectBeenModified(); + void updateModificationTime() { modificationTime = getFile().getLastModificationTime(); } + private: //============================================================================== void setMissingAudioPluginDefaultValues(); @@ -334,6 +338,8 @@ private: void updateOldModulePaths(); void warnAboutOldProjucerVersion(); + Time modificationTime; + JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Project) };