From 093a54cbb88e92a07fd7ca8f3076945bd0b756c3 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 29 May 2015 17:25:40 +0200 Subject: Make BaseFileWizard async The side-effect is that WizardEventLoop can go! Change-Id: I0eae0e0fa91a48e2a5010b47cc0de86758969904 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/basefilewizard.cpp | 136 +++++++++++++++++++++++++++++- 1 file changed, 133 insertions(+), 3 deletions(-) (limited to 'src/plugins/coreplugin/basefilewizard.cpp') diff --git a/src/plugins/coreplugin/basefilewizard.cpp b/src/plugins/coreplugin/basefilewizard.cpp index d65503436a..9fbf83b7e8 100644 --- a/src/plugins/coreplugin/basefilewizard.cpp +++ b/src/plugins/coreplugin/basefilewizard.cpp @@ -30,6 +30,136 @@ #include "basefilewizard.h" -Core::BaseFileWizard::BaseFileWizard(QWidget *parent) : - Utils::Wizard(parent) -{ } +#include "basefilewizardfactory.h" +#include "ifilewizardextension.h" + +#include + +#include + +using namespace Utils; + +namespace Core { + +BaseFileWizard::BaseFileWizard(const BaseFileWizardFactory *factory, + const QVariantMap &extraValues, + QWidget *parent) : + Wizard(parent), + m_extraValues(extraValues), + m_factory(factory) +{ + // Compile extension pages, purge out unused ones + QList extensionList + = ExtensionSystem::PluginManager::getObjects(); + + for (auto it = extensionList.begin(); it != extensionList.end(); ) { + const QList extensionPages = (*it)->extensionPages(factory); + if (extensionPages.empty()) { + it = extensionList.erase(it); + } else { + m_extensionPages += extensionPages; + ++it; + } + } + + if (!m_extensionPages.empty()) + m_firstExtensionPage = m_extensionPages.front(); +} + +void BaseFileWizard::initializePage(int id) +{ + if (page(id) == m_firstExtensionPage) { + generateFileList(); + + QList extensionList + = ExtensionSystem::PluginManager::getObjects(); + foreach (IFileWizardExtension *ex, extensionList) + ex->firstExtensionPageShown(m_files, m_extraValues); + } +} + +QList BaseFileWizard::extensionPages() +{ + return m_extensionPages; +} + +void BaseFileWizard::accept() +{ + if (m_files.isEmpty()) + generateFileList(); + + QString errorMessage; + + // Compile result list and prompt for overwrite + switch (m_factory->promptOverwrite(&m_files, &errorMessage)) { + case BaseFileWizardFactory::OverwriteCanceled: + reject(); + return; + case BaseFileWizardFactory::OverwriteError: + QMessageBox::critical(0, tr("Existing files"), errorMessage); + reject(); + return; + case BaseFileWizardFactory::OverwriteOk: + break; + } + + QList extensionList + = ExtensionSystem::PluginManager::getObjects(); + foreach (IFileWizardExtension *ex, extensionList) { + for (int i = 0; i < m_files.count(); i++) { + ex->applyCodeStyle(&m_files[i]); + } + } + + // Write + if (!m_factory->writeFiles(m_files, &errorMessage)) { + QMessageBox::critical(parentWidget(), tr("File Generation Failure"), errorMessage); + reject(); + return; + } + + bool removeOpenProjectAttribute = false; + // Run the extensions + foreach (IFileWizardExtension *ex, extensionList) { + bool remove; + if (!ex->processFiles(m_files, &remove, &errorMessage)) { + if (!errorMessage.isEmpty()) + QMessageBox::critical(parentWidget(), tr("File Generation Failure"), errorMessage); + reject(); + return; + } + removeOpenProjectAttribute |= remove; + } + + if (removeOpenProjectAttribute) { + for (int i = 0; i < m_files.count(); i++) { + if (m_files[i].attributes() & GeneratedFile::OpenProjectAttribute) + m_files[i].setAttributes(GeneratedFile::OpenEditorAttribute); + } + } + + // Post generation handler + if (!m_factory->postGenerateFiles(this, m_files, &errorMessage)) + if (!errorMessage.isEmpty()) + QMessageBox::critical(0, tr("File Generation Failure"), errorMessage); + + Wizard::accept(); +} + +void BaseFileWizard::reject() +{ + m_files.clear(); + Wizard::reject(); +} + +void BaseFileWizard::generateFileList() +{ + QString errorMessage; + m_files = m_factory->generateFiles(this, &errorMessage); + if (m_files.empty()) { + QMessageBox::critical(parentWidget(), tr("File Generation Failure"), errorMessage); + reject(); + } +} + +} // namespace Core -- cgit v1.2.1