forked from qt-creator/qt-creator
Improve simpleprojectwizard
- add Qt modules - add support for cmake build-system Change-Id: I80ea5ef78bbffedf8f2c140365ee31718e7ee4a4 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
committed by
BogDan Vatra
parent
b0b50257ec
commit
fb252248be
@@ -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,6 +242,7 @@ 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"
|
||||
@@ -218,6 +252,102 @@ GeneratedFiles SimpleProjectWizard::generateFiles(const QWizard *w,
|
||||
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
|
||||
{
|
||||
|
Reference in New Issue
Block a user