diff options
author | Eike Ziller <[email protected]> | 2022-05-18 13:07:59 +0200 |
---|---|---|
committer | Eike Ziller <[email protected]> | 2022-05-18 13:35:47 +0200 |
commit | 6a296ab68a4039790cb0993c261a256c9c2471a5 (patch) | |
tree | 7780d8b961a639b7963a8286d1763adaab0dc8ce /src/plugins/qmlprojectmanager/qmlprojectplugin.cpp | |
parent | 54d4c4db6293e7ed884afa92290d3c5d75e1eead (diff) | |
parent | e608243ee5fa4eb536d20d3c4c5d4e797a377cb0 (diff) |
Merge remote-tracking branch 'origin/7.0'
Conflicts:
src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
Change-Id: I14030f58303839e706af892dd12a67566e3bed68
Diffstat (limited to 'src/plugins/qmlprojectmanager/qmlprojectplugin.cpp')
-rw-r--r-- | src/plugins/qmlprojectmanager/qmlprojectplugin.cpp | 119 |
1 files changed, 116 insertions, 3 deletions
diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index 32b9cb1594d..5a7acca5e0d 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -30,16 +30,23 @@ #include "qmlprojectrunconfiguration.h" #include "projectfilecontenttools.h" +#include <coreplugin/actionmanager/actioncontainer.h> +#include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/coreconstants.h> #include <coreplugin/designmode.h> +#include <coreplugin/editormanager/editormanager.h> #include <coreplugin/fileiconprovider.h> #include <coreplugin/icore.h> #include <coreplugin/messagebox.h> #include <coreplugin/modemanager.h> +#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectmanager.h> +#include <projectexplorer/projectnodes.h> +#include <projectexplorer/projecttree.h> #include <projectexplorer/runcontrol.h> #include <projectexplorer/session.h> +#include <projectexplorer/target.h> #include <qmljs/qmljsmodelmanagerinterface.h> @@ -54,11 +61,12 @@ #include <utils/fileutils.h> #include <utils/qtcprocess.h> +#include <QAction> #include <QDesktopServices> #include <QMessageBox> +#include <QPointer> #include <QPushButton> #include <QTimer> -#include <QPointer> using namespace ProjectExplorer; @@ -230,19 +238,124 @@ void QmlProjectPlugin::openInQDSWithProject(const Utils::FilePath &filePath) } } +static QmlBuildSystem *qmlBuildSystemforFileNode(const FileNode *fileNode) +{ + if (!fileNode) + return nullptr; + + if (QmlProject *qmlProject = qobject_cast<QmlProject*>(fileNode->getProject())) { + auto target = qmlProject->activeTarget(); + if (!target) + return nullptr; + + return qobject_cast<QmlProjectManager::QmlBuildSystem *>(target->buildSystem()); + + } + + return nullptr; +} + bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) { Q_UNUSED(errorMessage) d = new QmlProjectPluginPrivate; - if (!qmlDesignerEnabled()) { + if (!qmlDesignerEnabled()) initializeQmlLandingPage(); - } ProjectManager::registerProjectType<QmlProject>(QmlJSTools::Constants::QMLPROJECT_MIMETYPE); Core::FileIconProvider::registerIconOverlayForSuffix(":/qmlproject/images/qmlproject.png", "qmlproject"); + + if (QmlProject::isQtDesignStudio()) { + Core::ActionContainer *menu = Core::ActionManager::actionContainer( + ProjectExplorer::Constants::M_FILECONTEXT); + QAction *mainfileAction = new QAction(tr("Set as main .qml file"), this); + mainfileAction->setEnabled(false); + + connect(mainfileAction, &QAction::triggered, this, []() { + const Node *currentNode = ProjectTree::currentNode(); + if (!currentNode || !currentNode->asFileNode() + || currentNode->asFileNode()->fileType() != FileType::QML) + return; + + const Utils::FilePath file = currentNode->filePath(); + + QmlBuildSystem *buildSystem = qmlBuildSystemforFileNode(currentNode->asFileNode()); + if (buildSystem) + buildSystem->setMainFileInProjectFile(file); + }); + + menu->addAction(Core::ActionManager::registerAction( + mainfileAction, + "QmlProject.setMainFile", + Core::Context(ProjectExplorer::Constants::C_PROJECT_TREE)), + ProjectExplorer::Constants::G_FILE_OTHER); + mainfileAction->setVisible(false); + connect(ProjectTree::instance(), + &ProjectTree::currentNodeChanged, + mainfileAction, + [mainfileAction](Node *node) { + const FileNode *fileNode = node ? node->asFileNode() : nullptr; + + const bool isVisible = fileNode && fileNode->fileType() == FileType::QML + && fileNode->filePath().completeSuffix() == "qml"; + + mainfileAction->setVisible(isVisible); + + if (!isVisible) + return; + + QmlBuildSystem *buildSystem = qmlBuildSystemforFileNode(fileNode); + + if (buildSystem) + mainfileAction->setEnabled(buildSystem->mainFilePath() + != fileNode->filePath()); + }); + + QAction *mainUifileAction = new QAction(tr("Set as main .ui.qml file"), this); + mainUifileAction->setEnabled(false); + + connect(mainUifileAction, &QAction::triggered, this, []() { + const Node *currentNode = ProjectTree::currentNode(); + if (!currentNode || !currentNode->asFileNode() + || currentNode->asFileNode()->fileType() != FileType::QML) + return; + + const Utils::FilePath file = currentNode->filePath(); + + QmlBuildSystem *buildSystem = qmlBuildSystemforFileNode(currentNode->asFileNode()); + if (buildSystem) + buildSystem->setMainUiFileInProjectFile(file); + }); + + menu->addAction(Core::ActionManager::registerAction( + mainUifileAction, + "QmlProject.setMainUIFile", + Core::Context(ProjectExplorer::Constants::C_PROJECT_TREE)), + ProjectExplorer::Constants::G_FILE_OTHER); + mainUifileAction->setVisible(false); + connect(ProjectTree::instance(), + &ProjectTree::currentNodeChanged, + mainUifileAction, + [mainUifileAction](Node *node) { + const FileNode *fileNode = node ? node->asFileNode() : nullptr; + const bool isVisible = fileNode && fileNode->fileType() == FileType::QML + && fileNode->filePath().completeSuffix() == "ui.qml"; + + mainUifileAction->setVisible(isVisible); + + if (!isVisible) + return; + + QmlBuildSystem *buildSystem = qmlBuildSystemforFileNode(fileNode); + if (buildSystem) + mainUifileAction->setEnabled(buildSystem->mainUiFilePath() + != fileNode->filePath()); + }); + } + return true; } |