diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp index 8c453d09a4..b5701e4b7c 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp @@ -504,6 +504,9 @@ void ProjectContentComponent::openInSelectedIDE (bool saveFirst) if (auto selectedExporter = headerComponent.getSelectedExporter()) { + if (! selectedExporter->canLaunchProject()) + return; + if (saveFirst) { if (project->isTemporaryProject()) @@ -512,7 +515,7 @@ void ProjectContentComponent::openInSelectedIDE (bool saveFirst) return; } - if (project->hasChangedSinceSaved()) + if (project->hasChangedSinceSaved() || ! selectedExporter->getIDEProjectFile().exists()) { project->saveAsync (true, true, [safeThis = SafePointer { this }] (Project::SaveResult r) { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h index b63983cb60..ee3b5fda7d 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h @@ -141,7 +141,7 @@ public: gradleVersion (settings, Ids::gradleVersion, getUndoManager(), "7.0.2"), gradleToolchain (settings, Ids::gradleToolchain, getUndoManager(), "clang"), androidPluginVersion (settings, Ids::androidPluginVersion, getUndoManager(), "7.0.0"), - AndroidExecutable (getAppSettings().getStoredPath (Ids::androidStudioExePath, TargetOS::getThisOS()).get().toString()) + androidExecutable (getAppSettings().getStoredPath (Ids::androidStudioExePath, TargetOS::getThisOS()).get().toString()) { name = getDisplayName(); targetLocationValue.setDefault (getDefaultBuildsRootFolder() + getTargetFolderName()); @@ -165,22 +165,25 @@ public: //============================================================================== bool canLaunchProject() override { - return AndroidExecutable.exists(); + return androidExecutable.exists(); } bool launchProject() override { - if (! AndroidExecutable.exists()) + if (! androidExecutable.exists()) { jassertfalse; return false; } - auto targetFolder = getTargetFolder(); - // we have to surround the path with extra quotes, otherwise Android Studio // will choke if there are any space characters in the path. - return AndroidExecutable.startAsProcess ("\"" + targetFolder.getFullPathName() + "\""); + return androidExecutable.startAsProcess (getIDEProjectFile().getFullPathName().quoted()); + } + + File getIDEProjectFile() const override + { + return getTargetFolder(); } //============================================================================== @@ -1874,7 +1877,7 @@ private: } //============================================================================== - const File AndroidExecutable; + const File androidExecutable; JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter) }; diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h index 1ad86918fe..e77fdf54e6 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h @@ -126,7 +126,12 @@ public: bool launchProject() override { - return getCLionExecutableOrApp().startAsProcess (getTargetFolder().getFullPathName().quoted()); + return getCLionExecutableOrApp().startAsProcess (getIDEProjectFile().getFullPathName().quoted()); + } + + File getIDEProjectFile() const override + { + return getTargetFolder(); } String getDescription() override diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index 32eadb9c83..90319e499e 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -1476,7 +1476,7 @@ public: bool launchProject() override { #if JUCE_WINDOWS - return getSLNFile().startAsProcess(); + return getIDEProjectFile().startAsProcess(); #else return false; #endif @@ -1491,6 +1491,11 @@ public: #endif } + File getIDEProjectFile() const override + { + return getSLNFile(); + } + void createExporterProperties (PropertyListBuilder& props) override { props.add (new TextPropertyComponent (manifestFileValue, "Manifest file", 8192, false), diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index 0316c84dcc..27c42ac56b 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -660,7 +660,7 @@ public: bool launchProject() override { #if JUCE_MAC - return getProjectBundle().startAsProcess(); + return getIDEProjectFile().startAsProcess(); #else return false; #endif @@ -675,6 +675,11 @@ public: #endif } + File getIDEProjectFile() const override + { + return getProjectBundle(); + } + //============================================================================== void create (const OwnedArray&) const override { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h index 8c6af9be4d..be0ad1e6ac 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExporter.h @@ -89,6 +89,8 @@ public: virtual bool isOSX() const = 0; virtual bool isiOS() const = 0; + virtual File getIDEProjectFile() const { return {}; } + virtual String getNewLineString() const = 0; virtual String getDescription() { return {}; }