aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
diff options
context:
space:
mode:
authorEike Ziller <[email protected]>2022-05-18 13:07:59 +0200
committerEike Ziller <[email protected]>2022-05-18 13:35:47 +0200
commit6a296ab68a4039790cb0993c261a256c9c2471a5 (patch)
tree7780d8b961a639b7963a8286d1763adaab0dc8ce /src/plugins/qmlprojectmanager/qmlprojectplugin.cpp
parent54d4c4db6293e7ed884afa92290d3c5d75e1eead (diff)
parente608243ee5fa4eb536d20d3c4c5d4e797a377cb0 (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.cpp119
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;
}