From bb02ab161cf956f616ad93da09baf62919641ac5 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Thu, 2 Jan 2020 11:58:33 +0200 Subject: [PATCH] Enable common keyboard hotkey actions for the Edit View 3D Clicking undo, redo, delete, or save keyboard hotkeys while the Edit View 3D has focus is working now. Additionally this commit introduces a generic command for carrying any variant data from puppet to creator side. This significantly simplifies and avoids the boiler plate work of sending actions from puppet to creator side. Current commands can be ported to use this generic command but this is not part of this commit. Also a similar command to work the other way around could be implemented. Task-number: QDS-1266 Change-Id: I40fdf6b215ce77402250a791ea49cbdcd2a9d6eb Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/commands/commands.pri | 2 + .../commands/puppettocreatorcommand.cpp | 55 ++++++++++++++++++ .../commands/puppettocreatorcommand.h | 56 +++++++++++++++++++ .../instances/nodeinstanceclientproxy.cpp | 6 ++ .../instances/nodeinstanceclientproxy.h | 2 + .../interfaces/nodeinstanceclientinterface.h | 2 + .../nodeinstanceserverinterface.cpp | 7 +++ .../qt5informationnodeinstanceserver.cpp | 8 +++ src/plugins/qmldesigner/CMakeLists.txt | 1 + .../designercore/include/nodeinstanceview.h | 7 ++- .../instances/nodeinstanceserverproxy.cpp | 4 ++ .../instances/nodeinstanceview.cpp | 42 +++++++++++++- src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 + src/tools/qml2puppet/CMakeLists.txt | 1 + src/tools/qml2puppet/qml2puppet.qbs | 2 + 15 files changed, 193 insertions(+), 4 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h diff --git a/share/qtcreator/qml/qmlpuppet/commands/commands.pri b/share/qtcreator/qml/qmlpuppet/commands/commands.pri index 47ec4473eaf..7bc595154b3 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/commands.pri +++ b/share/qtcreator/qml/qmlpuppet/commands/commands.pri @@ -31,6 +31,7 @@ HEADERS += $$PWD/drop3dlibraryitemcommand.h HEADERS += $$PWD/update3dviewstatecommand.h HEADERS += $$PWD/enable3dviewcommand.h HEADERS += $$PWD/view3dclosedcommand.h +HEADERS += $$PWD/puppettocreatorcommand.h SOURCES += $$PWD/synchronizecommand.cpp SOURCES += $$PWD/debugoutputcommand.cpp @@ -63,3 +64,4 @@ SOURCES += $$PWD/drop3dlibraryitemcommand.cpp SOURCES += $$PWD/update3dviewstatecommand.cpp SOURCES += $$PWD/enable3dviewcommand.cpp SOURCES += $$PWD/view3dclosedcommand.cpp +SOURCES += $$PWD/puppettocreatorcommand.cpp diff --git a/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.cpp new file mode 100644 index 00000000000..b346776a243 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.cpp @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include "puppettocreatorcommand.h" + +namespace QmlDesigner { + +// A generic command that can hold a variant data from puppet to creator + +PuppetToCreatorCommand::PuppetToCreatorCommand(Type type, const QVariant &data) + : m_type(type) + , m_data(data) +{ + +} + +QDataStream &operator<<(QDataStream &out, const PuppetToCreatorCommand &command) +{ + out << qint32(command.type()); + out << command.data(); + return out; +} + +QDataStream &operator>>(QDataStream &in, PuppetToCreatorCommand &command) +{ + qint32 type; + in >> type; + command.m_type = PuppetToCreatorCommand::Type(type); + in >> command.m_data; + return in; +} + +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h b/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h new file mode 100644 index 00000000000..aa4dcd1a44e --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#include +#include + +namespace QmlDesigner { + +class PuppetToCreatorCommand +{ +public: + enum Type { Key_Pressed, None }; + + PuppetToCreatorCommand(Type type, const QVariant &data); + PuppetToCreatorCommand() = default; + + Type type() const { return m_type; } + QVariant data() const { return m_data; } + +private: + Type m_type = None; + QVariant m_data; + + friend QDataStream &operator>>(QDataStream &in, PuppetToCreatorCommand &command); +}; + +QDataStream &operator<<(QDataStream &out, const PuppetToCreatorCommand &command); +QDataStream &operator>>(QDataStream &in, PuppetToCreatorCommand &command); + +} // namespace QmlDesigner + +Q_DECLARE_METATYPE(QmlDesigner::PuppetToCreatorCommand) diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp index 01d9cd18424..4ca4f0fb385 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp @@ -72,6 +72,7 @@ #include "changeselectioncommand.h" #include "drop3dlibraryitemcommand.h" #include "view3dclosedcommand.h" +#include "puppettocreatorcommand.h" namespace QmlDesigner { @@ -262,6 +263,11 @@ void NodeInstanceClientProxy::library3DItemDropped(const Drop3DLibraryItemComman writeCommand(QVariant::fromValue(command)); } +void NodeInstanceClientProxy::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) +{ + writeCommand(QVariant::fromValue(command)); +} + void NodeInstanceClientProxy::view3DClosed(const View3DClosedCommand &command) { writeCommand(QVariant::fromValue(command)); diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h index 7c9724e1ff0..6a114bbe3e1 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h @@ -60,6 +60,7 @@ class ChangeNodeSourceCommand; class EndPuppetCommand; class ChangeSelectionCommand; class Drop3DLibraryItemCommand; +class PuppetToCreatorCommand; class View3DClosedCommand; class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface @@ -81,6 +82,7 @@ public: void puppetAlive(const PuppetAliveCommand &command); void selectionChanged(const ChangeSelectionCommand &command) override; void library3DItemDropped(const Drop3DLibraryItemCommand &command) override; + void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override; void view3DClosed(const View3DClosedCommand &command) override; void flush() override; diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h index b188d7edfdc..d289a1b2594 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h @@ -43,6 +43,7 @@ class PuppetAliveCommand; class ChangeSelectionCommand; class Drop3DLibraryItemCommand; class View3DClosedCommand; +class PuppetToCreatorCommand; class NodeInstanceClientInterface { @@ -59,6 +60,7 @@ public: virtual void selectionChanged(const ChangeSelectionCommand &command) = 0; virtual void library3DItemDropped(const Drop3DLibraryItemCommand &command) = 0; virtual void view3DClosed(const View3DClosedCommand &command) = 0; + virtual void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) = 0; virtual void flush() {} virtual void synchronizeWithClientProcess() {} diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp index f606bfacf2f..5c7c9d2953a 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp @@ -64,6 +64,7 @@ #include "debugoutputcommand.h" #include "puppetalivecommand.h" #include "view3dclosedcommand.h" +#include "puppettocreatorcommand.h" #include @@ -209,6 +210,12 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType("View3DClosedCommand"); qRegisterMetaTypeStreamOperators("View3DClosedCommand"); + + qRegisterMetaType("PuppetToCreatorCommand"); + qRegisterMetaTypeStreamOperators("PuppetToCreatorCommand"); + + qRegisterMetaType>("QPairIntInt"); + qRegisterMetaTypeStreamOperators>("QPairIntInt"); } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index db38985d90e..b9bc5e8a3ff 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -61,6 +61,7 @@ #include "removesharedmemorycommand.h" #include "objectnodeinstance.h" #include "drop3dlibraryitemcommand.h" +#include "puppettocreatorcommand.h" #include "view3dclosedcommand.h" #include "dummycontextobject.h" @@ -102,6 +103,13 @@ bool Qt5InformationNodeInstanceServer::eventFilter(QObject *, QEvent *event) nodeInstanceClient()->view3DClosed(View3DClosedCommand()); } break; + case QEvent::KeyPress: { + QKeyEvent *keyEvent = static_cast(event); + QPair data = {keyEvent->key(), keyEvent->modifiers()}; + nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::Key_Pressed, + QVariant::fromValue(data)}); + } break; + default: break; } diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 5948c7d3b27..7596514f292 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -143,6 +143,7 @@ extend_qtc_plugin(QmlDesigner update3dviewstatecommand.cpp update3dviewstatecommand.h enable3dviewcommand.cpp enable3dviewcommand.h view3dclosedcommand.cpp view3dclosedcommand.h + puppettocreatorcommand.cpp puppettocreatorcommand.h ) extend_qtc_plugin(QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index c55dae2d87a..3e18424ca69 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -147,6 +147,8 @@ public: void mainWindowActiveChanged(bool active, bool hasPopup); void enable3DView(bool enable); + void handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) override; + protected: void timerEvent(QTimerEvent *event) override; @@ -198,12 +200,13 @@ private: // functions void restartProcess(); void delayedRestartProcess(); -private: void handleCrash(); void startPuppetTransaction(); void endPuppetTransaction(); -private: //variables + // puppet to creator command handlers + void handlePuppetKeyPress(int key, Qt::KeyboardModifiers modifiers); + NodeInstance m_rootNodeInstance; NodeInstance m_activeStateInstance; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 07e3216f377..76e1b34621d 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include @@ -286,6 +287,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr static const int puppetAliveCommandType = QMetaType::type("PuppetAliveCommand"); static const int changeSelectionCommandType = QMetaType::type("ChangeSelectionCommand"); static const int drop3DLibraryItemCommandType = QMetaType::type("Drop3DLibraryItemCommand"); + static const int puppetToCreatorCommand = QMetaType::type("PuppetToCreatorCommand"); static const int view3DClosedCommand = QMetaType::type("View3DClosedCommand"); if (m_destructing) @@ -314,6 +316,8 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr nodeInstanceClient()->selectionChanged(command.value()); } else if (command.userType() == drop3DLibraryItemCommandType) { nodeInstanceClient()->library3DItemDropped(command.value()); + } else if (command.userType() == puppetToCreatorCommand) { + nodeInstanceClient()->handlePuppetToCreatorCommand(command.value()); } else if (command.userType() == view3DClosedCommand) { nodeInstanceClient()->view3DClosed(command.value()); } else if (command.userType() == puppetAliveCommandType) { diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index a550a2e4b2d..b06b5137266 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -30,7 +30,7 @@ #include #include #include - +#include "qmldesignerplugin.h" #include "abstractproperty.h" #include "variantproperty.h" #include "bindingproperty.h" @@ -42,7 +42,10 @@ #include "qmltimeline.h" #include "qmltimelinekeyframegroup.h" #include "qmlvisualnode.h" - +#include "coreplugin/actionmanager/actionmanager.h" +#include "coreplugin/editormanager/editormanager.h" +#include "coreplugin/documentmanager.h" +#include "plugins/qmldesigner/qmldesignerconstants.h" #include "createscenecommand.h" #include "createinstancescommand.h" #include "clearscenecommand.h" @@ -71,6 +74,7 @@ #include "removesharedmemorycommand.h" #include "debugoutputcommand.h" #include "nodeinstanceserverproxy.h" +#include "puppettocreatorcommand.h" #include #include @@ -1454,6 +1458,40 @@ void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &comm QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, {}); } +void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) +{ + if (command.type() == PuppetToCreatorCommand::Key_Pressed) { + QPair data = qvariant_cast>(command.data()); + int key = data.first; + Qt::KeyboardModifiers modifiers = Qt::KeyboardModifiers(data.second); + + handlePuppetKeyPress(key, modifiers); + } +} + +// puppet to creator command handlers +void NodeInstanceView::handlePuppetKeyPress(int key, Qt::KeyboardModifiers modifiers) +{ + // TODO: optimal way to handle key events is to just pass them on. This is done + // using the code below but it is so far not working, if someone could get it to work then + // it should be utilized and the rest of the method deleted +// QCoreApplication::postEvent([receiver], new QKeyEvent(QEvent::KeyPress, key, modifiers)); + + // handle common keyboard actions coming from puppet + if (Core::ActionManager::command(Core::Constants::UNDO)->keySequence().matches(key + modifiers) == QKeySequence::ExactMatch) + QmlDesignerPlugin::instance()->currentDesignDocument()->undo(); + else if (Core::ActionManager::command(Core::Constants::REDO)->keySequence().matches(key + modifiers) == QKeySequence::ExactMatch) + QmlDesignerPlugin::instance()->currentDesignDocument()->redo(); + else if (Core::ActionManager::command(Core::Constants::SAVE)->keySequence().matches(key + modifiers) == QKeySequence::ExactMatch) + Core::EditorManager::saveDocument(); + else if (Core::ActionManager::command(Core::Constants::SAVEAS)->keySequence().matches(key + modifiers) == QKeySequence::ExactMatch) + Core::EditorManager::saveDocumentAs(); + else if (Core::ActionManager::command(Core::Constants::SAVEALL)->keySequence().matches(key + modifiers) == QKeySequence::ExactMatch) + Core::DocumentManager::saveAllModifiedDocuments(); + else if (Core::ActionManager::command(QmlDesigner::Constants::C_DELETE)->keySequence().matches(key + modifiers) == QKeySequence::ExactMatch) + QmlDesignerPlugin::instance()->currentDesignDocument()->deleteSelected(); +} + void NodeInstanceView::view3DClosed(const View3DClosedCommand &command) { Q_UNUSED(command) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 454fdfced05..6b11bf52bfa 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -177,6 +177,8 @@ Project { "commands/enable3dviewcommand.h", "commands/view3dclosedcommand.cpp", "commands/view3dclosedcommand.h", + "commands/puppettocreatorcommand.cpp", + "commands/puppettocreatorcommand.h", "container/addimportcontainer.cpp", "container/addimportcontainer.h", "container/idcontainer.cpp", diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 39126452830..06e224a96fc 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -49,6 +49,7 @@ extend_qtc_executable(qml2puppet update3dviewstatecommand.cpp update3dviewstatecommand.h enable3dviewcommand.cpp enable3dviewcommand.h view3dclosedcommand.cpp view3dclosedcommand.h + puppettocreatorcommand.cpp puppettocreatorcommand.h valueschangedcommand.cpp ) diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 645250c2d41..cef1c5fe0b1 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -103,6 +103,8 @@ QtcTool { "commands/enable3dviewcommand.h", "commands/view3dclosedcommand.cpp", "commands/view3dclosedcommand.h", + "commands/puppettocreatorcommand.cpp", + "commands/puppettocreatorcommand.h", "container/addimportcontainer.cpp", "container/addimportcontainer.h", "container/idcontainer.cpp",