diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 5e203026d3b..d4b689b5a60 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -36,9 +36,10 @@ #include #include #include +#include #include #include -#include +#include #include @@ -62,6 +63,20 @@ void Edit3DView::createEdit3DWidget() Core::ICore::addContextObject(editor3DContext); } +void Edit3DView::checkImports() +{ + bool has3dImport = false; + const QList imports = model()->imports(); + for (const auto &import : imports) { + if (import.url() == "QtQuick3D") { + has3dImport = true; + break; + } + } + + edit3DWidget()->showCanvas(has3dImport); +} + WidgetInfo Edit3DView::widgetInfo() { if (!m_edit3DWidget) @@ -130,13 +145,30 @@ void Edit3DView::updateActiveScene3D(const QVariantMap &sceneState) m_editLightAction->action()->setChecked(false); } +void Edit3DView::modelAttached(Model *model) +{ + AbstractView::modelAttached(model); + + checkImports(); +} + void Edit3DView::modelAboutToBeDetached(Model *model) { Q_UNUSED(model) - // Clear the image when model is detached (i.e. changing documents) - QImage emptyImage; - edit3DWidget()->canvas()->updateRenderImage(emptyImage); + // Hide the canvas when model is detached (i.e. changing documents) + edit3DWidget()->showCanvas(false); + + AbstractView::modelAboutToBeDetached(model); +} + +void Edit3DView::importsChanged(const QList &addedImports, + const QList &removedImports) +{ + Q_UNUSED(addedImports) + Q_UNUSED(removedImports) + + checkImports(); } void Edit3DView::sendInputEvent(QInputEvent *e) const @@ -266,5 +298,21 @@ QVector Edit3DView::rightActions() const return m_rightActions; } +void Edit3DView::addQuick3DImport() +{ + const QList imports = model()->possibleImports(); + for (const auto &import : imports) { + if (import.url() == "QtQuick3D") { + model()->changeImports({import}, {}); + + // Subcomponent manager update needed to make item library entries appear + QmlDesignerPlugin::instance()->currentDesignDocument()->updateSubcomponentManager(); + return; + } + } + Core::AsynchronousMessageBox::warning(tr("Failed to Add Import"), + tr("Could not add QtQuick3D import to project.")); +} + } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index 81298791067..5835c89b325 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -55,7 +55,9 @@ public: void renderImage3DChanged(const QImage &img) override; void updateActiveScene3D(const QVariantMap &sceneState) override; + void modelAttached(Model *model) override; void modelAboutToBeDetached(Model *model) override; + void importsChanged(const QList &addedImports, const QList &removedImports) override; void sendInputEvent(QInputEvent *e) const; void edit3DViewResized(const QSize &size) const; @@ -66,10 +68,13 @@ public: QVector leftActions() const; QVector rightActions() const; + void addQuick3DImport(); + protected: private: void createEdit3DWidget(); + void checkImports(); QPointer m_edit3DWidget; QVector m_leftActions; diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index 461613e476c..05ed484792e 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -94,9 +94,24 @@ Edit3DWidget::Edit3DWidget(Edit3DView *view) : addActionsToToolBox(view->leftActions(), true); addActionsToToolBox(view->rightActions(), false); + // Onboarding label contains instructions for new users how to get 3D content into the project + m_onboardingLabel = new QLabel(this); + QString labelText = + "No 3D import here yet!

" + "To create a 3D View you need to add the QtQuick3D import to your file.
" + "You can add the import via the QML Imports tab of the Library view, or alternatively click" + " here " + "to add it straight away.

" + "If you want to import 3D assets from another tool, click on the \"Add New Assets...\" button in the Assets tab of the Library view."; + m_onboardingLabel->setText(labelText.arg(Utils::creatorTheme()->color(Utils::Theme::TextColorLink).name())); + m_onboardingLabel->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + connect(m_onboardingLabel, &QLabel::linkActivated, this, &Edit3DWidget::linkActivated); + fillLayout->addWidget(m_onboardingLabel.data()); + // Canvas is used to render the actual edit 3d view m_canvas = new Edit3DCanvas(this); fillLayout->addWidget(m_canvas.data()); + showCanvas(false); } void Edit3DWidget::contextHelp(const Core::IContext::HelpCallback &callback) const @@ -107,6 +122,22 @@ void Edit3DWidget::contextHelp(const Core::IContext::HelpCallback &callback) con callback({}); } +void Edit3DWidget::showCanvas(bool show) +{ + if (!show) { + QImage emptyImage; + m_canvas->updateRenderImage(emptyImage); + } + m_canvas->setVisible(show); + m_onboardingLabel->setVisible(!show); +} + +void Edit3DWidget::linkActivated(const QString &link) +{ + if (m_view) + m_view->addQuick3DImport(); +} + Edit3DCanvas *Edit3DWidget::canvas() const { return m_canvas.data(); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h index c5cea8836cd..ca44a955f5e 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h @@ -25,6 +25,7 @@ #pragma once #include +#include #include #include @@ -45,10 +46,15 @@ public: Edit3DView *view() const; void contextHelp(const Core::IContext::HelpCallback &callback) const; + void showCanvas(bool show); + private: + void linkActivated(const QString &link); + QPointer m_edit3DView; QPointer m_view; QPointer m_canvas; + QPointer m_onboardingLabel; QPointer m_toolBox; Core::IContext *m_context = nullptr; };