forked from qt-creator/qt-creator
QmlProjectManager: Add .qmlproject file generator
Task-number: QDS-6993 Change-Id: I033b0efeea87e8eab3238d3ce8d5f25752822e36 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
@@ -15,6 +15,8 @@ add_qtc_plugin(QmlProjectManager
|
|||||||
cmakegen/generatecmakelists.cpp cmakegen/generatecmakelists.h
|
cmakegen/generatecmakelists.cpp cmakegen/generatecmakelists.h
|
||||||
cmakegen/generatecmakelistsconstants.h
|
cmakegen/generatecmakelistsconstants.h
|
||||||
cmakegen/boilerplate.qrc
|
cmakegen/boilerplate.qrc
|
||||||
|
qmlprojectgen/qmlprojectgenerator.cpp qmlprojectgen/qmlprojectgenerator.h
|
||||||
|
qmlprojectgen/templates.qrc
|
||||||
projectfilecontenttools.cpp projectfilecontenttools.h
|
projectfilecontenttools.cpp projectfilecontenttools.h
|
||||||
qdslandingpage.cpp qdslandingpage.h
|
qdslandingpage.cpp qdslandingpage.h
|
||||||
qdslandingpagetheme.cpp qdslandingpagetheme.h
|
qdslandingpagetheme.cpp qdslandingpagetheme.h
|
||||||
|
|||||||
@@ -38,6 +38,12 @@ namespace Internal {
|
|||||||
|
|
||||||
const char QMLRESOURCEPATH[] = "qmldesigner/propertyEditorQmlSources/imports";
|
const char QMLRESOURCEPATH[] = "qmldesigner/propertyEditorQmlSources/imports";
|
||||||
const char LANDINGPAGEPATH[] = "qmldesigner/landingpage";
|
const char LANDINGPAGEPATH[] = "qmldesigner/landingpage";
|
||||||
|
const char PROPERTY_QDSINSTALLED[] = "qdsInstalled";
|
||||||
|
const char PROPERTY_PROJECTFILEEXISTS[] = "projectFileExists";
|
||||||
|
const char PROPERTY_QTVERSION[] = "qtVersion";
|
||||||
|
const char PROPERTY_QDSVERSION[] = "qdsVersion";
|
||||||
|
const char PROPERTY_CMAKES[] = "cmakeLists";
|
||||||
|
const char PROPERTY_REMEMBER[] = "rememberSelection";
|
||||||
|
|
||||||
QdsLandingPageWidget::QdsLandingPageWidget(QWidget* parent)
|
QdsLandingPageWidget::QdsLandingPageWidget(QWidget* parent)
|
||||||
: QWidget(parent)
|
: QWidget(parent)
|
||||||
@@ -97,12 +103,12 @@ QWidget *QdsLandingPage::widget()
|
|||||||
|
|
||||||
void QdsLandingPage::show()
|
void QdsLandingPage::show()
|
||||||
{
|
{
|
||||||
m_widget->rootObject()->setProperty("qdsInstalled", m_qdsInstalled);
|
m_widget->rootObject()->setProperty(PROPERTY_QDSINSTALLED, m_qdsInstalled);
|
||||||
m_widget->rootObject()->setProperty("projectFileExists", m_projectFileExists);
|
m_widget->rootObject()->setProperty(PROPERTY_PROJECTFILEEXISTS, m_projectFileExists);
|
||||||
m_widget->rootObject()->setProperty("qtVersion", m_qtVersion);
|
m_widget->rootObject()->setProperty(PROPERTY_QTVERSION, m_qtVersion);
|
||||||
m_widget->rootObject()->setProperty("qdsVersion", m_qdsVersion);
|
m_widget->rootObject()->setProperty(PROPERTY_QDSVERSION, m_qdsVersion);
|
||||||
m_widget->rootObject()->setProperty("cmakeLists", m_cmakeResources);
|
m_widget->rootObject()->setProperty(PROPERTY_CMAKES, m_cmakeResources);
|
||||||
m_widget->rootObject()->setProperty("rememberSelection", Qt::Unchecked);
|
m_widget->rootObject()->setProperty(PROPERTY_REMEMBER, Qt::Unchecked);
|
||||||
m_widget->show();
|
m_widget->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,6 +125,8 @@ bool QdsLandingPage::qdsInstalled() const
|
|||||||
void QdsLandingPage::setQdsInstalled(bool installed)
|
void QdsLandingPage::setQdsInstalled(bool installed)
|
||||||
{
|
{
|
||||||
m_qdsInstalled = installed;
|
m_qdsInstalled = installed;
|
||||||
|
if (m_widget->rootObject())
|
||||||
|
m_widget->rootObject()->setProperty(PROPERTY_QDSINSTALLED, installed);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QdsLandingPage::projectFileExists() const
|
bool QdsLandingPage::projectFileExists() const
|
||||||
@@ -129,6 +137,8 @@ bool QdsLandingPage::projectFileExists() const
|
|||||||
void QdsLandingPage::setProjectFileExists(bool exists)
|
void QdsLandingPage::setProjectFileExists(bool exists)
|
||||||
{
|
{
|
||||||
m_projectFileExists = exists;
|
m_projectFileExists = exists;
|
||||||
|
if (m_widget->rootObject())
|
||||||
|
m_widget->rootObject()->setProperty(PROPERTY_PROJECTFILEEXISTS, exists);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString QdsLandingPage::qtVersion() const
|
const QString QdsLandingPage::qtVersion() const
|
||||||
@@ -139,6 +149,8 @@ const QString QdsLandingPage::qtVersion() const
|
|||||||
void QdsLandingPage::setQtVersion(const QString &version)
|
void QdsLandingPage::setQtVersion(const QString &version)
|
||||||
{
|
{
|
||||||
m_qtVersion = version;
|
m_qtVersion = version;
|
||||||
|
if (m_widget->rootObject())
|
||||||
|
m_widget->rootObject()->setProperty(PROPERTY_QTVERSION, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString QdsLandingPage::qdsVersion() const
|
const QString QdsLandingPage::qdsVersion() const
|
||||||
@@ -149,6 +161,8 @@ const QString QdsLandingPage::qdsVersion() const
|
|||||||
void QdsLandingPage::setQdsVersion(const QString &version)
|
void QdsLandingPage::setQdsVersion(const QString &version)
|
||||||
{
|
{
|
||||||
m_qdsVersion = version;
|
m_qdsVersion = version;
|
||||||
|
if (m_widget->rootObject())
|
||||||
|
m_widget->rootObject()->setProperty(PROPERTY_QDSVERSION, version);
|
||||||
}
|
}
|
||||||
|
|
||||||
const QStringList QdsLandingPage::cmakeResources() const
|
const QStringList QdsLandingPage::cmakeResources() const
|
||||||
|
|||||||
72
src/plugins/qmlprojectmanager/qmlprojectgen/qmlproject.tpl
Normal file
72
src/plugins/qmlprojectmanager/qmlprojectgen/qmlproject.tpl
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
import QmlProject
|
||||||
|
|
||||||
|
Project {
|
||||||
|
|
||||||
|
/* Include .qml, .js, and image files from current directory and subdirectories */
|
||||||
|
|
||||||
|
%1
|
||||||
|
%2
|
||||||
|
%3
|
||||||
|
%4
|
||||||
|
|
||||||
|
Files {
|
||||||
|
filter: "*.conf"
|
||||||
|
files: ["qtquickcontrols2.conf"]
|
||||||
|
}
|
||||||
|
|
||||||
|
Files {
|
||||||
|
filter: "qmldir"
|
||||||
|
directory: "."
|
||||||
|
}
|
||||||
|
|
||||||
|
Files {
|
||||||
|
filter: "*.ttf;*.otf"
|
||||||
|
}
|
||||||
|
|
||||||
|
Files {
|
||||||
|
filter: "*.wav;*.mp3"
|
||||||
|
}
|
||||||
|
|
||||||
|
Files {
|
||||||
|
filter: "*.mp4"
|
||||||
|
}
|
||||||
|
|
||||||
|
Files {
|
||||||
|
filter: "*.glsl;*.glslv;*.glslf;*.vsh;*.fsh;*.vert;*.frag"
|
||||||
|
}
|
||||||
|
|
||||||
|
Environment {
|
||||||
|
QT_QUICK_CONTROLS_CONF: "qtquickcontrols2.conf"
|
||||||
|
QT_AUTO_SCREEN_SCALE_FACTOR: "1"
|
||||||
|
QT_LOGGING_RULES: "qt.qml.connections=false"
|
||||||
|
QT_ENABLE_HIGHDPI_SCALING: "0"
|
||||||
|
/* Useful for debugging
|
||||||
|
QSG_VISUALIZE=batches
|
||||||
|
QSG_VISUALIZE=clip
|
||||||
|
QSG_VISUALIZE=changes
|
||||||
|
QSG_VISUALIZE=overdraw
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
qt6Project: true
|
||||||
|
createdInQtCreator: true
|
||||||
|
qdsVersion: "3.4"
|
||||||
|
|
||||||
|
%5
|
||||||
|
|
||||||
|
/* If any modules the project imports require widgets (e.g. QtCharts), widgetApp must be true */
|
||||||
|
widgetApp: true
|
||||||
|
|
||||||
|
/* args: Specifies command line arguments for qsb tool to generate shaders.
|
||||||
|
files: Specifies target files for qsb tool. If path is included, it must be relative to this file.
|
||||||
|
Wildcard '*' can be used in the file name part of the path.
|
||||||
|
e.g. files: [ "content/shaders/*.vert", "*.frag" ] */
|
||||||
|
ShaderTool {
|
||||||
|
args: "-s --glsl \\\"100 es,120,150\\\" --hlsl 50 --msl 12"
|
||||||
|
files: [ "content/shaders/*" ]
|
||||||
|
}
|
||||||
|
|
||||||
|
multilanguageSupport: true
|
||||||
|
supportedLanguages: ["en"]
|
||||||
|
primaryLanguage: "en"
|
||||||
|
}
|
||||||
@@ -0,0 +1,265 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2022 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Design Tooling
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "qmlprojectgenerator.h"
|
||||||
|
#include "cmakegen/generatecmakelists.h"
|
||||||
|
|
||||||
|
#include <coreplugin/documentmanager.h>
|
||||||
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
|
#include <QMessageBox>
|
||||||
|
|
||||||
|
using namespace Utils;
|
||||||
|
|
||||||
|
namespace QmlProjectManager {
|
||||||
|
namespace GenerateQmlProject {
|
||||||
|
|
||||||
|
bool QmlProjectFileGenerator::prepareForUiQmlFile(const FilePath &uiQmlFilePath)
|
||||||
|
{
|
||||||
|
return prepare(selectTargetFile(uiQmlFilePath));
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QmlProjectFileGenerator::prepare(const FilePath &targetDir)
|
||||||
|
{
|
||||||
|
m_targetFile = targetDir.isEmpty() ? selectTargetFile() : targetDir;
|
||||||
|
m_targetDir = m_targetFile.parentDir();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char QMLPROJECT_FILE_TEMPLATE_PATH[] = ":/projectfiletemplates/qmlproject.tpl";
|
||||||
|
const char FILE_QML[] = "*.qml";
|
||||||
|
const char FILE_JS[] = "*.js";
|
||||||
|
const char FILE_JPG[] = "*.jpg";
|
||||||
|
const char FILE_PNG[] = "*.png";
|
||||||
|
const char FILE_GIF[] = "*.gif";
|
||||||
|
const char FILE_MESH[] = "*.mesh";
|
||||||
|
const char BLOCKTITLE_QML[] = "QmlFiles";
|
||||||
|
const char BLOCKTITLE_IMAGE[] = "ImageFiles";
|
||||||
|
const char BLOCKTITLE_JS[] = "JavaScriptFiles";
|
||||||
|
const char BLOCK_CONTENTDIR[] = "\n %1 {\n directory: \"%2\"\n }\n";
|
||||||
|
const char BLOCK_FILTEREDDIR[] = "\n Files {\n filter: \"%1\"\n directory: \"%2\"\n }\n";
|
||||||
|
const char BLOCK_DIRARRAY[] = "\n %1: [ %2 ]\n";
|
||||||
|
|
||||||
|
bool QmlProjectFileGenerator::execute()
|
||||||
|
{
|
||||||
|
static const QStringList filesQml = {FILE_QML};
|
||||||
|
static const QStringList filesImage = {FILE_PNG, FILE_JPG, FILE_GIF};
|
||||||
|
static const QStringList filesJs = {FILE_QML, FILE_JS};
|
||||||
|
static const QStringList filesAsset = {FILE_MESH};
|
||||||
|
|
||||||
|
if (m_targetFile.isEmpty() || !m_targetDir.isWritableDir())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
const QString contentEntry = createContentDirEntries(BLOCKTITLE_QML, filesQml);
|
||||||
|
const QString imageEntry = createContentDirEntries(BLOCKTITLE_IMAGE, filesImage);
|
||||||
|
const QString jsEntry = createContentDirEntries(BLOCKTITLE_JS, filesJs);
|
||||||
|
const QString assetEntry = createFilteredDirEntries(filesAsset);
|
||||||
|
QStringList importDirs = findContentDirs(filesQml + filesAsset);
|
||||||
|
importDirs.removeAll(".");
|
||||||
|
importDirs.removeAll("content");
|
||||||
|
const QString importPaths = createDirArrayEntry("importPaths", importDirs);
|
||||||
|
|
||||||
|
const QString fileContent = GenerateCmake::readTemplate(QMLPROJECT_FILE_TEMPLATE_PATH)
|
||||||
|
.arg(contentEntry, imageEntry, jsEntry, assetEntry, importPaths);
|
||||||
|
|
||||||
|
QFile file(m_targetFile.toString());
|
||||||
|
file.open(QIODevice::WriteOnly);
|
||||||
|
if (!file.isOpen())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
file.reset();
|
||||||
|
file.write(fileContent.toUtf8());
|
||||||
|
file.close();
|
||||||
|
|
||||||
|
QMessageBox::information(Core::ICore::dialogParent(),
|
||||||
|
QObject::tr("Project File Generated"),
|
||||||
|
QObject::tr("File created:\n\n%1").arg(m_targetFile.toString()),
|
||||||
|
QMessageBox::Ok);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FilePath QmlProjectFileGenerator::targetDir() const
|
||||||
|
{
|
||||||
|
return m_targetDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
const FilePath QmlProjectFileGenerator::targetFile() const
|
||||||
|
{
|
||||||
|
return m_targetFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QmlProjectFileGenerator::isStandardStructure(const FilePath &projectDir) const
|
||||||
|
{
|
||||||
|
if (projectDir.pathAppended("content").isDir() &&
|
||||||
|
projectDir.pathAppended("imports").isDir())
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString QmlProjectFileGenerator::createContentDirEntries(const QString &containerName,
|
||||||
|
const QStringList &suffixes) const
|
||||||
|
{
|
||||||
|
QString entries;
|
||||||
|
|
||||||
|
const QStringList contentDirs = findContentDirs(suffixes);
|
||||||
|
for (const QString &dir : contentDirs)
|
||||||
|
entries.append(QString(BLOCK_CONTENTDIR).arg(containerName, dir));
|
||||||
|
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString QmlProjectFileGenerator::createFilteredDirEntries(const QStringList &suffixes) const
|
||||||
|
{
|
||||||
|
QString entries;
|
||||||
|
const QString filterList = suffixes.join(';');
|
||||||
|
|
||||||
|
const QStringList contentDirs = findContentDirs(suffixes);
|
||||||
|
for (const QString &dir : contentDirs)
|
||||||
|
entries.append(QString(BLOCK_FILTEREDDIR).arg(filterList, dir));
|
||||||
|
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QString QmlProjectFileGenerator::createDirArrayEntry(const QString &arrayName,
|
||||||
|
const QStringList &relativePaths) const
|
||||||
|
{
|
||||||
|
if (relativePaths.isEmpty())
|
||||||
|
return {};
|
||||||
|
|
||||||
|
QStringList formattedDirs = relativePaths;
|
||||||
|
for (QString &dir : formattedDirs)
|
||||||
|
dir.append('"').prepend('"');
|
||||||
|
|
||||||
|
return QString(BLOCK_DIRARRAY).arg(arrayName, formattedDirs.join(", "));
|
||||||
|
}
|
||||||
|
|
||||||
|
const FilePath QmlProjectFileGenerator::selectTargetFile(const FilePath &uiFilePath)
|
||||||
|
{
|
||||||
|
FilePath suggestedDir;
|
||||||
|
|
||||||
|
if (!uiFilePath.isEmpty())
|
||||||
|
if (uiFilePath.parentDir().parentDir().exists())
|
||||||
|
suggestedDir = uiFilePath.parentDir().parentDir();
|
||||||
|
|
||||||
|
if (suggestedDir.isEmpty())
|
||||||
|
suggestedDir = FilePath::fromString(QDir::homePath());
|
||||||
|
|
||||||
|
FilePath targetFile;
|
||||||
|
bool selectionCompleted = false;
|
||||||
|
do {
|
||||||
|
targetFile = Core::DocumentManager::getSaveFileNameWithExtension(
|
||||||
|
QObject::tr("Select File Location"),
|
||||||
|
suggestedDir,
|
||||||
|
QObject::tr("Qt Design Studio Project Files (*.qmlproject)"));
|
||||||
|
selectionCompleted = isDirAcceptable(targetFile.parentDir(), uiFilePath);
|
||||||
|
} while (!selectionCompleted);
|
||||||
|
|
||||||
|
return targetFile;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QmlProjectFileGenerator::isDirAcceptable(const FilePath &dir, const FilePath &uiFile)
|
||||||
|
{
|
||||||
|
const FilePath uiFileParentDir = uiFile.parentDir();
|
||||||
|
|
||||||
|
if (dir.isChildOf(uiFileParentDir)) {
|
||||||
|
QMessageBox::warning(Core::ICore::dialogParent(),
|
||||||
|
QObject::tr("Invalid Directory"),
|
||||||
|
QObject::tr("Project file must be placed in a parent directory of the QML files."),
|
||||||
|
QMessageBox::Ok);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (uiFileParentDir.isChildOf(dir)) {
|
||||||
|
const FilePath relativePath = uiFileParentDir.relativeChildPath(dir);
|
||||||
|
QStringList components = relativePath.toString().split("/");
|
||||||
|
if (components.size() > 2) {
|
||||||
|
QMessageBox::StandardButton sel = QMessageBox::question(Core::ICore::dialogParent(),
|
||||||
|
QObject::tr("Problem"),
|
||||||
|
QObject::tr("Selected directory is far away from the QML file. This can cause unexpected results.\n\nAre you sure?"),
|
||||||
|
QMessageBox::Yes | QMessageBox::No);
|
||||||
|
if (sel == QMessageBox::No)
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const int TOO_FAR_AWAY = 4;
|
||||||
|
const QDir::Filters FILES_ONLY = QDir::Files;
|
||||||
|
const QDir::Filters DIRS_ONLY = QDir::Dirs|QDir::Readable|QDir::NoDotAndDotDot;
|
||||||
|
|
||||||
|
const FilePath QmlProjectFileGenerator::findInDirTree(const FilePath &dir, const QStringList &suffixes, int currentSearchDepth) const
|
||||||
|
{
|
||||||
|
if (currentSearchDepth > TOO_FAR_AWAY)
|
||||||
|
return {};
|
||||||
|
|
||||||
|
currentSearchDepth++;
|
||||||
|
|
||||||
|
const FilePaths files = dir.dirEntries({suffixes, FILES_ONLY});
|
||||||
|
if (!files.isEmpty())
|
||||||
|
return dir;
|
||||||
|
|
||||||
|
FilePaths subdirs = dir.dirEntries(DIRS_ONLY);
|
||||||
|
for (const FilePath &subdir : subdirs) {
|
||||||
|
const FilePath result = findInDirTree(subdir, suffixes, currentSearchDepth);
|
||||||
|
if (!result.isEmpty())
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
const QStringList QmlProjectFileGenerator::findContentDirs(const QStringList &suffixes) const
|
||||||
|
{
|
||||||
|
FilePaths results;
|
||||||
|
|
||||||
|
if (!isStandardStructure(m_targetDir))
|
||||||
|
if (!m_targetDir.dirEntries({suffixes, FILES_ONLY}).isEmpty())
|
||||||
|
return {"."};
|
||||||
|
|
||||||
|
const FilePaths dirs = m_targetDir.dirEntries(DIRS_ONLY);
|
||||||
|
for (const FilePath &dir : dirs) {
|
||||||
|
const FilePath result = findInDirTree(dir, suffixes);
|
||||||
|
if (!result.isEmpty())
|
||||||
|
results.append(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList relativePaths;
|
||||||
|
for (const FilePath &fullPath : results) {
|
||||||
|
if (fullPath == m_targetDir)
|
||||||
|
relativePaths.append(".");
|
||||||
|
else
|
||||||
|
relativePaths.append(fullPath.relativeChildPath(m_targetDir).toString().split('/').first());
|
||||||
|
}
|
||||||
|
|
||||||
|
return relativePaths;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // GenerateQmlProject
|
||||||
|
} // QmlProjectManager
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/****************************************************************************
|
||||||
|
**
|
||||||
|
** Copyright (C) 2022 The Qt Company Ltd.
|
||||||
|
** Contact: https://www.qt.io/licensing/
|
||||||
|
**
|
||||||
|
** This file is part of the Qt Design Tooling
|
||||||
|
**
|
||||||
|
** Commercial License Usage
|
||||||
|
** Licensees holding valid commercial Qt licenses may use this file in
|
||||||
|
** accordance with the commercial license agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and The Qt Company. For licensing terms
|
||||||
|
** and conditions see https://www.qt.io/terms-conditions. For further
|
||||||
|
** information use the contact form at https://www.qt.io/contact-us.
|
||||||
|
**
|
||||||
|
** GNU General Public License Usage
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU
|
||||||
|
** General Public License version 3 as published by the Free Software
|
||||||
|
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
|
||||||
|
** included in the packaging of this file. Please review the following
|
||||||
|
** information to ensure the GNU General Public License requirements will
|
||||||
|
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
|
||||||
|
**
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <utils/filepath.h>
|
||||||
|
|
||||||
|
namespace QmlProjectManager {
|
||||||
|
namespace GenerateQmlProject {
|
||||||
|
|
||||||
|
class QmlProjectFileGenerator {
|
||||||
|
public:
|
||||||
|
bool prepare(const Utils::FilePath &targetDir);
|
||||||
|
bool prepareForUiQmlFile(const Utils::FilePath &uiFilePath);
|
||||||
|
bool execute();
|
||||||
|
|
||||||
|
const Utils::FilePath targetDir() const;
|
||||||
|
const Utils::FilePath targetFile() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
const QString createFilteredDirEntries(const QStringList &suffixes) const;
|
||||||
|
const QString createDirArrayEntry(const QString &arrayName, const QStringList &relativePaths) const;
|
||||||
|
const Utils::FilePath selectTargetFile(const Utils::FilePath &uiFilePath = {});
|
||||||
|
bool isStandardStructure(const Utils::FilePath &projectDir) const;
|
||||||
|
bool isDirAcceptable(const Utils::FilePath &dir, const Utils::FilePath &uiFile);
|
||||||
|
const QString createContentDirEntries(const QString &containerName,
|
||||||
|
const QStringList &suffixes) const;
|
||||||
|
const Utils::FilePath findInDirTree(const Utils::FilePath &dir,
|
||||||
|
const QStringList &suffixes,
|
||||||
|
int currentSearchDepth = 0) const;
|
||||||
|
const QStringList findContentDirs(const QStringList &suffixes) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Utils::FilePath m_targetDir;
|
||||||
|
Utils::FilePath m_targetFile;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // GenerateQmlProject
|
||||||
|
} // QmlProjectManager
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
<RCC>
|
||||||
|
<qresource prefix="/projectfiletemplates">
|
||||||
|
<file>qmlproject.tpl</file>
|
||||||
|
</qresource>
|
||||||
|
</RCC>
|
||||||
@@ -54,4 +54,13 @@ QtcPlugin {
|
|||||||
"cmakeprojectconverterdialog.cpp", "cmakeprojectconverterdialog.h",
|
"cmakeprojectconverterdialog.cpp", "cmakeprojectconverterdialog.h",
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Group {
|
||||||
|
name: "QML Project File Generator"
|
||||||
|
prefix: "qmlprojectgen/"
|
||||||
|
files: [
|
||||||
|
"qmlprojectgenerator.cpp", "qmlprojectgenerator.h",
|
||||||
|
"templates.qrc"
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "projectfilecontenttools.h"
|
#include "projectfilecontenttools.h"
|
||||||
#include "cmakegen/cmakeprojectconverter.h"
|
#include "cmakegen/cmakeprojectconverter.h"
|
||||||
#include "cmakegen/generatecmakelists.h"
|
#include "cmakegen/generatecmakelists.h"
|
||||||
|
#include "qmlprojectgen/qmlprojectgenerator.h"
|
||||||
|
|
||||||
#include <coreplugin/actionmanager/actioncontainer.h>
|
#include <coreplugin/actionmanager/actioncontainer.h>
|
||||||
#include <coreplugin/actionmanager/actionmanager.h>
|
#include <coreplugin/actionmanager/actionmanager.h>
|
||||||
@@ -390,17 +391,12 @@ void QmlProjectPlugin::initializeQmlLandingPage()
|
|||||||
|
|
||||||
void QmlProjectPlugin::displayQmlLandingPage()
|
void QmlProjectPlugin::displayQmlLandingPage()
|
||||||
{
|
{
|
||||||
const QString qtVersionString = ProjectFileContentTools::qtVersion(projectFilePath());
|
|
||||||
const QString qdsVersionString = ProjectFileContentTools::qdsVersion(projectFilePath());
|
|
||||||
|
|
||||||
if (!d->landingPage)
|
if (!d->landingPage)
|
||||||
initializeQmlLandingPage();
|
initializeQmlLandingPage();
|
||||||
|
|
||||||
|
updateQmlLandingPageProjectInfo(projectFilePath());
|
||||||
d->landingPage->setQdsInstalled(qdsInstallationExists());
|
d->landingPage->setQdsInstalled(qdsInstallationExists());
|
||||||
d->landingPage->setProjectFileExists(projectFilePath().exists());
|
|
||||||
d->landingPage->setCmakeResources(ProjectFileContentTools::rootCmakeFiles());
|
d->landingPage->setCmakeResources(ProjectFileContentTools::rootCmakeFiles());
|
||||||
d->landingPage->setQtVersion(qtVersionString);
|
|
||||||
d->landingPage->setQdsVersion(qdsVersionString);
|
|
||||||
d->landingPage->show();
|
d->landingPage->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -469,7 +465,24 @@ void QmlProjectPlugin::generateCmake()
|
|||||||
|
|
||||||
void QmlProjectPlugin::generateProjectFile()
|
void QmlProjectPlugin::generateProjectFile()
|
||||||
{
|
{
|
||||||
qWarning() << "TODO generate .qmlproject";
|
GenerateQmlProject::QmlProjectFileGenerator generator;
|
||||||
|
|
||||||
|
Core::IEditor *editor = Core::EditorManager::currentEditor();
|
||||||
|
if (editor)
|
||||||
|
if (generator.prepareForUiQmlFile(editor->document()->filePath()))
|
||||||
|
if (generator.execute())
|
||||||
|
updateQmlLandingPageProjectInfo(generator.targetFile());
|
||||||
|
}
|
||||||
|
|
||||||
|
void QmlProjectPlugin::updateQmlLandingPageProjectInfo(const Utils::FilePath &projectFile)
|
||||||
|
{
|
||||||
|
if (d->landingPage) {
|
||||||
|
const QString qtVersionString = ProjectFileContentTools::qtVersion(projectFile);
|
||||||
|
const QString qdsVersionString = ProjectFileContentTools::qdsVersion(projectFile);
|
||||||
|
d->landingPage->setProjectFileExists(projectFile.exists());
|
||||||
|
d->landingPage->setQtVersion(qtVersionString);
|
||||||
|
d->landingPage->setQdsVersion(qdsVersionString);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Utils::FilePath QmlProjectPlugin::projectFilePath()
|
Utils::FilePath QmlProjectPlugin::projectFilePath()
|
||||||
|
|||||||
@@ -66,6 +66,7 @@ private:
|
|||||||
void initializeQmlLandingPage();
|
void initializeQmlLandingPage();
|
||||||
void displayQmlLandingPage();
|
void displayQmlLandingPage();
|
||||||
void hideQmlLandingPage();
|
void hideQmlLandingPage();
|
||||||
|
void updateQmlLandingPageProjectInfo(const Utils::FilePath &projectFile);
|
||||||
|
|
||||||
class QmlProjectPluginPrivate *d = nullptr;
|
class QmlProjectPluginPrivate *d = nullptr;
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user