From 3aa3ebff91281c1eca84d025cb30ad1442d0efd9 Mon Sep 17 00:00:00 2001 From: jules Date: Mon, 2 Nov 2015 16:10:03 +0000 Subject: [PATCH] Introjucer: Added option to avoid overwriting changes to local module files --- .../Project Saving/jucer_ProjectSaver.h | 2 +- .../Source/Project/jucer_ConfigTree_Modules.h | 6 +++ .../Source/Project/jucer_Module.cpp | 37 ++++++++++++++----- .../Introjucer/Source/Project/jucer_Module.h | 1 + .../Source/Utility/jucer_PresetIDs.h | 1 + 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h index bbb99de1c0..6c6a118104 100644 --- a/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h +++ b/extras/Introjucer/Source/Project Saving/jucer_ProjectSaver.h @@ -217,6 +217,7 @@ public: } Project& project; + SortedSet filesCreated; private: const File projectFile, generatedCodeFolder; @@ -226,7 +227,6 @@ private: CriticalSection errorLock; File appConfigFile; - SortedSet filesCreated; bool hasBinaryData; // Recursively clears out any files in a folder that we didn't create, but avoids diff --git a/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h b/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h index 87231f95c3..1a9071b1c0 100644 --- a/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h +++ b/extras/Introjucer/Source/Project/jucer_ConfigTree_Modules.h @@ -101,6 +101,12 @@ private: "so that your project will be self-contained, and won't need to contain any references to files in other folders. " "This also means that you can check the module into your source-control system to make sure it is always in sync with your own code."); + props.add (new BooleanPropertyComponent (project.getModules().shouldNotOverwriteModuleCodeOnSave (moduleID), + "Preserve local module changes", + "Don't overwrite changes to JUCE modules"), + "Generally, this should be disabled. However if you've got local changes to " + "JUCE code that you want to preserve, enabling this lets you do that."); + props.add (new BooleanPropertyComponent (project.getModules().shouldShowAllModuleFilesInProject (moduleID), "Add source to project", "Make module files browsable in projects"), "If this is enabled, then the entire source tree from this module will be shown inside your project, " diff --git a/extras/Introjucer/Source/Project/jucer_Module.cpp b/extras/Introjucer/Source/Project/jucer_Module.cpp index 874351ddd5..d6f00fa053 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.cpp +++ b/extras/Introjucer/Source/Project/jucer_Module.cpp @@ -240,23 +240,34 @@ File LibraryModule::getModuleHeaderFile (const File& folder) const //============================================================================== void LibraryModule::writeIncludes (ProjectSaver& projectSaver, OutputStream& out) { - const File localModuleFolder (projectSaver.project.getLocalModuleFolder (getID())); + Project& project = projectSaver.project; + EnabledModuleList& modules = project.getModules(); + + const String id (getID()); + const File localModuleFolder (project.getLocalModuleFolder (id)); const File localHeader (getModuleHeaderFile (localModuleFolder)); + const bool usingLocalCopyOfModules = modules.shouldCopyModuleFilesLocally (id).getValue(); - localModuleFolder.createDirectory(); - - if (projectSaver.project.getModules().shouldCopyModuleFilesLocally (getID()).getValue()) + if (usingLocalCopyOfModules + && modules.shouldNotOverwriteModuleCodeOnSave (id).getValue() + && localModuleFolder.getChildFile ("juce_module_info").exists()) { - projectSaver.copyFolder (moduleInfo.getFolder(), localModuleFolder); + projectSaver.filesCreated.add (localModuleFolder); } else { - localModuleFolder.createDirectory(); - createLocalHeaderWrapper (projectSaver, getModuleHeaderFile (moduleInfo.getFolder()), localHeader); - } + const File juceModuleFolder (moduleInfo.getFolder()); - out << CodeHelpers::createIncludeStatement (localHeader, projectSaver.getGeneratedCodeFolder() - .getChildFile ("AppConfig.h")) << newLine; + localModuleFolder.createDirectory(); + + if (usingLocalCopyOfModules) + projectSaver.copyFolder (juceModuleFolder, localModuleFolder); + else + createLocalHeaderWrapper (projectSaver, getModuleHeaderFile (juceModuleFolder), localHeader); + + out << CodeHelpers::createIncludeStatement (localHeader, projectSaver.getGeneratedCodeFolder() + .getChildFile ("AppConfig.h")) << newLine; + } } static void writeGuardedInclude (OutputStream& out, StringArray paths, StringArray guards) @@ -644,6 +655,12 @@ Value EnabledModuleList::shouldShowAllModuleFilesInProject (const String& module .getPropertyAsValue (Ids::showAllCode, getUndoManager()); } +Value EnabledModuleList::shouldNotOverwriteModuleCodeOnSave (const String& moduleID) +{ + return state.getChildWithProperty (Ids::ID, moduleID) + .getPropertyAsValue (Ids::overwriteOnSave, getUndoManager()); +} + File EnabledModuleList::findLocalModuleInfoFile (const String& moduleID, bool useExportersForOtherOSes) { for (Project::ExporterIterator exporter (project); exporter.next();) diff --git a/extras/Introjucer/Source/Project/jucer_Module.h b/extras/Introjucer/Source/Project/jucer_Module.h index 490f7594b9..850b389019 100644 --- a/extras/Introjucer/Source/Project/jucer_Module.h +++ b/extras/Introjucer/Source/Project/jucer_Module.h @@ -127,6 +127,7 @@ public: bool isModuleEnabled (const String& moduleID) const; Value shouldShowAllModuleFilesInProject (const String& moduleID); + Value shouldNotOverwriteModuleCodeOnSave (const String& moduleID); Value shouldCopyModuleFilesLocally (const String& moduleID) const; void removeModule (String moduleID); bool isAudioPluginModuleMissing() const; diff --git a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h index aae1c94713..69a1c72c4d 100644 --- a/extras/Introjucer/Source/Utility/jucer_PresetIDs.h +++ b/extras/Introjucer/Source/Utility/jucer_PresetIDs.h @@ -134,6 +134,7 @@ namespace Ids DECLARE_ID (useStdCall); DECLARE_ID (showAllCode); DECLARE_ID (useLocalCopy); + DECLARE_ID (overwriteOnSave); DECLARE_ID (androidActivityClass); DECLARE_ID (androidActivitySubClassName); DECLARE_ID (androidVersionCode);