2021-10-06 12:35:52 +03:00
/****************************************************************************
* *
* * Copyright ( C ) 2021 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 "generatecmakelists.h"
2021-11-03 11:37:48 +02:00
# include "cmakegeneratordialog.h"
2021-10-06 12:35:52 +03:00
# include <coreplugin/actionmanager/actionmanager.h>
# include <coreplugin/actionmanager/actioncontainer.h>
# include <projectexplorer/projectexplorerconstants.h>
# include <projectexplorer/project.h>
2021-10-20 17:37:22 +03:00
# include <projectexplorer/runcontrol.h>
2021-10-06 12:35:52 +03:00
# include <projectexplorer/session.h>
# include <qmlprojectmanager/qmlprojectmanagerconstants.h>
2021-10-20 17:37:22 +03:00
# include <qmlprojectmanager/qmlmainfileaspect.h>
2021-10-06 12:35:52 +03:00
# include <utils/fileutils.h>
# include <QAction>
2021-11-17 12:18:35 +02:00
# include <QMessageBox>
2021-11-03 11:37:48 +02:00
# include <QtConcurrent>
2021-10-06 12:35:52 +03:00
# include <QRegularExpression>
# include <QStringList>
2021-10-12 13:30:14 +02:00
# include <QTextStream>
2021-10-06 12:35:52 +03:00
using namespace Utils ;
namespace QmlDesigner {
2021-10-20 17:37:22 +03:00
namespace GenerateCmake {
2021-10-06 12:35:52 +03:00
2021-11-03 11:37:48 +02:00
bool operator = = ( const GeneratableFile & left , const GeneratableFile & right )
{
return ( left . filePath = = right . filePath & & left . content = = right . content ) ;
}
2021-11-17 12:18:35 +02:00
enum ProjectDirectoryError {
NO_ERROR = 0 ,
MISSING_CONTENTDIR = 1 < < 1 ,
MISSING_IMPORTDIR = 1 < < 2 ,
MISSING_CPPDIR = 1 < < 3 ,
MISSING_MAINCMAKE = 1 < < 4 ,
MISSING_MAINQML = 1 < < 5 ,
MISSING_APPMAINQML = 1 < < 6 ,
MISSING_QMLMODULES = 1 < < 7 ,
MISSING_MAINCPP = 1 < < 8 ,
MISSING_MAINCPP_HEADER = 1 < < 9
} ;
2021-11-03 11:37:48 +02:00
QVector < GeneratableFile > queuedFiles ;
2021-10-06 12:35:52 +03:00
void generateMenuEntry ( )
{
Core : : ActionContainer * buildMenu =
Core : : ActionManager : : actionContainer ( ProjectExplorer : : Constants : : M_BUILDPROJECT ) ;
2021-11-17 12:18:35 +02:00
auto action = new QAction ( QCoreApplication : : tr ( " Generate CMakeLists.txt Files " ) ) ;
2021-10-20 17:37:22 +03:00
QObject : : connect ( action , & QAction : : triggered , GenerateCmake : : onGenerateCmakeLists ) ;
2021-10-06 12:35:52 +03:00
Core : : Command * cmd = Core : : ActionManager : : registerAction ( action , " QmlProject.CreateCMakeLists " ) ;
buildMenu - > addAction ( cmd , ProjectExplorer : : Constants : : G_BUILD_RUN ) ;
action - > setEnabled ( ProjectExplorer : : SessionManager : : startupProject ( ) ! = nullptr ) ;
QObject : : connect ( ProjectExplorer : : SessionManager : : instance ( ) ,
& ProjectExplorer : : SessionManager : : startupProjectChanged , [ action ] ( ) {
action - > setEnabled ( ProjectExplorer : : SessionManager : : startupProject ( ) ! = nullptr ) ;
} ) ;
}
void onGenerateCmakeLists ( )
{
2021-10-20 17:37:22 +03:00
FilePath rootDir = ProjectExplorer : : SessionManager : : startupProject ( ) - > projectDirectory ( ) ;
2021-11-17 12:18:35 +02:00
int projectDirErrors = isProjectCorrectlyFormed ( rootDir ) ;
if ( projectDirErrors ! = NO_ERROR ) {
showProjectDirErrorDialog ( projectDirErrors ) ;
if ( isErrorFatal ( projectDirErrors ) )
return ;
}
queuedFiles . clear ( ) ;
2021-11-11 18:36:48 +02:00
GenerateCmakeLists : : generateCmakes ( rootDir ) ;
2021-10-20 17:37:22 +03:00
GenerateEntryPoints : : generateMainCpp ( rootDir ) ;
GenerateEntryPoints : : generateMainQml ( rootDir ) ;
2021-11-03 11:37:48 +02:00
if ( showConfirmationDialog ( rootDir ) )
writeQueuedFiles ( ) ;
}
2021-11-17 12:18:35 +02:00
bool isErrorFatal ( int error )
{
if ( error & MISSING_CONTENTDIR | |
error & MISSING_IMPORTDIR | |
error & MISSING_CPPDIR | |
error & MISSING_APPMAINQML )
return true ;
return false ;
}
const char DIRNAME_CONTENT [ ] = " content " ;
const char DIRNAME_IMPORT [ ] = " imports " ;
const char DIRNAME_CPP [ ] = " src " ;
const char FILENAME_CMAKELISTS [ ] = " CMakeLists.txt " ;
const char FILENAME_APPMAINQML [ ] = " App.qml " ;
const char FILENAME_MAINQML [ ] = " main.qml " ;
const char FILENAME_MAINCPP [ ] = " main.cpp " ;
const char FILENAME_MAINCPP_HEADER [ ] = " import_qml_plugins.h " ;
const char FILENAME_MODULES [ ] = " qmlmodules " ;
int isProjectCorrectlyFormed ( const FilePath & rootDir )
{
int errors = NO_ERROR ;
if ( ! rootDir . pathAppended ( DIRNAME_CONTENT ) . exists ( ) )
errors | = MISSING_CONTENTDIR ;
if ( ! rootDir . pathAppended ( DIRNAME_CONTENT ) . pathAppended ( FILENAME_APPMAINQML ) . exists ( ) )
errors | = MISSING_APPMAINQML ;
if ( ! rootDir . pathAppended ( DIRNAME_IMPORT ) . exists ( ) )
errors | = MISSING_IMPORTDIR ;
if ( ! rootDir . pathAppended ( DIRNAME_CPP ) . exists ( ) )
errors | = MISSING_CPPDIR ;
if ( ! rootDir . pathAppended ( DIRNAME_CPP ) . pathAppended ( FILENAME_MAINCPP ) . exists ( ) )
errors | = MISSING_MAINCPP ;
if ( ! rootDir . pathAppended ( DIRNAME_CPP ) . pathAppended ( FILENAME_MAINCPP_HEADER ) . exists ( ) )
errors | = MISSING_MAINCPP_HEADER ;
if ( ! rootDir . pathAppended ( FILENAME_CMAKELISTS ) . exists ( ) )
errors | = MISSING_MAINCMAKE ;
if ( ! rootDir . pathAppended ( FILENAME_MODULES ) . exists ( ) )
errors | = MISSING_QMLMODULES ;
if ( ! rootDir . pathAppended ( FILENAME_MAINQML ) . exists ( ) )
errors | = MISSING_MAINQML ;
return errors ;
}
2021-11-03 11:37:48 +02:00
void removeUnconfirmedQueuedFiles ( const Utils : : FilePaths confirmedFiles )
{
QtConcurrent : : blockingFilter ( queuedFiles , [ confirmedFiles ] ( const GeneratableFile & qf ) {
return confirmedFiles . contains ( qf . filePath ) ;
} ) ;
}
2021-11-17 12:18:35 +02:00
const QString WARNING_MISSING_STRUCTURE_FATAL = QCoreApplication : : tr (
" The project is not properly structured for automatically generating CMake files. \n \n Aborting process. \n \n The following files or directories are missing: \n \n %1 " ) ;
const QString WARNING_MISSING_STRUCTURE_NONFATAL = QCoreApplication : : tr (
" The project is not properly structured for automatically generating CMake files. \n \n The following files will be created: \n \n %1 " ) ;
const QString WARNING_TITLE_FATAL = QCoreApplication : : tr (
" Cannot Generate CMake Files " ) ;
const QString WARNING_TITLE_NONFATAL = QCoreApplication : : tr (
" Problems with Generating CMake Files " ) ;
void showProjectDirErrorDialog ( int error )
{
QString fatalList ;
QString nonFatalList ;
if ( error & MISSING_CONTENTDIR )
fatalList . append ( QString ( DIRNAME_CONTENT ) + " \n " ) ;
if ( error & MISSING_APPMAINQML )
fatalList . append ( QString ( DIRNAME_CONTENT )
+ QDir : : separator ( )
+ QString ( FILENAME_APPMAINQML )
+ " \n " ) ;
if ( error & MISSING_CPPDIR )
fatalList . append ( QString ( DIRNAME_CPP ) + " \n " ) ;
if ( error & MISSING_IMPORTDIR )
fatalList . append ( QString ( DIRNAME_IMPORT ) + " \n " ) ;
if ( error & MISSING_MAINCMAKE )
nonFatalList . append ( QString ( FILENAME_CMAKELISTS ) + " \n " ) ;
if ( error & MISSING_QMLMODULES )
nonFatalList . append ( QString ( FILENAME_MODULES ) + " \n " ) ;
if ( error & MISSING_MAINQML )
nonFatalList . append ( QString ( FILENAME_MAINQML ) + " \n " ) ;
if ( error & MISSING_MAINCPP )
nonFatalList . append ( QString ( DIRNAME_CPP )
+ QDir : : separator ( )
+ QString ( FILENAME_MAINCPP )
+ " \n " ) ;
if ( error & MISSING_MAINCPP_HEADER )
nonFatalList . append ( QString ( DIRNAME_CPP )
+ QDir : : separator ( )
+ QString ( FILENAME_MAINCPP_HEADER )
+ " \n " ) ;
bool isFatal = isErrorFatal ( error ) ;
if ( isFatal ) {
QMessageBox : : critical ( nullptr ,
WARNING_TITLE_FATAL ,
WARNING_MISSING_STRUCTURE_FATAL . arg ( fatalList + nonFatalList ) ) ;
}
else {
QMessageBox : : warning ( nullptr ,
WARNING_TITLE_NONFATAL ,
WARNING_MISSING_STRUCTURE_NONFATAL . arg ( nonFatalList ) ) ;
}
}
2021-11-03 11:37:48 +02:00
bool showConfirmationDialog ( const Utils : : FilePath & rootDir )
{
Utils : : FilePaths files ;
for ( GeneratableFile & file : queuedFiles )
files . append ( file . filePath ) ;
CmakeGeneratorDialog dialog ( rootDir , files ) ;
if ( dialog . exec ( ) ) {
Utils : : FilePaths confirmedFiles = dialog . getFilePaths ( ) ;
removeUnconfirmedQueuedFiles ( confirmedFiles ) ;
return true ;
}
return false ;
}
bool queueFile ( const FilePath & filePath , const QString & fileContent )
{
GeneratableFile file ;
file . filePath = filePath ;
file . content = fileContent ;
2021-11-17 12:18:35 +02:00
file . fileExists = filePath . exists ( ) ;
2021-11-03 11:37:48 +02:00
queuedFiles . append ( file ) ;
return true ;
}
bool writeQueuedFiles ( )
{
for ( GeneratableFile & file : queuedFiles )
if ( ! writeFile ( file ) )
return false ;
return true ;
2021-10-20 17:37:22 +03:00
}
2021-11-03 11:37:48 +02:00
bool writeFile ( const GeneratableFile & file )
2021-10-20 17:37:22 +03:00
{
2021-11-03 11:37:48 +02:00
QFile fileHandle ( file . filePath . toString ( ) ) ;
fileHandle . open ( QIODevice : : WriteOnly ) ;
QTextStream stream ( & fileHandle ) ;
stream < < file . content ;
fileHandle . close ( ) ;
2021-10-20 17:37:22 +03:00
return true ;
2021-10-06 12:35:52 +03:00
}
2021-11-11 18:36:48 +02:00
QString readTemplate ( const QString & templatePath )
{
QFile templatefile ( templatePath ) ;
templatefile . open ( QIODevice : : ReadOnly ) ;
QTextStream stream ( & templatefile ) ;
QString content = stream . readAll ( ) ;
templatefile . close ( ) ;
return content ;
}
2021-10-20 17:37:22 +03:00
}
namespace GenerateCmakeLists {
2021-11-11 18:36:48 +02:00
QStringList moduleNames ;
2021-10-20 17:37:22 +03:00
const QDir : : Filters FILES_ONLY = QDir : : Files ;
const QDir : : Filters DIRS_ONLY = QDir : : Dirs | QDir : : Readable | QDir : : NoDotAndDotDot ;
const char QMLDIRFILENAME [ ] = " qmldir " ;
2021-11-17 12:18:35 +02:00
const char MAIN_CMAKEFILE_TEMPLATE_PATH [ ] = " :/boilerplatetemplates/qmlprojectmaincmakelists.tpl " ;
const char QMLMODULES_FILE_TEMPLATE_PATH [ ] = " :/boilerplatetemplates/qmlprojectmodules.tpl " ;
2021-10-20 17:37:22 +03:00
2021-11-11 18:36:48 +02:00
bool generateCmakes ( const FilePath & rootDir )
2021-10-06 12:35:52 +03:00
{
2021-11-11 18:36:48 +02:00
moduleNames . clear ( ) ;
2021-10-06 12:35:52 +03:00
2021-11-11 18:36:48 +02:00
FilePath contentDir = rootDir . pathAppended ( " content " ) ;
FilePath importDir = rootDir . pathAppended ( " imports " ) ;
2021-10-06 12:35:52 +03:00
2021-11-11 18:36:48 +02:00
generateModuleCmake ( contentDir ) ;
generateImportCmake ( importDir ) ;
generateMainCmake ( rootDir ) ;
2021-10-06 12:35:52 +03:00
2021-11-11 18:36:48 +02:00
return true ;
2021-10-06 12:35:52 +03:00
}
void generateMainCmake ( const FilePath & rootDir )
{
//TODO startupProject() may be a terrible way to try to get "current project". It's not necessarily the same thing at all.
QString projectName = ProjectExplorer : : SessionManager : : startupProject ( ) - > displayName ( ) ;
2021-11-11 18:36:48 +02:00
QString appName = projectName + " App " ;
2021-10-06 12:35:52 +03:00
2021-11-11 18:36:48 +02:00
QString cmakeFileContent = GenerateCmake : : readTemplate ( MAIN_CMAKEFILE_TEMPLATE_PATH ) . arg ( appName ) ;
queueCmakeFile ( rootDir , cmakeFileContent ) ;
QString modulesAsPlugins ;
for ( const QString & moduleName : moduleNames )
modulesAsPlugins . append ( " " + moduleName + " plugin \n " ) ;
QString moduleFileContent = GenerateCmake : : readTemplate ( QMLMODULES_FILE_TEMPLATE_PATH ) . arg ( appName ) . arg ( modulesAsPlugins ) ;
2021-11-17 12:18:35 +02:00
GenerateCmake : : queueFile ( rootDir . pathAppended ( GenerateCmake : : FILENAME_MODULES ) , moduleFileContent ) ;
2021-11-11 18:36:48 +02:00
}
2021-10-06 12:35:52 +03:00
2021-11-11 18:36:48 +02:00
const char DO_NOT_EDIT_FILE_COMMENT [ ] = " ### This file is automatically generated by Qt Design Studio. \n ### Do not change \n \n " ;
const char ADD_SUBDIR [ ] = " add_subdirectory(%1) \n " ;
void generateImportCmake ( const FilePath & dir )
{
2021-10-06 12:35:52 +03:00
QString fileContent ;
2021-11-11 18:36:48 +02:00
fileContent . append ( DO_NOT_EDIT_FILE_COMMENT ) ;
FilePaths subDirs = dir . dirEntries ( DIRS_ONLY ) ;
2021-10-06 12:35:52 +03:00
for ( FilePath & subDir : subDirs ) {
2021-11-11 18:36:48 +02:00
fileContent . append ( QString ( ADD_SUBDIR ) . arg ( subDir . fileName ( ) ) ) ;
generateModuleCmake ( subDir ) ;
2021-10-06 12:35:52 +03:00
}
2021-11-11 18:36:48 +02:00
queueCmakeFile ( dir , fileContent ) ;
2021-10-06 12:35:52 +03:00
}
const char MODULEFILE_PROPERTY_SINGLETON [ ] = " QT_QML_SINGLETON_TYPE " ;
2021-11-11 18:36:48 +02:00
const char MODULEFILE_PROPERTY_SET [ ] = " set_source_files_properties(%1 \n PROPERTIES \n %2 %3 \n ) \n \n " ;
const char MODULEFILE_TEMPLATE_PATH [ ] = " :/boilerplatetemplates/qmlprojectmodulecmakelists.tpl " ;
2021-10-06 12:35:52 +03:00
2021-11-11 18:36:48 +02:00
void generateModuleCmake ( const FilePath & dir )
2021-10-06 12:35:52 +03:00
{
2021-11-11 18:36:48 +02:00
QString fileTemplate = GenerateCmake : : readTemplate ( MODULEFILE_TEMPLATE_PATH ) ;
2021-10-06 12:35:52 +03:00
const QStringList qmldirFilesOnly ( QMLDIRFILENAME ) ;
2021-11-11 18:36:48 +02:00
QString singletonContent ;
2021-10-06 12:35:52 +03:00
FilePaths qmldirFileList = dir . dirEntries ( qmldirFilesOnly , FILES_ONLY ) ;
if ( ! qmldirFileList . isEmpty ( ) ) {
QStringList singletons = getSingletonsFromQmldirFile ( qmldirFileList . first ( ) ) ;
for ( QString & singleton : singletons ) {
2021-11-11 18:36:48 +02:00
singletonContent . append ( QString ( MODULEFILE_PROPERTY_SET ) . arg ( singleton ) . arg ( MODULEFILE_PROPERTY_SINGLETON ) . arg ( " true " ) ) ;
2021-10-06 12:35:52 +03:00
}
}
2021-10-18 12:02:58 +03:00
QStringList qmlFileList = getDirectoryTreeQmls ( dir ) ;
2021-10-06 12:35:52 +03:00
QString qmlFiles ;
2021-10-18 12:02:58 +03:00
for ( QString & qmlFile : qmlFileList )
2021-11-11 18:36:48 +02:00
qmlFiles . append ( QString ( " %1 \n " ) . arg ( qmlFile ) ) ;
2021-10-06 12:35:52 +03:00
QStringList resourceFileList = getDirectoryTreeResources ( dir ) ;
QString resourceFiles ;
2021-10-18 12:02:58 +03:00
for ( QString & resourceFile : resourceFileList )
2021-11-11 18:36:48 +02:00
resourceFiles . append ( QString ( " %1 \n " ) . arg ( resourceFile ) ) ;
2021-10-06 12:35:52 +03:00
QString moduleContent ;
if ( ! qmlFiles . isEmpty ( ) ) {
2021-11-11 18:36:48 +02:00
moduleContent . append ( QString ( " QML_FILES \n %1 " ) . arg ( qmlFiles ) ) ;
2021-10-06 12:35:52 +03:00
}
if ( ! resourceFiles . isEmpty ( ) ) {
2021-11-11 18:36:48 +02:00
moduleContent . append ( QString ( " RESOURCES \n %1 " ) . arg ( resourceFiles ) ) ;
2021-10-06 12:35:52 +03:00
}
QString moduleName = dir . fileName ( ) ;
2021-11-11 18:36:48 +02:00
moduleNames . append ( moduleName ) ;
2021-10-06 12:35:52 +03:00
QString fileContent ;
2021-11-11 18:36:48 +02:00
fileContent . append ( fileTemplate . arg ( singletonContent ) . arg ( moduleName ) . arg ( moduleContent ) ) ;
queueCmakeFile ( dir , fileContent ) ;
2021-10-06 12:35:52 +03:00
}
QStringList getSingletonsFromQmldirFile ( const FilePath & filePath )
{
QStringList singletons ;
QFile f ( filePath . toString ( ) ) ;
f . open ( QIODevice : : ReadOnly ) ;
QTextStream stream ( & f ) ;
while ( ! stream . atEnd ( ) ) {
QString line = stream . readLine ( ) ;
if ( line . startsWith ( " singleton " , Qt : : CaseInsensitive ) ) {
QStringList tokenizedLine = line . split ( QRegularExpression ( " \\ s+ " ) ) ;
QString fileName = tokenizedLine . last ( ) ;
if ( fileName . endsWith ( " .qml " , Qt : : CaseInsensitive ) ) {
singletons . append ( fileName ) ;
}
}
}
f . close ( ) ;
return singletons ;
}
2021-10-18 12:02:58 +03:00
QStringList getDirectoryTreeQmls ( const FilePath & dir )
{
const QStringList qmlFilesOnly ( " *.qml " ) ;
ProjectExplorer : : Project * project = ProjectExplorer : : SessionManager : : startupProject ( ) ;
QStringList qmlFileList ;
FilePaths thisDirFiles = dir . dirEntries ( qmlFilesOnly , FILES_ONLY ) ;
for ( FilePath & file : thisDirFiles ) {
if ( ! isFileBlacklisted ( file . fileName ( ) ) & &
project - > isKnownFile ( file ) ) {
qmlFileList . append ( file . fileName ( ) ) ;
}
}
FilePaths subDirsList = dir . dirEntries ( DIRS_ONLY ) ;
for ( FilePath & subDir : subDirsList ) {
QStringList subDirQmlFiles = getDirectoryTreeQmls ( subDir ) ;
for ( QString & qmlFile : subDirQmlFiles ) {
qmlFileList . append ( subDir . fileName ( ) . append ( ' / ' ) . append ( qmlFile ) ) ;
}
}
return qmlFileList ;
}
2021-10-06 12:35:52 +03:00
QStringList getDirectoryTreeResources ( const FilePath & dir )
{
ProjectExplorer : : Project * project = ProjectExplorer : : SessionManager : : startupProject ( ) ;
QStringList resourceFileList ;
FilePaths thisDirFiles = dir . dirEntries ( FILES_ONLY ) ;
for ( FilePath & file : thisDirFiles ) {
if ( ! isFileBlacklisted ( file . fileName ( ) ) & &
! file . fileName ( ) . endsWith ( " .qml " , Qt : : CaseInsensitive ) & &
project - > isKnownFile ( file ) ) {
resourceFileList . append ( file . fileName ( ) ) ;
}
}
FilePaths subDirsList = dir . dirEntries ( DIRS_ONLY ) ;
for ( FilePath & subDir : subDirsList ) {
QStringList subDirResources = getDirectoryTreeResources ( subDir ) ;
for ( QString & resource : subDirResources ) {
resourceFileList . append ( subDir . fileName ( ) . append ( ' / ' ) . append ( resource ) ) ;
}
}
return resourceFileList ;
}
2021-11-11 18:36:48 +02:00
void queueCmakeFile ( const FilePath & dir , const QString & content )
2021-10-06 12:35:52 +03:00
{
2021-11-17 12:18:35 +02:00
FilePath filePath = dir . pathAppended ( GenerateCmake : : FILENAME_CMAKELISTS ) ;
2021-11-03 11:37:48 +02:00
GenerateCmake : : queueFile ( filePath , content ) ;
2021-10-06 12:35:52 +03:00
}
bool isFileBlacklisted ( const QString & fileName )
{
return ( ! fileName . compare ( QMLDIRFILENAME ) | |
2021-11-17 12:18:35 +02:00
! fileName . compare ( GenerateCmake : : FILENAME_CMAKELISTS ) ) ;
2021-10-06 12:35:52 +03:00
}
}
2021-10-20 17:37:22 +03:00
namespace GenerateEntryPoints {
bool generateEntryPointFiles ( const FilePath & dir )
{
bool cppOk = generateMainCpp ( dir ) ;
bool qmlOk = generateMainQml ( dir ) ;
return cppOk & & qmlOk ;
}
2021-11-11 18:36:48 +02:00
const char MAIN_CPPFILE_TEMPLATE_PATH [ ] = " :/boilerplatetemplates/qmlprojectmaincpp.tpl " ;
const char MAIN_CPPFILE_HEADER_TEMPLATE_PATH [ ] = " :/boilerplatetemplates/qmlprojectmaincppheader.tpl " ;
const char MAIN_CPPFILE_HEADER_PLUGIN_LINE [ ] = " Q_IMPORT_QML_PLUGIN(%1) \n " ;
2021-10-20 17:37:22 +03:00
bool generateMainCpp ( const FilePath & dir )
{
2021-11-17 12:18:35 +02:00
FilePath srcDir = dir . pathAppended ( GenerateCmake : : DIRNAME_CPP ) ;
2021-10-20 17:37:22 +03:00
2021-11-11 18:36:48 +02:00
QString cppContent = GenerateCmake : : readTemplate ( MAIN_CPPFILE_TEMPLATE_PATH ) ;
2021-11-17 12:18:35 +02:00
FilePath cppFilePath = srcDir . pathAppended ( GenerateCmake : : FILENAME_MAINCPP ) ;
2021-11-11 18:36:48 +02:00
bool cppOk = GenerateCmake : : queueFile ( cppFilePath , cppContent ) ;
QString modulesAsPlugins ;
for ( const QString & moduleName : GenerateCmakeLists : : moduleNames )
modulesAsPlugins . append (
QString ( MAIN_CPPFILE_HEADER_PLUGIN_LINE ) . arg ( moduleName + " plugin " ) ) ;
QString headerContent = GenerateCmake : : readTemplate ( MAIN_CPPFILE_HEADER_TEMPLATE_PATH )
. arg ( modulesAsPlugins ) ;
2021-11-17 12:18:35 +02:00
FilePath headerFilePath = srcDir . pathAppended ( GenerateCmake : : FILENAME_MAINCPP_HEADER ) ;
2021-11-11 18:36:48 +02:00
bool headerOk = GenerateCmake : : queueFile ( headerFilePath , headerContent ) ;
return cppOk & & headerOk ;
2021-10-06 12:35:52 +03:00
}
2021-10-20 17:37:22 +03:00
2021-11-17 12:18:35 +02:00
const char MAIN_QMLFILE_TEMPLATE_PATH [ ] = " :/boilerplatetemplates/qmlprojectmainqml.tpl " ;
2021-10-20 17:37:22 +03:00
bool generateMainQml ( const FilePath & dir )
{
2021-11-17 12:18:35 +02:00
QString content = GenerateCmake : : readTemplate ( MAIN_QMLFILE_TEMPLATE_PATH ) ;
FilePath filePath = dir . pathAppended ( GenerateCmake : : FILENAME_MAINQML ) ;
2021-11-11 18:36:48 +02:00
return GenerateCmake : : queueFile ( filePath , content ) ;
2021-10-20 17:37:22 +03:00
}
}
}