summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiikka Heikkinen <miikka.heikkinen@qt.io>2019-11-25 17:10:59 +0200
committerMiikka Heikkinen <miikka.heikkinen@qt.io>2019-11-26 10:36:51 +0000
commitd076c59429e2898f7d88699ed733ec0c3b2d66b6 (patch)
tree942469dcb8eab4144898a06a2a8b6565ae7e4245
parentb96bf86f180ea3a90bf396b8a45b587a9fb0539d (diff)
downloadqt-creator-d076c59429e2898f7d88699ed733ec0c3b2d66b6.tar.gz
QmlDesigner: Block selection of hidden objects
If eyeball is turned off for object, it shouldn't be pickable in 3D edit view. Change-Id: Ib9308aaaecc822f448591f249bd96ffb5d0c9c48 Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp60
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h1
-rw-r--r--share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h2
3 files changed, 51 insertions, 12 deletions
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp
index ff555f6514..f35d165931 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp
@@ -56,17 +56,7 @@ void Quick3DNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNo
InstanceContainer::NodeFlags flags)
{
ObjectNodeInstance::initialize(objectNodeInstance, flags);
-
-#ifdef QUICK3D_MODULE
- if (quick3DNode()) {
- QQuick3DObject::Type nodeType = quick3DNode()->type();
- if (nodeType == QQuick3DObject::Camera || nodeType == QQuick3DObject::Light
- || nodeType == QQuick3DObject::Model || nodeType == QQuick3DObject::Image
- || nodeType == QQuick3DObject::Text) {
- setPropertyVariant("pickable", true); // allow 3D objects to receive mouse clicks
- }
- }
-#endif
+ setPickable(true, true, false);
}
Qt5NodeInstanceServer *Quick3DNodeInstance::qt5NodeInstanceServer() const
@@ -83,6 +73,48 @@ QQuick3DNode *Quick3DNodeInstance::quick3DNode() const
#endif
}
+void Quick3DNodeInstance::setPickable(bool enable, bool checkParent, bool applyToChildren)
+{
+#ifdef QUICK3D_MODULE
+ auto node = quick3DNode();
+ if (node) {
+ QQuick3DObject::Type nodeType = node->type();
+ bool parentHidden = false;
+ if (checkParent) {
+ // First check if any parent node is already hidden. Never set pickable on that case.
+ auto parentNode = node->parentNode();
+ while (parentNode && !parentHidden) {
+ parentHidden = QQuick3DNodePrivate::get(parentNode)->m_isHiddenInEditor;
+ parentNode = parentNode->parentNode();
+ }
+
+ }
+ if (!parentHidden) {
+ if (applyToChildren) {
+ auto getQuick3DInstance = [this](QQuick3DObject *obj) -> Quick3DNodeInstance * {
+ if (nodeInstanceServer()->hasInstanceForObject(obj)) {
+ ServerNodeInstance instance = nodeInstanceServer()->instanceForObject(obj);
+ if (instance.isValid() && qobject_cast<QQuick3DNode *>(instance.internalObject()))
+ return static_cast<Quick3DNodeInstance *>(instance.internalInstance().data());
+ }
+ return nullptr;
+ };
+ const auto childItems = node->childItems();
+ for (auto childItem : childItems) {
+ if (auto quick3dInstance = getQuick3DInstance(childItem)) {
+ // Don't override explicit block in children
+ if (!QQuick3DNodePrivate::get(quick3dInstance->quick3DNode())->m_isHiddenInEditor)
+ quick3dInstance->setPickable(enable, false, true);
+ }
+ }
+ }
+ if (nodeType == QQuick3DObject::Model)
+ setPropertyVariant("pickable", enable); // allow 3D objects to receive mouse clicks
+ }
+ }
+#endif
+}
+
Quick3DNodeInstance::Pointer Quick3DNodeInstance::create(QObject *object)
{
Pointer instance(new Quick3DNodeInstance(object));
@@ -94,8 +126,12 @@ void Quick3DNodeInstance::setHideInEditor(bool b)
{
#ifdef QUICK3D_MODULE
QQuick3DNodePrivate *privateNode = QQuick3DNodePrivate::get(quick3DNode());
- if (privateNode)
+ if (privateNode) {
privateNode->setIsHiddenInEditor(b);
+
+ // Hidden objects should not be pickable
+ setPickable(!b, true, true);
+ }
#else
Q_UNUSED(b);
#endif
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h
index 96c44c4d52..27e2488eb3 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.h
@@ -53,6 +53,7 @@ protected:
private:
Qt5NodeInstanceServer *qt5NodeInstanceServer() const;
QQuick3DNode *quick3DNode() const;
+ void setPickable(bool enable, bool checkParent, bool applyToChildren);
};
} // namespace Internal
diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h
index 86003b51b6..c85ba9a2b8 100644
--- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h
+++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/servernodeinstance.h
@@ -60,6 +60,7 @@ namespace Internal {
class GraphicsObjectNodeInstance;
class QmlStateNodeInstance;
class QuickItemNodeInstance;
+ class Quick3DNodeInstance;
}
class ServerNodeInstance
@@ -82,6 +83,7 @@ class ServerNodeInstance
friend class QmlDesigner::Internal::ObjectNodeInstance;
friend class QmlDesigner::Internal::QmlPropertyChangesNodeInstance;
friend class QmlDesigner::Internal::QmlStateNodeInstance;
+ friend class QmlDesigner::Internal::Quick3DNodeInstance;
public:
enum ComponentWrap {