From c5fe523774d0682dc3ee15fb1ad780bf1cff74be Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 8 Oct 2019 18:28:09 +0200 Subject: [PATCH] QmlDesigner: Fix eyeball in navigator for QQuick3DNode The eyeball status for QQuickItem is handled in the form editor. This does not work for QQuick3DNode. * Adding support for 'invisible' in QmlVisualNode This allows to handle the 'invisible" state for both QQuickItem and QQuick3DNode. * Adding support for 'invisible' in the NodeInstanceServer. This means that the nodes are actuallly made invisible, if the AuxiliaryData is set. Even with this patch there is still a downside. We actually do hide the QQuick3DNode, which is reflected by the value of 'visible' in the property editor. This is not correct. The eybeball should not affect the actual property. To properly implement this we need a way to hide an item in the scene wihout changing the visibility property. Task-number: QDS-1065 Change-Id: I713ec97bc89fdd7271b2174756f36ce3731cfd4e Reviewed-by: Miikka Heikkinen Reviewed-by: Alessandro Portale Reviewed-by: Mahmoud Badri --- .../qml2puppet/instances/nodeinstanceserver.cpp | 11 ++++++++++- .../components/navigator/navigatortreemodel.cpp | 5 +---- .../components/navigator/navigatorview.cpp | 2 +- .../designercore/include/qmlvisualnode.h | 2 ++ .../designercore/instances/nodeinstanceview.cpp | 10 ++++++---- .../designercore/model/qmlvisualnode.cpp | 15 +++++++++++++++ 6 files changed, 35 insertions(+), 10 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 50062818037..60d34c909d9 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -958,7 +958,6 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer) { - //instanceId() == 0: the item is root if (auxiliaryContainer.instanceId() == 0 && (auxiliaryContainer.name() == "width" || auxiliaryContainer.name() == "height")) { @@ -978,6 +977,16 @@ void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer & } else { rootNodeInstance().resetProperty(propertyName); } + } else if (auxiliaryContainer.name() == "invisible") { + if (hasInstanceForId(auxiliaryContainer.instanceId())) { + ServerNodeInstance instance = instanceForId(auxiliaryContainer.instanceId()); + if (instance.isSubclassOf("QQuick3DNode")) { + if (!auxiliaryContainer.value().isNull()) + instance.setPropertyVariant("visible", !auxiliaryContainer.value().toBool()); + else + instance.resetProperty("visible"); + } + } } } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 08d2454bb15..e82fbe97701 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -607,10 +607,7 @@ bool NavigatorTreeModel::setData(const QModelIndex &index, const QVariant &value QTC_ASSERT(m_view, return false); m_view->handleChangedExport(modelNode, value.toInt() != 0); } else if (index.column() == 2 && role == Qt::CheckStateRole) { - if (value.toInt() == 0) - modelNode.setAuxiliaryData("invisible", true); - else - modelNode.removeAuxiliaryData("invisible"); + QmlVisualNode(modelNode).setVisibilityOverride(value.toInt() == 0); } return true; diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 553baa8e24d..4918f88a8bf 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -208,7 +208,7 @@ void NavigatorView::handleChangedExport(const ModelNode &modelNode, bool exporte bool NavigatorView::isNodeInvisible(const ModelNode &modelNode) const { - return modelNode.auxiliaryData("invisible").toBool(); + return QmlVisualNode(modelNode).visibilityOverride(); } void NavigatorView::disableWidget() diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index df6db763f8f..49785d0398b 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -61,6 +61,8 @@ public: const QList allDirectSubModelNodes() const; const QList allSubModelNodes() const; bool hasAnySubModelNodes() const; + void setVisibilityOverride(bool visible); + bool visibilityOverride() const; static bool isItemOr3DNode(const ModelNode &modelNode); }; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index f316200dcc5..dd7052819be 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -472,13 +472,15 @@ void NodeInstanceView::importsChanged(const QList &/*addedImports*/, con restartProcess(); } -void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, const PropertyName &name, const QVariant &data) +void NodeInstanceView::auxiliaryDataChanged(const ModelNode &node, + const PropertyName &name, + const QVariant &value) { - if ((node.isRootNode() && (name == "width" || name == "height")) || name.endsWith(PropertyName("@NodeInstance"))) { + if ((node.isRootNode() && (name == "width" || name == "height") || name == "invisible") + || name.endsWith(PropertyName("@NodeInstance"))) { if (hasInstanceForModelNode(node)) { NodeInstance instance = instanceForModelNode(node); - QVariant value = data; - if (value.isValid()) { + if (value.isValid() || name == "invisible") { PropertyValueContainer container(instance.instanceId(), name, value, TypeName()); ChangeAuxiliaryCommand changeAuxiliaryCommand({container}); nodeInstanceServer()->changeAuxiliaryValues(changeAuxiliaryCommand); diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index a1d351907ba..d0598e844ed 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -151,6 +151,21 @@ bool QmlVisualNode::hasAnySubModelNodes() const return modelNode().hasAnySubModelNodes(); } +void QmlVisualNode::setVisibilityOverride(bool visible) +{ + if (visible) + modelNode().setAuxiliaryData("invisible", true); + else + modelNode().removeAuxiliaryData("invisible"); +} + +bool QmlVisualNode::visibilityOverride() const +{ + if (isValid()) + return modelNode().auxiliaryData("invisible").toBool(); + return false; +} + QmlModelStateGroup QmlVisualNode::states() const { if (isValid())