From ac93351c93f6fc272f293372f1be63e648be6ef5 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 5 Jan 2023 15:05:02 +0200 Subject: [PATCH] QmlDesigner: Respect node locking in navigator and 3D view If 3D scene root is locked, disable create options from context menu in 3D view. Also, don't highlight locked nodes as drop targets in navigator. Fixes: QDS-8731 Change-Id: If0c8b5497781c2623f2c57966d4689e345b85785 Reviewed-by: Mahmoud Badri --- .../components/edit3d/edit3dwidget.cpp | 15 +++++++++- .../components/edit3d/edit3dwidget.h | 1 + .../components/navigator/nameitemdelegate.cpp | 28 ++++++++++--------- 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index f7c6ae22cfe..cb16233475d 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -248,6 +248,16 @@ bool Edit3DWidget::isPasteAvailable() const return QApplication::clipboard()->text().startsWith(Constants::HEADER_3DPASTE_CONTENT); } +bool Edit3DWidget::isSceneLocked() const +{ + if (m_view && m_view->hasModelNodeForInternalId(m_canvas->activeScene())) { + ModelNode node = m_view->modelNodeForInternalId(m_canvas->activeScene()); + if (ModelNode::isThisOrAncestorLocked(node)) + return true; + } + return false; +} + // Called by the view to update the "create" sub-menu when the Quick3D entries are ready. void Edit3DWidget::updateCreateSubMenu(const QStringList &keys, const QHash> &entriesMap) @@ -286,7 +296,7 @@ void Edit3DWidget::updateCreateSubMenu(const QStringList &keys, void Edit3DWidget::onCreateAction() { QAction *action = qobject_cast(sender()); - if (!action || !m_view || !m_view->model()) + if (!action || !m_view || !m_view->model() || isSceneLocked()) return; m_view->executeInTransaction(__FUNCTION__, [&] { @@ -374,6 +384,9 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode const bool anyNodeSelected = view()->hasSelectedModelNodes(); const bool selectionExcludingRoot = anyNodeSelected && !view()->rootModelNode().isSelected(); + if (m_createSubMenu) + m_createSubMenu->setEnabled(!isSceneLocked()); + m_editComponentAction->setEnabled(isSingleComponent); m_editMaterialAction->setEnabled(isModel); m_duplicateAction->setEnabled(selectionExcludingRoot); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h index b7d1ec996a7..37298dfb281 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h @@ -52,6 +52,7 @@ private: void createContextMenu(); bool isPasteAvailable() const; + bool isSceneLocked() const; QPointer m_edit3DView; QPointer m_view; diff --git a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp index f56a5477fec..65822094394 100644 --- a/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp +++ b/src/plugins/qmldesigner/components/navigator/nameitemdelegate.cpp @@ -211,21 +211,23 @@ void NameItemDelegate::paint(QPainter *painter, } ModelNode node = getModelNode(modelIndex); - NavigatorWidget *widget = qobject_cast(styleOption.widget->parent()); - if (widget && !widget->dragType().isEmpty()) { - QByteArray dragType = widget->dragType(); - const NodeMetaInfo metaInfo = node.metaInfo(); - const NodeMetaInfo dragInfo = node.model()->metaInfo(dragType); - ChooseFromPropertyListFilter *filter = new ChooseFromPropertyListFilter(dragInfo, metaInfo, true); + if (!ModelNode::isThisOrAncestorLocked(node)) { + NavigatorWidget *widget = qobject_cast(styleOption.widget->parent()); + if (widget && !widget->dragType().isEmpty()) { + QByteArray dragType = widget->dragType(); + const NodeMetaInfo metaInfo = node.metaInfo(); + const NodeMetaInfo dragInfo = node.model()->metaInfo(dragType); + ChooseFromPropertyListFilter *filter = new ChooseFromPropertyListFilter(dragInfo, metaInfo, true); - if (!filter->propertyList.isEmpty()) { - painter->setOpacity(0.5); - painter->fillRect(styleOption.rect.adjusted(0, delegateMargin, 0, -delegateMargin), - Theme::getColor(Theme::Color::DSnavigatorDropIndicatorBackground)); - painter->setOpacity(1.0); - painter->setPen(Theme::getColor(Theme::Color::DSnavigatorTextSelected)); + if (!filter->propertyList.isEmpty()) { + painter->setOpacity(0.5); + painter->fillRect(styleOption.rect.adjusted(0, delegateMargin, 0, -delegateMargin), + Theme::getColor(Theme::Color::DSnavigatorDropIndicatorBackground)); + painter->setOpacity(1.0); + painter->setPen(Theme::getColor(Theme::Color::DSnavigatorTextSelected)); + } + delete filter; } - delete filter; } iconOffset = drawIcon(painter, styleOption, modelIndex);