From eadbce7b804fb274ad3f0e914e906b2d48922ddd Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 5 Mar 2020 11:28:31 +0200 Subject: [PATCH 01/11] QmlDesigner: Fix 5.15 build QtQuick3D Type API changes broke build. Change-Id: Ibbd7fc3f699875b24f6345dfca66c5f442915544 Reviewed-by: Tim Jenssen --- .../qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp index 960509ee4e0..907896cdd46 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/quick3dnodeinstance.cpp @@ -79,7 +79,6 @@ void Quick3DNodeInstance::setPickable(bool enable, bool checkParent, bool applyT #ifdef QUICK3D_MODULE auto node = quick3DNode(); if (node) { - QQuick3DObject::Type nodeType = node->type(); bool parentHidden = false; if (checkParent) { // First check if any parent node is already hidden. Never set pickable on that case. @@ -129,7 +128,7 @@ void Quick3DNodeInstance::setPickable(bool enable, bool checkParent, bool applyT checkChildren(node); } } - if (nodeType == QQuick3DObject::Type::Model) + if (qobject_cast(node)) setPropertyVariant("pickable", enable); // allow 3D objects to receive mouse clicks } } From 5b8fe2233772a21f49e4cc9d7e7aebdd22e5f08c Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Wed, 4 Mar 2020 12:49:22 +0100 Subject: [PATCH 02/11] QmlDesigner: ColorEditor Fix and Tooltips - Fixed an issue with not-clickable recent color button - Added tooltips with color hexes for recent and original colors Change-Id: I21c2e4c98005b473a3450606eb27428977578bdc Reviewed-by: Tim Jenssen --- .../imports/HelperWidgets/ColorEditor.qml | 8 ++++++-- .../imports/HelperWidgets/SimpleColorPalette.qml | 6 +++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index ade6b3e5268..a1b5672ebb3 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -88,6 +88,8 @@ Column { //Delay setting the color to keep ui responsive colorEditorTimer.restart() } + + colorPalette.selectedColor = color } ColorLine { @@ -178,6 +180,7 @@ Column { } gradientLine.isInValidState = true colorEditor.originalColor = colorEditor.color + colorPalette.selectedColor = colorEditor.color } } @@ -673,8 +676,10 @@ Column { border.width: 1 border.color: "#555555" - MouseArea { + ToolTipArea { anchors.fill: parent + + tooltip: originalColorRectangle.color onClicked: { if (!colorEditor.transparent) colorEditor.color = colorEditor.originalColor @@ -722,7 +727,6 @@ Column { onDialogColorChanged: colorEditor.color = colorPalette.selectedColor } } - } } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml index 3e9e04cf996..8f3460c9e19 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml @@ -73,9 +73,12 @@ Item { border.width: 1 } - MouseArea { + ToolTipArea { anchors.fill: parent acceptedButtons: Qt.LeftButton | Qt.RightButton + + tooltip: colorCode + onClicked: { if ((mouse.button === Qt.LeftButton) && clickable) selectedColor = colorRectangle.color @@ -85,6 +88,7 @@ Item { contextMenu.popup() } } + StudioControls.Menu { id: contextMenu StudioControls.MenuItem { From fb843d34424b08f9a9905f3f465c788dcf6765ed Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Mon, 2 Mar 2020 15:51:28 +0200 Subject: [PATCH 03/11] QmlDesigner: Remove the standalone view3D window implementation Task-number: QDS-1692 Change-Id: I6c04aaee9ab6a119cfcc22ee2e19b808bb95ae0a Reviewed-by: Miikka Heikkinen --- .../qml/qmlpuppet/commands/commands.pri | 4 - .../commands/drop3dlibraryitemcommand.cpp | 59 --------- .../commands/drop3dlibraryitemcommand.h | 61 --------- .../commands/puppettocreatorcommand.h | 2 +- .../commands/update3dviewstatecommand.cpp | 47 ------- .../commands/update3dviewstatecommand.h | 15 +-- .../commands/view3dclosedcommand.cpp | 47 ------- .../qmlpuppet/commands/view3dclosedcommand.h | 47 ------- .../instances/nodeinstanceclientproxy.cpp | 15 --- .../instances/nodeinstanceclientproxy.h | 4 - .../interfaces/nodeinstanceclientinterface.h | 4 - .../nodeinstanceserverinterface.cpp | 8 -- .../instances/nodeinstanceserver.cpp | 7 - .../qml2puppet/instances/nodeinstanceserver.h | 2 - .../qt5informationnodeinstanceserver.cpp | 123 ++---------------- .../qt5informationnodeinstanceserver.h | 3 - .../instances/qt5nodeinstanceclientproxy.cpp | 12 +- .../instances/qt5nodeinstanceserver.cpp | 14 +- src/plugins/coreplugin/icore.h | 2 - src/plugins/coreplugin/mainwindow.cpp | 25 ---- src/plugins/coreplugin/mainwindow.h | 2 - src/plugins/qmldesigner/CMakeLists.txt | 3 - .../components/formeditor/formeditor.pri | 2 - .../components/formeditor/formeditorview.cpp | 37 ------ .../components/formeditor/formeditorview.h | 1 - .../formeditor/formeditorwidget.cpp | 13 -- .../components/formeditor/formeditorwidget.h | 3 - .../components/formeditor/option3daction.cpp | 66 ---------- .../components/formeditor/option3daction.h | 52 -------- .../designercore/include/nodeinstanceview.h | 4 - .../instances/nodeinstanceserverproxy.cpp | 14 +- .../instances/nodeinstanceview.cpp | 63 +-------- .../designercore/instances/puppetcreator.cpp | 7 +- src/plugins/qmldesigner/designersettings.cpp | 1 - src/plugins/qmldesigner/designersettings.h | 1 - src/plugins/qmldesigner/qmldesignerplugin.cpp | 10 -- src/plugins/qmldesigner/qmldesignerplugin.qbs | 6 - src/tools/qml2puppet/CMakeLists.txt | 2 - src/tools/qml2puppet/qml2puppet.qbs | 4 - 39 files changed, 19 insertions(+), 773 deletions(-) delete mode 100644 share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp delete mode 100644 share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h delete mode 100644 share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.cpp delete mode 100644 share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.h delete mode 100644 src/plugins/qmldesigner/components/formeditor/option3daction.cpp delete mode 100644 src/plugins/qmldesigner/components/formeditor/option3daction.h diff --git a/share/qtcreator/qml/qmlpuppet/commands/commands.pri b/share/qtcreator/qml/qmlpuppet/commands/commands.pri index deee4c34e1c..1bc858831ea 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/commands.pri +++ b/share/qtcreator/qml/qmlpuppet/commands/commands.pri @@ -27,9 +27,7 @@ HEADERS += $$PWD/changeauxiliarycommand.h HEADERS += $$PWD/removesharedmemorycommand.h HEADERS += $$PWD/puppetalivecommand.h HEADERS += $$PWD/changeselectioncommand.h -HEADERS += $$PWD/drop3dlibraryitemcommand.h HEADERS += $$PWD/update3dviewstatecommand.h -HEADERS += $$PWD/view3dclosedcommand.h HEADERS += $$PWD/puppettocreatorcommand.h HEADERS += $$PWD/inputeventcommand.h HEADERS += $$PWD/view3dactioncommand.h @@ -61,9 +59,7 @@ SOURCES += $$PWD/changeauxiliarycommand.cpp SOURCES += $$PWD/removesharedmemorycommand.cpp SOURCES += $$PWD/puppetalivecommand.cpp SOURCES += $$PWD/changeselectioncommand.cpp -SOURCES += $$PWD/drop3dlibraryitemcommand.cpp SOURCES += $$PWD/update3dviewstatecommand.cpp -SOURCES += $$PWD/view3dclosedcommand.cpp SOURCES += $$PWD/puppettocreatorcommand.cpp SOURCES += $$PWD/inputeventcommand.cpp SOURCES += $$PWD/view3dactioncommand.cpp diff --git a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp deleted file mode 100644 index 6c851e3a432..00000000000 --- a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 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 "drop3dlibraryitemcommand.h" - -#include - -namespace QmlDesigner { - -Drop3DLibraryItemCommand::Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId) - : m_itemData(itemData), - m_sceneRootId(sceneRootId) -{ -} - -QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command) -{ - out << command.itemData(); - out << command.sceneRootId(); - - return out; -} - -QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command) -{ - in >> command.m_itemData; - in >> command.m_sceneRootId; - - return in; -} - -bool operator==(const Drop3DLibraryItemCommand &first, const Drop3DLibraryItemCommand &second) -{ - return first.m_itemData == second.m_itemData && first.m_sceneRootId == second.m_sceneRootId; -} - -} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h deleted file mode 100644 index 4bc36e1ebdb..00000000000 --- a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 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 -#include - -#include "instancecontainer.h" - -namespace QmlDesigner { - -class Drop3DLibraryItemCommand -{ - friend QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command); - friend QDebug operator<<(QDebug debug, const Drop3DLibraryItemCommand &command); - friend bool operator==(const Drop3DLibraryItemCommand &first, - const Drop3DLibraryItemCommand &second); - -public: - explicit Drop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId); - Drop3DLibraryItemCommand() = default; - - QByteArray itemData() const { return m_itemData; } - qint32 sceneRootId() const { return m_sceneRootId; } - -private: - QByteArray m_itemData; - qint32 m_sceneRootId; -}; - -QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command); -QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command); -bool operator==(const Drop3DLibraryItemCommand &first, const Drop3DLibraryItemCommand &second); - -} // namespace QmlDesigner - -Q_DECLARE_METATYPE(QmlDesigner::Drop3DLibraryItemCommand) diff --git a/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h b/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h index 91c2877f4b3..a713656bde8 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/puppettocreatorcommand.h @@ -34,7 +34,7 @@ namespace QmlDesigner { class PuppetToCreatorCommand { public: - enum Type { KeyPressed, Edit3DToolState, Render3DView, ActiveSceneChanged, None }; + enum Type { Edit3DToolState, Render3DView, ActiveSceneChanged, None }; PuppetToCreatorCommand(Type type, const QVariant &data); PuppetToCreatorCommand() = default; diff --git a/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.cpp index 584e041c7ab..02fbdc0093d 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.cpp +++ b/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.cpp @@ -30,47 +30,12 @@ namespace QmlDesigner { -Update3dViewStateCommand::Update3dViewStateCommand(Qt::WindowStates previousStates, - Qt::WindowStates currentStates) - : m_previousStates(previousStates) - , m_currentStates(currentStates) - , m_type(Update3dViewStateCommand::StateChange) -{ -} - -Update3dViewStateCommand::Update3dViewStateCommand(bool active, bool hasPopup) - : m_active(active) - , m_hasPopup(hasPopup) - , m_type(Update3dViewStateCommand::ActiveChange) -{ -} - Update3dViewStateCommand::Update3dViewStateCommand(const QSize &size) : m_size(size) , m_type(Update3dViewStateCommand::SizeChange) { } -Qt::WindowStates Update3dViewStateCommand::previousStates() const -{ - return m_previousStates; -} - -Qt::WindowStates Update3dViewStateCommand::currentStates() const -{ - return m_currentStates; -} - -bool Update3dViewStateCommand::isActive() const -{ - return m_active; -} - -bool Update3dViewStateCommand::hasPopup() const -{ - return m_hasPopup; -} - QSize Update3dViewStateCommand::size() const { return m_size; @@ -83,10 +48,6 @@ Update3dViewStateCommand::Type Update3dViewStateCommand::type() const QDataStream &operator<<(QDataStream &out, const Update3dViewStateCommand &command) { - out << command.previousStates(); - out << command.currentStates(); - out << qint32(command.isActive()); - out << qint32(command.hasPopup()); out << qint32(command.type()); out << command.size(); @@ -95,16 +56,8 @@ QDataStream &operator<<(QDataStream &out, const Update3dViewStateCommand &comman QDataStream &operator>>(QDataStream &in, Update3dViewStateCommand &command) { - in >> command.m_previousStates; - in >> command.m_currentStates; - qint32 active; - qint32 hasPopup; qint32 type; - in >> active; - in >> hasPopup; in >> type; - command.m_active = active; - command.m_hasPopup = hasPopup; command.m_type = Update3dViewStateCommand::Type(type); in >> command.m_size; diff --git a/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.h b/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.h index a38ca4bb543..ffc3fa66594 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.h +++ b/share/qtcreator/qml/qmlpuppet/commands/update3dviewstatecommand.h @@ -36,28 +36,15 @@ class Update3dViewStateCommand friend QDebug operator<<(QDebug debug, const Update3dViewStateCommand &command); public: - enum Type { StateChange, ActiveChange, SizeChange, Empty }; + enum Type { SizeChange, Empty }; - explicit Update3dViewStateCommand(Qt::WindowStates previousStates, Qt::WindowStates currentStates); - explicit Update3dViewStateCommand(bool active, bool hasPopup); explicit Update3dViewStateCommand(const QSize &size); Update3dViewStateCommand() = default; - Qt::WindowStates previousStates() const; - Qt::WindowStates currentStates() const; - - bool isActive() const; - bool hasPopup() const; QSize size() const; - Type type() const; private: - Qt::WindowStates m_previousStates = Qt::WindowNoState; - Qt::WindowStates m_currentStates = Qt::WindowNoState; - - bool m_active = false; - bool m_hasPopup = false; QSize m_size; Type m_type = Empty; diff --git a/share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.cpp deleted file mode 100644 index c7de7a99dee..00000000000 --- a/share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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 "view3dclosedcommand.h" - -namespace QmlDesigner { - -View3DClosedCommand::View3DClosedCommand() = default; - -QDataStream &operator<<(QDataStream &out, const View3DClosedCommand &/*command*/) -{ - return out; -} - -QDataStream &operator>>(QDataStream &in, View3DClosedCommand &/*command*/) -{ - return in; -} - -QDebug operator<<(QDebug debug, const View3DClosedCommand &/*command*/) -{ - return debug.nospace() << "View3DClosedCommand()"; -} - -} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.h b/share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.h deleted file mode 100644 index 132bb3c37bd..00000000000 --- a/share/qtcreator/qml/qmlpuppet/commands/view3dclosedcommand.h +++ /dev/null @@ -1,47 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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 -#include - -namespace QmlDesigner { - -class View3DClosedCommand -{ -public: - View3DClosedCommand(); -}; - -QDataStream &operator<<(QDataStream &out, const View3DClosedCommand &command); -QDataStream &operator>>(QDataStream &in, View3DClosedCommand &command); - -QDebug operator<<(QDebug debug, const View3DClosedCommand &command); - -} // namespace QmlDesigner - -Q_DECLARE_METATYPE(QmlDesigner::View3DClosedCommand) diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp index e42c8bb3a2a..115bb5a90ab 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp @@ -71,8 +71,6 @@ #include "debugoutputcommand.h" #include "puppetalivecommand.h" #include "changeselectioncommand.h" -#include "drop3dlibraryitemcommand.h" -#include "view3dclosedcommand.h" #include "puppettocreatorcommand.h" namespace QmlDesigner { @@ -152,7 +150,6 @@ bool compareCommands(const QVariant &command, const QVariant &controlCommand) static const int tokenCommandType = QMetaType::type("TokenCommand"); static const int debugOutputCommandType = QMetaType::type("DebugOutputCommand"); static const int changeSelectionCommandType = QMetaType::type("ChangeSelectionCommand"); - static const int drop3DLibraryItemCommandType = QMetaType::type("Drop3DLibraryItemCommand"); if (command.userType() == controlCommand.userType()) { if (command.userType() == informationChangedCommandType) @@ -177,8 +174,6 @@ bool compareCommands(const QVariant &command, const QVariant &controlCommand) return command.value() == controlCommand.value(); else if (command.userType() == changeSelectionCommandType) return command.value() == controlCommand.value(); - else if (command.userType() == drop3DLibraryItemCommandType) - return command.value() == controlCommand.value(); } return false; @@ -266,21 +261,11 @@ void NodeInstanceClientProxy::selectionChanged(const ChangeSelectionCommand &com writeCommand(QVariant::fromValue(command)); } -void NodeInstanceClientProxy::library3DItemDropped(const Drop3DLibraryItemCommand &command) -{ - writeCommand(QVariant::fromValue(command)); -} - void NodeInstanceClientProxy::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) { writeCommand(QVariant::fromValue(command)); } -void NodeInstanceClientProxy::view3DClosed(const View3DClosedCommand &command) -{ - writeCommand(QVariant::fromValue(command)); -} - void NodeInstanceClientProxy::flush() { } diff --git a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h index 6cafd282af4..f66bb4362b6 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h @@ -58,9 +58,7 @@ class ChangeStateCommand; class ChangeNodeSourceCommand; class EndPuppetCommand; class ChangeSelectionCommand; -class Drop3DLibraryItemCommand; class PuppetToCreatorCommand; -class View3DClosedCommand; class InputEventCommand; class View3DActionCommand; @@ -82,9 +80,7 @@ public: void debugOutput(const DebugOutputCommand &command) override; 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; void synchronizeWithClientProcess() override; diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h index d289a1b2594..9498cfb1f76 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h @@ -41,8 +41,6 @@ class RemoveSharedMemoryCommand; class DebugOutputCommand; class PuppetAliveCommand; class ChangeSelectionCommand; -class Drop3DLibraryItemCommand; -class View3DClosedCommand; class PuppetToCreatorCommand; class NodeInstanceClientInterface @@ -58,8 +56,6 @@ public: virtual void token(const TokenCommand &command) = 0; virtual void debugOutput(const DebugOutputCommand &command) = 0; 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() {} diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp index b2703f7f320..307b7581997 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp @@ -47,7 +47,6 @@ #include "addimportcontainer.h" #include "changenodesourcecommand.h" #include "changeselectioncommand.h" -#include "drop3dlibraryitemcommand.h" #include "inputeventcommand.h" #include "view3dactioncommand.h" @@ -64,7 +63,6 @@ #include "endpuppetcommand.h" #include "debugoutputcommand.h" #include "puppetalivecommand.h" -#include "view3dclosedcommand.h" #include "puppettocreatorcommand.h" #include @@ -116,9 +114,6 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType("ChangeSelectionCommand"); qRegisterMetaTypeStreamOperators("ChangeSelectionCommand"); - qRegisterMetaType("Drop3DLibraryItemCommand"); - qRegisterMetaTypeStreamOperators("Drop3DLibraryItemCommand"); - qRegisterMetaType("RemovePropertiesCommand"); qRegisterMetaTypeStreamOperators("RemovePropertiesCommand"); @@ -206,9 +201,6 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType("PuppetAliveCommand"); qRegisterMetaTypeStreamOperators("PuppetAliveCommand"); - qRegisterMetaType("View3DClosedCommand"); - qRegisterMetaTypeStreamOperators("View3DClosedCommand"); - qRegisterMetaType("PuppetToCreatorCommand"); qRegisterMetaTypeStreamOperators("PuppetToCreatorCommand"); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 2b5f805f174..cfdc513c1b1 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -67,7 +67,6 @@ #include #include #include -#include #include #include @@ -1178,12 +1177,6 @@ ChangeSelectionCommand NodeInstanceServer::createChangeSelectionCommand(const QL return ChangeSelectionCommand(idVector); } -Drop3DLibraryItemCommand NodeInstanceServer::createDrop3DLibraryItemCommand(const QByteArray &itemData, - qint32 sceneRootId) -{ - return Drop3DLibraryItemCommand(itemData, sceneRootId); -} - ValuesChangedCommand NodeInstanceServer::createValuesChangedCommand(const QVector &propertyList) const { QVector valueVector; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h index e2a5528bcf1..6b11e1b87f8 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -70,7 +70,6 @@ class AddImportContainer; class MockupTypeContainer; class IdContainer; class ChangeSelectionCommand; -class Drop3DLibraryItemCommand; namespace Internal { class ChildrenChangeEventFilter; @@ -184,7 +183,6 @@ protected: ChildrenChangedCommand createChildrenChangedCommand(const ServerNodeInstance &parentInstance, const QList &instanceList) const; ComponentCompletedCommand createComponentCompletedCommand(const QList &instanceList); ChangeSelectionCommand createChangeSelectionCommand(const QList &instanceList); - Drop3DLibraryItemCommand createDrop3DLibraryItemCommand(const QByteArray &itemData, qint32 sceneRootId); void addChangedProperty(const InstancePropertyPair &property); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 296a95e7856..f6b5a47f451 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -59,9 +59,7 @@ #include "tokencommand.h" #include "removesharedmemorycommand.h" #include "objectnodeinstance.h" -#include "drop3dlibraryitemcommand.h" #include "puppettocreatorcommand.h" -#include "view3dclosedcommand.h" #include "inputeventcommand.h" #include "view3dactioncommand.h" @@ -100,80 +98,9 @@ static QVariant objectToVariant(QObject *object) return QVariant::fromValue(object); } -bool Qt5InformationNodeInstanceServer::eventFilter(QObject *, QEvent *event) -{ - switch (event->type()) { - case QEvent::DragMove: { - if (!dropAcceptable(static_cast(event))) { - event->ignore(); - return true; - } - } break; - - case QEvent::Drop: { - QDropEvent *dropEvent = static_cast(event); - QByteArray data = dropEvent->mimeData()->data(QStringLiteral("application/vnd.bauhaus.itemlibraryinfo")); - if (!data.isEmpty()) { - nodeInstanceClient()->library3DItemDropped(createDrop3DLibraryItemCommand( - data, active3DSceneInstance().instanceId())); - } - - } break; - - case QEvent::Close: { - nodeInstanceClient()->view3DClosed(View3DClosedCommand()); - } break; - - case QEvent::KeyPress: { - QKeyEvent *keyEvent = static_cast(event); - QPair data = {keyEvent->key(), int(keyEvent->modifiers())}; - nodeInstanceClient()->handlePuppetToCreatorCommand({PuppetToCreatorCommand::KeyPressed, - QVariant::fromValue(data)}); - } break; - - default: - break; - } - - return false; -} - -bool Qt5InformationNodeInstanceServer::dropAcceptable(QDragMoveEvent *event) const -{ - // Note: this method parses data out of the QDataStream. This should be in sync with how the - // data is written to the stream (check QDataStream overloaded operators << and >> in - // itemlibraryentry.cpp). If the write order changes, this logic may break. - QDataStream stream(event->mimeData()->data(QStringLiteral("application/vnd.bauhaus.itemlibraryinfo"))); - - QString name; - TypeName typeName; - int majorVersion; - int minorVersion; - QIcon typeIcon; - QString libraryEntryIconPath; - QString category; - QString requiredImport; - QHash hints; - - stream >> name; - stream >> typeName; - stream >> majorVersion; - stream >> minorVersion; - stream >> typeIcon; - stream >> libraryEntryIconPath; - stream >> category; - stream >> requiredImport; - stream >> hints; - - QString canBeDropped = hints.value("canBeDroppedInView3D"); - return canBeDropped == "true" || canBeDropped == "True"; -} - void Qt5InformationNodeInstanceServer::createEditView3D() { #ifdef QUICK3D_MODULE - static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW"); - qmlRegisterRevision("MouseArea3D", 1, 0); qmlRegisterType("MouseArea3D", 1, 0, "MouseArea3D"); qmlRegisterType("CameraGeometry", 1, 0, "CameraGeometry"); @@ -187,37 +114,19 @@ void Qt5InformationNodeInstanceServer::createEditView3D() engine()->rootContext()->setContextProperty("_generalHelper", helper); m_3dHelper = helper; + m_editView3D = new QQuickView(quickView()->engine(), quickView()); + m_editView3D->setFormat(quickView()->format()); + DesignerSupport::createOpenGLContext(m_editView3D.data()); QQmlComponent component(engine()); - if (showEditView) { - component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/EditWindow3D.qml")); - m_editWindow3D = qobject_cast(component.create()); - m_editView3DRootItem = QQmlProperty::read(m_editWindow3D, "editViewRoot").value(); - - //For macOS we have to use the 4.1 core profile - QSurfaceFormat surfaceFormat = m_editWindow3D->requestedFormat(); - surfaceFormat.setVersion(4, 1); - surfaceFormat.setProfile(QSurfaceFormat::CoreProfile); - m_editWindow3D->setFormat(surfaceFormat); - } else { - m_editView3D = new QQuickView(quickView()->engine(), quickView()); - m_editView3D->setFormat(quickView()->format()); - DesignerSupport::createOpenGLContext(m_editView3D.data()); - component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml")); - m_editView3DRootItem = qobject_cast(component.create()); - } + component.loadUrl(QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml")); + m_editView3DRootItem = qobject_cast(component.create()); if (!m_editView3DRootItem) { qWarning() << "Could not create edit view 3D: " << component.errors(); return; } - if (!showEditView) { - DesignerSupport::setRootItem(m_editView3D, m_editView3DRootItem); - } else { - m_editView3DRootItem->installEventFilter(this); - QQmlProperty showButtonsProperty(m_editView3DRootItem, "showButtons", context()); - showButtonsProperty.write(QVariant(true)); - } + DesignerSupport::setRootItem(m_editView3D, m_editView3DRootItem); QObject::connect(m_editView3DRootItem, SIGNAL(selectionChanged(QVariant)), this, SLOT(handleSelectionChanged(QVariant))); @@ -233,8 +142,6 @@ void Qt5InformationNodeInstanceServer::createEditView3D() this, &Qt5InformationNodeInstanceServer::doRender3DEditView); helper->setParent(m_editView3DRootItem); - if (showEditView) - helper->setEdit3DWindow(m_editWindow3D); #endif } @@ -521,8 +428,7 @@ void Qt5InformationNodeInstanceServer::render3DEditView() // render the 3D edit view and send the result to creator process void Qt5InformationNodeInstanceServer::doRender3DEditView() { - static bool showEditView = qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW"); - if (m_editView3DRootItem && !showEditView) { + if (m_editView3DRootItem) { if (!m_editView3DContentItem) { m_editView3DContentItem = QQmlProperty::read(m_editView3DRootItem, "contentItem").value(); if (m_editView3DContentItem) { @@ -1258,7 +1164,7 @@ void Qt5InformationNodeInstanceServer::changeAuxiliaryValues(const ChangeAuxilia render3DEditView(); } -// update 3D view window state when the main app window state change +// update 3D view size when it changes in creator side void Qt5InformationNodeInstanceServer::update3DViewState(const Update3dViewStateCommand &command) { #ifdef QUICK3D_MODULE @@ -1270,19 +1176,6 @@ void Qt5InformationNodeInstanceServer::update3DViewState(const Update3dViewState helper->storeToolState(helper->globalStateId(), "rootSize", QVariant(command.size()), 0); render3DEditView(); } - } else if (m_editWindow3D) { - if (command.type() == Update3dViewStateCommand::StateChange) { - if (command.previousStates() & Qt::WindowMinimized) // main window expanded from minimize state - m_editWindow3D->show(); - else if (command.currentStates() & Qt::WindowMinimized) // main window minimized - m_editWindow3D->hide(); - } else if (command.type() == Update3dViewStateCommand::ActiveChange) { - m_editWindow3D->setFlag(Qt::WindowStaysOnTopHint, command.isActive()); - - // main window has a popup open, lower the edit view 3D so that the pop up is visible - if (command.hasPopup()) - m_editWindow3D->lower(); - } } #else Q_UNUSED(command) diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index 1e4d70577b0..5244064e9ef 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -73,7 +73,6 @@ private slots: protected: void collectItemChangesAndSendChangeCommands() override; - bool eventFilter(QObject *obj, QEvent *event) override; void sendChildrenChangedCommand(const QList &childList); void sendTokenBack(); bool isDirtyRecursiveForNonInstanceItems(QQuickItem *item) const; @@ -101,7 +100,6 @@ private: void modifyVariantValue(const QVariant &node, const PropertyName &propertyName, ValuesModifiedCommand::TransactionOption option); - bool dropAcceptable(QDragMoveEvent *event) const; void updateView3DRect(QObject *view3D); void updateActiveSceneToEditView3D(); void removeNode3D(QObject *node); @@ -111,7 +109,6 @@ private: void doRender3DEditView(); QPointer m_editView3D; - QPointer m_editWindow3D; QQuickItem *m_editView3DRootItem = nullptr; QQuickItem *m_editView3DContentItem = nullptr; QSet m_view3Ds; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp index be54efd2c54..449e4ff188f 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceclientproxy.cpp @@ -54,30 +54,20 @@ Qt5NodeInstanceClientProxy::Qt5NodeInstanceClientProxy(QObject *parent) : NodeInstanceClientProxy(parent) { prioritizeDown(); + DesignerSupport::activateDesignerWindowManager(); if (QCoreApplication::arguments().at(1) == QLatin1String("--readcapturedstream")) { - DesignerSupport::activateDesignerWindowManager(); qputenv("DESIGNER_DONT_USE_SHARED_MEMORY", "1"); setNodeInstanceServer(new Qt5TestNodeInstanceServer(this)); initializeCapturedStream(QCoreApplication::arguments().at(2)); readDataStream(); QCoreApplication::exit(); } else if (QCoreApplication::arguments().at(2) == QLatin1String("previewmode")) { - DesignerSupport::activateDesignerWindowManager(); setNodeInstanceServer(new Qt5PreviewNodeInstanceServer(this)); initializeSocket(); } else if (QCoreApplication::arguments().at(2) == QLatin1String("editormode")) { - /* The editormode does not use the DesignerWindowManager, - * because we want to be able to show the 3D Edit View - * as a normal QQuickView. - * The DesignerWindowManager prevents any window from actually being shown. */ - if (!qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_MODE") - || !qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW")) { - DesignerSupport::activateDesignerWindowManager(); - } setNodeInstanceServer(new Qt5InformationNodeInstanceServer(this)); initializeSocket(); } else if (QCoreApplication::arguments().at(2) == QLatin1String("rendermode")) { - DesignerSupport::activateDesignerWindowManager(); setNodeInstanceServer(new Qt5RenderNodeInstanceServer(this)); initializeSocket(); } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp index b503afb655c..822ffd4f1c7 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5nodeinstanceserver.cpp @@ -71,21 +71,9 @@ void Qt5NodeInstanceServer::initializeView() DesignerSupport::createOpenGLContext(m_quickView.data()); - if (qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_MODE") - && qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW") - && QCoreApplication::arguments().at(2) == "editormode") { - /* In '3d editormode' we do not use the DesignerWindowManager - * and since we do not show the QQuickView we have to manually create the OpenGL context */ - auto context = new QOpenGLContext(m_quickView); - context->setFormat(surfaceFormat); - context->create(); - if (!context->makeCurrent(m_quickView)) - qWarning("QOpenGLContext: makeCurrent() failed..."); - } - if (qEnvironmentVariableIsSet("QML_FILE_SELECTORS")) { QQmlFileSelector *fileSelector = new QQmlFileSelector(engine(), engine()); - QStringList customSelectors = QString::fromUtf8(qgetenv("QML_FILE_SELECTORS")).split(","); + QStringList customSelectors = QString::fromUtf8(qgetenv("QML_FILE_SELECTORS")).split(','); fileSelector->setExtraSelectors(customSelectors); } } diff --git a/src/plugins/coreplugin/icore.h b/src/plugins/coreplugin/icore.h index d6e426b3ed6..487a9715792 100644 --- a/src/plugins/coreplugin/icore.h +++ b/src/plugins/coreplugin/icore.h @@ -166,8 +166,6 @@ signals: void coreAboutToClose(); void contextAboutToChange(const QList &context); void contextChanged(const Core::Context &context); - void windowStateChanged(Qt::WindowStates previousStates, Qt::WindowStates currentStates); - void windowActivationChanged(bool isActive, bool hasPopup); public: /* internal use */ diff --git a/src/plugins/coreplugin/mainwindow.cpp b/src/plugins/coreplugin/mainwindow.cpp index f3a948f330f..4af57a6fd91 100644 --- a/src/plugins/coreplugin/mainwindow.cpp +++ b/src/plugins/coreplugin/mainwindow.cpp @@ -197,31 +197,6 @@ MainWindow::MainWindow() this, &MainWindow::openDroppedFiles); } -// Edit View 3D needs to know when the main window's state or activation change -void MainWindow::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::WindowStateChange) { - emit m_coreImpl->windowStateChanged(m_previousWindowStates, windowState()); - m_previousWindowStates = windowState(); - } else if (event->type() == QEvent::ActivationChange) { - // check the last 3 children for a possible active window - auto rIter = children().rbegin(); - bool hasPopup = false; - for (int i = 0; i < 3; ++i) { - if (rIter < children().rend()) { - auto child = qobject_cast(*(rIter++)); - if (child && child->isActiveWindow()) { - hasPopup = true; - break; - } - } else { - break; - } - } - emit m_coreImpl->windowActivationChanged(isActiveWindow(), hasPopup); - } -} - NavigationWidget *MainWindow::navigationWidget(Side side) const { return side == Side::Left ? m_leftNavigationWidget : m_rightNavigationWidget; diff --git a/src/plugins/coreplugin/mainwindow.h b/src/plugins/coreplugin/mainwindow.h index 865a6e8aaa7..0d7b533086a 100644 --- a/src/plugins/coreplugin/mainwindow.h +++ b/src/plugins/coreplugin/mainwindow.h @@ -116,7 +116,6 @@ public slots: protected: void closeEvent(QCloseEvent *event) override; - void changeEvent(QEvent *event) override; private: void openFile(); @@ -195,7 +194,6 @@ private: QToolButton *m_toggleRightSideBarButton = nullptr; QColor m_overrideColor; QList> m_preCloseListeners; - Qt::WindowStates m_previousWindowStates = Qt::WindowNoState; }; } // namespace Internal diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 82c26c43adc..85e0c67ec9e 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -139,9 +139,7 @@ extend_qtc_plugin(QmlDesigner tokencommand.cpp tokencommand.h valueschangedcommand.cpp valueschangedcommand.h changeselectioncommand.cpp changeselectioncommand.h - drop3dlibraryitemcommand.cpp drop3dlibraryitemcommand.h update3dviewstatecommand.cpp update3dviewstatecommand.h - view3dclosedcommand.cpp view3dclosedcommand.h puppettocreatorcommand.cpp puppettocreatorcommand.h inputeventcommand.cpp inputeventcommand.h view3dactioncommand.cpp view3dactioncommand.h @@ -248,7 +246,6 @@ extend_qtc_plugin(QmlDesigner snapper.cpp snapper.h snappinglinecreator.cpp snappinglinecreator.h toolbox.cpp toolbox.h - option3daction.cpp option3daction.h ) extend_qtc_plugin(QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/formeditor.pri b/src/plugins/qmldesigner/components/formeditor/formeditor.pri index dba3a8a6b74..3464ba3afe4 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditor.pri +++ b/src/plugins/qmldesigner/components/formeditor/formeditor.pri @@ -36,7 +36,6 @@ SOURCES += formeditoritem.cpp \ contentnoteditableindicator.cpp \ backgroundaction.cpp \ formeditortoolbutton.cpp \ - option3daction.cpp \ formeditorannotationicon.cpp HEADERS += formeditorscene.h \ @@ -76,7 +75,6 @@ HEADERS += formeditorscene.h \ contentnoteditableindicator.h \ backgroundaction.h \ formeditortoolbutton.h \ - option3daction.h \ formeditorannotationicon.h RESOURCES += formeditor.qrc diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index a9da5b22f49..c37ff56cc04 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -27,7 +27,6 @@ #include "nodeinstanceview.h" #include "selectiontool.h" #include "movetool.h" -#include "option3daction.h" #include "resizetool.h" #include "dragtool.h" #include "formeditorwidget.h" @@ -87,12 +86,6 @@ void FormEditorView::modelAttached(Model *model) setupFormEditorItemTree(rootModelNode()); m_formEditorWidget->updateActions(); - m_formEditorWidget->option3DAction()->set3DEnabled(rootModelNode().hasAuxiliaryData("3d-view")); - - // disable option3DAction if no View3D(s) exists in attached model - const QList views3D = rootModelNode().subModelNodesOfType("QtQuick3D.View3D"); - if (views3D.size() == 0) - m_formEditorWidget->option3DAction()->setEnabled(false); if (!rewriterView()->errors().isEmpty()) m_formEditorWidget->showErrorMessageBox(rewriterView()->errors()); @@ -213,7 +206,6 @@ void FormEditorView::createFormEditorWidget() }); connect(m_formEditorWidget->showBoundingRectAction(), &QAction::toggled, scene(), &FormEditorScene::setShowBoundingRects); - connect(m_formEditorWidget->option3DAction(), &Option3DAction::enabledChanged, this, &FormEditorView::toggle3DViewEnabled); connect(m_formEditorWidget->resetAction(), &QAction::triggered, this, &FormEditorView::resetNodeInstanceView); } @@ -236,9 +228,6 @@ void FormEditorView::nodeCreated(const ModelNode &node) setupFormEditorItemTree(QmlItemNode(node)); else if (QmlVisualNode::isFlowTransition(node)) setupFormEditorItemTree(QmlItemNode(node)); - - if (node.isSubclassOf("QtQuick3D.Node")) - m_formEditorWidget->option3DAction()->setEnabled(true); } void FormEditorView::modelAboutToBeDetached(Model *model) @@ -270,13 +259,6 @@ void FormEditorView::nodeAboutToBeRemoved(const ModelNode &removedNode) const QmlItemNode qmlItemNode(removedNode); removeNodeFromScene(qmlItemNode); - - const QList nodes3D = rootModelNode().subModelNodesOfType("QtQuick3D.Node"); - - // if no more 3D Nodes exist after the node removal, disable option3DAction - bool hasView3D = nodes3D.size() > 1 || (nodes3D.size() == 1 && nodes3D[0] != removedNode); - if (!hasView3D) - m_formEditorWidget->option3DAction()->setEnabled(false); } void FormEditorView::rootNodeTypeChanged(const QString &/*type*/, int /*majorVersion*/, int /*minorVersion*/) @@ -534,9 +516,6 @@ void FormEditorView::auxiliaryDataChanged(const ModelNode &node, const PropertyN if (isInvisible) newNode.deselectNode(); } - } else if (name == "3d-view") { - DesignerSettings::setValue(DesignerSettingsKey::VIEW_3D_ACTIVE, data); - m_formEditorWidget->option3DAction()->set3DEnabled(data.toBool()); } else if (item.isFlowTransition() || item.isFlowItem() || item.isFlowActionArea()) { FormEditorItem *editorItem = m_scene->itemForQmlItemNode(item); if (editorItem) @@ -671,22 +650,6 @@ void FormEditorView::exportAsImage() m_formEditorWidget->exportAsImage(m_scene->rootFormEditorItem()->boundingRect()); } -void FormEditorView::toggle3DViewEnabled(bool enabled) -{ - QTC_ASSERT(model(), return); - QTC_ASSERT(rootModelNode().isValid(), return); - - if (enabled == rootModelNode().hasAuxiliaryData("3d-view")) - return; - - if (enabled) - rootModelNode().setAuxiliaryData("3d-view", true); - else - rootModelNode().removeAuxiliaryData("3d-view"); - - resetNodeInstanceView(); -} - QmlItemNode findRecursiveQmlItemNode(const QmlObjectNode &firstQmlObjectNode) { QmlObjectNode qmlObjectNode = firstQmlObjectNode; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.h b/src/plugins/qmldesigner/components/formeditor/formeditorview.h index 1558563337d..85cc5821ee4 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.h @@ -133,7 +133,6 @@ private: void createFormEditorWidget(); void temporaryBlockView(); void resetNodeInstanceView(); - void toggle3DViewEnabled(bool enabled); QPointer m_formEditorWidget; QPointer m_scene; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp index 24177ccc6c9..f13de043258 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.cpp @@ -39,7 +39,6 @@ #include #include #include -#include #include #include @@ -146,13 +145,6 @@ FormEditorWidget::FormEditorWidget(FormEditorView *view) : upperActions.append(m_backgroundAction.data()); m_toolBox->addRightSideAction(m_backgroundAction.data()); - m_option3DAction = new Option3DAction(m_toolActionGroup.data()); - if (qEnvironmentVariableIsSet("QMLDESIGNER_QUICK3D_SHOW_EDIT_WINDOW")) { - addAction(m_option3DAction.data()); - upperActions.append(m_option3DAction.data()); - m_toolBox->addRightSideAction(m_option3DAction.data()); - } - m_zoomAction = new ZoomAction(m_toolActionGroup.data()); connect(m_zoomAction.data(), &ZoomAction::zoomLevelChanged, this, &FormEditorWidget::setZoomLevel); @@ -298,11 +290,6 @@ ZoomAction *FormEditorWidget::zoomAction() const return m_zoomAction.data(); } -Option3DAction *FormEditorWidget::option3DAction() const -{ - return m_option3DAction.data(); -} - QAction *FormEditorWidget::resetAction() const { return m_resetAction.data(); diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h index f8cd0cd1a8d..eb01611682f 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h +++ b/src/plugins/qmldesigner/components/formeditor/formeditorwidget.h @@ -40,7 +40,6 @@ namespace QmlDesigner { class ZoomAction; class LineEditAction; class BackgroundAction; -class Option3DAction; class FormEditorView; class FormEditorScene; class FormEditorGraphicsView; @@ -54,7 +53,6 @@ public: FormEditorWidget(FormEditorView *view); ZoomAction *zoomAction() const; - Option3DAction *option3DAction() const; QAction *showBoundingRectAction() const; QAction *snappingAction() const; QAction *snappingAndAnchoringAction() const; @@ -113,7 +111,6 @@ private: QPointer m_rootWidthAction; QPointer m_rootHeightAction; QPointer m_backgroundAction; - QPointer m_option3DAction; QPointer m_resetAction; QPointer m_documentErrorWidget; Core::IContext *m_context = nullptr; diff --git a/src/plugins/qmldesigner/components/formeditor/option3daction.cpp b/src/plugins/qmldesigner/components/formeditor/option3daction.cpp deleted file mode 100644 index e7c88158d8f..00000000000 --- a/src/plugins/qmldesigner/components/formeditor/option3daction.cpp +++ /dev/null @@ -1,66 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 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 "option3daction.h" - -#include -#include - -namespace QmlDesigner { - -Option3DAction::Option3DAction(QObject *parent) : - QWidgetAction(parent) -{ -} - -void Option3DAction::set3DEnabled(bool enabled) -{ - if (m_comboBox) { - m_comboBox->blockSignals(true); - m_comboBox->setCurrentIndex(enabled ? 1 : 0); - m_comboBox->blockSignals(false); - } -} - -QWidget *Option3DAction::createWidget(QWidget *parent) -{ - m_comboBox = new QComboBox(parent); - m_comboBox->setFixedWidth(82); - - m_comboBox->addItem(tr("2D")); - m_comboBox->addItem(tr("2D/3D")); - - m_comboBox->setCurrentIndex(0); - connect(m_comboBox, QOverload::of(&QComboBox::currentIndexChanged), this, [this]() { - emit enabledChanged(m_comboBox->currentIndex() != 0); - }); - - m_comboBox->setProperty("hideborder", true); - m_comboBox->setToolTip(tr("Enable/Disable 3D edit mode.")); - - return m_comboBox; -} - -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/formeditor/option3daction.h b/src/plugins/qmldesigner/components/formeditor/option3daction.h deleted file mode 100644 index ab01c1b364e..00000000000 --- a/src/plugins/qmldesigner/components/formeditor/option3daction.h +++ /dev/null @@ -1,52 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 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 - -QT_FORWARD_DECLARE_CLASS(QComboBox) - -namespace QmlDesigner { - -class Option3DAction : public QWidgetAction -{ - Q_OBJECT - -public: - explicit Option3DAction(QObject *parent); - void set3DEnabled(bool enabled); - -signals: - void enabledChanged(bool enabled); - -protected: - QWidget *createWidget(QWidget *parent) override; - -private: - QPointer m_comboBox; -}; - -} // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index 6087997332c..c7bd9d3682c 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -128,14 +128,10 @@ public: void sendToken(const QString &token, int number, const QVector &nodeVector); void selectionChanged(const ChangeSelectionCommand &command) override; - void library3DItemDropped(const Drop3DLibraryItemCommand &command) override; - void view3DClosed(const View3DClosedCommand &command) override; void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; - void mainWindowStateChanged(Qt::WindowStates previousStates, Qt::WindowStates currentStates); - void mainWindowActiveChanged(bool active, bool hasPopup); void sendInputEvent(QInputEvent *e) const; void view3DAction(const View3DActionCommand &command); void edit3DViewResized(const QSize &size) const; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 480f1e4472a..82b1e533410 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -43,9 +43,7 @@ #include #include #include -#include #include -#include #include #include @@ -286,9 +284,7 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr static const int debugOutputCommandType = QMetaType::type("DebugOutputCommand"); 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) return; @@ -314,20 +310,18 @@ void NodeInstanceServerProxy::dispatchCommand(const QVariant &command, PuppetStr nodeInstanceClient()->debugOutput(command.value()); } else if (command.userType() == changeSelectionCommandType) { 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) { puppetAlive(puppetStreamType); } else if (command.userType() == synchronizeCommandType) { SynchronizeCommand synchronizeCommand = command.value(); m_synchronizeId = synchronizeCommand.synchronizeId(); - } else + } else { Q_ASSERT(false); - qCInfo(instanceViewBenchmark) << "dispatching command" << "done" << command.userType(); + } + + qCInfo(instanceViewBenchmark) << "dispatching command" << "done" << command.userType(); } NodeInstanceClientInterface *NodeInstanceServerProxy::nodeInstanceClient() const diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index 66572534261..d68a2ce7e8a 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -53,7 +53,6 @@ #include "changebindingscommand.h" #include "changeidscommand.h" #include "changeselectioncommand.h" -#include "drop3dlibraryitemcommand.h" #include "changenodesourcecommand.h" #include "removeinstancescommand.h" #include "removepropertiescommand.h" @@ -1447,23 +1446,10 @@ void NodeInstanceView::selectionChanged(const ChangeSelectionCommand &command) selectModelNode(modelNodeForInternalId(instanceId)); } } -void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &command) -{ - QDataStream stream(command.itemData()); - ItemLibraryEntry itemLibraryEntry; - stream >> itemLibraryEntry; - QmlVisualNode::createQml3DNode(this, itemLibraryEntry, command.sceneRootId(), {}); -} void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand &command) { - if (command.type() == PuppetToCreatorCommand::KeyPressed) { - QPair data = qvariant_cast>(command.data()); - int key = data.first; - Qt::KeyboardModifiers modifiers = Qt::KeyboardModifiers(data.second); - - handlePuppetKeyPress(key, modifiers); - } else if (command.type() == PuppetToCreatorCommand::Edit3DToolState) { + if (command.type() == PuppetToCreatorCommand::Edit3DToolState) { if (!m_nodeInstanceServer.isNull()) { auto data = qvariant_cast(command.data()); if (data.size() == 3) { @@ -1481,59 +1467,12 @@ void NodeInstanceView::handlePuppetToCreatorCommand(const PuppetToCreatorCommand } } -// 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)); - -#ifndef QMLDESIGNER_TEST - // 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(); -#else - Q_UNUSED(key); - Q_UNUSED(modifiers); -#endif -} - -void NodeInstanceView::view3DClosed(const View3DClosedCommand &command) -{ - Q_UNUSED(command) - - rootModelNode().removeAuxiliaryData("3d-view"); -} - void NodeInstanceView::selectedNodesChanged(const QList &selectedNodeList, const QList & /*lastSelectedNodeList*/) { nodeInstanceServer()->changeSelection(createChangeSelectionCommand(selectedNodeList)); } -void NodeInstanceView::mainWindowStateChanged(Qt::WindowStates previousStates, Qt::WindowStates currentStates) -{ - if (nodeInstanceServer()) - nodeInstanceServer()->update3DViewState(Update3dViewStateCommand(previousStates, currentStates)); -} - -void NodeInstanceView::mainWindowActiveChanged(bool active, bool hasPopup) -{ - if (nodeInstanceServer()) - nodeInstanceServer()->update3DViewState(Update3dViewStateCommand(active, hasPopup)); -} - void NodeInstanceView::sendInputEvent(QInputEvent *e) const { nodeInstanceServer()->inputEvent(InputEventCommand(e)); diff --git a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp index 80672b17a9c..ba5b9a9f04d 100644 --- a/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp +++ b/src/plugins/qmldesigner/designercore/instances/puppetcreator.cpp @@ -476,13 +476,10 @@ QProcessEnvironment PuppetCreator::processEnvironment() const auto view = QmlDesignerPlugin::instance()->viewManager().nodeInstanceView(); view->emitCustomNotification("PuppetStatus", {}, {QVariant(m_qrcMapping)}); - // set env var and aux data if 3d-view is enabled + // set env var if QtQuick3D import exists QmlDesigner::Import import = QmlDesigner::Import::createLibraryImport("QtQuick3D", "1.0"); - if (m_model->hasImport(import, true, true) - && DesignerSettings::getValue(DesignerSettingsKey::VIEW_3D_ACTIVE).toBool()) { - view->rootModelNode().setAuxiliaryData("3d-view", true); + if (m_model->hasImport(import, true, true)) environment.set("QMLDESIGNER_QUICK3D_MODE", "true"); - } #endif QStringList importPaths = m_model->importPaths(); diff --git a/src/plugins/qmldesigner/designersettings.cpp b/src/plugins/qmldesigner/designersettings.cpp index 328d07bb727..4944cef9db2 100644 --- a/src/plugins/qmldesigner/designersettings.cpp +++ b/src/plugins/qmldesigner/designersettings.cpp @@ -84,7 +84,6 @@ void DesignerSettings::fromSettings(QSettings *settings) ); restoreValue(settings, DesignerSettingsKey::SIMPLE_COLOR_PALETTE_CONTENT, QStringList()); restoreValue(settings, DesignerSettingsKey::ALWAYS_DESIGN_MODE, true); - restoreValue(settings, DesignerSettingsKey::VIEW_3D_ACTIVE, false); settings->endGroup(); settings->endGroup(); diff --git a/src/plugins/qmldesigner/designersettings.h b/src/plugins/qmldesigner/designersettings.h index f3a2d42430b..ec4dc1f7e58 100644 --- a/src/plugins/qmldesigner/designersettings.h +++ b/src/plugins/qmldesigner/designersettings.h @@ -67,7 +67,6 @@ const char STANDALONE_MODE[] = "StandAloneMode"; const char ENABLE_TIMELINEVIEW[] = "EnableTimelineView"; const char SIMPLE_COLOR_PALETTE_CONTENT[] = "SimpleColorPaletteContent"; const char ALWAYS_DESIGN_MODE[] = "AlwaysDesignMode"; -const char VIEW_3D_ACTIVE[] = "View3DActive"; } class DesignerSettings : public QHash diff --git a/src/plugins/qmldesigner/qmldesignerplugin.cpp b/src/plugins/qmldesigner/qmldesignerplugin.cpp index c1249f3dbdc..1a2f3c8c273 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.cpp +++ b/src/plugins/qmldesigner/qmldesignerplugin.cpp @@ -253,16 +253,6 @@ void QmlDesignerPlugin::extensionsInitialized() connect(Core::ICore::instance(), &Core::ICore::coreAboutToOpen, this, [this] { integrateIntoQtCreator(&d->mainWidget); }); - - connect(Core::ICore::instance(), &Core::ICore::windowStateChanged, this, - [this] (Qt::WindowStates previousStates, Qt::WindowStates currentStates) { - d->viewManager.nodeInstanceView()->mainWindowStateChanged(previousStates, currentStates); - }); - - connect(Core::ICore::instance(), &Core::ICore::windowActivationChanged, this, - [this] (bool isActive, bool hasPopup) { - d->viewManager.nodeInstanceView()->mainWindowActiveChanged(isActive, hasPopup); - }); } static QStringList allUiQmlFilesforCurrentProject(const Utils::FilePath &fileName) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index 4bad2b32bed..3c434788cd9 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -173,12 +173,8 @@ Project { "commands/valueschangedcommand.h", "commands/changeselectioncommand.cpp", "commands/changeselectioncommand.h", - "commands/drop3dlibraryitemcommand.cpp", - "commands/drop3dlibraryitemcommand.h", "commands/update3dviewstatecommand.cpp", "commands/update3dviewstatecommand.h", - "commands/view3dclosedcommand.cpp", - "commands/view3dclosedcommand.h", "commands/puppettocreatorcommand.cpp", "commands/puppettocreatorcommand.h", "commands/inputeventcommand.cpp", @@ -534,8 +530,6 @@ Project { "formeditor/toolbox.h", "formeditor/formeditortoolbutton.cpp", "formeditor/formeditortoolbutton.h", - "formeditor/option3daction.cpp", - "formeditor/option3daction.h", "importmanager/importlabel.cpp", "importmanager/importlabel.h", "importmanager/importmanagercombobox.cpp", diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 8c7a18cf76c..50d457f4f38 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -45,9 +45,7 @@ extend_qtc_executable(qml2puppet synchronizecommand.cpp synchronizecommand.h tokencommand.cpp tokencommand.h changeselectioncommand.cpp changeselectioncommand.h - drop3dlibraryitemcommand.cpp drop3dlibraryitemcommand.h update3dviewstatecommand.cpp update3dviewstatecommand.h - view3dclosedcommand.cpp view3dclosedcommand.h puppettocreatorcommand.cpp puppettocreatorcommand.h inputeventcommand.cpp inputeventcommand.h view3dactioncommand.cpp view3dactioncommand.h diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index bf494c8a7bd..c5c49670b4a 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -95,12 +95,8 @@ QtcTool { "commands/valueschangedcommand.h", "commands/changeselectioncommand.cpp", "commands/changeselectioncommand.h", - "commands/drop3dlibraryitemcommand.cpp", - "commands/drop3dlibraryitemcommand.h", "commands/update3dviewstatecommand.cpp", "commands/update3dviewstatecommand.h", - "commands/view3dclosedcommand.cpp", - "commands/view3dclosedcommand.h", "commands/puppettocreatorcommand.cpp", "commands/puppettocreatorcommand.h", "commands/inputeventcommand.cpp", From 5683f2df85be7607556ea09e5988e4c6de98c16c Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Mon, 2 Mar 2020 15:13:20 +0100 Subject: [PATCH 04/11] ADS: Cleanup workspace manager workflow - Add workspace presets - Add reset button to workspace manager - Fix last workspace settings save/restore - Move functionality from DesignModeWidget to DockManager - Remove factory default workspace - Cleanup a few if statements Task-number: QDS-1699 Change-Id: I282dd6162a5a36041f8cd2aacd7407750d54cc22 Reviewed-by: Tim Jenssen --- .../workspacePresets/3D_Preset.wrk | 47 +++ .../workspacePresets/Essentials.wrk | 44 +++ .../advanceddockingsystem/dockmanager.cpp | 296 ++++++++++++------ src/libs/advanceddockingsystem/dockmanager.h | 30 +- .../advanceddockingsystem/workspacedialog.cpp | 29 +- .../advanceddockingsystem/workspacedialog.ui | 7 + .../advanceddockingsystem/workspacemodel.cpp | 39 ++- .../advanceddockingsystem/workspacemodel.h | 7 +- .../advanceddockingsystem/workspaceview.cpp | 14 +- .../advanceddockingsystem/workspaceview.h | 4 +- src/plugins/qmldesigner/designmodewidget.cpp | 120 +------ src/plugins/qmldesigner/designmodewidget.h | 2 - 12 files changed, 388 insertions(+), 251 deletions(-) create mode 100644 share/qtcreator/qmldesigner/workspacePresets/3D_Preset.wrk create mode 100644 share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk diff --git a/share/qtcreator/qmldesigner/workspacePresets/3D_Preset.wrk b/share/qtcreator/qmldesigner/workspacePresets/3D_Preset.wrk new file mode 100644 index 00000000000..62c823b1470 --- /dev/null +++ b/share/qtcreator/qmldesigner/workspacePresets/3D_Preset.wrk @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + 653 436 + + + + + + + + + + + + + + + + + 600 600 0 0 + + + + + + + + + 762 327 + + 376 1127 376 + + + diff --git a/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk b/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk new file mode 100644 index 00000000000..1bfe0c8ca59 --- /dev/null +++ b/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + 600 400 + + + + + + + + + + + + + + 700 150 150 + + + + + + + + + 700 300 + + 200 600 200 + + + diff --git a/src/libs/advanceddockingsystem/dockmanager.cpp b/src/libs/advanceddockingsystem/dockmanager.cpp index 63c71c7a8ad..80e45881256 100644 --- a/src/libs/advanceddockingsystem/dockmanager.cpp +++ b/src/libs/advanceddockingsystem/dockmanager.cpp @@ -92,10 +92,12 @@ namespace ADS QString m_workspaceName; bool m_workspaceListDirty = true; QStringList m_workspaces; + QSet m_workspacePresets; QHash m_workspaceDateTimes; QString m_workspaceToRestoreAtStartup; bool m_autorestoreLastWorkspace; // This option is set in the Workspace Manager! QSettings *m_settings = nullptr; + QString m_workspacePresetsPath; /** * Private data constructor @@ -127,16 +129,14 @@ namespace ADS void hideFloatingWidgets() { // Hide updates of floating widgets from user - for (auto floatingWidget : m_floatingWidgets) { // TODO qAsConst() + for (auto floatingWidget : m_floatingWidgets) // TODO qAsConst() floatingWidget->hide(); - } } void markDockWidgetsDirty() { - for (auto dockWidget : m_dockWidgetsMap) { // TODO qAsConst() + for (auto dockWidget : m_dockWidgetsMap) // TODO qAsConst() dockWidget->setProperty("dirty", true); - } } /** @@ -153,9 +153,8 @@ namespace ADS bool DockManagerPrivate::restoreContainer(int index, DockingStateReader &stream, bool testing) { - if (testing) { + if (testing) index = 0; - } bool result = false; if (index >= m_containers.count()) { @@ -183,22 +182,21 @@ namespace ADS { Q_UNUSED(version) // TODO version is not needed, why is it in here in the first place? - if (state.isEmpty()) { + if (state.isEmpty()) return false; - } + DockingStateReader stateReader(state); - stateReader.readNextStartElement(); if (!stateReader.readNextStartElement()) return false; - if (stateReader.name() != "QtAdvancedDockingSystem") { + + if (stateReader.name() != "QtAdvancedDockingSystem") return false; - } + qCInfo(adsLog) << stateReader.attributes().value("version"); bool ok; int v = stateReader.attributes().value("version").toInt(&ok); - if (!ok || v > CurrentVersion) { + if (!ok || v > CurrentVersion) return false; - } stateReader.setFileVersion(v); bool result = true; @@ -210,9 +208,9 @@ namespace ADS while (stateReader.readNextStartElement()) { if (stateReader.name() == "container") { result = restoreContainer(dockContainerCount, stateReader, testing); - if (!result) { + if (!result) break; - } + dockContainerCount++; } } @@ -265,9 +263,9 @@ namespace ADS if (!dockWidget || dockWidget->isClosed()) { int index = dockArea->indexOfFirstOpenDockWidget(); - if (index < 0) { + if (index < 0) continue; - } + dockArea->setCurrentIndex(index); } else { dockArea->internalSetCurrentDockWidget(dockWidget); @@ -336,25 +334,17 @@ namespace ADS d->m_dockAreaOverlay = new DockOverlay(this, DockOverlay::ModeDockAreaOverlay); d->m_containerOverlay = new DockOverlay(this, DockOverlay::ModeContainerOverlay); d->m_containers.append(this); - //d->loadStylesheet(); } DockManager::~DockManager() { - // If the factory default workspace is still loaded, create a default workspace just in case - // the layout changed as there is no tracking of layout changes. - if (isFactoryDefaultWorkspace(d->m_workspaceName) - && !isDefaultWorkspace(d->m_workspaceName)) { - createWorkspace(Constants::DEFAULT_NAME); - openWorkspace(Constants::DEFAULT_NAME); - } - emit aboutToUnloadWorkspace(d->m_workspaceName); save(); + saveStartupWorkspace(); - for (auto floatingWidget : d->m_floatingWidgets) { + for (auto floatingWidget : d->m_floatingWidgets) delete floatingWidget; - } + delete d; } @@ -385,6 +375,8 @@ namespace ADS void DockManager::setSettings(QSettings *settings) { d->m_settings = settings; } + void DockManager::setWorkspacePresetsPath(const QString &path) { d->m_workspacePresetsPath = path; } + DockAreaWidget *DockManager::addDockWidget(DockWidgetArea area, DockWidget *dockWidget, DockAreaWidget *dockAreaWidget) @@ -393,6 +385,24 @@ namespace ADS return DockContainerWidget::addDockWidget(area, dockWidget, dockAreaWidget); } + void DockManager::initialize() + { + syncWorkspacePresets(); + + QString workspace = ADS::Constants::DEFAULT_WORKSPACE; + + // Determine workspace to restore at startup + if (autoRestorLastWorkspace()) { + QString lastWS = lastWorkspace(); + if (!lastWS.isEmpty() && workspaces().contains(lastWS)) + workspace = lastWS; + else + qDebug() << "Couldn't restore last workspace!"; + } + + openWorkspace(workspace); + } + DockAreaWidget *DockManager::addDockWidgetTab(DockWidgetArea area, DockWidget *dockWidget) { DockAreaWidget *areaWidget = lastAddedDockAreaWidget(area); @@ -415,9 +425,8 @@ namespace ADS { d->m_dockWidgetsMap.insert(dockWidget->objectName(), dockWidget); DockAreaWidget *oldDockArea = dockWidget->dockAreaWidget(); - if (oldDockArea) { + if (oldDockArea) oldDockArea->removeDockWidget(dockWidget); - } dockWidget->setDockManager(this); FloatingDockContainer *floatingWidget = new FloatingDockContainer(dockWidget); @@ -480,9 +489,8 @@ namespace ADS stream.writeStartElement("QtAdvancedDockingSystem"); stream.writeAttribute("version", QString::number(version)); stream.writeAttribute("containers", QString::number(d->m_containers.count())); - for (auto container : d->m_containers) { + for (auto container : d->m_containers) container->saveState(stream); - } stream.writeEndElement(); stream.writeEndDocument(); @@ -493,9 +501,8 @@ namespace ADS { // Prevent multiple calls as long as state is not restore. This may // happen, if QApplication::processEvents() is called somewhere - if (d->m_restoringState) { + if (d->m_restoringState) return false; - } // We hide the complete dock manager here. Restoring the state means // that DockWidgets are removed from the DockArea internal stack layout @@ -506,17 +513,16 @@ namespace ADS // events until this function is finished, the user will not see this // hiding bool isHidden = this->isHidden(); - if (!isHidden) { + if (!isHidden) hide(); - } + d->m_restoringState = true; emit restoringState(); bool result = d->restoreState(state, version); d->m_restoringState = false; emit stateRestored(); - if (!isHidden) { + if (!isHidden) show(); - } return result; } @@ -524,13 +530,12 @@ namespace ADS void DockManager::showEvent(QShowEvent *event) { Super::showEvent(event); - if (d->m_uninitializedFloatingWidgets.empty()) { + if (d->m_uninitializedFloatingWidgets.empty()) return; - } - for (auto floatingWidget : d->m_uninitializedFloatingWidgets) { + for (auto floatingWidget : d->m_uninitializedFloatingWidgets) floatingWidget->show(); - } + d->m_uninitializedFloatingWidgets.clear(); } @@ -553,8 +558,7 @@ namespace ADS void DockManager::showWorkspaceMananger() { - // Save current workspace - save(); + save(); // Save current workspace WorkspaceDialog workspaceDialog(this, parentWidget()); workspaceDialog.setAutoLoadWorkspace(autoRestorLastWorkspace()); @@ -565,30 +569,22 @@ namespace ADS workspaceDialog.autoLoadWorkspace()); } - bool DockManager::isFactoryDefaultWorkspace(const QString &workspace) const + bool DockManager::isWorkspacePreset(const QString &workspace) const { - return workspace == QLatin1String(Constants::FACTORY_DEFAULT_NAME); - } - - bool DockManager::isDefaultWorkspace(const QString &workspace) const - { - return workspace == QLatin1String(Constants::DEFAULT_NAME); + return d->m_workspacePresets.contains(workspace); } bool DockManager::save() { - if (isFactoryDefaultWorkspace(activeWorkspace())) - return true; - emit aboutToSaveWorkspace(); - bool result = write(saveState(), parentWidget()); + bool result = write(activeWorkspace(), saveState(), parentWidget()); if (result) { d->m_workspaceDateTimes.insert(activeWorkspace(), QDateTime::currentDateTime()); } else { QMessageBox::warning(parentWidget(), - tr("Cannot Save Session"), - tr("Could not save session to file %1") + tr("Cannot Save Workspace"), + tr("Could not save workspace to file %1") .arg(workspaceNameToFileName(d->m_workspaceName) .toUserOutput())); } @@ -624,15 +620,13 @@ namespace ADS QFileInfoList workspaceFiles = workspaceDir.entryInfoList(QStringList() << QLatin1String("*.wrk"), QDir::NoFilter, - QDir::Time); // TODO Choose different extension + QDir::Time); for (const QFileInfo &fileInfo : workspaceFiles) { QString filename = fileInfo.completeBaseName(); filename.replace("_", " "); d->m_workspaceDateTimes.insert(filename, fileInfo.lastModified()); - //if (name != QLatin1String(Constants::DEFAULT_NAME)) tmp.insert(filename); } - //d->m_workspaces.prepend(QLatin1String(Constants::DEFAULT_NAME)); d->m_workspaceListDirty = false; d->m_workspaces = Utils::toList(tmp); @@ -640,6 +634,23 @@ namespace ADS return d->m_workspaces; } + QSet DockManager::workspacePresets() const + { + if (d->m_workspacePresets.isEmpty()) { + QDir workspacePresetsDir(d->m_workspacePresetsPath); + QFileInfoList workspacePresetsFiles + = workspacePresetsDir.entryInfoList(QStringList() << QLatin1String("*.wrk"), + QDir::NoFilter, + QDir::Time); + for (const QFileInfo &fileInfo : workspacePresetsFiles) { + QString filename = fileInfo.completeBaseName(); + filename.replace("_", " "); + d->m_workspacePresets.insert(filename); + } + } + return d->m_workspacePresets; + } + QDateTime DockManager::workspaceDateTime(const QString &workspace) const { return d->m_workspaceDateTimes.value(workspace); @@ -661,12 +672,21 @@ namespace ADS { if (workspaces().contains(workspace)) return false; - d->m_workspaces.insert(1, workspace); - d->m_workspaceDateTimes.insert(workspace, QDateTime::currentDateTime()); - emit workspaceListChanged(); + bool result = write(workspace, saveState(), parentWidget()); + if (result) { + d->m_workspaces.insert(1, workspace); + d->m_workspaceDateTimes.insert(workspace, QDateTime::currentDateTime()); + emit workspaceListChanged(); + } else { + QMessageBox::warning(parentWidget(), + tr("Cannot Save Workspace"), + tr("Could not save workspace to file %1") + .arg(workspaceNameToFileName(d->m_workspaceName) + .toUserOutput())); + } - return true; + return result; } bool DockManager::openWorkspace(const QString &workspace) @@ -674,7 +694,7 @@ namespace ADS // Do nothing if we have that workspace already loaded, exception if the // workspace is the default virgin workspace we still want to be able to // load the default workspace. - if (workspace == d->m_workspaceName) // && !isFactoryDefaultWorkspace(workspace)) + if (workspace == d->m_workspaceName && !isWorkspacePreset(workspace)) return true; if (!workspaces().contains(workspace)) @@ -684,38 +704,45 @@ namespace ADS if (!d->m_workspaceName.isEmpty()) { // Allow everyone to set something in the workspace and before saving emit aboutToUnloadWorkspace(d->m_workspaceName); - if (!save()) { + if (!save()) return false; - } } // Try loading the file - QByteArray data; - Utils::FilePath fileName = workspaceNameToFileName(workspace); - if (fileName.exists()) { - QFile file(fileName.toString()); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QMessageBox::warning(parentWidget(), - tr("Cannot Restore Workspace"), - tr("Could not restore workspace %1") - .arg(fileName.toUserOutput())); - return false; - } - data = file.readAll(); - file.close(); - } + QByteArray data = loadWorkspace(workspace); + if (data.isEmpty()) + return false; emit openingWorkspace(workspace); // If data was loaded from file try to restore its state - if (!data.isNull() && !restoreState(data)) { + if (!data.isNull() && !restoreState(data)) return false; - } + d->m_workspaceName = workspace; emit workspaceLoaded(workspace); return true; } + bool DockManager::reloadActiveWorkspace() + { + if (!workspaces().contains(activeWorkspace())) + return false; + + // Try loading the file + QByteArray data = loadWorkspace(activeWorkspace()); + if (data.isEmpty()) + return false; + + // If data was loaded from file try to restore its state + if (!data.isNull() && !restoreState(data)) + return false; + + emit workspaceReloaded(activeWorkspace()); + + return true; + } + /** * \brief Shows a dialog asking the user to confirm deleting the workspace \p workspace */ @@ -742,6 +769,7 @@ namespace ADS // Remove workspace from internal list if (!d->m_workspaces.contains(workspace)) return false; + d->m_workspaces.removeOne(workspace); emit workspacesRemoved(); @@ -752,8 +780,7 @@ namespace ADS if (fi.exists()) return fi.remove(); - return false; // TODO If we allow temporary workspaces without writing them to file - // directly, this needs to be true otherwise in all those cases it will return false. + return false; } void DockManager::deleteWorkspaces(const QStringList &workspaces) @@ -787,36 +814,111 @@ namespace ADS return deleteWorkspace(original); } - bool DockManager::write(const QByteArray &data, QString *errorString) const + bool DockManager::resetWorkspacePreset(const QString &workspace) { - Utils::FilePath fileName = workspaceNameToFileName(activeWorkspace()); + if (!isWorkspacePreset(workspace)) + return false; + + Utils::FilePath filename = workspaceNameToFileName(workspace); + + if (!QFile::remove(filename.toString())) + return false; + + QDir presetsDir(d->m_workspacePresetsPath); + QString presetName = workspace; + presetName.replace(" ", "_"); + presetName.append(".wrk"); + + bool result = QFile::copy(presetsDir.filePath(presetName), filename.toString()); + if (result) + d->m_workspaceDateTimes.insert(workspace, QDateTime::currentDateTime()); + + return result; + } + + bool DockManager::write(const QString &workspace, const QByteArray &data, QString *errorString) const + { + Utils::FilePath filename = workspaceNameToFileName(workspace); QDir tmp; - tmp.mkpath(fileName.toFileInfo().path()); - Utils::FileSaver fileSaver(fileName.toString(), QIODevice::Text); - if (!fileSaver.hasError()) { + tmp.mkpath(filename.toFileInfo().path()); + Utils::FileSaver fileSaver(filename.toString(), QIODevice::Text); + if (!fileSaver.hasError()) fileSaver.write(data); - } + bool ok = fileSaver.finalize(); - if (!ok && errorString) { + if (!ok && errorString) *errorString = fileSaver.errorString(); - } return ok; } -#ifdef QT_GUI_LIB - bool DockManager::write(const QByteArray &data, QWidget *parent) const + bool DockManager::write(const QString &workspace, const QByteArray &data, QWidget *parent) const { QString errorString; - const bool success = write(data, &errorString); + const bool success = write(workspace, data, &errorString); if (!success) QMessageBox::critical(parent, QCoreApplication::translate("Utils::FileSaverBase", "File Error"), errorString); return success; } -#endif // QT_GUI_LIB + + QByteArray DockManager::loadWorkspace(const QString &workspace) const + { + QByteArray data; + Utils::FilePath fileName = workspaceNameToFileName(workspace); + if (fileName.exists()) { + QFile file(fileName.toString()); + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { + QMessageBox::warning(parentWidget(), + tr("Cannot Restore Workspace"), + tr("Could not restore workspace %1") + .arg(fileName.toUserOutput())); + return data; + } + data = file.readAll(); + file.close(); + } + return data; + } + + void DockManager::syncWorkspacePresets() + { + // Get a list of all workspace presets + QSet presets = workspacePresets(); + + // Get a list of all available workspaces + QSet availableWorkspaces = Utils::toSet(workspaces()); + presets.subtract(availableWorkspaces); + + // Copy all missing workspace presets over to the local workspace folder + QDir presetsDir(d->m_workspacePresetsPath); + QDir workspaceDir(QFileInfo(d->m_settings->fileName()).path() + QLatin1String("/workspaces")); + + for (const auto &preset : presets) { + QString filename = preset; + filename.replace(" ", "_"); + filename.append(".wrk"); + + QString filePath = presetsDir.filePath(filename); + QFile file(filePath); + + if (file.exists()) { + file.copy(workspaceDir.filePath(filename)); + d->m_workspaceListDirty = true; + } + } + + // After copying over missing workspace presets, update the workspace list + workspaces(); + } + + void DockManager::saveStartupWorkspace() + { + QTC_ASSERT(d->m_settings, return ); + d->m_settings->setValue(Constants::STARTUP_WORKSPACE_SETTINGS_KEY, activeWorkspace()); + } } // namespace ADS diff --git a/src/libs/advanceddockingsystem/dockmanager.h b/src/libs/advanceddockingsystem/dockmanager.h index 721f7e76027..e52646437f9 100644 --- a/src/libs/advanceddockingsystem/dockmanager.h +++ b/src/libs/advanceddockingsystem/dockmanager.h @@ -60,8 +60,7 @@ QT_END_NAMESPACE namespace ADS { namespace Constants { -const char FACTORY_DEFAULT_NAME[] = "factorydefault"; -const char DEFAULT_NAME[] = "default"; +const char DEFAULT_WORKSPACE[] = "Essentials"; // This needs to align with a name of the shipped presets const char STARTUP_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/StartupWorkspace"; const char AUTO_RESTORE_WORKSPACE_SETTINGS_KEY[] = "QML/Designer/AutoRestoreLastWorkspace"; } // namespace Constants @@ -271,6 +270,13 @@ public: */ void setSettings(QSettings *settings); + /** + * Set the path to the workspace presets folder. + */ + void setWorkspacePresetsPath(const QString &path); + + void initialize(); + /** * Adds dockwidget into the given area. * If DockAreaWidget is not null, then the area parameter indicates the area @@ -445,12 +451,14 @@ public: QString lastWorkspace() const; bool autoRestorLastWorkspace() const; QStringList workspaces(); + QSet workspacePresets() const; QDateTime workspaceDateTime(const QString &workspace) const; Utils::FilePath workspaceNameToFileName(const QString &workspaceName) const; bool createWorkspace(const QString &workspace); bool openWorkspace(const QString &workspace); + bool reloadActiveWorkspace(); bool confirmWorkspaceDelete(const QStringList &workspaces); bool deleteWorkspace(const QString &workspace); @@ -459,22 +467,28 @@ public: bool cloneWorkspace(const QString &original, const QString &clone); bool renameWorkspace(const QString &original, const QString &newName); + bool resetWorkspacePreset(const QString &workspace); + bool save(); - bool isFactoryDefaultWorkspace(const QString &workspace) const; - bool isDefaultWorkspace(const QString &workspace) const; + bool isWorkspacePreset(const QString &workspace) const; signals: void aboutToUnloadWorkspace(QString workspaceName); void aboutToLoadWorkspace(QString workspaceName); void workspaceLoaded(QString workspaceName); + void workspaceReloaded(QString workspaceName); void aboutToSaveWorkspace(); private: - bool write(const QByteArray &data, QString *errorString) const; -#ifdef QT_GUI_LIB - bool write(const QByteArray &data, QWidget *parent) const; -#endif + bool write(const QString &workspace, const QByteArray &data, QString *errorString) const; + bool write(const QString &workspace, const QByteArray &data, QWidget *parent) const; + + QByteArray loadWorkspace(const QString &workspace) const; + + void syncWorkspacePresets(); + + void saveStartupWorkspace(); }; // class DockManager } // namespace ADS diff --git a/src/libs/advanceddockingsystem/workspacedialog.cpp b/src/libs/advanceddockingsystem/workspacedialog.cpp index ec4d6a23e7e..a458940aa00 100644 --- a/src/libs/advanceddockingsystem/workspacedialog.cpp +++ b/src/libs/advanceddockingsystem/workspacedialog.cpp @@ -64,9 +64,9 @@ QValidator::State WorkspaceValidator::validate(QString &input, int &pos) const { Q_UNUSED(pos) - if (input.contains(QLatin1Char('/')) || input.contains(QLatin1Char(':')) - || input.contains(QLatin1Char('\\')) || input.contains(QLatin1Char('?')) - || input.contains(QLatin1Char('*')) || input.contains(QLatin1Char('_'))) + static QRegExp rx("[a-zA-Z0-9 ()\\-]*"); + + if (!rx.exactMatch(input)) return QValidator::Invalid; if (m_workspaces.contains(input)) @@ -158,15 +158,22 @@ WorkspaceDialog::WorkspaceDialog(DockManager *manager, QWidget *parent) &QAbstractButton::clicked, m_ui.workspaceView, &WorkspaceView::renameCurrentWorkspace); + connect(m_ui.btReset, + &QAbstractButton::clicked, + m_ui.workspaceView, + &WorkspaceView::resetCurrentWorkspace); connect(m_ui.workspaceView, &WorkspaceView::activated, m_ui.workspaceView, &WorkspaceView::switchToCurrentWorkspace); - - connect(m_ui.workspaceView, &WorkspaceView::selected, this, &WorkspaceDialog::updateActions); - connect(m_ui.workspaceView, &WorkspaceView::workspaceSwitched, this, &QDialog::reject); + connect(m_ui.workspaceView, + &WorkspaceView::selected, + this, + &WorkspaceDialog::updateActions); m_ui.whatsAWorkspaceLabel->setOpenExternalLinks(true); + + updateActions(m_ui.workspaceView->selectedWorkspaces()); } void WorkspaceDialog::setAutoLoadWorkspace(bool check) @@ -190,16 +197,20 @@ void WorkspaceDialog::updateActions(const QStringList &workspaces) m_ui.btDelete->setEnabled(false); m_ui.btRename->setEnabled(false); m_ui.btClone->setEnabled(false); + m_ui.btReset->setEnabled(false); m_ui.btSwitch->setEnabled(false); return; } - const bool defaultIsSelected = workspaces.contains("default"); // TODO use const var + const bool presetIsSelected = Utils::anyOf(workspaces, [this](const QString &workspace) { + return m_manager->isWorkspacePreset(workspace); + }); const bool activeIsSelected = Utils::anyOf(workspaces, [this](const QString &workspace) { return workspace == m_manager->activeWorkspace(); }); - m_ui.btDelete->setEnabled(!defaultIsSelected && !activeIsSelected); - m_ui.btRename->setEnabled(workspaces.size() == 1 && !defaultIsSelected); + m_ui.btDelete->setEnabled(!activeIsSelected && !presetIsSelected); + m_ui.btRename->setEnabled(workspaces.size() == 1 && !presetIsSelected); m_ui.btClone->setEnabled(workspaces.size() == 1); + m_ui.btReset->setEnabled(presetIsSelected); m_ui.btSwitch->setEnabled(workspaces.size() == 1); } diff --git a/src/libs/advanceddockingsystem/workspacedialog.ui b/src/libs/advanceddockingsystem/workspacedialog.ui index db38f9fa925..93e40aeefc7 100644 --- a/src/libs/advanceddockingsystem/workspacedialog.ui +++ b/src/libs/advanceddockingsystem/workspacedialog.ui @@ -60,6 +60,13 @@ + + + + Reset + + + diff --git a/src/libs/advanceddockingsystem/workspacemodel.cpp b/src/libs/advanceddockingsystem/workspacemodel.cpp index 4a0b20b7466..08d12966734 100644 --- a/src/libs/advanceddockingsystem/workspacemodel.cpp +++ b/src/libs/advanceddockingsystem/workspacemodel.cpp @@ -50,6 +50,7 @@ namespace ADS { WorkspaceModel::WorkspaceModel(DockManager *manager, QObject *parent) : QAbstractTableModel(parent) , m_manager(manager) + , m_currentSortColumn(0) { m_sortedWorkspaces = m_manager->workspaces(); connect(m_manager, &DockManager::workspaceLoaded, this, &WorkspaceModel::resetWorkspaces); @@ -134,19 +135,18 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const break; case Qt::FontRole: { QFont font; - if (m_manager->isDefaultWorkspace(workspaceName)) + if (m_manager->isWorkspacePreset(workspaceName)) font.setItalic(true); else font.setItalic(false); - if (m_manager->activeWorkspace() == workspaceName - && !m_manager->isFactoryDefaultWorkspace(workspaceName)) + if (m_manager->activeWorkspace() == workspaceName) font.setBold(true); else font.setBold(false); result = font; } break; - case DefaultWorkspaceRole: - result = m_manager->isDefaultWorkspace(workspaceName); + case PresetWorkspaceRole: + result = m_manager->isWorkspacePreset(workspaceName); break; case LastWorkspaceRole: result = m_manager->lastWorkspace() == workspaceName; @@ -163,7 +163,7 @@ QVariant WorkspaceModel::data(const QModelIndex &index, int role) const QHash WorkspaceModel::roleNames() const { static QHash extraRoles{{Qt::DisplayRole, "workspaceName"}, - {DefaultWorkspaceRole, "defaultWorkspace"}, + {PresetWorkspaceRole, "presetWorkspace"}, {LastWorkspaceRole, "activeWorkspace"}, {ActiveWorkspaceRole, "lastWorkspace"}}; return QAbstractTableModel::roleNames().unite(extraRoles); @@ -171,6 +171,9 @@ QHash WorkspaceModel::roleNames() const void WorkspaceModel::sort(int column, Qt::SortOrder order) { + m_currentSortColumn = column; + m_currentSortOrder = order; + beginResetModel(); const auto cmp = [this, column, order](const QString &s1, const QString &s2) { bool isLess; @@ -186,16 +189,10 @@ void WorkspaceModel::sort(int column, Qt::SortOrder order) endResetModel(); } -bool WorkspaceModel::isDefaultVirgin() const -{ - return false; //m_manager->isFactoryDefaultWorkspace(); // TODO -} - void WorkspaceModel::resetWorkspaces() { - beginResetModel(); m_sortedWorkspaces = m_manager->workspaces(); - endResetModel(); + sort(m_currentSortColumn, m_currentSortOrder); } void WorkspaceModel::newWorkspace(QWidget *parent) @@ -225,9 +222,10 @@ void WorkspaceModel::deleteWorkspaces(const QStringList &workspaces) { if (!m_manager->confirmWorkspaceDelete(workspaces)) return; - beginResetModel(); + m_manager->deleteWorkspaces(workspaces); - endResetModel(); + m_sortedWorkspaces = m_manager->workspaces(); + sort(m_currentSortColumn, m_currentSortOrder); } void WorkspaceModel::renameWorkspace(QWidget *parent, const QString &workspace) @@ -242,6 +240,12 @@ void WorkspaceModel::renameWorkspace(QWidget *parent, const QString &workspace) }); } +void WorkspaceModel::resetWorkspace(const QString &workspace) +{ + if (m_manager->resetWorkspacePreset(workspace) && workspace == m_manager->activeWorkspace()) + m_manager->reloadActiveWorkspace(); +} + void WorkspaceModel::switchToWorkspace(const QString &workspace) { m_manager->openWorkspace(workspace); @@ -255,13 +259,14 @@ void WorkspaceModel::runWorkspaceNameInputDialog(WorkspaceNameInputDialog *works QString newWorkspace = workspaceInputDialog->value(); if (newWorkspace.isEmpty() || m_manager->workspaces().contains(newWorkspace)) return; - beginResetModel(); + createWorkspace(newWorkspace); m_sortedWorkspaces = m_manager->workspaces(); - endResetModel(); + sort(m_currentSortColumn, m_currentSortOrder); if (workspaceInputDialog->isSwitchToRequested()) switchToWorkspace(newWorkspace); + emit workspaceCreated(newWorkspace); } } diff --git a/src/libs/advanceddockingsystem/workspacemodel.h b/src/libs/advanceddockingsystem/workspacemodel.h index ac4abae37fe..3ccd70db922 100644 --- a/src/libs/advanceddockingsystem/workspacemodel.h +++ b/src/libs/advanceddockingsystem/workspacemodel.h @@ -49,7 +49,7 @@ class WorkspaceModel : public QAbstractTableModel Q_OBJECT public: - enum { DefaultWorkspaceRole = Qt::UserRole + 1, LastWorkspaceRole, ActiveWorkspaceRole }; + enum { PresetWorkspaceRole = Qt::UserRole + 1, LastWorkspaceRole, ActiveWorkspaceRole }; explicit WorkspaceModel(DockManager *manager, QObject *parent = nullptr); @@ -64,8 +64,6 @@ public: QHash roleNames() const override; void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override; - Q_SCRIPTABLE bool isDefaultVirgin() const; - signals: void workspaceSwitched(); void workspaceCreated(const QString &workspaceName); @@ -76,6 +74,7 @@ public: void cloneWorkspace(QWidget *parent, const QString &workspace); void deleteWorkspaces(const QStringList &workspaces); void renameWorkspace(QWidget *parent, const QString &workspace); + void resetWorkspace(const QString &workspace); void switchToWorkspace(const QString &workspace); private: @@ -84,6 +83,8 @@ private: QStringList m_sortedWorkspaces; DockManager *m_manager; + int m_currentSortColumn; + Qt::SortOrder m_currentSortOrder = Qt::AscendingOrder; }; } // namespace ADS diff --git a/src/libs/advanceddockingsystem/workspaceview.cpp b/src/libs/advanceddockingsystem/workspaceview.cpp index 3a5182011ba..383aa2d0a52 100644 --- a/src/libs/advanceddockingsystem/workspaceview.cpp +++ b/src/libs/advanceddockingsystem/workspaceview.cpp @@ -84,7 +84,7 @@ WorkspaceView::WorkspaceView(QWidget *parent) { setItemDelegate(new RemoveItemFocusDelegate(this)); setSelectionBehavior(QAbstractItemView::SelectRows); - setSelectionMode(QAbstractItemView::ExtendedSelection); + setSelectionMode(QAbstractItemView::SingleSelection); setWordWrap(false); setRootIsDecorated(false); setSortingEnabled(true); @@ -145,6 +145,11 @@ void WorkspaceView::renameCurrentWorkspace() m_workspaceModel.renameWorkspace(this, currentWorkspace()); } +void WorkspaceView::resetCurrentWorkspace() +{ + m_workspaceModel.resetWorkspace(currentWorkspace()); +} + void WorkspaceView::switchToCurrentWorkspace() { m_workspaceModel.switchToWorkspace(currentWorkspace()); @@ -187,10 +192,9 @@ void WorkspaceView::keyPressEvent(QKeyEvent *event) return; } const QStringList workspaces = selectedWorkspaces(); - if (!workspaces.contains("default") - && !Utils::anyOf(workspaces, [this](const QString &workspace) { - return workspace == m_manager->activeWorkspace(); - })) { + if (!Utils::anyOf(workspaces, [this](const QString &workspace) { + return workspace == m_manager->activeWorkspace(); + })) { deleteWorkspaces(workspaces); } } diff --git a/src/libs/advanceddockingsystem/workspaceview.h b/src/libs/advanceddockingsystem/workspaceview.h index 7edde4d62eb..428c0cbd1de 100644 --- a/src/libs/advanceddockingsystem/workspaceview.h +++ b/src/libs/advanceddockingsystem/workspaceview.h @@ -57,6 +57,7 @@ public: void deleteSelectedWorkspaces(); void cloneCurrentWorkspace(); void renameCurrentWorkspace(); + void resetCurrentWorkspace(); void switchToCurrentWorkspace(); QString currentWorkspace(); @@ -64,6 +65,8 @@ public: void selectActiveWorkspace(); void selectWorkspace(const QString &workspaceName); + QStringList selectedWorkspaces() const; + signals: void activated(const QString &workspace); void selected(const QStringList &workspaces); @@ -74,7 +77,6 @@ private: void keyPressEvent(QKeyEvent *event) override; void deleteWorkspaces(const QStringList &workspaces); - QStringList selectedWorkspaces() const; static WorkspaceDialog *castToWorkspaceDialog(QWidget *widget); diff --git a/src/plugins/qmldesigner/designmodewidget.cpp b/src/plugins/qmldesigner/designmodewidget.cpp index db8e819869f..a434d5d866c 100644 --- a/src/plugins/qmldesigner/designmodewidget.cpp +++ b/src/plugins/qmldesigner/designmodewidget.cpp @@ -56,6 +56,7 @@ #include #include +#include #include #include @@ -230,9 +231,12 @@ void DesignModeWidget::setup() actionManager.createDefaultAddResourceHandler(); actionManager.polishActions(); + auto settings = Core::ICore::settings(QSettings::UserScope); + m_dockManager = new ADS::DockManager(this); m_dockManager->setConfigFlags(ADS::DockManager::DefaultNonOpaqueConfig); - m_dockManager->setSettings(Core::ICore::settings(QSettings::UserScope)); + m_dockManager->setSettings(settings); + m_dockManager->setWorkspacePresetsPath(Core::ICore::resourcePath() + QLatin1String("/qmldesigner/workspacePresets/")); QString sheet = QString::fromUtf8(Utils::FileReader::fetchQrc(":/qmldesigner/dockwidgets.css")); m_dockManager->setStyleSheet(Theme::replaceCssColors(sheet)); @@ -369,32 +373,7 @@ void DesignModeWidget::setup() if (currentDesignDocument()) setupNavigatorHistory(currentDesignDocument()->textEditor()); - // Get a list of all available workspaces - QStringList workspaces = m_dockManager->workspaces(); - QString workspace = ADS::Constants::FACTORY_DEFAULT_NAME; - - // If there is no factory default workspace create one and write the xml file - if (!workspaces.contains(ADS::Constants::FACTORY_DEFAULT_NAME)) { - createFactoryDefaultWorkspace(); - // List of workspaces needs to be updated - workspaces = m_dockManager->workspaces(); - } - - // Determine workspace to restore at startup - if (m_dockManager->autoRestorLastWorkspace()) { - QString lastWorkspace = m_dockManager->lastWorkspace(); - if (!lastWorkspace.isEmpty() && workspaces.contains(lastWorkspace)) - workspace = lastWorkspace; - else - qDebug() << "Couldn't restore last workspace!"; - } - - if (workspace.isNull() && workspaces.contains(ADS::Constants::DEFAULT_NAME)) { - workspace = ADS::Constants::DEFAULT_NAME; - } - - m_dockManager->openWorkspace(workspace); - + m_dockManager->initialize(); viewManager().enableWidgets(); readSettings(); show(); @@ -419,7 +398,11 @@ void DesignModeWidget::aboutToShowWorkspaces() menu->addSeparator(); - for (const auto &workspace : m_dockManager->workspaces()) + // Sort the list of workspaces + auto sortedWorkspaces = m_dockManager->workspaces(); + Utils::sort(sortedWorkspaces); + + for (const auto &workspace : sortedWorkspaces) { QAction *action = ag->addAction(workspace); action->setData(workspace); @@ -430,87 +413,6 @@ void DesignModeWidget::aboutToShowWorkspaces() menu->addActions(ag->actions()); } -void DesignModeWidget::createFactoryDefaultWorkspace() -{ - ADS::DockAreaWidget* centerArea = nullptr; - ADS::DockAreaWidget* leftArea = nullptr; - ADS::DockAreaWidget* rightArea = nullptr; - ADS::DockAreaWidget* bottomArea = nullptr; - - // Iterate over all widgets and only get the central once to start with creating the factory - // default workspace layout. - for (const WidgetInfo &widgetInfo : viewManager().widgetInfos()) { - if (widgetInfo.placementHint == widgetInfo.CentralPane) { - ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId); - if (centerArea) - m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, centerArea); - else - centerArea = m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget); - } - } - - // Iterate over all widgets and get the remaining left, right and bottom widgets - for (const WidgetInfo &widgetInfo : viewManager().widgetInfos()) { - if (widgetInfo.placementHint == widgetInfo.LeftPane) { - ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId); - if (leftArea) - m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, leftArea); - else - leftArea = m_dockManager->addDockWidget(ADS::LeftDockWidgetArea, dockWidget, centerArea); - } - - if (widgetInfo.placementHint == widgetInfo.RightPane) { - ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId); - if (rightArea) - m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, rightArea); - else - rightArea = m_dockManager->addDockWidget(ADS::RightDockWidgetArea, dockWidget, centerArea); - } - - if (widgetInfo.placementHint == widgetInfo.BottomPane) { - ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(widgetInfo.uniqueId); - if (bottomArea) - m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, bottomArea); - else - bottomArea = m_dockManager->addDockWidget(ADS::BottomDockWidgetArea, dockWidget, centerArea); - } - } - - // Iterate over all 'special' widgets - QStringList specialWidgets = {"Projects", "FileSystem", "OpenDocuments"}; - ADS::DockAreaWidget* leftBottomArea = nullptr; - for (const QString &uniqueId : specialWidgets) { - ADS::DockWidget *dockWidget = m_dockManager->findDockWidget(uniqueId); - if (leftBottomArea) - m_dockManager->addDockWidget(ADS::CenterDockWidgetArea, dockWidget, leftBottomArea); - else - leftBottomArea = m_dockManager->addDockWidget(ADS::BottomDockWidgetArea, dockWidget, leftArea); - } - - // Add the last widget 'OutputPane' as the bottom bottom area - ADS::DockWidget *dockWidget = m_dockManager->findDockWidget("OutputPane"); - m_dockManager->addDockWidget(ADS::BottomDockWidgetArea, dockWidget, bottomArea); - - // TODO This is just a test - auto splitter = centerArea->dockContainer()->rootSplitter(); - splitter->setSizes({100, 800, 100}); - // TODO - - m_dockManager->createWorkspace(ADS::Constants::FACTORY_DEFAULT_NAME); - - // Write the xml file - Utils::FilePath fileName = m_dockManager->workspaceNameToFileName(ADS::Constants::FACTORY_DEFAULT_NAME); - QString errorString; - Utils::FileSaver fileSaver(fileName.toString(), QIODevice::Text); - QByteArray data = m_dockManager->saveState(); - if (!fileSaver.hasError()) { - fileSaver.write(data); - } - if (!fileSaver.finalize()) { - errorString = fileSaver.errorString(); - } -} - void DesignModeWidget::toolBarOnGoBackClicked() { if (m_navigatorHistoryCounter > 0) { diff --git a/src/plugins/qmldesigner/designmodewidget.h b/src/plugins/qmldesigner/designmodewidget.h index 113265368c3..f538c1aff07 100644 --- a/src/plugins/qmldesigner/designmodewidget.h +++ b/src/plugins/qmldesigner/designmodewidget.h @@ -104,8 +104,6 @@ private: // functions void aboutToShowWorkspaces(); - void createFactoryDefaultWorkspace(); - private: // variables SwitchSplitTabWidget* m_centralTabWidget = nullptr; From ae0d2bd1ac4f8102be4e76ef6701a253fe6c9bc1 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Tue, 3 Mar 2020 14:57:21 +0100 Subject: [PATCH 05/11] QmakeProjectManager: Try harder not to access nodes of in-parse project For extra safety, do not touch the project nodes if any build system of any build configuration is currently parsing. This is a bit of a stab in the dark, as I cannot reproduce the crash described in the linked bug report. Task-number: QTCREATORBUG-23597 Change-Id: Ie62a94232e89d8fba5866ea3572535e2ab209924 Reviewed-by: hjk --- src/plugins/projectexplorer/project.cpp | 2 +- src/plugins/projectexplorer/project.h | 2 +- .../qmakeprojectmanager/profileeditor.cpp | 23 +++++++++++++++---- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index f338b3bfafc..e7e6599ed91 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -320,7 +320,7 @@ bool Project::removeTarget(Target *target) return true; } -QList Project::targets() const +const QList Project::targets() const { return Utils::toRawPointer(d->m_targets); } diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index b93e273a068..b6b65e68893 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -106,7 +106,7 @@ public: Target *addTargetForKit(Kit *kit); bool removeTarget(Target *target); - QList targets() const; + const QList targets() const; // Note: activeTarget can be 0 (if no targets are defined). Target *activeTarget() const; Target *target(Core::Id id) const; diff --git a/src/plugins/qmakeprojectmanager/profileeditor.cpp b/src/plugins/qmakeprojectmanager/profileeditor.cpp index 3d14ff3d500..a00e26d39e1 100644 --- a/src/plugins/qmakeprojectmanager/profileeditor.cpp +++ b/src/plugins/qmakeprojectmanager/profileeditor.cpp @@ -37,6 +37,7 @@ #include #include #include +#include #include #include #include @@ -85,12 +86,24 @@ QString ProFileEditorWidget::checkForPrfFile(const QString &baseName) const { const FilePath projectFile = textDocument()->filePath(); const QmakePriFileNode *projectNode = nullptr; + + // FIXME: Remove this check once project nodes are fully "static". for (const Project * const project : SessionManager::projects()) { - if (Target *t = project->activeTarget()) { - if (t->buildSystem()->isParsing()) - continue; - } - projectNode = dynamic_cast(project->rootProjectNode() + static const auto isParsing = [](const Project *project) { + for (const Target * const t : project->targets()) { + for (const BuildConfiguration * const bc : t->buildConfigurations()) { + if (bc->buildSystem()->isParsing()) + return true; + } + } + return false; + }; + if (isParsing(project)) + continue; + + ProjectNode * const rootNode = project->rootProjectNode(); + QTC_ASSERT(rootNode, continue); + projectNode = dynamic_cast(rootNode ->findProjectNode([&projectFile](const ProjectNode *pn) { return pn->filePath() == projectFile; })); From 447171400bd0de8640e755d95bc618a31d9dc634 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Thu, 5 Mar 2020 14:01:42 +0100 Subject: [PATCH 06/11] ADS: Adapt Essentials preset layout Adapt Essentials preset layout so it will look like before ADS was introduced. Change-Id: I08ea0cbac41f2de53a3c62c032494e219963bada Reviewed-by: Tim Jenssen --- .../workspacePresets/Essentials.wrk | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk b/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk index 1bfe0c8ca59..0b1a7c2d528 100644 --- a/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk +++ b/share/qtcreator/qmldesigner/workspacePresets/Essentials.wrk @@ -2,10 +2,9 @@ - - + + - @@ -13,21 +12,24 @@ - 600 400 + + + + 6000 1500 2500 - + - 700 150 150 + 7000 1500 1500 @@ -36,9 +38,9 @@ - 700 300 + 7000 3000 - 200 600 200 + 2000 6000 2000 From cd00122fcd9dae0e7cb836774db20d7248ec671c Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 5 Mar 2020 10:25:03 +0100 Subject: [PATCH 07/11] Doc: Update info about Qbs support Fixes: QTCREATORBUG-23691 Change-Id: Ic1d9b23720a305c39792948aec8f15ee52c1a778 Reviewed-by: Christian Kandeler --- .../images/creator-qbs-build-app.png | Bin 57774 -> 17418 bytes doc/qtcreator/images/creator-qbs-profiles.png | Bin 0 -> 10815 bytes .../images/qtcreator-options-qbs.png | Bin 43851 -> 5394 bytes .../images/qtcreator-qbs-profile-settings.png | Bin 6708 -> 5487 bytes .../creator-projects-build-systems.qdocinc | 7 ++-- .../creator-only/creator-projects-qbs.qdoc | 38 +++++++++++------- ...reator-projects-settings-build-qbs.qdocinc | 7 ++++ .../creator-projects-targets.qdoc | 6 ++- 8 files changed, 39 insertions(+), 19 deletions(-) create mode 100644 doc/qtcreator/images/creator-qbs-profiles.png diff --git a/doc/qtcreator/images/creator-qbs-build-app.png b/doc/qtcreator/images/creator-qbs-build-app.png index a8b1413c15f8bd38de7a3049903739db7efa4c71..f6d5078fdbd38362194dcaa8adaf2d19e459f079 100644 GIT binary patch literal 17418 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 literal 57774 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