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);