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 <miikka.heikkinen@qt.io>
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Thomas Hartmann
2019-10-08 18:28:09 +02:00
parent 6147584c97
commit c5fe523774
6 changed files with 35 additions and 10 deletions

View File

@@ -958,7 +958,6 @@ void NodeInstanceServer::setInstancePropertyVariant(const PropertyValueContainer
void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer) void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &auxiliaryContainer)
{ {
//instanceId() == 0: the item is root
if (auxiliaryContainer.instanceId() == 0 && (auxiliaryContainer.name() == "width" || if (auxiliaryContainer.instanceId() == 0 && (auxiliaryContainer.name() == "width" ||
auxiliaryContainer.name() == "height")) { auxiliaryContainer.name() == "height")) {
@@ -978,6 +977,16 @@ void NodeInstanceServer::setInstanceAuxiliaryData(const PropertyValueContainer &
} else { } else {
rootNodeInstance().resetProperty(propertyName); 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");
}
}
} }
} }

View File

@@ -607,10 +607,7 @@ bool NavigatorTreeModel::setData(const QModelIndex &index, const QVariant &value
QTC_ASSERT(m_view, return false); QTC_ASSERT(m_view, return false);
m_view->handleChangedExport(modelNode, value.toInt() != 0); m_view->handleChangedExport(modelNode, value.toInt() != 0);
} else if (index.column() == 2 && role == Qt::CheckStateRole) { } else if (index.column() == 2 && role == Qt::CheckStateRole) {
if (value.toInt() == 0) QmlVisualNode(modelNode).setVisibilityOverride(value.toInt() == 0);
modelNode.setAuxiliaryData("invisible", true);
else
modelNode.removeAuxiliaryData("invisible");
} }
return true; return true;

View File

@@ -208,7 +208,7 @@ void NavigatorView::handleChangedExport(const ModelNode &modelNode, bool exporte
bool NavigatorView::isNodeInvisible(const ModelNode &modelNode) const bool NavigatorView::isNodeInvisible(const ModelNode &modelNode) const
{ {
return modelNode.auxiliaryData("invisible").toBool(); return QmlVisualNode(modelNode).visibilityOverride();
} }
void NavigatorView::disableWidget() void NavigatorView::disableWidget()

View File

@@ -61,6 +61,8 @@ public:
const QList<QmlVisualNode> allDirectSubModelNodes() const; const QList<QmlVisualNode> allDirectSubModelNodes() const;
const QList<QmlVisualNode> allSubModelNodes() const; const QList<QmlVisualNode> allSubModelNodes() const;
bool hasAnySubModelNodes() const; bool hasAnySubModelNodes() const;
void setVisibilityOverride(bool visible);
bool visibilityOverride() const;
static bool isItemOr3DNode(const ModelNode &modelNode); static bool isItemOr3DNode(const ModelNode &modelNode);
}; };

View File

@@ -472,13 +472,15 @@ void NodeInstanceView::importsChanged(const QList<Import> &/*addedImports*/, con
restartProcess(); 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)) { if (hasInstanceForModelNode(node)) {
NodeInstance instance = instanceForModelNode(node); NodeInstance instance = instanceForModelNode(node);
QVariant value = data; if (value.isValid() || name == "invisible") {
if (value.isValid()) {
PropertyValueContainer container(instance.instanceId(), name, value, TypeName()); PropertyValueContainer container(instance.instanceId(), name, value, TypeName());
ChangeAuxiliaryCommand changeAuxiliaryCommand({container}); ChangeAuxiliaryCommand changeAuxiliaryCommand({container});
nodeInstanceServer()->changeAuxiliaryValues(changeAuxiliaryCommand); nodeInstanceServer()->changeAuxiliaryValues(changeAuxiliaryCommand);

View File

@@ -151,6 +151,21 @@ bool QmlVisualNode::hasAnySubModelNodes() const
return modelNode().hasAnySubModelNodes(); 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 QmlModelStateGroup QmlVisualNode::states() const
{ {
if (isValid()) if (isValid())