diff --git a/src/libs/qmlpuppetcommunication/commands/inputeventcommand.cpp b/src/libs/qmlpuppetcommunication/commands/inputeventcommand.cpp index 0dc669406af..2ba1a651228 100644 --- a/src/libs/qmlpuppetcommunication/commands/inputeventcommand.cpp +++ b/src/libs/qmlpuppetcommunication/commands/inputeventcommand.cpp @@ -10,10 +10,16 @@ namespace QmlDesigner { InputEventCommand::InputEventCommand() = default; -InputEventCommand::InputEventCommand(QInputEvent *e) - : m_type(e->type()), - m_modifiers(e->modifiers()) +InputEventCommand::InputEventCommand(QEvent *e) + : m_type(e->type()) { + // Leave events are not actual input events + if (m_type == QEvent::Leave) + return; + + auto ie = static_cast(e); + m_modifiers = ie->modifiers(); + if (m_type == QEvent::Wheel) { auto we = static_cast(e); #if QT_VERSION <= QT_VERSION_CHECK(5, 15, 0) @@ -28,6 +34,11 @@ InputEventCommand::InputEventCommand(QInputEvent *e) m_key = ke->key(); m_count = ke->count(); m_autoRepeat = ke->isAutoRepeat(); + } else if (m_type == QEvent::Enter) { + auto spe = static_cast(e); + m_pos = spe->position().toPoint(); + m_button = spe->button(); + m_buttons = spe->buttons(); } else { auto me = static_cast(e); m_pos = me->pos(); diff --git a/src/libs/qmlpuppetcommunication/commands/inputeventcommand.h b/src/libs/qmlpuppetcommunication/commands/inputeventcommand.h index e0a220cd693..7cd2c898fe4 100644 --- a/src/libs/qmlpuppetcommunication/commands/inputeventcommand.h +++ b/src/libs/qmlpuppetcommunication/commands/inputeventcommand.h @@ -18,7 +18,7 @@ class InputEventCommand public: InputEventCommand(); - explicit InputEventCommand(QInputEvent *e); + explicit InputEventCommand(QEvent *e); QEvent::Type type() const { return m_type; } QPoint pos() const { return m_pos; } diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp index 60cba025840..6afe4fa8164 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.cpp @@ -155,6 +155,18 @@ void Edit3DCanvas::focusInEvent(QFocusEvent *focusEvent) QWidget::focusInEvent(focusEvent); } +void Edit3DCanvas::enterEvent(QEnterEvent *e) +{ + m_parent->view()->sendInputEvent(e); + QWidget::enterEvent(e); +} + +void Edit3DCanvas::leaveEvent(QEvent *e) +{ + m_parent->view()->sendInputEvent(e); + QWidget::leaveEvent(e); +} + void Edit3DCanvas::positionBusyInidicator() { m_busyIndicator->move(width() / 2 - 32, height() / 2 - 32); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h index d575e68c139..810e246f8a3 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dcanvas.h @@ -38,6 +38,8 @@ protected: void resizeEvent(QResizeEvent *e) override; void focusOutEvent(QFocusEvent *focusEvent) override; void focusInEvent(QFocusEvent *focusEvent) override; + void enterEvent(QEnterEvent *e) override; + void leaveEvent(QEvent *e) override; private: void positionBusyInidicator(); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp index fc81eef4797..9831ee18467 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.cpp @@ -431,7 +431,7 @@ void Edit3DView::nodeRemoved(const ModelNode &, updateAlignActionStates(); } -void Edit3DView::sendInputEvent(QInputEvent *e) const +void Edit3DView::sendInputEvent(QEvent *e) const { if (nodeInstanceView()) nodeInstanceView()->sendInputEvent(e); diff --git a/src/plugins/qmldesigner/components/edit3d/edit3dview.h b/src/plugins/qmldesigner/components/edit3d/edit3dview.h index 2fb1e0451cd..e5d41614958 100644 --- a/src/plugins/qmldesigner/components/edit3d/edit3dview.h +++ b/src/plugins/qmldesigner/components/edit3d/edit3dview.h @@ -52,7 +52,7 @@ public: void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange) override; - void sendInputEvent(QInputEvent *e) const; + void sendInputEvent(QEvent *e) const; void edit3DViewResized(const QSize &size) const; QSize canvasSize() const; diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index fd7f21d090b..80727bf5a9e 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -132,7 +132,7 @@ public: void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; - void sendInputEvent(QInputEvent *e) const; + void sendInputEvent(QEvent *e) const; void view3DAction(View3DActionType type, const QVariant &value) override; void requestModelNodePreviewImage(const ModelNode &node, const ModelNode &renderNode) const; void edit3DViewResized(const QSize &size) const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 23146996afc..641455910a0 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -1764,7 +1764,7 @@ void NodeInstanceView::selectedNodesChanged(const QList &selectedNode m_rotBlockTimer.start(); } -void NodeInstanceView::sendInputEvent(QInputEvent *e) const +void NodeInstanceView::sendInputEvent(QEvent *e) const { m_nodeInstanceServer->inputEvent(InputEventCommand(e)); } diff --git a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index bff0732d0c1..7647fd8ddbd 100644 --- a/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/src/tools/qml2puppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -213,7 +213,7 @@ void Qt5InformationNodeInstanceServer::handleInputEvents() // Peek at next command. If that is also a wheel with same button/modifiers // state, skip this event and add the angle delta to the next one. auto nextCommand = m_pendingInputEventCommands[i + 1]; - if (nextCommand.type() == QEvent::MouseMove + if (nextCommand.type() == QEvent::Wheel && nextCommand.button() == command.button() && nextCommand.buttons() == command.buttons() && nextCommand.modifiers() == command.modifiers()) { @@ -232,6 +232,12 @@ void Qt5InformationNodeInstanceServer::handleInputEvents() QKeyEvent *ke = new QKeyEvent(command.type(), command.key(), command.modifiers(), QString(), command.autoRepeat(), command.count()); QGuiApplication::sendEvent(m_editView3DData.window, ke); + } else if (command.type() == QEvent::Enter) { + QEnterEvent *ee = new QEnterEvent(command.pos(), {}, {}); + QGuiApplication::sendEvent(m_editView3DData.window, ee); + } else if (command.type() == QEvent::Leave) { + QEvent *e = new QEvent(command.type()); + QGuiApplication::sendEvent(m_editView3DData.window, e); } else { if (command.type() == QEvent::MouseMove && i < m_pendingInputEventCommands.size() - 1) { // Peek at next command. If that is also a move with only difference being