Browse Source

Projucer: Only updated saved state on content change

tags/2021-05-28
Tom Poole 5 years ago
parent
commit
a5aea2006d
4 changed files with 59 additions and 70 deletions
  1. +48
    -31
      extras/Projucer/Source/Project/jucer_Project.cpp
  2. +6
    -6
      extras/Projucer/Source/Project/jucer_Project.h
  3. +5
    -32
      extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp
  4. +0
    -1
      extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h

+ 48
- 31
extras/Projucer/Source/Project/jucer_Project.cpp View File

@@ -39,18 +39,15 @@ void Project::ProjectFileModificationPoller::reset()
void Project::ProjectFileModificationPoller::timerCallback()
{
if (project.hasProjectBeenModified())
if (project.updateCachedFileState() && ! showingWarning)
{
if (! showingWarning)
{
project.addProjectMessage (ProjectMessages::Ids::jucerFileModified,
{ { "Keep", [this] { keepProject(); } },
{ "Re-load from disk", [this] { reloadProjectFromDisk(); } },
{ "Ignore", [this] { reset(); } } });
project.addProjectMessage (ProjectMessages::Ids::jucerFileModified,
{ { "Save current state", [this] { resaveProject(); } },
{ "Re-load from disk", [this] { reloadProjectFromDisk(); } },
{ "Ignore", [this] { reset(); } } });
stopTimer();
showingWarning = true;
}
stopTimer();
showingWarning = true;
}
}
@@ -73,7 +70,7 @@ void Project::ProjectFileModificationPoller::reloadProjectFromDisk()
});
}
void Project::ProjectFileModificationPoller::keepProject()
void Project::ProjectFileModificationPoller::resaveProject()
{
project.saveProject();
reset();
@@ -95,7 +92,7 @@ Project::Project (const File& f)
initialiseAudioPluginValues();
setChangedFlag (false);
modificationTime = getFile().getLastModificationTime();
updateCachedFileState();
auto& app = ProjucerApplication::getApp();
@@ -166,7 +163,6 @@ void Project::updateCompanyNameDependencies()
void Project::updateProjectSettings()
{
projectRoot.setProperty (Ids::jucerVersion, ProjectInfo::versionString, nullptr);
projectRoot.setProperty (Ids::name, getDocumentTitle(), nullptr);
}
@@ -952,7 +948,7 @@ void Project::saveAndMoveTemporaryProject (bool openInIDE)
auto newDirectory = newParentDirectory.getChildFile (tempDirectory.getFileName());
auto oldJucerFileName = getFile().getFileName();
saveProjectRootToFile();
writeProjectFile();
tempDirectory.copyDirectoryTo (newDirectory);
tempDirectory.deleteRecursively();
@@ -973,19 +969,6 @@ void Project::saveAndMoveTemporaryProject (bool openInIDE)
}
}
bool Project::saveProjectRootToFile()
{
if (auto xml = projectRoot.createXml())
{
MemoryOutputStream mo;
xml->writeTo (mo, {});
return build_tools::overwriteFileWithNewDataIfDifferent (getFile(), mo);
}
jassertfalse;
return false;
}
//==============================================================================
void Project::valueTreePropertyChanged (ValueTree& tree, const Identifier& property)
{
@@ -1058,12 +1041,46 @@ void Project::valueTreeChildOrderChanged (ValueTree&, int, int)
}
//==============================================================================
bool Project::hasProjectBeenModified()
String Project::serialiseProjectXml (std::unique_ptr<XmlElement> xml) const
{
if (xml == nullptr)
return {};
XmlElement::TextFormat format;
format.newLineChars = getProjectLineFeed().toRawUTF8();
return xml->toString (format);
}
bool Project::updateCachedFileState()
{
auto oldModificationTime = modificationTime;
modificationTime = getFile().getLastModificationTime();
auto lastModificationTime = getFile().getLastModificationTime();
if (lastModificationTime <= cachedFileState.first)
return false;
cachedFileState.first = lastModificationTime;
return (modificationTime.toMilliseconds() > (oldModificationTime.toMilliseconds() + 1000LL));
auto serialisedFileContent = serialiseProjectXml (XmlDocument (getFile()).getDocumentElement());
if (serialisedFileContent == cachedFileState.second)
return false;
cachedFileState.second = serialisedFileContent;
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 };
}
}
//==============================================================================


+ 6
- 6
extras/Projucer/Source/Project/jucer_Project.h View File

@@ -475,8 +475,8 @@ public:
static const char* projectFileExtension;
//==============================================================================
bool hasProjectBeenModified();
void updateModificationTime() { modificationTime = getFile().getLastModificationTime(); }
bool updateCachedFileState();
void writeProjectFile();
//==============================================================================
String getUniqueTargetFolderSuffixForExporter (const String& exporterName, const String& baseTargetFolder);
@@ -513,7 +513,7 @@ private:
void timerCallback() override;
void reset();
void keepProject();
void resaveProject();
void reloadProjectFromDisk();
Project& project;
@@ -556,15 +556,15 @@ private:
void updatePluginCategories();
//==============================================================================
File tempDirectory = {};
File tempDirectory;
std::pair<Time, String> cachedFileState;
void saveAndMoveTemporaryProject (bool openInIDE);
bool saveProjectRootToFile();
String serialiseProjectXml (std::unique_ptr<XmlElement>) const;
//==============================================================================
friend class Item;
bool isSaving = false;
Time modificationTime;
StringPairArray parsedPreprocessorDefs;
//==============================================================================


+ 5
- 32
extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.cpp View File

@@ -50,7 +50,7 @@ Result ProjectSaver::saveResourcesOnly()
{
writeBinaryDataFiles();
if (errors.size() > 0)
if (! errors.isEmpty())
return Result::fail (errors[0]);
return Result::ok();
@@ -69,7 +69,7 @@ Result ProjectSaver::saveContentNeededForLiveBuild()
{
auto modules = getModules();
if (errors.size() == 0)
if (errors.isEmpty())
{
saveBasicProjectItems (modules, loadUserContentFromAppConfig());
return Result::ok();
@@ -275,13 +275,8 @@ Result ProjectSaver::saveProject (ProjectExporter* specifiedExporterToSave)
auto oldProjectFile = project.getFile();
auto modules = getModules();
if (errors.size() == 0)
if (errors.isEmpty())
{
writeMainProjectFile();
project.updateModificationTime();
auto projectRootHash = project.getProjectRoot().toXmlString().hashCode();
if (project.isAudioPluginProject())
{
if (project.shouldBuildUnityPlugin())
@@ -292,12 +287,7 @@ Result ProjectSaver::saveProject (ProjectExporter* specifiedExporterToSave)
writeProjects (modules, specifiedExporterToSave);
runPostExportScript();
// if the project root has changed after writing the other files then re-save it
if (project.getProjectRoot().toXmlString().hashCode() != projectRootHash)
{
writeMainProjectFile();
project.updateModificationTime();
}
project.writeProjectFile();
if (generatedCodeFolder.exists())
{
@@ -305,7 +295,7 @@ Result ProjectSaver::saveProject (ProjectExporter* specifiedExporterToSave)
deleteUnwantedFilesIn (generatedCodeFolder);
}
if (errors.size() == 0)
if (errors.isEmpty())
return Result::ok();
}
@@ -314,23 +304,6 @@ Result ProjectSaver::saveProject (ProjectExporter* specifiedExporterToSave)
}
//==============================================================================
void ProjectSaver::writeMainProjectFile()
{
if (auto xml = project.getProjectRoot().createXml())
{
XmlElement::TextFormat format;
format.newLineChars = projectLineFeed.toRawUTF8();
MemoryOutputStream mo (8192);
xml->writeTo (mo, format);
replaceFileIfDifferent (project.getFile(), mo);
}
else
{
addError ("Failed to write main project file: " + project.getFile().getFullPathName());
}
}
static void writeAutoGenWarningComment (OutputStream& out)
{
out << "/*" << newLine << newLine


+ 0
- 1
extras/Projucer/Source/Utility/Helpers/jucer_PresetIDs.h View File

@@ -142,7 +142,6 @@ namespace Ids
DECLARE_ID (msvcModuleDefinitionFile);
DECLARE_ID (bigIcon);
DECLARE_ID (smallIcon);
DECLARE_ID (jucerVersion);
DECLARE_ID (prebuildCommand);
DECLARE_ID (postbuildCommand);
DECLARE_ID (generateManifest);


Loading…
Cancel
Save