@@ -276,6 +276,29 @@ void MainWindow::activeWindowStatusChanged() | |||||
pcc->updateMissingFileStatuses(); | pcc->updateMissingFileStatuses(); | ||||
ProjucerApplication::getApp().openDocumentManager.reloadModifiedFiles(); | 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) | void MainWindow::updateTitle (const String& documentName) | ||||
@@ -104,6 +104,8 @@ public: | |||||
return Result::fail (errors[0]); | return Result::fail (errors[0]); | ||||
} | } | ||||
project.updateModificationTime(); | |||||
return Result::ok(); | return Result::ok(); | ||||
} | } | ||||
@@ -59,6 +59,8 @@ Project::Project (const File& f) | |||||
setChangedFlag (false); | setChangedFlag (false); | ||||
projectRoot.addListener (this); | projectRoot.addListener (this); | ||||
modificationTime = getFile().getLastModificationTime(); | |||||
} | } | ||||
Project::~Project() | Project::~Project() | ||||
@@ -374,6 +376,20 @@ void Project::valueTreeChildRemoved (ValueTree&, ValueTree&, int) { changed(); | |||||
void Project::valueTreeChildOrderChanged (ValueTree&, int, int) { changed(); } | void Project::valueTreeChildOrderChanged (ValueTree&, int, int) { changed(); } | ||||
void Project::valueTreeParentChanged (ValueTree&) {} | 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 | File Project::resolveFilename (String filename) const | ||||
{ | { | ||||
@@ -311,6 +311,10 @@ public: | |||||
//============================================================================== | //============================================================================== | ||||
static const char* projectFileExtension; | static const char* projectFileExtension; | ||||
//============================================================================== | |||||
bool hasProjectBeenModified(); | |||||
void updateModificationTime() { modificationTime = getFile().getLastModificationTime(); } | |||||
private: | private: | ||||
//============================================================================== | //============================================================================== | ||||
void setMissingAudioPluginDefaultValues(); | void setMissingAudioPluginDefaultValues(); | ||||
@@ -334,6 +338,8 @@ private: | |||||
void updateOldModulePaths(); | void updateOldModulePaths(); | ||||
void warnAboutOldProjucerVersion(); | void warnAboutOldProjucerVersion(); | ||||
Time modificationTime; | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Project) | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (Project) | ||||
}; | }; | ||||