diff options
author | BogDan Vatra <bogdan@kde.org> | 2020-02-26 15:05:29 +0200 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2020-03-03 10:53:37 +0000 |
commit | fb252248be81674f08f9122438b72dc11a0ef8ea (patch) | |
tree | 1e306345afe0d49fe538f500cc5294a8c9b7f6f3 /src/plugins/qmakeprojectmanager | |
parent | b0b50257ecbac450d74982e600f0586e507c8fd2 (diff) |
Improve simpleprojectwizard
- add Qt modules
- add support for cmake build-system
Change-Id: I80ea5ef78bbffedf8f2c140365ee31718e7ee4a4
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Diffstat (limited to 'src/plugins/qmakeprojectmanager')
-rw-r--r-- | src/plugins/qmakeprojectmanager/wizards/simpleprojectwizard.cpp | 148 |
1 files changed, 139 insertions, 9 deletions
diff --git a/src/plugins/qmakeprojectmanager/wizards/simpleprojectwizard.cpp b/src/plugins/qmakeprojectmanager/wizards/simpleprojectwizard.cpp index f601b4c5a12..a169e3d4484 100644 --- a/src/plugins/qmakeprojectmanager/wizards/simpleprojectwizard.cpp +++ b/src/plugins/qmakeprojectmanager/wizards/simpleprojectwizard.cpp @@ -32,6 +32,7 @@ #include <coreplugin/basefilewizard.h> #include <coreplugin/icore.h> +#include <cmakeprojectmanager/cmakeprojectconstants.h> #include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/customwizard/customwizard.h> #include <projectexplorer/selectablefilesmodel.h> @@ -43,9 +44,11 @@ #include <utils/wizard.h> #include <QApplication> +#include <QComboBox> #include <QDebug> #include <QDir> #include <QFileInfo> +#include <QLineEdit> #include <QPainter> #include <QPixmap> #include <QStyle> @@ -72,10 +75,14 @@ public: void cleanupPage() override { m_filesWidget->cancelParsing(); } FilePaths selectedFiles() const { return m_filesWidget->selectedFiles(); } FilePaths selectedPaths() const { return m_filesWidget->selectedPaths(); } + QString qtModules() const { return m_qtModules; } + QString buildSystem() const { return m_buildSystem; } private: SimpleProjectWizardDialog *m_simpleProjectWizardDialog; SelectableFilesWidget *m_filesWidget; + QString m_qtModules; + QString m_buildSystem; }; FilesSelectionWizardPage::FilesSelectionWizardPage(SimpleProjectWizardDialog *simpleProjectWizard) @@ -83,6 +90,31 @@ FilesSelectionWizardPage::FilesSelectionWizardPage(SimpleProjectWizardDialog *si m_filesWidget(new SelectableFilesWidget(this)) { auto layout = new QVBoxLayout(this); + { + auto hlayout = new QHBoxLayout; + hlayout->addWidget(new QLabel("Qt modules", this)); + auto lineEdit = new QLineEdit("core gui widgets", this); + connect(lineEdit, &QLineEdit::editingFinished, this, [this, lineEdit]{ + m_qtModules = lineEdit->text(); + }); + m_qtModules = lineEdit->text(); + hlayout->addWidget(lineEdit); + layout->addLayout(hlayout); + } + + { + auto hlayout = new QHBoxLayout; + hlayout->addWidget(new QLabel("Build system", this)); + auto comboBox = new QComboBox(this); + connect(comboBox, &QComboBox::currentTextChanged, this, [this](const QString &bs){ + m_buildSystem = bs; + }); + comboBox->addItems(QStringList() << "qmake" << "cmake"); + comboBox->setEditable(false); + comboBox->setCurrentText("qmake"); + hlayout->addWidget(comboBox); + layout->addLayout(hlayout); + } layout->addWidget(m_filesWidget); m_filesWidget->setBaseDirEditable(false); @@ -119,6 +151,8 @@ public: void setPath(const QString &path) { m_firstPage->setPath(path); } FilePaths selectedFiles() const { return m_secondPage->selectedFiles(); } FilePaths selectedPaths() const { return m_secondPage->selectedPaths(); } + QString qtModules() const { return m_secondPage->qtModules(); } + QString buildSystem() const { return m_secondPage->buildSystem(); } QString projectName() const { return m_firstPage->fileName(); } FileWizardPage *m_firstPage; @@ -133,14 +167,15 @@ void FilesSelectionWizardPage::initializePage() SimpleProjectWizard::SimpleProjectWizard() { - setSupportedProjectTypes({Constants::QMAKEPROJECT_ID}); + setSupportedProjectTypes({QmakeProjectManager::Constants::QMAKEPROJECT_ID, + CMakeProjectManager::Constants::CMAKEPROJECT_ID}); setIcon(QIcon(QLatin1String(":/qmakeprojectmanager/images/qmakeprojectmanager.png"))); - setDisplayName(tr("Import as qmake Project (Limited Functionality)")); + setDisplayName(tr("Import as qmake or cmake Project (Limited Functionality)")); setId("Z.DummyProFile"); setDescription(tr("Imports existing projects that do not use qmake, CMake or Autotools.<p>" - "This creates a qmake .pro file that allows you to use %1 as a code editor " + "This creates a project file that allows you to use %1 as a code editor " "and as a launcher for debugging and analyzing tools. " - "If you want to build the project, you might need to edit the generated .pro file.") + "If you want to build the project, you might need to edit the generated project file.") .arg(Core::Constants::IDE_DISPLAY_NAME)); setCategory(ProjectExplorer::Constants::IMPORT_WIZARD_CATEGORY); setDisplayCategory(ProjectExplorer::Constants::IMPORT_WIZARD_CATEGORY_DISPLAY); @@ -159,12 +194,10 @@ BaseFileWizard *SimpleProjectWizard::create(QWidget *parent, return wizard; } -GeneratedFiles SimpleProjectWizard::generateFiles(const QWizard *w, - QString *errorMessage) const +GeneratedFiles generateQmakeFiles(const SimpleProjectWizardDialog *wizard, + QString *errorMessage) { Q_UNUSED(errorMessage) - - auto wizard = qobject_cast<const SimpleProjectWizardDialog *>(w); const QString projectPath = wizard->path(); const QDir dir(projectPath); const QString projectName = wizard->projectName(); @@ -209,15 +242,112 @@ GeneratedFiles SimpleProjectWizard::generateFiles(const QWizard *w, + " This file was created for editing the project sources only.\n" "# You may attempt to use it for building too, by modifying this file here.\n\n" "#TARGET = " + projectName + "\n\n" + "QT = " + wizard->qtModules() + "\n\n" + proHeaders + "\n\n" + proSources + "\n\n" + proIncludes + "\n\n" "#DEFINES = \n\n" - ); + ); + + return GeneratedFiles{generatedProFile}; +} + +GeneratedFiles generateCmakeFiles(const SimpleProjectWizardDialog *wizard, + QString *errorMessage) +{ + Q_UNUSED(errorMessage) + const QString projectPath = wizard->path(); + const QDir dir(projectPath); + const QString projectName = wizard->projectName(); + const QString projectFileName = QFileInfo(dir, "CMakeLists.txt").absoluteFilePath(); + const QStringList paths = Utils::transform(wizard->selectedPaths(), &FilePath::toString); + + MimeType headerType = Utils::mimeTypeForName("text/x-chdr"); + + QStringList nameFilters = headerType.globPatterns(); + QString includes = "include_directories(\n"; + bool haveIncludes = false; + for (const QString &path : paths) { + QFileInfo fileInfo(path); + QDir thisDir(fileInfo.absoluteFilePath()); + if (!thisDir.entryList(nameFilters, QDir::Files).isEmpty()) { + QString relative = dir.relativeFilePath(path); + if (!relative.isEmpty()) { + includes.append(" " + relative + "\n"); + haveIncludes = true; + } + } + } + if (haveIncludes) + includes += ")"; + else + includes.clear(); + + QString srcs = "set (SRCS\n"; + for (const FilePath &fileName : wizard->selectedFiles()) + srcs += " " + dir.relativeFilePath(fileName.toString()) + "\n"; + srcs += ")\n"; + + QString components = "find_package(Qt5 COMPONENTS"; + QString libs = "target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE"; + bool haveQtModules = false; + for (QString c : wizard->qtModules().split(' ')) { + if (c.isEmpty()) + continue; + c[0] = c[0].toUpper(); + libs += " Qt5::" + c; + components += " " + c; + haveQtModules = true; + } + if (haveQtModules) { + libs += ")\n"; + components += " REQUIRED)"; + } else { + libs.clear(); + components.clear(); + } + + + GeneratedFile generatedProFile(projectFileName); + generatedProFile.setAttributes(Core::GeneratedFile::OpenProjectAttribute); + generatedProFile.setContents( + "# Created by and for " + QLatin1String(Core::Constants::IDE_DISPLAY_NAME) + + " This file was created for editing the project sources only.\n" + "# You may attempt to use it for building too, by modifying this file here.\n\n" + "cmake_minimum_required(VERSION 3.5)\n" + "project("+ projectName +")\n\n" + "set(CMAKE_INCLUDE_CURRENT_DIR ON)\n" + "set(CMAKE_AUTOUIC ON)\n" + "set(CMAKE_AUTOMOC ON)\n" + "set(CMAKE_AUTORCC ON)\n" + "set(CMAKE_CXX_STANDARD 11)\n" + "set(CMAKE_CXX_STANDARD_REQUIRED ON)\n" + + components + "\n\n" + + includes + "\n\n" + + srcs + "\n\n" + "add_executable(${CMAKE_PROJECT_NAME} ${SRCS})\n\n" + + libs + ); return GeneratedFiles{generatedProFile}; } +GeneratedFiles SimpleProjectWizard::generateFiles(const QWizard *w, + QString *errorMessage) const +{ + Q_UNUSED(errorMessage) + + auto wizard = qobject_cast<const SimpleProjectWizardDialog *>(w); + if (wizard->buildSystem() == "qmake") + return generateQmakeFiles(wizard, errorMessage); + else if (wizard->buildSystem() == "cmake") + return generateCmakeFiles(wizard, errorMessage); + + if (errorMessage) + *errorMessage = tr("Unknown build system \"%1\"").arg(wizard->buildSystem()); + return {}; +} + bool SimpleProjectWizard::postGenerateFiles(const QWizard *w, const GeneratedFiles &l, QString *errorMessage) const { |