@@ -226,31 +226,29 @@ void HeaderComponent::initialiseButtons() | |||||
saveAndOpenInIDEButton.setIconInset (7); | saveAndOpenInIDEButton.setIconInset (7); | ||||
saveAndOpenInIDEButton.onClick = [this] | 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(); | updateExporterButton(); | ||||
@@ -496,9 +496,24 @@ StringArray ProjectContentComponent::getExportersWhichCanLaunch() const | |||||
void ProjectContentComponent::openInSelectedIDE (bool saveFirst) | 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() | 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();) | for (ExporterIterator exporter (*this); exporter.next();) | ||||
{ | { | ||||
@@ -749,51 +749,13 @@ void Project::openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, | |||||
if (isTemporaryProject()) | if (isTemporaryProject()) | ||||
{ | { | ||||
saveAndMoveTemporaryProject (true); | 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; | return; | ||||
} | } | ||||
exporter->launchProject(); | exporter->launchProject(); | ||||
break; | |||||
return; | |||||
} | } | ||||
} | } | ||||
if (onCompletion != nullptr) | |||||
onCompletion (Result::ok()); | |||||
} | } | ||||
Result Project::saveResourcesOnly() | Result Project::saveResourcesOnly() | ||||
@@ -132,7 +132,7 @@ public: | |||||
void saveProject (Async, ProjectExporter* exporterToSave, std::function<void (Result)> onCompletion); | void saveProject (Async, ProjectExporter* exporterToSave, std::function<void (Result)> onCompletion); | ||||
Result saveResourcesOnly(); | Result saveResourcesOnly(); | ||||
void openProjectInIDE (ProjectExporter& exporterToOpen, bool saveFirst, std::function<void (Result)> onCompletion); | |||||
void openProjectInIDE (ProjectExporter& exporterToOpen); | |||||
File getLastDocumentOpened() override; | File getLastDocumentOpened() override; | ||||
void setLastDocumentOpened (const File& file) override; | void setLastDocumentOpened (const File& file) override; | ||||
@@ -614,11 +614,6 @@ private: | |||||
void updateCLionWarning (bool showWarning); | void updateCLionWarning (bool showWarning); | ||||
void updateModuleNotFoundWarning (bool showWarning); | void updateModuleNotFoundWarning (bool showWarning); | ||||
void openProjectInIDEImpl (ExporterIterator exporter, | |||||
String exporterToOpen, | |||||
bool saveFirst, | |||||
std::function<void (Result)> onCompletion); | |||||
ValueTree projectMessages { ProjectMessages::Ids::projectMessages, {}, | ValueTree projectMessages { ProjectMessages::Ids::projectMessages, {}, | ||||
{ { ProjectMessages::Ids::notification, {} }, { ProjectMessages::Ids::warning, {} } } }; | { { ProjectMessages::Ids::notification, {} }, { ProjectMessages::Ids::warning, {} } } }; | ||||
std::map<Identifier, std::vector<ProjectMessages::MessageAction>> messageActions; | std::map<Identifier, std::vector<ProjectMessages::MessageAction>> messageActions; | ||||