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:
Henning Gruendl
2020-10-09 11:14:14 +02:00
committed by Miikka Heikkinen
parent 3d78fef4ef
commit f2883c19b1
16 changed files with 343 additions and 106 deletions

View File

@@ -244,6 +244,40 @@ QQuick3DNode *GeneralHelper::resolvePick(QQuick3DNode *pickNode)
return pickNode;
}
void GeneralHelper::registerGizmoTarget(QQuick3DNode *node)
{
if (!m_gizmoTargets.contains(node)) {
m_gizmoTargets.insert(node);
node->installEventFilter(this);
}
}
void GeneralHelper::unregisterGizmoTarget(QQuick3DNode *node)
{
if (m_gizmoTargets.contains(node)) {
m_gizmoTargets.remove(node);
node->removeEventFilter(this);
}
}
bool GeneralHelper::isLocked(QQuick3DNode *node)
{
if (node) {
QVariant lockValue = node->property("_edit3dLocked");
return lockValue.isValid() && lockValue.toBool();
}
return false;
}
bool GeneralHelper::isHidden(QQuick3DNode *node)
{
if (node) {
QVariant hideValue = node->property("_edit3dHidden");
return hideValue.isValid() && hideValue.toBool();
}
return false;
}
void GeneralHelper::storeToolState(const QString &sceneId, const QString &tool, const QVariant &state,
int delay)
{
@@ -322,6 +356,21 @@ bool GeneralHelper::isMacOS() const
#endif
}
bool GeneralHelper::eventFilter(QObject *obj, QEvent *event)
{
if (event->type() == QEvent::DynamicPropertyChange) {
auto node = qobject_cast<QQuick3DNode *>(obj);
if (m_gizmoTargets.contains(node)) {
auto de = static_cast<QDynamicPropertyChangeEvent *>(event);
if (de->propertyName() == "_edit3dLocked")
emit lockedStateChanged(node);
else if (de->propertyName() == "_edit3dHidden")
emit hiddenStateChanged(node);
}
}
return QObject::eventFilter(obj, event);
}
void GeneralHelper::handlePendingToolStateUpdate()
{
m_toolStateUpdateTimer.stop();

View File

@@ -74,6 +74,12 @@ public:
Q_INVOKABLE void delayedPropertySet(QObject *obj, int delay, const QString &property,
const QVariant& value);
Q_INVOKABLE QQuick3DNode *resolvePick(QQuick3DNode *pickNode);
Q_INVOKABLE void registerGizmoTarget(QQuick3DNode *node);
Q_INVOKABLE void unregisterGizmoTarget(QQuick3DNode *node);
Q_INVOKABLE bool isLocked(QQuick3DNode *node);
Q_INVOKABLE bool isHidden(QQuick3DNode *node);
Q_INVOKABLE void storeToolState(const QString &sceneId, const QString &tool,
const QVariant &state, int delayEmit = 0);
void initToolStates(const QString &sceneId, const QVariantMap &toolStates);
@@ -90,6 +96,11 @@ public:
signals:
void overlayUpdateNeeded();
void toolStateChanged(const QString &sceneId, const QString &tool, const QVariant &toolState);
void hiddenStateChanged(QQuick3DNode *node);
void lockedStateChanged(QQuick3DNode *node);
protected:
bool eventFilter(QObject *obj, QEvent *event);
private:
void handlePendingToolStateUpdate();
@@ -98,6 +109,7 @@ private:
QTimer m_toolStateUpdateTimer;
QHash<QString, QVariantMap> m_toolStates;
QHash<QString, QVariantMap> m_toolStatesPending;
QSet<QQuick3DNode *> m_gizmoTargets;
};
}