diff --git a/extras/Projucer/Source/Application/jucer_MainWindow.cpp b/extras/Projucer/Source/Application/jucer_MainWindow.cpp index 337dde39a9..bd59b1c46f 100644 --- a/extras/Projucer/Source/Application/jucer_MainWindow.cpp +++ b/extras/Projucer/Source/Application/jucer_MainWindow.cpp @@ -253,11 +253,8 @@ void MainWindow::moveProject (File newProjectFileToOpen, OpenInIDE openInIDE) closeCurrentProject (OpenDocumentManager::SaveIfNeeded::no); openFile (newProjectFileToOpen); - if (currentProject != nullptr) - ProjucerApplication::getApp().getCommandManager() - .invokeDirectly (openInIDE == OpenInIDE::yes ? CommandIDs::saveAndOpenInIDE - : CommandIDs::saveProject, - false); + if (currentProject != nullptr && openInIDE == OpenInIDE::yes) + ProjucerApplication::getApp().getCommandManager().invokeDirectly (CommandIDs::openInIDE, false); } void MainWindow::setProject (std::unique_ptr newProject) diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index 5cc63512b3..1ad0282d6f 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -970,7 +970,8 @@ void Project::saveAndMoveTemporaryProject (bool openInIDE) auto newDirectory = newParentDirectory.getChildFile (tempDirectory.getFileName()); auto oldJucerFileName = getFile().getFileName(); - writeProjectFile(); + ProjectSaver saver (*this); + saver.save(); tempDirectory.copyDirectoryTo (newDirectory); tempDirectory.deleteRecursively(); @@ -1091,20 +1092,6 @@ bool Project::updateCachedFileState() return true; } -void Project::writeProjectFile() -{ - updateCachedFileState(); - - auto newSerialisedXml = serialiseProjectXml (getProjectRoot().createXml()); - jassert (newSerialisedXml.isNotEmpty()); - - if (newSerialisedXml != cachedFileState.second) - { - getFile().replaceWithText (newSerialisedXml); - cachedFileState = { getFile().getLastModificationTime(), newSerialisedXml }; - } -} - //============================================================================== 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 726b272e05..41179b942c 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -475,7 +475,9 @@ public: //============================================================================== bool updateCachedFileState(); - void writeProjectFile(); + String getCachedFileStateContent() const noexcept { return cachedFileState.second; } + + String serialiseProjectXml (std::unique_ptr) const; //============================================================================== String getUniqueTargetFolderSuffixForExporter (const Identifier& exporterIdentifier, const String& baseTargetFolder); @@ -566,7 +568,6 @@ private: std::pair cachedFileState; void saveAndMoveTemporaryProject (bool openInIDE); - String serialiseProjectXml (std::unique_ptr) const; //============================================================================== friend class Item; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp index 697f164aa6..8a788d9f9a 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp @@ -30,6 +30,8 @@ static constexpr const char* generatedGroupID = "__jucelibfiles"; static constexpr const char* generatedGroupUID = "__generatedcode__"; +constexpr int jucerFormatVersion = 1; + //============================================================================== ProjectSaver::ProjectSaver (Project& p) : project (p), @@ -294,7 +296,7 @@ Result ProjectSaver::saveProject (ProjectExporter* specifiedExporterToSave) writeProjects (modules, specifiedExporterToSave); runPostExportScript(); - project.writeProjectFile(); + writeProjectFile(); if (generatedCodeFolder.exists()) { @@ -332,6 +334,25 @@ void ProjectSaver::writePluginDefines (MemoryOutputStream& out) const << pluginDefines << newLine; } +void ProjectSaver::writeProjectFile() +{ + auto root = project.getProjectRoot(); + + root.removeProperty ("jucerVersion", nullptr); + root.setProperty (Ids::jucerFormatVersion, jucerFormatVersion, nullptr); + + project.updateCachedFileState(); + + auto newSerialisedXml = project.serialiseProjectXml (root.createXml()); + jassert (newSerialisedXml.isNotEmpty()); + + if (newSerialisedXml != project.getCachedFileStateContent()) + { + project.getFile().replaceWithText (newSerialisedXml); + project.updateCachedFileState(); + } +} + void ProjectSaver::writeAppConfig (MemoryOutputStream& out, const OwnedArray& modules, const String& userContent) { if (! project.shouldUseAppConfig()) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h index 31500c3bd8..e3d0348cd0 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h @@ -95,7 +95,7 @@ private: void writePluginDefines(); void writeAppConfigFile (const OwnedArray& modules, const String& userContent); - void writeMainProjectFile(); + void writeProjectFile(); void writeAppConfig (MemoryOutputStream& outStream, const OwnedArray& modules, const String& userContent); void writeAppHeader (MemoryOutputStream& outStream, const OwnedArray& modules); void writeAppHeader (const OwnedArray& modules); diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h index 1cc51a0492..edd3b091fe 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h @@ -370,6 +370,7 @@ namespace Ids DECLARE_ID (postExportShellCommandWin); DECLARE_ID (liveBuildEnabled); DECLARE_ID (guiEditorEnabled); + DECLARE_ID (jucerFormatVersion); const Identifier ID ("id"); const Identifier ID_uppercase ("ID");