QmlDesigner: Add "Group/Single selection" to the 3D context menu

- "Toggle Group/Single selection mode" option is added to the
3D Editor's context menu.
- All 3D actions are pushed into a map and are accessible by
View3DActionType as the key.

Task-number: QDS-8200
Change-Id: Ia5071ef8901b926ee4e4889fd840fc49c859bccd
Reviewed-by: Mahmoud Badri <mahmoud.badri@qt.io>
This commit is contained in:
Ali Kianian
2022-12-19 10:59:40 +02:00
parent 970af9e64d
commit 0887174727
6 changed files with 77 additions and 9 deletions

View File

@@ -3,7 +3,6 @@
#include "edit3dactions.h"
#include "edit3dview.h"
#include "edit3dwidget.h"
#include <viewmanager.h>
#include <nodeinstanceview.h>
@@ -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<Edit3DActionTemplate *>(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)
{

View File

@@ -10,19 +10,22 @@
namespace QmlDesigner {
using SelectionContextOperation = std::function<void(const SelectionContext &)>;
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:

View File

@@ -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<Edit3DAction *> 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();

View File

@@ -57,6 +57,7 @@ public:
QVector<Edit3DAction *> rightActions() const;
QVector<Edit3DAction *> visibilityToggleActions() const;
QVector<Edit3DAction *> 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<Edit3DAction *> m_rightActions;
QVector<Edit3DAction *> m_visibilityToggleActions;
QVector<Edit3DAction *> m_backgroundColorActions;
QMap<View3DActionType, Edit3DAction *> 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

View File

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

View File

@@ -72,6 +72,7 @@ private:
QPointer<QAction> m_alignCameraAction;
QPointer<QAction> m_alignViewAction;
QPointer<QAction> m_selectParentAction;
QPointer<QAction> m_toggleGroupAction;
QPointer<QMenu> m_createSubMenu;
ModelNode m_contextMenuTarget;
QVector3D m_contextMenuPos3d;