| @@ -504,6 +504,9 @@ void ProjectContentComponent::openInSelectedIDE (bool saveFirst) | |||||
| if (auto selectedExporter = headerComponent.getSelectedExporter()) | if (auto selectedExporter = headerComponent.getSelectedExporter()) | ||||
| { | { | ||||
| if (! selectedExporter->canLaunchProject()) | |||||
| return; | |||||
| if (saveFirst) | if (saveFirst) | ||||
| { | { | ||||
| if (project->isTemporaryProject()) | if (project->isTemporaryProject()) | ||||
| @@ -512,7 +515,7 @@ void ProjectContentComponent::openInSelectedIDE (bool saveFirst) | |||||
| return; | return; | ||||
| } | } | ||||
| if (project->hasChangedSinceSaved()) | |||||
| if (project->hasChangedSinceSaved() || ! selectedExporter->getIDEProjectFile().exists()) | |||||
| { | { | ||||
| project->saveAsync (true, true, [safeThis = SafePointer<ProjectContentComponent> { this }] (Project::SaveResult r) | project->saveAsync (true, true, [safeThis = SafePointer<ProjectContentComponent> { this }] (Project::SaveResult r) | ||||
| { | { | ||||
| @@ -141,7 +141,7 @@ public: | |||||
| gradleVersion (settings, Ids::gradleVersion, getUndoManager(), "7.0.2"), | gradleVersion (settings, Ids::gradleVersion, getUndoManager(), "7.0.2"), | ||||
| gradleToolchain (settings, Ids::gradleToolchain, getUndoManager(), "clang"), | gradleToolchain (settings, Ids::gradleToolchain, getUndoManager(), "clang"), | ||||
| androidPluginVersion (settings, Ids::androidPluginVersion, getUndoManager(), "7.0.0"), | 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(); | name = getDisplayName(); | ||||
| targetLocationValue.setDefault (getDefaultBuildsRootFolder() + getTargetFolderName()); | targetLocationValue.setDefault (getDefaultBuildsRootFolder() + getTargetFolderName()); | ||||
| @@ -165,22 +165,25 @@ public: | |||||
| //============================================================================== | //============================================================================== | ||||
| bool canLaunchProject() override | bool canLaunchProject() override | ||||
| { | { | ||||
| return AndroidExecutable.exists(); | |||||
| return androidExecutable.exists(); | |||||
| } | } | ||||
| bool launchProject() override | bool launchProject() override | ||||
| { | { | ||||
| if (! AndroidExecutable.exists()) | |||||
| if (! androidExecutable.exists()) | |||||
| { | { | ||||
| jassertfalse; | jassertfalse; | ||||
| return false; | return false; | ||||
| } | } | ||||
| auto targetFolder = getTargetFolder(); | |||||
| // we have to surround the path with extra quotes, otherwise Android Studio | // we have to surround the path with extra quotes, otherwise Android Studio | ||||
| // will choke if there are any space characters in the path. | // 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) | JUCE_DECLARE_NON_COPYABLE (AndroidProjectExporter) | ||||
| }; | }; | ||||
| @@ -126,7 +126,12 @@ public: | |||||
| bool launchProject() override | bool launchProject() override | ||||
| { | { | ||||
| return getCLionExecutableOrApp().startAsProcess (getTargetFolder().getFullPathName().quoted()); | |||||
| return getCLionExecutableOrApp().startAsProcess (getIDEProjectFile().getFullPathName().quoted()); | |||||
| } | |||||
| File getIDEProjectFile() const override | |||||
| { | |||||
| return getTargetFolder(); | |||||
| } | } | ||||
| String getDescription() override | String getDescription() override | ||||
| @@ -1476,7 +1476,7 @@ public: | |||||
| bool launchProject() override | bool launchProject() override | ||||
| { | { | ||||
| #if JUCE_WINDOWS | #if JUCE_WINDOWS | ||||
| return getSLNFile().startAsProcess(); | |||||
| return getIDEProjectFile().startAsProcess(); | |||||
| #else | #else | ||||
| return false; | return false; | ||||
| #endif | #endif | ||||
| @@ -1491,6 +1491,11 @@ public: | |||||
| #endif | #endif | ||||
| } | } | ||||
| File getIDEProjectFile() const override | |||||
| { | |||||
| return getSLNFile(); | |||||
| } | |||||
| void createExporterProperties (PropertyListBuilder& props) override | void createExporterProperties (PropertyListBuilder& props) override | ||||
| { | { | ||||
| props.add (new TextPropertyComponent (manifestFileValue, "Manifest file", 8192, false), | props.add (new TextPropertyComponent (manifestFileValue, "Manifest file", 8192, false), | ||||
| @@ -660,7 +660,7 @@ public: | |||||
| bool launchProject() override | bool launchProject() override | ||||
| { | { | ||||
| #if JUCE_MAC | #if JUCE_MAC | ||||
| return getProjectBundle().startAsProcess(); | |||||
| return getIDEProjectFile().startAsProcess(); | |||||
| #else | #else | ||||
| return false; | return false; | ||||
| #endif | #endif | ||||
| @@ -675,6 +675,11 @@ public: | |||||
| #endif | #endif | ||||
| } | } | ||||
| File getIDEProjectFile() const override | |||||
| { | |||||
| return getProjectBundle(); | |||||
| } | |||||
| //============================================================================== | //============================================================================== | ||||
| void create (const OwnedArray<LibraryModule>&) const override | void create (const OwnedArray<LibraryModule>&) const override | ||||
| { | { | ||||
| @@ -89,6 +89,8 @@ public: | |||||
| virtual bool isOSX() const = 0; | virtual bool isOSX() const = 0; | ||||
| virtual bool isiOS() const = 0; | virtual bool isiOS() const = 0; | ||||
| virtual File getIDEProjectFile() const { return {}; } | |||||
| virtual String getNewLineString() const = 0; | virtual String getNewLineString() const = 0; | ||||
| virtual String getDescription() { return {}; } | virtual String getDescription() { return {}; } | ||||