diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index 9d662f2d5ff..8b4b0dc2219 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -95,12 +95,12 @@ void FormEditorView::modelAttached(Model *model) m_formEditorWidget->option3DAction()->setEnabled(false); if (!rewriterView()->errors().isEmpty()) - formEditorWidget()->showErrorMessageBox(rewriterView()->errors()); + m_formEditorWidget->showErrorMessageBox(rewriterView()->errors()); else - formEditorWidget()->hideErrorMessageBox(); + m_formEditorWidget->hideErrorMessageBox(); if (!rewriterView()->warnings().isEmpty()) - formEditorWidget()->showWarningMessageBox(rewriterView()->warnings()); + m_formEditorWidget->showWarningMessageBox(rewriterView()->warnings()); } @@ -201,36 +201,37 @@ void FormEditorView::createFormEditorWidget() auto formEditorContext = new Internal::FormEditorContext(m_formEditorWidget.data()); Core::ICore::addContextObject(formEditorContext); - connect(formEditorWidget()->zoomAction(), &ZoomAction::zoomLevelChanged, [this]() { + connect(m_formEditorWidget->zoomAction(), &ZoomAction::zoomLevelChanged, [this]() { m_currentTool->formEditorItemsChanged(scene()->allFormEditorItems()); }); - connect(formEditorWidget()->showBoundingRectAction(), &QAction::toggled, - scene(), &FormEditorScene::setShowBoundingRects); + + connect(m_formEditorWidget->showBoundingRectAction(), &QAction::toggled, scene(), &FormEditorScene::setShowBoundingRects); + connect(m_formEditorWidget->option3DAction(), &Option3DAction::enabledChanged, this, &FormEditorView::toggle3DViewEnabled); + connect(m_formEditorWidget->resetAction(), &QAction::triggered, this, &FormEditorView::resetNodeInstanceView); } void FormEditorView::temporaryBlockView() { - formEditorWidget()->graphicsView()->setUpdatesEnabled(false); + m_formEditorWidget->graphicsView()->setUpdatesEnabled(false); static auto timer = new QTimer(qApp); timer->setSingleShot(true); timer->start(1000); connect(timer, &QTimer::timeout, this, [this]() { - formEditorWidget()->graphicsView()->setUpdatesEnabled(true); + m_formEditorWidget->graphicsView()->setUpdatesEnabled(true); }); } void FormEditorView::nodeCreated(const ModelNode &node) { //If the node has source for components/custom parsers we ignore it. - if (QmlItemNode::isValidQmlItemNode(node) && node.nodeSourceType() == ModelNode::NodeWithoutSource) { //only setup QmlItems + if (QmlItemNode::isValidQmlItemNode(node) && node.nodeSourceType() == ModelNode::NodeWithoutSource) //only setup QmlItems setupFormEditorItemTree(QmlItemNode(node)); - - if (node.isSubclassOf("QtQuick3D.View3D")) - m_formEditorWidget->option3DAction()->setEnabled(true); - } else if (QmlVisualNode::isFlowTransition(node)) setupFormEditorItemTree(QmlItemNode(node)); + + if (node.isSubclassOf("QtQuick3D.Node")) + m_formEditorWidget->option3DAction()->setEnabled(true); } void FormEditorView::modelAboutToBeDetached(Model *model) @@ -263,14 +264,12 @@ void FormEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) removeNodeFromScene(qmlItemNode); - const QList views3D = rootModelNode().subModelNodesOfType("QtQuick3D.View3D"); + const QList nodes3D = rootModelNode().subModelNodesOfType("QtQuick3D.Node"); - // if no more View3D(s) exist after the node removal, set option3DAction to 2D and disable it - bool hasView3D = views3D.size() > 1 || (views3D.size() == 1 && views3D[0] != removedNode); - if (!hasView3D) { - rootModelNode().removeAuxiliaryData("3d-view"); // this will cause option3DAction to select 2D option + // if no more 3D Nodes exist after the node removal, disable option3DAction + bool hasView3D = nodes3D.size() > 1 || (nodes3D.size() == 1 && nodes3D[0] != removedNode); + if (!hasView3D) m_formEditorWidget->option3DAction()->setEnabled(false); - } } void FormEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) @@ -396,20 +395,20 @@ void FormEditorView::bindingPropertiesChanged(const QList &prop void FormEditorView::documentMessagesChanged(const QList &errors, const QList &) { if (!errors.isEmpty()) - formEditorWidget()->showErrorMessageBox(errors); + m_formEditorWidget->showErrorMessageBox(errors); else - formEditorWidget()->hideErrorMessageBox(); + m_formEditorWidget->hideErrorMessageBox(); } void FormEditorView::customNotification(const AbstractView * /*view*/, const QString &identifier, const QList &/*nodeList*/, const QList &/*data*/) { - if (identifier == QStringLiteral("puppet crashed")) + if (identifier == QLatin1String("puppet crashed")) m_dragTool->clearMoveDelay(); - if (identifier == QStringLiteral("reset QmlPuppet")) + if (identifier == QLatin1String("reset QmlPuppet")) temporaryBlockView(); } -AbstractFormEditorTool* FormEditorView::currentTool() const +AbstractFormEditorTool *FormEditorView::currentTool() const { return m_currentTool; } @@ -525,6 +524,7 @@ void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyN newNode.deselectNode(); } } else if (name == "3d-view") { + DesignerSettings::setValue(DesignerSettingsKey::VIEW_3D_ACTIVE, data); m_formEditorWidget->option3DAction()->set3DEnabled(data.toBool()); } else if (item.isFlowTransition() || item.isFlowItem() || item.isFlowActionArea()) { FormEditorItem *editorItem = m_scene->itemForQmlItemNode(item); @@ -660,12 +660,16 @@ void FormEditorView::toggle3DViewEnabled(bool enabled) { QTC_ASSERT(model(), return); QTC_ASSERT(rootModelNode().isValid(), return); + if (enabled) rootModelNode().setAuxiliaryData("3d-view", true); else rootModelNode().removeAuxiliaryData("3d-view"); - nodeInstanceView()->enable3DView(enabled); + resetNodeInstanceView(); + + // TODO: the line below is not in use. It should replace the resetNodeInstanceView(); to have a clean API +// nodeInstanceView()->enable3DView(enabled); } QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode) @@ -716,6 +720,12 @@ bool FormEditorView::isMoveToolAvailable() const return true; } +void FormEditorView::resetNodeInstanceView() +{ + setCurrentStateNode(rootModelNode()); + resetPuppet(); +} + void FormEditorView::reset() { QTimer::singleShot(200, this, &FormEditorView::delayedReset); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index 74d00f4a209..1558563337d 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -121,22 +121,20 @@ public: void exportAsImage(); - void toggle3DViewEnabled(bool enabled); - void setupOption3DAction(); - protected: void reset(); void delayedReset(); bool isMoveToolAvailable() const; -private: //functions +private: void setupFormEditorItemTree(const QmlItemNode &qmlItemNode); void removeNodeFromScene(const QmlItemNode &qmlItemNode); void hideNodeFromScene(const QmlItemNode &qmlItemNode); void createFormEditorWidget(); void temporaryBlockView(); + void resetNodeInstanceView(); + void toggle3DViewEnabled(bool enabled); -private: //variables QPointer m_formEditorWidget; QPointer m_scene; QList m_customToolList; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index f5970dc0e06..bf4f1f0454f 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -148,10 +148,6 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) : addAction(m_option3DAction.data()); upperActions.append(m_option3DAction.data()); m_toolBox->addRightSideAction(m_option3DAction.data()); - connect(m_option3DAction.data(), &Option3DAction::enabledChanged, - m_formEditorView.data(), &FormEditorView::toggle3DViewEnabled); - connect(m_option3DAction.data(), &Option3DAction::activated, - this, &FormEditorWidget::resetNodeInstanceView); m_zoomAction = new ZoomAction(m_toolActionGroup.data()); connect(m_zoomAction.data(), &ZoomAction::zoomLevelChanged, @@ -164,7 +160,7 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) : m_resetAction->setShortcut(Qt::Key_R); m_resetAction->setShortcutContext(Qt::WidgetWithChildrenShortcut); m_resetAction->setIcon(Utils::Icons::RESET_TOOLBAR.icon()); - connect(m_resetAction.data(), &QAction::triggered, this, &FormEditorWidget::resetNodeInstanceView); + addAction(m_resetAction.data()); upperActions.append(m_resetAction.data()); m_toolBox->addRightSideAction(m_resetAction.data()); @@ -209,12 +205,6 @@ void FormEditorWidget::changeBackgound(const QColor &color) m_graphicsView->activateColoredBackground(color); } -void FormEditorWidget::resetNodeInstanceView() -{ - m_formEditorView->setCurrentStateNode(m_formEditorView->rootModelNode()); - m_formEditorView->resetPuppet(); -} - void FormEditorWidget::wheelEvent(QWheelEvent *event) { if (event->modifiers().testFlag(Qt::ControlModifier)) { @@ -299,6 +289,11 @@ Option3DAction *FormEditorWidget::option3DAction() const return m_option3DAction.data(); } +QAction *FormEditorWidget::resetAction() const +{ + return m_resetAction.data(); +} + QAction *FormEditorWidget::showBoundingRectAction() const { return m_showBoundingRectAction.data(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h index f7e0d8a92d2..f7efbf60c05 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h @@ -58,6 +58,7 @@ public: QAction *showBoundingRectAction() const; QAction *snappingAction() const; QAction *snappingAndAnchoringAction() const; + QAction *resetAction() const; void setScene(FormEditorScene *scene); ToolBox *toolBox() const; @@ -97,9 +98,7 @@ private: void changeRootItemWidth(const QString &widthText); void changeRootItemHeight(const QString &heightText); void changeBackgound(const QColor &color); - void resetNodeInstanceView(); -private: QPointer m_formEditorView; QPointer m_graphicsView; QPointer m_zoomAction; diff --git a/src/plugins/qmldesigner/components/formeditor/option3daction.cpp b/src/plugins/qmldesigner/components/formeditor/option3daction.cpp index 05bfcaedffd..e7c88158d8f 100644 --- a/src/plugins/qmldesigner/components/formeditor/option3daction.cpp +++ b/src/plugins/qmldesigner/components/formeditor/option3daction.cpp @@ -37,8 +37,11 @@ Option3DAction::Option3DAction(QObject *parent) : void Option3DAction::set3DEnabled(bool enabled) { - if (m_comboBox) + if (m_comboBox) { + m_comboBox->blockSignals(true); m_comboBox->setCurrentIndex(enabled ? 1 : 0); + m_comboBox->blockSignals(false); + } } QWidget *Option3DAction::createWidget(QWidget *parent) @@ -50,17 +53,13 @@ QWidget *Option3DAction::createWidget(QWidget *parent) m_comboBox->addItem(tr("2D/3D")); m_comboBox->setCurrentIndex(0); - connect(m_comboBox, QOverload::of(&QComboBox::currentIndexChanged), - this, [this](){ + connect(m_comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { emit enabledChanged(m_comboBox->currentIndex() != 0); }); - connect(m_comboBox, QOverload::of(&QComboBox::activated), - this, [this](){ - emit activated(); - }); m_comboBox->setProperty("hideborder", true); m_comboBox->setToolTip(tr("Enable/Disable 3D edit mode.")); + return m_comboBox; } diff --git a/src/plugins/qmldesigner/components/formeditor/option3daction.h b/src/plugins/qmldesigner/components/formeditor/option3daction.h index a6d3e814676..ab01c1b364e 100644 --- a/src/plugins/qmldesigner/components/formeditor/option3daction.h +++ b/src/plugins/qmldesigner/components/formeditor/option3daction.h @@ -41,7 +41,6 @@ public: signals: void enabledChanged(bool enabled); - void activated(); protected: QWidget *createWidget(QWidget *parent) override; diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 8215358011a..80672b17a9c 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -473,18 +473,16 @@ QProcessEnvironment PuppetCreator::processEnvironment() const } #ifndef QMLDESIGNER_TEST - AbstractView *view = nullptr; - view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView(); + auto view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView(); view->emitCustomNotification("PuppetStatus", {}, {QVariant(m_qrcMapping)}); + // set env var and aux data if 3d-view is enabled QmlDesigner::Import import = QmlDesigner::Import::createLibraryImport("QtQuick3D", "1.0"); - bool view3DEnabled = false; - - if (m_model->hasImport(import, true, true)) - view3DEnabled = view->rootModelNode().hasAuxiliaryData("3d-view"); - - if (view3DEnabled) + if (m_model->hasImport(import, true, true) + && DesignerSettings::getValue(DesignerSettingsKey::VIEW_3D_ACTIVE).toBool()) { + view->rootModelNode().setAuxiliaryData("3d-view", true); environment.set("QMLDESIGNER_QUICK3D_MODE", "true"); + } #endif QStringList importPaths = m_model->importPaths(); diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index e9aa5175dc7..17c5a608104 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -797,7 +797,7 @@ const QList ModelNode::directSubModelNodesOfType(const TypeName &type const QList ModelNode::subModelNodesOfType(const TypeName &typeName) const { return Utils::filtered(allSubModelNodes(), [typeName](const ModelNode &node){ - return node.metaInfo().isValid() && node.metaInfo().typeName() == typeName; + return node.metaInfo().isValid() && node.metaInfo().isSubclassOf(typeName); }); } diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 4944cef9db2..328d07bb727 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -84,6 +84,7 @@ void DesignerSettings::fromSettings(QSettings *settings) ); restoreValue(settings, DesignerSettingsKey::SIMPLE_COLOR_PALETTE_CONTENT, QStringList()); restoreValue(settings, DesignerSettingsKey::ALWAYS_DESIGN_MODE, true); + restoreValue(settings, DesignerSettingsKey::VIEW_3D_ACTIVE, false); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index ec4dc1f7e58..f3a2d42430b 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -67,6 +67,7 @@ const char STANDALONE_MODE[] = "StandAloneMode"; const char ENABLE_TIMELINEVIEW[] = "EnableTimelineView"; const char SIMPLE_COLOR_PALETTE_CONTENT[] = "SimpleColorPaletteContent"; const char ALWAYS_DESIGN_MODE[] = "AlwaysDesignMode"; +const char VIEW_3D_ACTIVE[] = "View3DActive"; } class DesignerSettings : public QHash