forked from qt-creator/qt-creator
QmlProjectManager: Load QDS landing page content when it is needed
Task-number: QTCREATORBUG-27583 Change-Id: Ib329816f7282b0c6f88d78d62a0c9f34c961e509 Reviewed-by: Alessandro Portale <alessandro.portale@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
@@ -30,6 +30,7 @@
|
|||||||
#include <coreplugin/icore.h>
|
#include <coreplugin/icore.h>
|
||||||
|
|
||||||
#include <QtQml/QQmlEngine>
|
#include <QtQml/QQmlEngine>
|
||||||
|
#include <QHBoxLayout>
|
||||||
#include <QQuickItem>
|
#include <QQuickItem>
|
||||||
|
|
||||||
namespace QmlProjectManager {
|
namespace QmlProjectManager {
|
||||||
@@ -38,51 +39,76 @@ namespace Internal {
|
|||||||
const char QMLRESOURCEPATH[] = "qmldesigner/propertyEditorQmlSources/imports";
|
const char QMLRESOURCEPATH[] = "qmldesigner/propertyEditorQmlSources/imports";
|
||||||
const char LANDINGPAGEPATH[] = "qmldesigner/landingpage";
|
const char LANDINGPAGEPATH[] = "qmldesigner/landingpage";
|
||||||
|
|
||||||
QdsLandingPage::QdsLandingPage(QWidget *parent)
|
QdsLandingPageWidget::QdsLandingPageWidget(QWidget* parent)
|
||||||
: m_dialog{new QQuickWidget(parent)}
|
: QWidget(parent)
|
||||||
{
|
{
|
||||||
setParent(m_dialog);
|
setLayout(new QHBoxLayout());
|
||||||
|
layout()->setContentsMargins(0, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
QdsLandingPageWidget::~QdsLandingPageWidget()
|
||||||
|
{
|
||||||
|
if (m_widget)
|
||||||
|
m_widget->deleteLater();
|
||||||
|
}
|
||||||
|
|
||||||
|
QQuickWidget *QdsLandingPageWidget::widget()
|
||||||
|
{
|
||||||
|
if (!m_widget) {
|
||||||
|
m_widget = new QQuickWidget();
|
||||||
|
layout()->addWidget(m_widget);
|
||||||
|
}
|
||||||
|
|
||||||
|
return m_widget;
|
||||||
|
}
|
||||||
|
|
||||||
|
QdsLandingPage::QdsLandingPage(QdsLandingPageWidget *widget, QWidget *parent)
|
||||||
|
: m_widget{widget->widget()}
|
||||||
|
{
|
||||||
|
Q_UNUSED(parent)
|
||||||
|
|
||||||
|
setParent(m_widget);
|
||||||
|
|
||||||
const QString resourcePath = Core::ICore::resourcePath(QMLRESOURCEPATH).toString();
|
const QString resourcePath = Core::ICore::resourcePath(QMLRESOURCEPATH).toString();
|
||||||
const QString landingPath = Core::ICore::resourcePath(LANDINGPAGEPATH).toString();
|
const QString landingPath = Core::ICore::resourcePath(LANDINGPAGEPATH).toString();
|
||||||
|
|
||||||
qmlRegisterSingletonInstance<QdsLandingPage>("LandingPageApi", 1, 0, "LandingPageApi", this);
|
qmlRegisterSingletonInstance<QdsLandingPage>("LandingPageApi", 1, 0, "LandingPageApi", this);
|
||||||
QdsLandingPageTheme::setupTheme(m_dialog->engine());
|
QdsLandingPageTheme::setupTheme(m_widget->engine());
|
||||||
|
|
||||||
m_dialog->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
m_widget->setResizeMode(QQuickWidget::SizeRootObjectToView);
|
||||||
m_dialog->engine()->addImportPath(landingPath + "/imports");
|
m_widget->engine()->addImportPath(landingPath + "/imports");
|
||||||
m_dialog->engine()->addImportPath(resourcePath);
|
m_widget->engine()->addImportPath(resourcePath);
|
||||||
m_dialog->setSource(QUrl::fromLocalFile(landingPath + "/main.qml"));
|
m_widget->setSource(QUrl::fromLocalFile(landingPath + "/main.qml"));
|
||||||
|
|
||||||
if (m_dialog->rootObject()) { // main.qml only works with Qt6
|
if (m_widget->rootObject()) { // main.qml only works with Qt6
|
||||||
connect(m_dialog->rootObject(), SIGNAL(openQtc(bool)), this, SIGNAL(openCreator(bool)));
|
connect(m_widget->rootObject(), SIGNAL(openQtc(bool)), this, SIGNAL(openCreator(bool)));
|
||||||
connect(m_dialog->rootObject(), SIGNAL(openQds(bool)), this, SIGNAL(openDesigner(bool)));
|
connect(m_widget->rootObject(), SIGNAL(openQds(bool)), this, SIGNAL(openDesigner(bool)));
|
||||||
connect(m_dialog->rootObject(), SIGNAL(installQds()), this, SIGNAL(installDesigner()));
|
connect(m_widget->rootObject(), SIGNAL(installQds()), this, SIGNAL(installDesigner()));
|
||||||
connect(m_dialog->rootObject(), SIGNAL(generateCmake()), this, SIGNAL(generateCmake()));
|
connect(m_widget->rootObject(), SIGNAL(generateCmake()), this, SIGNAL(generateCmake()));
|
||||||
connect(m_dialog->rootObject(), SIGNAL(generateProjectFile()), this, SIGNAL(generateProjectFile()));
|
connect(m_widget->rootObject(), SIGNAL(generateProjectFile()), this, SIGNAL(generateProjectFile()));
|
||||||
}
|
}
|
||||||
m_dialog->hide();
|
m_widget->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
QWidget* QdsLandingPage::dialog()
|
QWidget *QdsLandingPage::widget()
|
||||||
{
|
{
|
||||||
return m_dialog;
|
return m_widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
void QdsLandingPage::show()
|
void QdsLandingPage::show()
|
||||||
{
|
{
|
||||||
m_dialog->rootObject()->setProperty("qdsInstalled", m_qdsInstalled);
|
m_widget->rootObject()->setProperty("qdsInstalled", m_qdsInstalled);
|
||||||
m_dialog->rootObject()->setProperty("projectFileExists", m_projectFileExists);
|
m_widget->rootObject()->setProperty("projectFileExists", m_projectFileExists);
|
||||||
m_dialog->rootObject()->setProperty("qtVersion", m_qtVersion);
|
m_widget->rootObject()->setProperty("qtVersion", m_qtVersion);
|
||||||
m_dialog->rootObject()->setProperty("qdsVersion", m_qdsVersion);
|
m_widget->rootObject()->setProperty("qdsVersion", m_qdsVersion);
|
||||||
m_dialog->rootObject()->setProperty("cmakeLists", m_cmakeResources);
|
m_widget->rootObject()->setProperty("cmakeLists", m_cmakeResources);
|
||||||
m_dialog->rootObject()->setProperty("rememberSelection", Qt::Unchecked);
|
m_widget->rootObject()->setProperty("rememberSelection", Qt::Unchecked);
|
||||||
m_dialog->show();
|
m_widget->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
void QdsLandingPage::hide()
|
void QdsLandingPage::hide()
|
||||||
{
|
{
|
||||||
m_dialog->hide();
|
m_widget->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QdsLandingPage::qdsInstalled() const
|
bool QdsLandingPage::qdsInstalled() const
|
||||||
|
@@ -42,6 +42,19 @@ public:
|
|||||||
DesignModeContext(QWidget *widget) { setWidget(widget); }
|
DesignModeContext(QWidget *widget) { setWidget(widget); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class QdsLandingPageWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
QdsLandingPageWidget(QWidget* parent = nullptr);
|
||||||
|
~QdsLandingPageWidget();
|
||||||
|
QQuickWidget *widget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QQuickWidget *m_widget = nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
class QdsLandingPage : public QObject
|
class QdsLandingPage : public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@@ -53,9 +66,9 @@ public:
|
|||||||
Q_PROPERTY(QString qdsVersion MEMBER m_qdsVersion READ qdsVersion WRITE setQdsVersion)
|
Q_PROPERTY(QString qdsVersion MEMBER m_qdsVersion READ qdsVersion WRITE setQdsVersion)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
QdsLandingPage(QWidget *parent = nullptr);
|
QdsLandingPage(QdsLandingPageWidget *widget, QWidget *parent = nullptr);
|
||||||
|
|
||||||
QWidget *dialog();
|
QWidget *widget();
|
||||||
void show();
|
void show();
|
||||||
void hide();
|
void hide();
|
||||||
|
|
||||||
@@ -80,7 +93,7 @@ signals:
|
|||||||
void generateProjectFile();
|
void generateProjectFile();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QQuickWidget *m_dialog = nullptr;
|
QQuickWidget *m_widget = nullptr;
|
||||||
|
|
||||||
bool m_qdsInstalled = false;
|
bool m_qdsInstalled = false;
|
||||||
bool m_projectFileExists = false;
|
bool m_projectFileExists = false;
|
||||||
|
@@ -117,6 +117,7 @@ public:
|
|||||||
{runConfigFactory.runConfigurationId()}};
|
{runConfigFactory.runConfigurationId()}};
|
||||||
QPointer<QMessageBox> lastMessageBox;
|
QPointer<QMessageBox> lastMessageBox;
|
||||||
QdsLandingPage *landingPage = nullptr;
|
QdsLandingPage *landingPage = nullptr;
|
||||||
|
QdsLandingPageWidget *landingPageWidget = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
QmlProjectPlugin::~QmlProjectPlugin()
|
QmlProjectPlugin::~QmlProjectPlugin()
|
||||||
@@ -125,6 +126,8 @@ QmlProjectPlugin::~QmlProjectPlugin()
|
|||||||
d->lastMessageBox->deleteLater();
|
d->lastMessageBox->deleteLater();
|
||||||
if (d->landingPage)
|
if (d->landingPage)
|
||||||
d->landingPage->deleteLater();
|
d->landingPage->deleteLater();
|
||||||
|
if (d->landingPageWidget)
|
||||||
|
d->landingPageWidget->deleteLater();
|
||||||
delete d;
|
delete d;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -263,8 +266,19 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
|
|||||||
|
|
||||||
d = new QmlProjectPluginPrivate;
|
d = new QmlProjectPluginPrivate;
|
||||||
|
|
||||||
if (!qmlDesignerEnabled())
|
if (!qmlDesignerEnabled()) {
|
||||||
initializeQmlLandingPage();
|
d->landingPageWidget = new QdsLandingPageWidget();
|
||||||
|
|
||||||
|
const QStringList mimeTypes = {QmlJSTools::Constants::QMLUI_MIMETYPE};
|
||||||
|
auto context = new Internal::DesignModeContext(d->landingPageWidget);
|
||||||
|
Core::ICore::addContextObject(context);
|
||||||
|
|
||||||
|
Core::DesignMode::registerDesignWidget(d->landingPageWidget, mimeTypes, context->context());
|
||||||
|
|
||||||
|
connect(Core::ModeManager::instance(), &Core::ModeManager::currentModeChanged,
|
||||||
|
this, &QmlProjectPlugin::editorModeChanged);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
ProjectManager::registerProjectType<QmlProject>(QmlJSTools::Constants::QMLPROJECT_MIMETYPE);
|
ProjectManager::registerProjectType<QmlProject>(QmlJSTools::Constants::QMLPROJECT_MIMETYPE);
|
||||||
Core::FileIconProvider::registerIconOverlayForSuffix(":/qmlproject/images/qmlproject.png",
|
Core::FileIconProvider::registerIconOverlayForSuffix(":/qmlproject/images/qmlproject.png",
|
||||||
@@ -366,23 +380,12 @@ bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage)
|
|||||||
|
|
||||||
void QmlProjectPlugin::initializeQmlLandingPage()
|
void QmlProjectPlugin::initializeQmlLandingPage()
|
||||||
{
|
{
|
||||||
d->landingPage = new QdsLandingPage();
|
d->landingPage = new QdsLandingPage(d->landingPageWidget);
|
||||||
connect(d->landingPage, &QdsLandingPage::openCreator, this, &QmlProjectPlugin::openQtc);
|
connect(d->landingPage, &QdsLandingPage::openCreator, this, &QmlProjectPlugin::openQtc);
|
||||||
connect(d->landingPage, &QdsLandingPage::openDesigner, this, &QmlProjectPlugin::openQds);
|
connect(d->landingPage, &QdsLandingPage::openDesigner, this, &QmlProjectPlugin::openQds);
|
||||||
connect(d->landingPage, &QdsLandingPage::installDesigner, this, &QmlProjectPlugin::installQds);
|
connect(d->landingPage, &QdsLandingPage::installDesigner, this, &QmlProjectPlugin::installQds);
|
||||||
connect(d->landingPage, &QdsLandingPage::generateCmake, this, &QmlProjectPlugin::generateCmake);
|
connect(d->landingPage, &QdsLandingPage::generateCmake, this, &QmlProjectPlugin::generateCmake);
|
||||||
connect(d->landingPage, &QdsLandingPage::generateProjectFile, this, &QmlProjectPlugin::generateProjectFile);
|
connect(d->landingPage, &QdsLandingPage::generateProjectFile, this, &QmlProjectPlugin::generateProjectFile);
|
||||||
|
|
||||||
auto dialog = d->landingPage->dialog();
|
|
||||||
|
|
||||||
const QStringList mimeTypes = {QmlJSTools::Constants::QMLUI_MIMETYPE};
|
|
||||||
auto context = new Internal::DesignModeContext(dialog);
|
|
||||||
Core::ICore::addContextObject(context);
|
|
||||||
|
|
||||||
Core::DesignMode::registerDesignWidget(dialog, mimeTypes, context->context());
|
|
||||||
|
|
||||||
connect(Core::ModeManager::instance(), &Core::ModeManager::currentModeChanged,
|
|
||||||
this, &QmlProjectPlugin::editorModeChanged);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmlProjectPlugin::displayQmlLandingPage()
|
void QmlProjectPlugin::displayQmlLandingPage()
|
||||||
@@ -390,6 +393,9 @@ void QmlProjectPlugin::displayQmlLandingPage()
|
|||||||
const QString qtVersionString = ProjectFileContentTools::qtVersion(projectFilePath());
|
const QString qtVersionString = ProjectFileContentTools::qtVersion(projectFilePath());
|
||||||
const QString qdsVersionString = ProjectFileContentTools::qdsVersion(projectFilePath());
|
const QString qdsVersionString = ProjectFileContentTools::qdsVersion(projectFilePath());
|
||||||
|
|
||||||
|
if (!d->landingPage)
|
||||||
|
initializeQmlLandingPage();
|
||||||
|
|
||||||
d->landingPage->setQdsInstalled(qdsInstallationExists());
|
d->landingPage->setQdsInstalled(qdsInstallationExists());
|
||||||
d->landingPage->setProjectFileExists(projectFilePath().exists());
|
d->landingPage->setProjectFileExists(projectFilePath().exists());
|
||||||
d->landingPage->setCmakeResources(ProjectFileContentTools::rootCmakeFiles());
|
d->landingPage->setCmakeResources(ProjectFileContentTools::rootCmakeFiles());
|
||||||
@@ -400,7 +406,8 @@ void QmlProjectPlugin::displayQmlLandingPage()
|
|||||||
|
|
||||||
void QmlProjectPlugin::hideQmlLandingPage()
|
void QmlProjectPlugin::hideQmlLandingPage()
|
||||||
{
|
{
|
||||||
d->landingPage->hide();
|
if (d->landingPage)
|
||||||
|
d->landingPage->hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isDesignerMode(Utils::Id mode)
|
static bool isDesignerMode(Utils::Id mode)
|
||||||
@@ -430,7 +437,9 @@ void QmlProjectPlugin::openQtc(bool permanent)
|
|||||||
if (permanent)
|
if (permanent)
|
||||||
setAlwaysOpenWithMode(Core::Constants::MODE_EDIT);
|
setAlwaysOpenWithMode(Core::Constants::MODE_EDIT);
|
||||||
|
|
||||||
hideQmlLandingPage();
|
if (d->landingPage)
|
||||||
|
hideQmlLandingPage();
|
||||||
|
|
||||||
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
|
Core::ModeManager::activateMode(Core::Constants::MODE_EDIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -439,7 +448,9 @@ void QmlProjectPlugin::openQds(bool permanent)
|
|||||||
if (permanent)
|
if (permanent)
|
||||||
setAlwaysOpenWithMode(Core::Constants::MODE_DESIGN);
|
setAlwaysOpenWithMode(Core::Constants::MODE_DESIGN);
|
||||||
|
|
||||||
hideQmlLandingPage();
|
if (d->landingPage)
|
||||||
|
hideQmlLandingPage();
|
||||||
|
|
||||||
auto editor = Core::EditorManager::currentEditor();
|
auto editor = Core::EditorManager::currentEditor();
|
||||||
if (editor)
|
if (editor)
|
||||||
openInQDSWithProject(editor->document()->filePath());
|
openInQDSWithProject(editor->document()->filePath());
|
||||||
|
Reference in New Issue
Block a user