diff --git a/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp index f036b0d4a2..86b30fadcb 100644 --- a/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_HeaderComponent.cpp @@ -226,31 +226,29 @@ void HeaderComponent::initialiseButtons() saveAndOpenInIDEButton.setIconInset (7); saveAndOpenInIDEButton.onClick = [this] { - if (project != nullptr) + if (project == nullptr) + return; + + if (! project->isSaveAndExportDisabled()) { - if (project->isSaveAndExportDisabled()) - { - auto setWarningVisible = [this] (const Identifier& identifier) - { - auto child = project->getProjectMessages().getChildWithName (ProjectMessages::Ids::warning) - .getChildWithName (identifier); + projectContentComponent->openInSelectedIDE (true); + return; + } + + auto setWarningVisible = [this] (const Identifier& identifier) + { + auto child = project->getProjectMessages().getChildWithName (ProjectMessages::Ids::warning) + .getChildWithName (identifier); - if (child.isValid()) - child.setProperty (ProjectMessages::Ids::isVisible, true, nullptr); - }; + if (child.isValid()) + child.setProperty (ProjectMessages::Ids::isVisible, true, nullptr); + }; - if (project->hasIncompatibleLicenseTypeAndSplashScreenSetting()) - setWarningVisible (ProjectMessages::Ids::incompatibleLicense); + if (project->hasIncompatibleLicenseTypeAndSplashScreenSetting()) + setWarningVisible (ProjectMessages::Ids::incompatibleLicense); - if (project->isFileModificationCheckPending()) - setWarningVisible (ProjectMessages::Ids::jucerFileModified); - } - else - { - if (auto exporter = getSelectedExporter()) - project->openProjectInIDE (*exporter, true, nullptr); - } - } + if (project->isFileModificationCheckPending()) + setWarningVisible (ProjectMessages::Ids::jucerFileModified); }; updateExporterButton(); diff --git a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp index 0d52d6b669..38b6a00da2 100644 --- a/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp +++ b/extras/Projucer/Source/Project/UI/jucer_ProjectContentComponent.cpp @@ -496,9 +496,24 @@ StringArray ProjectContentComponent::getExportersWhichCanLaunch() const void ProjectContentComponent::openInSelectedIDE (bool saveFirst) { - if (project != nullptr) - if (auto selectedExporter = headerComponent.getSelectedExporter()) - project->openProjectInIDE (*selectedExporter, saveFirst, nullptr); + if (project == nullptr) + return; + + if (auto selectedExporter = headerComponent.getSelectedExporter()) + { + if (saveFirst) + { + SafePointer safeThis { this }; + project->saveAsync (true, true, [safeThis] (Project::SaveResult r) + { + if (safeThis != nullptr && r == Project::SaveResult::savedOk) + safeThis->openInSelectedIDE (false); + }); + return; + } + + project->openProjectInIDE (*selectedExporter); + } } void ProjectContentComponent::showNewExporterMenu() diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index 17d7931f37..e46eed5765 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -740,7 +740,7 @@ void Project::saveProject (Async async, }); } -void Project::openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, std::function onCompletion) +void Project::openProjectInIDE (ProjectExporter& exporterToOpen) { for (ExporterIterator exporter (*this); exporter.next();) { @@ -749,51 +749,13 @@ void Project::openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, if (isTemporaryProject()) { saveAndMoveTemporaryProject (true); - - if (onCompletion != nullptr) - onCompletion (Result::ok()); - - return; - } - - if (saveFirst) - { - struct Callback - { - void operator() (Result saveResult) noexcept - { - if (! saveResult.wasOk()) - { - if (onCompletion != nullptr) - onCompletion (saveResult); - - return; - } - - // Workaround for a bug where Xcode thinks the project is invalid if opened immediately - // after writing - auto exporterCopy = exporter; - Timer::callAfterDelay (exporter->isXcode() ? 1000 : 0, [exporterCopy] - { - exporterCopy->launchProject(); - }); - } - - std::shared_ptr exporter; - std::function onCompletion; - }; - - saveProject (Async::yes, nullptr, Callback { std::move (exporter.exporter), onCompletion }); return; } exporter->launchProject(); - break; + return; } } - - if (onCompletion != nullptr) - onCompletion (Result::ok()); } Result Project::saveResourcesOnly() diff --git a/extras/Projucer/Source/Project/jucer_Project.h b/extras/Projucer/Source/Project/jucer_Project.h index 11ae32183d..fbbb854830 100644 --- a/extras/Projucer/Source/Project/jucer_Project.h +++ b/extras/Projucer/Source/Project/jucer_Project.h @@ -132,7 +132,7 @@ public: void saveProject (Async, ProjectExporter* exporterToSave, std::function onCompletion); Result saveResourcesOnly(); - void openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, std::function onCompletion); + void openProjectInIDE (ProjectExporter& exporterToOpen); File getLastDocumentOpened() override; void setLastDocumentOpened (const File& file) override; @@ -614,11 +614,6 @@ private: void updateCLionWarning (bool showWarning); void updateModuleNotFoundWarning (bool showWarning); - void openProjectInIDEImpl (ExporterIterator exporter, - String exporterToOpen, - bool saveFirst, - std::function onCompletion); - ValueTree projectMessages { ProjectMessages::Ids::projectMessages, {}, { { ProjectMessages::Ids::notification, {} }, { ProjectMessages::Ids::warning, {} } } }; std::map> messageActions;