forked from qt-creator/qt-creator
QmlDesigner: Add lock feature support to 3D editor
Added lock feature support for 3D editor. Also refactored the hide support, since the two use largely similar logic. Task-number: QDS-2915 Change-Id: I627848f3a3a73881427a03aeec6793fd26a1885a Reviewed-by: Henning Gründl <henning.gruendl@qt.io> Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io> Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
committed by
Miikka Heikkinen
parent
3d78fef4ef
commit
f2883c19b1
@@ -57,7 +57,6 @@ void Quick3DNodeInstance::initialize(const ObjectNodeInstance::Pointer &objectNo
|
||||
InstanceContainer::NodeFlags flags)
|
||||
{
|
||||
ObjectNodeInstance::initialize(objectNodeInstance, flags);
|
||||
setPickable(true, true, false);
|
||||
}
|
||||
|
||||
Qt5NodeInstanceServer *Quick3DNodeInstance::qt5NodeInstanceServer() const
|
||||
@@ -74,71 +73,6 @@ QQuick3DNode *Quick3DNodeInstance::quick3DNode() const
|
||||
#endif
|
||||
}
|
||||
|
||||
void Quick3DNodeInstance::setPickable(bool enable, bool checkParent, bool applyToChildInstances)
|
||||
{
|
||||
#ifdef QUICK3D_MODULE
|
||||
auto node = quick3DNode();
|
||||
if (node) {
|
||||
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) {
|
||||
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)) {
|
||||
if (applyToChildInstances) {
|
||||
// Don't override explicit block in children
|
||||
if (!QQuick3DNodePrivate::get(quick3dInstance->quick3DNode())->m_isHiddenInEditor)
|
||||
quick3dInstance->setPickable(enable, false, true);
|
||||
}
|
||||
} else {
|
||||
// Children of components do not have instances, but will still need to be
|
||||
// pickable. These need to be set even if applyToChildInstances is false.
|
||||
std::function<void(QQuick3DNode *)> checkChildren;
|
||||
checkChildren = [&](QQuick3DNode *checkNode) {
|
||||
const auto childItems = checkNode->childItems();
|
||||
for (auto child : childItems) {
|
||||
if (auto childNode = qobject_cast<QQuick3DNode *>(child))
|
||||
checkChildren(childNode);
|
||||
}
|
||||
if (auto checkModel = qobject_cast<QQuick3DModel *>(checkNode)) {
|
||||
QVariant value;
|
||||
if (enable)
|
||||
value = QVariant::fromValue(node);
|
||||
// Specify the actual pick target with dynamic property
|
||||
checkModel->setProperty("_pickTarget", value);
|
||||
checkModel->setPickable(enable);
|
||||
}
|
||||
};
|
||||
checkChildren(node);
|
||||
}
|
||||
}
|
||||
if (qobject_cast<QQuick3DModel *>(node))
|
||||
setPropertyVariant("pickable", enable); // allow 3D objects to receive mouse clicks
|
||||
}
|
||||
}
|
||||
#else
|
||||
Q_UNUSED(enable)
|
||||
Q_UNUSED(checkParent)
|
||||
Q_UNUSED(applyToChildInstances)
|
||||
#endif
|
||||
}
|
||||
|
||||
Quick3DNodeInstance::Pointer Quick3DNodeInstance::create(QObject *object)
|
||||
{
|
||||
Pointer instance(new Quick3DNodeInstance(object));
|
||||
@@ -146,18 +80,13 @@ Quick3DNodeInstance::Pointer Quick3DNodeInstance::create(QObject *object)
|
||||
return instance;
|
||||
}
|
||||
|
||||
void Quick3DNodeInstance::setHideInEditor(bool b)
|
||||
void Quick3DNodeInstance::setHiddenInEditor(bool b)
|
||||
{
|
||||
ObjectNodeInstance::setHiddenInEditor(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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user