diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp index d5c93ca4b97..5b271a4c13d 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dactions.cpp @@ -3,7 +3,6 @@ #include "edit3dactions.h" #include "edit3dview.h" -#include "edit3dwidget.h" #include #include @@ -18,7 +17,7 @@ namespace QmlDesigner { Edit3DActionTemplate::Edit3DActionTemplate(const QString &description, SelectionContextOperation action, - AbstractView *view, + Edit3DView *view, View3DActionType type) : DefaultAction(description) , m_action(action) @@ -45,12 +44,14 @@ Edit3DAction::Edit3DAction(const QByteArray &menuId, bool checked, const QIcon &iconOff, const QIcon &iconOn, - AbstractView *view, + Edit3DView *view, SelectionContextOperation selectionAction, const QString &toolTip) : AbstractAction(new Edit3DActionTemplate(description, selectionAction, view, type)) , m_menuId(menuId) + , m_actionTemplate(qobject_cast(defaultAction())) { + view->registerEdit3DAction(this); action()->setShortcut(key); action()->setShortcutContext(Qt::WidgetWithChildrenShortcut); action()->setCheckable(checkable); @@ -73,11 +74,21 @@ Edit3DAction::Edit3DAction(const QByteArray &menuId, } } +Edit3DAction::~Edit3DAction() +{ + m_actionTemplate->m_view->unregisterEdit3DAction(this); +} + QByteArray Edit3DAction::category() const { return QByteArray(); } +View3DActionType Edit3DAction::actionType() const +{ + return m_actionTemplate->m_type; +} + bool Edit3DAction::isVisible([[maybe_unused]] const SelectionContext &selectionContext) const { return true; @@ -96,7 +107,7 @@ Edit3DCameraAction::Edit3DCameraAction(const QByteArray &menuId, bool checked, const QIcon &iconOff, const QIcon &iconOn, - AbstractView *view, + Edit3DView *view, SelectionContextOperation selectionAction) : Edit3DAction(menuId, type, description, key, checkable, checked, iconOff, iconOn, view, selectionAction) { diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dactions.h b/src/plugins/qmldesigner/components/edit3d/edit3dactions.h index 14f63c3796e..a78b95d784a 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dactions.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dactions.h @@ -10,19 +10,22 @@ namespace QmlDesigner { using SelectionContextOperation = std::function; +class Edit3DView; class Edit3DActionTemplate : public DefaultAction { + Q_OBJECT + public: Edit3DActionTemplate(const QString &description, SelectionContextOperation action, - AbstractView *view, + Edit3DView *view, View3DActionType type); void actionTriggered(bool b) override; SelectionContextOperation m_action; - AbstractView *m_view; + Edit3DView *m_view = nullptr; View3DActionType m_type; }; @@ -37,10 +40,12 @@ public: bool checked, const QIcon &iconOff, const QIcon &iconOn, - AbstractView *view, + Edit3DView *view, SelectionContextOperation selectionAction = nullptr, const QString &toolTip = {}); + virtual ~Edit3DAction(); + QByteArray category() const override; int priority() const override @@ -58,12 +63,15 @@ public: return m_menuId; } + View3DActionType actionType() const; + protected: bool isVisible(const SelectionContext &selectionContext) const override; bool isEnabled(const SelectionContext &selectionContext) const override; private: QByteArray m_menuId; + Edit3DActionTemplate *m_actionTemplate = nullptr; }; class Edit3DCameraAction : public Edit3DAction @@ -77,7 +85,7 @@ public: bool checked, const QIcon &iconOff, const QIcon &iconOn, - AbstractView *view, + Edit3DView *view, SelectionContextOperation selectionAction = nullptr); protected: diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index 75c2138ffc0..038c658c51e 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -38,7 +38,9 @@ Edit3DView::Edit3DView(ExternalDependenciesInterface &externalDependencies) } Edit3DView::~Edit3DView() -{} +{ + qDeleteAll(m_edit3DActions); +} void Edit3DView::createEdit3DWidget() { @@ -197,6 +199,31 @@ void Edit3DView::onEntriesChanged() m_compressionTimer.start(); } +void Edit3DView::registerEdit3DAction(Edit3DAction *action) +{ + View3DActionType actionType = action->actionType(); + if (actionType == View3DActionType::Empty) + return; + + if (m_edit3DActions.contains(actionType)) { + Edit3DAction *formerAction = m_edit3DActions.value(actionType); + if (formerAction == action) + return; + + qWarning() << Q_FUNC_INFO << __LINE__ << "Reregistering action for" << int(actionType); + delete formerAction; + } + + m_edit3DActions.insert(actionType, action); +} + +void Edit3DView::unregisterEdit3DAction(Edit3DAction *action) +{ + View3DActionType actionType = action->actionType(); + if (m_edit3DActions.value(actionType, nullptr) == action) + m_edit3DActions.remove(actionType); +} + void Edit3DView::handleEntriesChanged() { if (!model()) @@ -812,6 +839,11 @@ QVector Edit3DView::backgroundColorActions() const return m_backgroundColorActions; } +Edit3DAction *Edit3DView::edit3DAction(View3DActionType type) const +{ + return m_edit3DActions.value(type, nullptr); +} + void Edit3DView::addQuick3DImport() { DesignDocument *document = QmlDesignerPlugin::instance()->currentDesignDocument(); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index a14399e1c70..7653730480f 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -57,6 +57,7 @@ public: QVector rightActions() const; QVector visibilityToggleActions() const; QVector backgroundColorActions() const; + Edit3DAction *edit3DAction(View3DActionType type) const; void setSeeker(SeekerSlider *slider); void addQuick3DImport(); @@ -77,6 +78,9 @@ private: None }; + void registerEdit3DAction(Edit3DAction *action); + void unregisterEdit3DAction(Edit3DAction *action); + void createEdit3DWidget(); void checkImports(); void handleEntriesChanged(); @@ -92,6 +96,7 @@ private: QVector m_rightActions; QVector m_visibilityToggleActions; QVector m_backgroundColorActions; + QMap m_edit3DActions; Edit3DAction *m_selectionModeAction = nullptr; Edit3DAction *m_moveToolAction = nullptr; Edit3DAction *m_rotateToolAction = nullptr; @@ -120,6 +125,8 @@ private: NodeAtPosReqType m_nodeAtPosReqType; QPoint m_contextMenuPos; QTimer m_compressionTimer; + + friend class Edit3DAction; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp index d939d4bf50d..c6cc8e43717 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.cpp @@ -232,6 +232,14 @@ void Edit3DWidget::createContextMenu() view()->setSelectedModelNode(parentNode); }); + QAction *defaultToggleGroupAction = view()->edit3DAction(View3DActionType::SelectionModeToggle)->action(); + m_toggleGroupAction = m_contextMenu->addAction(tr("Group Selection Mode"), [&](const bool &mode) { + view()->edit3DAction(View3DActionType::SelectionModeToggle)->action()->trigger(); + }); + connect(defaultToggleGroupAction, &QAction::toggled, m_toggleGroupAction, &QAction::setChecked); + m_toggleGroupAction->setCheckable(true); + m_toggleGroupAction->setChecked(defaultToggleGroupAction->isChecked()); + m_contextMenu->addSeparator(); } @@ -376,6 +384,7 @@ void Edit3DWidget::showContextMenu(const QPoint &pos, const ModelNode &modelNode m_alignCameraAction->setEnabled(isCamera); m_alignViewAction->setEnabled(isCamera); m_selectParentAction->setEnabled(selectionExcludingRoot); + m_toggleGroupAction->setEnabled(true); m_contextMenu->popup(mapToGlobal(pos)); } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h index 25948d5d9aa..f1a9c09f445 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dwidget.h @@ -72,6 +72,7 @@ private: QPointer m_alignCameraAction; QPointer m_alignViewAction; QPointer m_selectParentAction; + QPointer m_toggleGroupAction; QPointer m_createSubMenu; ModelNode m_contextMenuTarget; QVector3D m_contextMenuPos3d;