forked from qt-creator/qt-creator
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:
@@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -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;
|
||||
|
@@ -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()
|
||||
|
@@ -61,6 +61,8 @@ public:
|
||||
const QList<QmlVisualNode> allDirectSubModelNodes() const;
|
||||
const QList<QmlVisualNode> allSubModelNodes() const;
|
||||
bool hasAnySubModelNodes() const;
|
||||
void setVisibilityOverride(bool visible);
|
||||
bool visibilityOverride() const;
|
||||
|
||||
static bool isItemOr3DNode(const ModelNode &modelNode);
|
||||
};
|
||||
|
@@ -472,13 +472,15 @@ void NodeInstanceView::importsChanged(const QList<Import> &/*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);
|
||||
|
@@ -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())
|
||||
|
Reference in New Issue
Block a user