@@ -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(); | |||
@@ -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<ProjectContentComponent> 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() | |||
@@ -740,7 +740,7 @@ void Project::saveProject (Async async, | |||
}); | |||
} | |||
void Project::openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, std::function<void (Result)> 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<ProjectExporter> exporter; | |||
std::function<void (Result)> 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() | |||
@@ -132,7 +132,7 @@ public: | |||
void saveProject (Async, ProjectExporter* exporterToSave, std::function<void (Result)> onCompletion); | |||
Result saveResourcesOnly(); | |||
void openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, std::function<void (Result)> 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<void (Result)> onCompletion); | |||
ValueTree projectMessages { ProjectMessages::Ids::projectMessages, {}, | |||
{ { ProjectMessages::Ids::notification, {} }, { ProjectMessages::Ids::warning, {} } } }; | |||
std::map<Identifier, std::vector<ProjectMessages::MessageAction>> messageActions; | |||