From 952f4d82e56efebb6ca7be7e643965b3222e0ee0 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 11 Nov 2019 11:29:41 +0100 Subject: [PATCH 01/59] McuSupport: Add .gitignore handling to wizard Change-Id: I8ae5570c3011b25b00ff432627d7b76daa0f361b Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/wizards/application/wizard.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/mcusupport/wizards/application/wizard.json b/src/plugins/mcusupport/wizards/application/wizard.json index 4583b48c2ba..5e512f420a4 100644 --- a/src/plugins/mcusupport/wizards/application/wizard.json +++ b/src/plugins/mcusupport/wizards/application/wizard.json @@ -51,6 +51,11 @@ "source": "main.qml.tpl", "target": "%{ProjectDirectory}/%{MainQmlFile}", "openInEditor": true + }, + { + "source": "%{IDE:ResourcePath}/templates/wizards/projects/git.ignore", + "target": ".gitignore", + "condition": "%{JS: !value('IsSubproject') && value('VersionControl') === 'G.Git'}" } ] } From 22429728f182b6c75837526875e5fe14e92c34dc Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 8 Nov 2019 16:49:00 +0100 Subject: [PATCH 02/59] QmlDesigner: Add 'float' support to curve editor Change-Id: I7daf26a565b24c48b247021f0a21024524e479bc Reviewed-by: Knud Dollereder Reviewed-by: Thomas Hartmann --- .../components/timelineeditor/animationcurveeditormodel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/timelineeditor/animationcurveeditormodel.cpp b/src/plugins/qmldesigner/components/timelineeditor/animationcurveeditormodel.cpp index 7b27194582a..34f3afea965 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/animationcurveeditormodel.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/animationcurveeditormodel.cpp @@ -113,7 +113,9 @@ void AnimationCurveEditorModel::setMaximumTime(double time) DesignTools::ValueType typeFrom(const QmlTimelineKeyframeGroup &group) { - if (group.valueType() == TypeName("double") || group.valueType() == TypeName("real")) + if (group.valueType() == TypeName("double") + || group.valueType() == TypeName("real") + || group.valueType() == TypeName("float")) return DesignTools::ValueType::Double; if (group.valueType() == TypeName("boolean") || group.valueType() == TypeName("bool")) From 1d357f6b33a7a062e6272c0afea8dfa0bcde78ec Mon Sep 17 00:00:00 2001 From: Andre Hartmann Date: Fri, 8 Nov 2019 21:07:29 +0100 Subject: [PATCH 03/59] TextEditor: Make TextEditorLinkLabel elideable And use that in the Include and Type Hierarchy panels to allow resizing the panels smaller. Fixes: QTCREATORBUG-23197 Change-Id: Ia4b39e610c7a4be4df564dc69573f4748d7634a5 Reviewed-by: David Schulz --- src/plugins/texteditor/texteditor.cpp | 3 ++- src/plugins/texteditor/texteditor.h | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 84b947f4009..2d349cecb70 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -8438,8 +8438,9 @@ void TextEditorWidget::setupGenericHighlighter() // TextEditorLinkLabel // TextEditorLinkLabel::TextEditorLinkLabel(QWidget *parent) - : QLabel(parent) + : Utils::ElidingLabel(parent) { + setElideMode(Qt::ElideMiddle); } void TextEditorLinkLabel::setLink(Utils::Link link) diff --git a/src/plugins/texteditor/texteditor.h b/src/plugins/texteditor/texteditor.h index d5a9a68ead1..dddfa54868a 100644 --- a/src/plugins/texteditor/texteditor.h +++ b/src/plugins/texteditor/texteditor.h @@ -35,10 +35,10 @@ #include #include +#include #include #include -#include #include #include #include @@ -611,7 +611,7 @@ private: friend class RefactorOverlay; }; -class TEXTEDITOR_EXPORT TextEditorLinkLabel : public QLabel +class TEXTEDITOR_EXPORT TextEditorLinkLabel : public Utils::ElidingLabel { public: TextEditorLinkLabel(QWidget *parent = nullptr); From 5df7ad94ecd44681b38e78641471754d0ab90eda Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 1 Nov 2019 10:51:09 +0200 Subject: [PATCH 04/59] Implement DnD 3D objects from the item library to the EditView3D Proof of concept drag and drop implementation. Basic functionality working but needs polish. Task-number: QDS-1132 Change-Id: Ie3b9e80de9a414c4955d6e38daf338045bc1e614 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/commands/commands.pri | 2 + .../commands/drop3dlibraryitemcommand.cpp | 56 ++++++++++++++++++ .../commands/drop3dlibraryitemcommand.h | 59 +++++++++++++++++++ .../instances/nodeinstanceclientproxy.cpp | 9 +++ .../instances/nodeinstanceclientproxy.h | 2 + .../interfaces/nodeinstanceclientinterface.h | 2 + .../nodeinstanceserverinterface.cpp | 4 ++ .../qml/qmlpuppet/mockfiles/EditView3D.qml | 4 ++ .../instances/nodeinstanceserver.cpp | 6 ++ .../qml2puppet/instances/nodeinstanceserver.h | 2 + .../qt5informationnodeinstanceserver.cpp | 23 ++++++++ .../qt5informationnodeinstanceserver.h | 1 + src/plugins/qmldesigner/CMakeLists.txt | 1 + .../designercore/include/nodeinstanceview.h | 1 + .../instances/nodeinstanceserverproxy.cpp | 4 ++ .../instances/nodeinstanceview.cpp | 14 ++++- src/plugins/qmldesigner/qmldesignerplugin.qbs | 2 + src/tools/qml2puppet/CMakeLists.txt | 1 + src/tools/qml2puppet/qml2puppet.qbs | 2 + 19 files changed, 194 insertions(+), 1 deletion(-) create mode 100644 share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h diff --git a/share/qtcreator/qml/qmlpuppet/commands/commands.pri b/share/qtcreator/qml/qmlpuppet/commands/commands.pri index 78dfcd8eb14..8bca5ce88a9 100644 --- a/share/qtcreator/qml/qmlpuppet/commands/commands.pri +++ b/share/qtcreator/qml/qmlpuppet/commands/commands.pri @@ -27,6 +27,7 @@ HEADERS += $$PWD/changeauxiliarycommand.h HEADERS += $$PWD/removesharedmemorycommand.h HEADERS += $$PWD/puppetalivecommand.h HEADERS += $$PWD/changeselectioncommand.h +HEADERS += $$PWD/drop3dlibraryitemcommand.h SOURCES += $$PWD/synchronizecommand.cpp SOURCES += $$PWD/debugoutputcommand.cpp @@ -55,3 +56,4 @@ SOURCES += $$PWD/changeauxiliarycommand.cpp SOURCES += $$PWD/removesharedmemorycommand.cpp SOURCES += $$PWD/puppetalivecommand.cpp SOURCES += $$PWD/changeselectioncommand.cpp +SOURCES += $$PWD/drop3dlibraryitemcommand.cpp diff --git a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp new file mode 100644 index 00000000000..aa7c8260655 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.cpp @@ -0,0 +1,56 @@ +/**************************************************************************** +** +** 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) + : m_itemData(itemData) +{ +} + +QDataStream &operator<<(QDataStream &out, const Drop3DLibraryItemCommand &command) +{ + out << command.itemData(); + + return out; +} + +QDataStream &operator>>(QDataStream &in, Drop3DLibraryItemCommand &command) +{ + in >> command.m_itemData; + + return in; +} + +bool operator==(const Drop3DLibraryItemCommand &first, const Drop3DLibraryItemCommand &second) +{ + return first.m_itemData == second.m_itemData; +} + +} // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h new file mode 100644 index 00000000000..1aa11a85f92 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/commands/drop3dlibraryitemcommand.h @@ -0,0 +1,59 @@ +/**************************************************************************** +** +** 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); + Drop3DLibraryItemCommand() = default; + + QByteArray itemData() const { return m_itemData; } + +private: + QByteArray m_itemData; +}; + +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/instances/nodeinstanceclientproxy.cpp b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp index 3e57baffd0d..7d46fcbfc19 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.cpp @@ -68,6 +68,7 @@ #include "debugoutputcommand.h" #include "puppetalivecommand.h" #include "changeselectioncommand.h" +#include "drop3dlibraryitemcommand.h" namespace QmlDesigner { @@ -139,6 +140,7 @@ 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) @@ -163,6 +165,8 @@ 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; @@ -250,6 +254,11 @@ void NodeInstanceClientProxy::selectionChanged(const ChangeSelectionCommand &com writeCommand(QVariant::fromValue(command)); } +void NodeInstanceClientProxy::library3DItemDropped(const Drop3DLibraryItemCommand &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 edf290f38a0..2b41bf83cba 100644 --- a/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h +++ b/share/qtcreator/qml/qmlpuppet/instances/nodeinstanceclientproxy.h @@ -57,6 +57,7 @@ class ChangeStateCommand; class ChangeNodeSourceCommand; class EndPuppetCommand; class ChangeSelectionCommand; +class Drop3DLibraryItemCommand; class NodeInstanceClientProxy : public QObject, public NodeInstanceClientInterface { @@ -76,6 +77,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 flush() override; void synchronizeWithClientProcess() override; diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h index 0b5a5ca334b..10688cdd89f 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceclientinterface.h @@ -41,6 +41,7 @@ class RemoveSharedMemoryCommand; class DebugOutputCommand; class PuppetAliveCommand; class ChangeSelectionCommand; +class Drop3DLibraryItemCommand; class NodeInstanceClientInterface { @@ -55,6 +56,7 @@ 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 flush() {} virtual void synchronizeWithClientProcess() {} diff --git a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp index d2b7cb26207..e58ef1011e3 100644 --- a/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp +++ b/share/qtcreator/qml/qmlpuppet/interfaces/nodeinstanceserverinterface.cpp @@ -46,6 +46,7 @@ #include "addimportcontainer.h" #include "changenodesourcecommand.h" #include "changeselectioncommand.h" +#include "drop3dlibraryitemcommand.h" #include "informationchangedcommand.h" #include "pixmapchangedcommand.h" @@ -107,6 +108,9 @@ void NodeInstanceServerInterface::registerCommands() qRegisterMetaType("ChangeSelectionCommand"); qRegisterMetaTypeStreamOperators("ChangeSelectionCommand"); + qRegisterMetaType("Drop3DLibraryItemCommand"); + qRegisterMetaTypeStreamOperators("Drop3DLibraryItemCommand"); + qRegisterMetaType("RemovePropertiesCommand"); qRegisterMetaTypeStreamOperators("RemovePropertiesCommand"); diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index e82391f8bce..024c8c5d1b8 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -161,6 +161,10 @@ Window { } } + DropArea { + anchors.fill: parent + } + View3D { id: editView anchors.fill: parent diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp index 9103ef5de01..e2e6564c893 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.cpp @@ -67,6 +67,7 @@ #include #include #include +#include #include #include @@ -1171,6 +1172,11 @@ ChangeSelectionCommand NodeInstanceServer::createChangeSelectionCommand(const QL return ChangeSelectionCommand(idVector); } +Drop3DLibraryItemCommand NodeInstanceServer::createDrop3DLibraryItemCommand(const QByteArray &itemData) +{ + return Drop3DLibraryItemCommand(itemData); +} + 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 7af63c0b5be..9eab649af71 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/nodeinstanceserver.h @@ -70,6 +70,7 @@ class AddImportContainer; class MockupTypeContainer; class IdContainer; class ChangeSelectionCommand; +class Drop3DLibraryItemCommand; namespace Internal { class ChildrenChangeEventFilter; @@ -180,6 +181,7 @@ 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); 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 a0783eff577..546593ca828 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -27,6 +27,8 @@ #include #include +#include +#include #include "servernodeinstance.h" #include "childrenchangeeventfilter.h" @@ -57,6 +59,7 @@ #include "removesharedmemorycommand.h" #include "changeselectioncommand.h" #include "objectnodeinstance.h" +#include #include "dummycontextobject.h" #include "../editor3d/cameracontrolhelper.h" @@ -79,6 +82,25 @@ static QVariant objectToVariant(QObject *object) return QVariant::fromValue(object); } +bool Qt5InformationNodeInstanceServer::eventFilter(QObject *, QEvent *event) +{ + switch (event->type()) { + 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)); + + } break; + + default: + break; + } + + return false; +} + QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) { auto helper = new QmlDesigner::Internal::CameraControlHelper(); @@ -98,6 +120,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) return nullptr; } + window->installEventFilter(this); QObject::connect(window, SIGNAL(objectClicked(QVariant)), this, SLOT(objectClicked(QVariant))); QObject::connect(window, SIGNAL(commitObjectProperty(QVariant, QVariant)), this, SLOT(handleObjectPropertyCommit(QVariant, QVariant))); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h index dc1e342fbd8..0597947024d 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.h @@ -57,6 +57,7 @@ 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; diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index df5d3815112..9d291c7bad2 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -139,6 +139,7 @@ extend_qtc_plugin(QmlDesigner tokencommand.cpp tokencommand.h valueschangedcommand.cpp valueschangedcommand.h changeselectioncommand.cpp changeselectioncommand.h + drop3dlibraryitemcommand.cpp drop3dlibraryitemcommand.h ) extend_qtc_plugin(QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h index a2aa30f40a4..61ee71e3002 100644 --- a/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h +++ b/src/plugins/qmldesigner/designercore/include/nodeinstanceview.h @@ -137,6 +137,7 @@ public: void sendToken(const QString &token, int number, const QVector &nodeVector); void selectionChanged(const ChangeSelectionCommand &command) override; + void library3DItemDropped(const Drop3DLibraryItemCommand &command) override; void selectedNodesChanged(const QList &selectedNodeList, const QList &lastSelectedNodeList) override; diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp index 3d57b3a16a7..408dd2a7e46 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceserverproxy.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include @@ -281,6 +282,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"); if (m_destructing) return; @@ -306,6 +308,8 @@ 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() == puppetAliveCommandType) { puppetAlive(puppetStreamType); } else if (command.userType() == synchronizeCommandType) { diff --git a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp index fd17c83551c..a65d52d8887 100644 --- a/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp +++ b/src/plugins/qmldesigner/designercore/instances/nodeinstanceview.cpp @@ -41,6 +41,7 @@ #include "qmlstate.h" #include "qmltimeline.h" #include "qmltimelinekeyframegroup.h" +#include "qmlvisualnode.h" #include "createscenecommand.h" #include "createinstancescommand.h" @@ -52,6 +53,7 @@ #include "changebindingscommand.h" #include "changeidscommand.h" #include "changeselectioncommand.h" +#include "drop3dlibraryitemcommand.h" #include "changenodesourcecommand.h" #include "removeinstancescommand.h" #include "removepropertiescommand.h" @@ -66,7 +68,6 @@ #include "tokencommand.h" #include "removesharedmemorycommand.h" #include "debugoutputcommand.h" - #include "nodeinstanceserverproxy.h" #include @@ -1439,6 +1440,17 @@ void NodeInstanceView::selectionChanged(const ChangeSelectionCommand &command) selectModelNode(modelNodeForInternalId(instanceId)); } } +void NodeInstanceView::library3DItemDropped(const Drop3DLibraryItemCommand &command) +{ + QDataStream stream(command.itemData()); + ItemLibraryEntry itemLibraryEntry; + stream >> itemLibraryEntry; + + if (itemLibraryEntry.category() != "Qt Quick 3D") + return; + + QmlVisualNode::createQmlVisualNode(this, itemLibraryEntry, {}); +} void NodeInstanceView::selectedNodesChanged(const QList &selectedNodeList, const QList & /*lastSelectedNodeList*/) diff --git a/src/plugins/qmldesigner/qmldesignerplugin.qbs b/src/plugins/qmldesigner/qmldesignerplugin.qbs index f2fdd765984..4ebac8ce310 100644 --- a/src/plugins/qmldesigner/qmldesignerplugin.qbs +++ b/src/plugins/qmldesigner/qmldesignerplugin.qbs @@ -169,6 +169,8 @@ Project { "commands/valueschangedcommand.h", "commands/changeselectioncommand.cpp", "commands/changeselectioncommand.h", + "commands/drop3dlibraryitemcommand.cpp", + "commands/drop3dlibraryitemcommand.h", "container/addimportcontainer.cpp", "container/addimportcontainer.h", "container/idcontainer.cpp", diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 46a82eeecee..920d984bd4d 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -45,6 +45,7 @@ extend_qtc_executable(qml2puppet synchronizecommand.cpp synchronizecommand.h tokencommand.cpp tokencommand.h changeselectioncommand.cpp changeselectioncommand.h + drop3dlibraryitemcommand.cpp drop3dlibraryitemcommand.h valueschangedcommand.cpp ) diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 540a2a3c08c..2d083714525 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -95,6 +95,8 @@ QtcTool { "commands/valueschangedcommand.h", "commands/changeselectioncommand.cpp", "commands/changeselectioncommand.h", + "commands/drop3dlibraryitemcommand.cpp", + "commands/drop3dlibraryitemcommand.h", "container/addimportcontainer.cpp", "container/addimportcontainer.h", "container/idcontainer.cpp", From 725432be04ff075b1f6d3869b678b1e6b9d64ab9 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 12 Nov 2019 11:06:14 +0100 Subject: [PATCH 05/59] QmlDesigner: Always show timeline settings panel mapping table An empty table is confusing. Once a state is added we enforce an id for the root node. Task-number: QDS-1218 Change-Id: Ifc2c0317dfbed2c8d8b9dd540079e6879fe4f2a9 Reviewed-by: Miikka Heikkinen Reviewed-by: Mahmoud Badri --- .../components/timelineeditor/timelinesettingsmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/timelineeditor/timelinesettingsmodel.cpp b/src/plugins/qmldesigner/components/timelineeditor/timelinesettingsmodel.cpp index e308d657725..6ecb4ef2320 100644 --- a/src/plugins/qmldesigner/components/timelineeditor/timelinesettingsmodel.cpp +++ b/src/plugins/qmldesigner/components/timelineeditor/timelinesettingsmodel.cpp @@ -149,7 +149,7 @@ void TimelineSettingsModel::resetModel() setHorizontalHeaderLabels( QStringList({tr("State"), tr("Timeline"), tr("Animation"), tr("Fixed Frame")})); - if (timelineView()->isAttached() && timelineView()->rootModelNode().hasId()) { + if (timelineView()->isAttached()) { addState(ModelNode()); for (const QmlModelState &state : QmlVisualNode(timelineView()->rootModelNode()).states().allStates()) From cfd419cc0c93824557b98eb1f449b2a69a40fd6c Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 7 Nov 2019 12:03:52 +0100 Subject: [PATCH 06/59] Squish: Adapt to changed ui Change-Id: Icf371af4de7aadbcab5cdf53a8095b26a7150aba Reviewed-by: Robert Loehning --- .../system/suite_editors/tst_generic_highlighter/test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/system/suite_editors/tst_generic_highlighter/test.py b/tests/system/suite_editors/tst_generic_highlighter/test.py index 1a389090fe7..05951f26719 100644 --- a/tests/system/suite_editors/tst_generic_highlighter/test.py +++ b/tests/system/suite_editors/tst_generic_highlighter/test.py @@ -123,10 +123,10 @@ def addHighlighterDefinition(*languages): "text='Generic Highlighter'}") clickOnTab(":Options.qt_tabwidget_tabbar_QTabBar", "Generic Highlighter") - clickButton("{text='Update Definitions' type='QPushButton' name='updateDefinitions' visible='1'}") + clickButton("{text='Download Definitions' type='QPushButton' name='downloadDefinitions' visible='1'}") updateStatus = "{name='updateStatus' type='QLabel' visible='1'}" waitFor("object.exists(updateStatus)", 5000) - if waitFor('str(findObject(updateStatus).text) == "Update finished"', 5000): + if waitFor('str(findObject(updateStatus).text) == "Download finished"', 5000): test.verify(os.path.exists(syntaxDirectory), "Directory for syntax highlighter files exists.") xmlFiles = glob.glob(os.path.join(syntaxDirectory, "*.xml")) @@ -157,8 +157,8 @@ def displayHintForHighlighterDefinition(fileName, patterns, lPatterns, added, ad return False def main(): - miss = ("A highlight definition was not found for this file. Would you like to update " - "highlight definition files?") + miss = ("A highlight definition was not found for this file. Would you like to download " + "additional highlight definition files?") startQC() if not startedWithoutPluginError(): return From 8866153c2a1f65d6ae37b4c8914b66356fbdd58e Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 7 Nov 2019 14:06:53 +0100 Subject: [PATCH 07/59] Squish: Fix test for welcome page Amends cf3772ca77e4687ee0d7d183a17f6cc9cea28dbc. Change-Id: I3b98f4493db130f062982a5a8b39e334d5b6b49f Reviewed-by: Robert Loehning --- tests/system/suite_WELP/tst_WELP01/test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/system/suite_WELP/tst_WELP01/test.py b/tests/system/suite_WELP/tst_WELP01/test.py index d20c5d1d912..75264583aa7 100755 --- a/tests/system/suite_WELP/tst_WELP01/test.py +++ b/tests/system/suite_WELP/tst_WELP01/test.py @@ -92,7 +92,7 @@ def main(): # select Projects and roughly check this switchToSubMode('Projects') - for button in ['New Project', 'Open Project']: + for button in ['New', 'Open']: wsButtonFrame, wsButtonLabel = getWelcomeScreenMainButton(button) if test.verify(all((wsButtonFrame, wsButtonLabel)), "Verified whether '%s' button is shown." % button): From 0be200e44e44217e5e21f6358654306dcf200e71 Mon Sep 17 00:00:00 2001 From: Tim Jenssen Date: Fri, 25 Oct 2019 19:48:14 +0200 Subject: [PATCH 08/59] improve code Change-Id: I06c7274c39f7e369d4cd9bed0c1ef77e4bc08b35 Reviewed-by: Christian Kandeler --- src/plugins/android/androidmanager.cpp | 4 ++-- src/plugins/clangcodemodel/clangutils.cpp | 14 +++++--------- src/plugins/clangtools/clangtoolruncontrol.cpp | 2 +- src/plugins/perfprofiler/perfloaddialog.cpp | 7 ++----- 4 files changed, 10 insertions(+), 17 deletions(-) diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index 4958bd02a3c..80e6fbbd801 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -288,8 +288,8 @@ QJsonObject AndroidManager::deploymentSettings(const Target *target) Utils::FilePath AndroidManager::dirPath(const ProjectExplorer::Target *target) { - if (target->activeBuildConfiguration()) - return target->activeBuildConfiguration()->buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY); + if (auto *bc = target->activeBuildConfiguration()) + return bc->buildDirectory().pathAppended(Constants::ANDROID_BUILDDIRECTORY); return Utils::FilePath(); } diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp index e7d7de420a8..2734f232557 100644 --- a/src/plugins/clangcodemodel/clangutils.cpp +++ b/src/plugins/clangcodemodel/clangutils.cpp @@ -315,15 +315,11 @@ static ::Utils::FilePath compilerPath(const CppTools::ProjectPart &projectPart) static ::Utils::FilePath buildDirectory(const ProjectExplorer::Project &project) { - ProjectExplorer::Target *target = project.activeTarget(); - if (!target) - return ::Utils::FilePath(); - - ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration(); - if (!buildConfig) - return ::Utils::FilePath(); - - return buildConfig->buildDirectory(); + if (auto *target = project.activeTarget()) { + if (auto *bc = target->activeBuildConfiguration()) + return bc->buildDirectory(); + } + return {}; } static QStringList projectPartArguments(const ProjectPart &projectPart) diff --git a/src/plugins/clangtools/clangtoolruncontrol.cpp b/src/plugins/clangtools/clangtoolruncontrol.cpp index e58b77a7690..b4d7804f962 100644 --- a/src/plugins/clangtools/clangtoolruncontrol.cpp +++ b/src/plugins/clangtools/clangtoolruncontrol.cpp @@ -495,7 +495,7 @@ void ClangToolRunWorker::finalize() QString msg = tr("%1: Not all files could be analyzed.").arg(toolName); TaskHub::addTask(Task::Error, msg, Debugger::Constants::ANALYZERTASK_ID); Target *target = runControl()->target(); - if (target && !target->activeBuildConfiguration()->buildDirectory().exists() + if (target && target->activeBuildConfiguration() && !target->activeBuildConfiguration()->buildDirectory().exists() && !m_runSettings.buildBeforeAnalysis()) { msg = tr("%1: You might need to build the project to generate or update source " "files. To build automatically, enable \"Build the project before starting " diff --git a/src/plugins/perfprofiler/perfloaddialog.cpp b/src/plugins/perfprofiler/perfloaddialog.cpp index a88c57ae643..b0602ed725c 100644 --- a/src/plugins/perfprofiler/perfloaddialog.cpp +++ b/src/plugins/perfprofiler/perfloaddialog.cpp @@ -106,11 +106,8 @@ void PerfLoadDialog::chooseDefaults() ui->kitChooser->setCurrentKitId(target->kit()->id()); - ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration(); - if (!buildConfig) - return; - - ui->executableDirLineEdit->setText(buildConfig->buildDirectory().toString()); + if (auto *bc = target->activeBuildConfiguration()) + ui->executableDirLineEdit->setText(bc->buildDirectory().toString()); } } // namespace Internal From 577c01ce00d939084eaa26156ce983dd169fc686 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 12 Nov 2019 10:40:09 +0100 Subject: [PATCH 09/59] QmlDesigner: Split property notifier MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Ib8da8171ff740492ebfd81bd496a2eb7d9061926 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../components/propertyeditor/propertyeditorvalue.cpp | 3 +++ .../components/propertyeditor/propertyeditorvalue.h | 5 +++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp index df58f309ec9..c4a928b1ec6 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.cpp @@ -145,6 +145,7 @@ void PropertyEditorValue::setValueWithEmit(const QVariant &value) emit valueChanged(nameAsQString(), value); emit valueChangedQml(); emit isBoundChanged(); + emit isExplicitChanged(); } } @@ -160,6 +161,8 @@ void PropertyEditorValue::setValue(const QVariant &value) if (m_value.isValid()) emit valueChangedQml(); + + emit isExplicitChanged(); emit isBoundChanged(); } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h index 99c38feb34d..e74196f55cb 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorvalue.h @@ -77,8 +77,8 @@ class PropertyEditorValue : public QObject Q_PROPERTY(QVariant enumeration READ enumeration NOTIFY valueChangedQml) Q_PROPERTY(QString expression READ expression WRITE setExpressionWithEmit NOTIFY expressionChanged FINAL) Q_PROPERTY(QString valueToString READ valueToString NOTIFY valueChangedQml FINAL) - Q_PROPERTY(bool isInModel READ isInModel NOTIFY valueChangedQml FINAL) - Q_PROPERTY(bool isInSubState READ isInSubState NOTIFY valueChangedQml FINAL) + Q_PROPERTY(bool isInModel READ isInModel NOTIFY isExplicitChanged FINAL) + Q_PROPERTY(bool isInSubState READ isInSubState NOTIFY isExplicitChanged FINAL) Q_PROPERTY(bool isBound READ isBound NOTIFY isBoundChanged FINAL) Q_PROPERTY(bool isValid READ isValid NOTIFY isValidChanged FINAL) Q_PROPERTY(bool isTranslated READ isTranslated NOTIFY expressionChanged FINAL) @@ -147,6 +147,7 @@ signals: void complexNodeChanged(); void isBoundChanged(); void isValidChanged(); + void isExplicitChanged(); private: //variables QmlDesigner::ModelNode m_modelNode; From 89732c361e7abd9f536a7dd07d23f847452d25a6 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 12 Nov 2019 16:07:35 +0100 Subject: [PATCH 10/59] QmlDesigner: Fix assert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We allow Window, Popup, Dialog etc. for root nodes. Change-Id: I776c88ab8d276d48f275d842349796c8445259ad Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index e9977d5c98c..b3444ce6114 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -56,6 +56,9 @@ bool QmlVisualNode::isItemOr3DNode(const ModelNode &modelNode) if (modelNode.metaInfo().isSubclassOf("QtQuick3D.Node")) return true; + if (modelNode.metaInfo().isGraphicalItem() && modelNode.isRootNode()) + return true; + return false; } From ce83b2a93c0f7fe9a6c5591b2fbc46d83e23717e Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 12 Nov 2019 15:14:20 +0100 Subject: [PATCH 11/59] McuSupport: Unify, simplify and improve kit name creation Change-Id: I27ffa3d89226eedc8396c37249e124f846a630d3 Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 15 +++++++--- src/plugins/mcusupport/mcusupportoptions.h | 2 ++ .../mcusupport/mcusupportoptionspage.cpp | 30 ++++++++----------- 3 files changed, 26 insertions(+), 21 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 4352f49f1fd..cb1981c42d0 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -425,11 +425,12 @@ static bool isDesktop(const BoardOptions* board) return board->qulPlatform() == "Qt"; } -static void setKitProperties(ProjectExplorer::Kit *k, const BoardOptions* board) +static void setKitProperties(const McuSupportOptions *options, ProjectExplorer::Kit *k, + const BoardOptions* board) { using namespace ProjectExplorer; - k->setUnexpandedDisplayName("QtMCU - " + board->model()); + k->setUnexpandedDisplayName(options->kitName(board)); k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor()); k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); k->setAutoDetected(false); @@ -527,6 +528,12 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM"); } +QString McuSupportOptions::kitName(const BoardOptions *board) const +{ + // TODO: get version from qulSdkPackage and insert into name + return QString::fromLatin1("QtMCU - %1 %2").arg(board->vendor(), board->model()); +} + ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board) { using namespace ProjectExplorer; @@ -536,10 +543,10 @@ ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board) }); if (!kit) { const QString armGccPath = toolchainPackage->path(); - const auto init = [board, &armGccPath](Kit *k) { + const auto init = [this, board, &armGccPath](Kit *k) { KitGuard kitGuard(k); - setKitProperties(k, board); + setKitProperties(this, k, board); if (!isDesktop(board)) { setKitToolchains(k, armGccPath); setKitDebugger(k, armGccPath); diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index f7f2d84b390..57281b274bb 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -132,6 +132,8 @@ public: QVector boards; PackageOptions *toolchainPackage = nullptr; + QString kitName(const BoardOptions* board) const; + ProjectExplorer::Kit *kit(const BoardOptions* board); signals: diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 02c2044cf40..e764113f311 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -96,26 +96,22 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option showBoardPackages(m_currentBoardIndex); } -static QString ulOfBoardModels(const QVector &validBoards) -{ - return "
  • " - + Utils::transform(validBoards,[](BoardOptions* board) - {return board->model();}).join("
  • ") - + "
"; -} - void McuSupportOptionsWidget::updateStatus() { const QVector validBoards = m_options->validBoards(); - m_statusLabel->setText(validBoards.isEmpty() - ? McuSupportOptionsPage::tr("No kits can currently be generated. " - "Select a target and provide the package paths. " - "Afterwards, press Apply to generate a kit for " - "your board.") - : McuSupportOptionsPage::tr("Kits for the following targets can be generated: " - "%1 " - "Press Apply to generate a kit for " - "your target.").arg(ulOfBoardModels(validBoards))); + + QString list("
    "); + for (auto board : validBoards) + list.append("
  • " + m_options->kitName(board) + "
  • "); + list.append("
"); + + m_statusLabel->setText( + validBoards.isEmpty() + ? QString::fromLatin1("No kits can currently be generated. " + "Select a target and provide the package paths. " + "Afterwards, press Apply to generate a kit for your target.") + : QString::fromLatin1("The following Kits can be generated: %1 " + "Press Apply to generate a kit for your target.").arg(list)); } void McuSupportOptionsWidget::showBoardPackages(int boardIndex) From 9641de200711afbd857d977f86e94e103172ef20 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 12 Nov 2019 13:58:23 +0100 Subject: [PATCH 12/59] McuSupport: Distinguish "Evaluation" and "Engineering" roles "Evaluation" and "Engineering" kits need to be set up differently. Change-Id: I649fed9cbdff248c5cbc69e65a095ced1f25326e Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 41 +++++++++++++------ .../mcusupport/mcusupportoptionspage.cpp | 8 +++- 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index cb1981c42d0..901642d2c06 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -351,26 +351,43 @@ McuSupportOptions::McuSupportOptions(QObject *parent) toolchainPackage = armGccPackage; - - auto stmPackages = {armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, - qulPackage}; - auto nxpPackages = {armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, - qulPackage}; - auto desktopPackages = {qulPackage}; - packages = {armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, - evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage}; + auto stmEvalPackages = { + armGccPackage, stm32CubeProgrammerPackage, qulPackage}; + auto stmEngPackages = { + armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, qulPackage}; + auto nxpEvalPackages = { + armGccPackage, seggerJLinkPackage, qulPackage}; + auto nxpEngPackages = { + armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage}; + auto desktopPackages = { + qulPackage}; + packages = { + armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, + seggerJLinkPackage, qulPackage}; const QString vendorStm = "STM"; const QString vendorNxp = "NXP"; const QString vendorQt = "Qt"; + boards.append(new BoardOptions(vendorStm, - "stm32f7508", "CMake/stm32f7508-discovery.cmake", "", stmPackages)); + "stm32f7508", + "CMake/stm32f7508-discovery.cmake", "", stmEvalPackages)); boards.append(new BoardOptions(vendorStm, - "stm32f769i", "CMake/stm32f769i-discovery.cmake", "", stmPackages)); + "stm32f769i", + "CMake/stm32f769i-discovery.cmake", "", stmEvalPackages)); + boards.append(new BoardOptions(vendorStm, + "Engineering", + "CMake/", "", stmEngPackages)); + boards.append(new BoardOptions(vendorNxp, - "evkbimxrt1050", "CMake/evkbimxrt1050-toolchain.cmake", "", nxpPackages)); + "evkbimxrt1050", + "CMake/evkbimxrt1050-toolchain.cmake", "", nxpEvalPackages)); + boards.append(new BoardOptions(vendorNxp, + "Engineering", + "CMake/", "", nxpEngPackages)); + boards.append(new BoardOptions(vendorQt, - "Desktop", "", "Qt", desktopPackages)); + "Desktop", "", "Qt", desktopPackages)); for (auto package : packages) connect(package, &PackageOptions::changed, [this](){ diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index e764113f311..62024e376bd 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -73,8 +73,10 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option auto boardComboBox = new QComboBox; boardChooserLabel->setBuddy(boardComboBox); boardChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - boardComboBox->addItems(Utils::transform(m_options->boards, [](BoardOptions *b){ - return b->model();})); + boardComboBox->addItems( + Utils::transform(m_options->boards, [this](BoardOptions *b){ + return m_options->kitName(b); + })); boardChooserlayout->addWidget(boardComboBox); mainLayout->addLayout(boardChooserlayout); @@ -83,6 +85,8 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option m_packagesLayout = new QFormLayout; m_packagesGroupBox->setLayout(m_packagesLayout); + mainLayout->addStretch(1); + m_statusLabel = new QLabel; mainLayout->addWidget(m_statusLabel); m_statusLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); From 1d1dde0f9bb0749bec39438477707cab1d8684c1 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Tue, 12 Nov 2019 10:39:18 +0100 Subject: [PATCH 13/59] McuSupport: Avoid mix of dir separator styles for CMake parameter Qt Creator's CMake plugin would otherwise (since recently) open that "sync" dialog if a configuration path contains back slashes. Change-Id: I2e333604e22158bdb61c2ca8eb65911295383b52 Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 22 ++++++++++--------- src/plugins/mcusupport/mcusupportoptions.h | 1 + .../mcusupport/mcusupportoptionspage.cpp | 1 + 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 901642d2c06..91d69ceb8d6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -350,6 +350,7 @@ McuSupportOptions::McuSupportOptions(QObject *parent) PackageOptions* seggerJLinkPackage = createSeggerJLinkPackage(); toolchainPackage = armGccPackage; + qulSdkPackage = qulPackage; auto stmEvalPackages = { armGccPackage, stm32CubeProgrammerPackage, qulPackage}; @@ -442,12 +443,12 @@ static bool isDesktop(const BoardOptions* board) return board->qulPlatform() == "Qt"; } -static void setKitProperties(const McuSupportOptions *options, ProjectExplorer::Kit *k, +static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k, const BoardOptions* board) { using namespace ProjectExplorer; - k->setUnexpandedDisplayName(options->kitName(board)); + k->setUnexpandedDisplayName(kitName); k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor()); k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); k->setAutoDetected(false); @@ -523,15 +524,15 @@ static void setKitEnvironment(ProjectExplorer::Kit *k, const BoardOptions* board EnvironmentKitAspect::setEnvironmentChanges(k, changes); } -static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* board) +static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* board, + const QString &qulDir) { using namespace CMakeProjectManager; CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); if (!board->toolChainFile().isEmpty()) config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", - ("%{CurrentBuild:Env:Qul_DIR}/" + - board->toolChainFile()).toUtf8())); + (qulDir + "/" + board->toolChainFile()).toUtf8())); if (!board->qulPlatform().isEmpty()) config.append(CMakeConfigItem("QUL_PLATFORM", board->qulPlatform().toUtf8())); @@ -560,17 +561,18 @@ ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board) }); if (!kit) { const QString armGccPath = toolchainPackage->path(); - const auto init = [this, board, &armGccPath](Kit *k) { + const QString qulDir = qulSdkPackage->path(); + const auto init = [this, board](Kit *k) { KitGuard kitGuard(k); - setKitProperties(this, k, board); + setKitProperties(kitName(board), k, board); if (!isDesktop(board)) { - setKitToolchains(k, armGccPath); - setKitDebugger(k, armGccPath); + setKitToolchains(k, toolchainPackage->path()); + setKitDebugger(k, toolchainPackage->path()); setKitDevice(k); } setKitEnvironment(k, board); - setKitCMakeOptions(k, board); + setKitCMakeOptions(k, board, qulSdkPackage->path()); k->setup(); k->fix(); diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 57281b274bb..c5d64171a9e 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -131,6 +131,7 @@ public: QVector packages; QVector boards; PackageOptions *toolchainPackage = nullptr; + PackageOptions *qulSdkPackage = nullptr; QString kitName(const BoardOptions* board) const; diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 62024e376bd..3ddf08fd2ab 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -160,6 +160,7 @@ void McuSupportOptionsPage::apply() package->writeToSettings(); QTC_ASSERT(m_options->toolchainPackage, return); + QTC_ASSERT(m_options->qulSdkPackage, return); const QVector validBoards = m_options->validBoards(); From 8722836b4456443d3e6173e49df93da831c531ee Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Fri, 8 Nov 2019 15:05:36 +0200 Subject: [PATCH 14/59] Implement EditView3D's toolbar Move and scale shortcuts are temporarily set to (M) and (T) instead of (W) and (R) to avoid interference with the WASD RF controller Task-number: QDS-1201 Change-Id: Ia7ebb6c0d39880be6b87b12d0a4a1d16638fd141 Reviewed-by: Miikka Heikkinen Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 87 +++++++++++++++--- .../qml/qmlpuppet/mockfiles/ToolBarButton.qml | 79 ++++++++++++++++ .../images/group_selection_active.png | Bin 0 -> 404 bytes .../images/group_selection_active@2x.png | Bin 0 -> 779 bytes .../images/group_selection_selected.png | Bin 0 -> 438 bytes .../images/group_selection_selected@2x.png | Bin 0 -> 904 bytes .../images/item_selection_active.png | Bin 0 -> 353 bytes .../images/item_selection_active@2x.png | Bin 0 -> 657 bytes .../images/item_selection_selected.png | Bin 0 -> 355 bytes .../images/item_selection_selected@2x.png | Bin 0 -> 661 bytes .../mockfiles/images/move_active.png | Bin 0 -> 294 bytes .../mockfiles/images/move_active@2x.png | Bin 0 -> 303 bytes .../mockfiles/images/move_selected.png | Bin 0 -> 191 bytes .../mockfiles/images/move_selected@2x.png | Bin 0 -> 272 bytes .../mockfiles/images/rotate_active.png | Bin 0 -> 451 bytes .../mockfiles/images/rotate_active@2x.png | Bin 0 -> 869 bytes .../mockfiles/images/rotate_selected.png | Bin 0 -> 478 bytes .../mockfiles/images/rotate_selected@2x.png | Bin 0 -> 906 bytes .../mockfiles/images/scale_active.png | Bin 0 -> 242 bytes .../mockfiles/images/scale_active@2x.png | Bin 0 -> 338 bytes .../mockfiles/images/scale_selected.png | Bin 0 -> 277 bytes .../mockfiles/images/scale_selected@2x.png | Bin 0 -> 364 bytes share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 21 +++++ 23 files changed, 172 insertions(+), 15 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/ToolBarButton.qml create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_active.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_active@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_selected.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_selected@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_active.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_active@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_selected.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_selected@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/move_active.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/move_active@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/move_selected.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/move_selected@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_active.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_active@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_selected.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_selected@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_active.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_active@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_selected.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_selected@2x.png diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 024c8c5d1b8..bed8dd3f9a8 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -118,7 +118,7 @@ Window { position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition : Qt.vector3d(0, 0, 0) globalOrientation: globalControl.checked - visible: selectedNode && moveToolControl.checked + visible: selectedNode && btnMove.selected view3D: overlayView onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position") @@ -133,7 +133,7 @@ Window { position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition : Qt.vector3d(0, 0, 0) globalOrientation: globalControl.checked - visible: selectedNode && scaleToolControl.checked + visible: selectedNode && btnScale.selected view3D: overlayView onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale") @@ -263,8 +263,78 @@ Window { } } + Rectangle { // toolbar + id: toolbar + color: "#9F000000" + width: 35 + height: col.height + + Column { + id: col + anchors.horizontalCenter: parent.horizontalCenter + spacing: 5 + padding: 5 + + property var group: [btnSelectItem, btnSelectGroup, btnMove, btnRotate, btnScale] + + ToolbarButton { + id: btnSelectItem + selected: true + tooltip: qsTr("Select Item") + shortcut: "Q" + currentShortcut: selected ? "" : shortcut + tool: "item_selection" + buttonsGroup: col.group + } + + ToolbarButton { + id: btnSelectGroup + tooltip: qsTr("Select Group") + shortcut: "Q" + currentShortcut: btnSelectItem.currentShortcut === shortcut ? "" : shortcut + tool: "group_selection" + buttonsGroup: col.group + } + + Rectangle { // separator + width: 25 + height: 1 + color: "#f1f1f1" + anchors.horizontalCenter: parent.horizontalCenter + } + + ToolbarButton { + id: btnMove + tooltip: qsTr("Move current selection") + shortcut: "M" + currentShortcut: shortcut + tool: "move" + buttonsGroup: col.group + } + + ToolbarButton { + id: btnRotate + tooltip: qsTr("Rotate current selection") + shortcut: "E" + currentShortcut: shortcut + tool: "rotate" + buttonsGroup: col.group + } + + ToolbarButton { + id: btnScale + tooltip: qsTr("Scale current selection") + shortcut: "T" + currentShortcut: shortcut + tool: "scale" + buttonsGroup: col.group + } + } + } + Column { y: 8 + anchors.right: parent.right CheckBox { id: editLightCheckbox checked: false @@ -285,19 +355,6 @@ Window { text: qsTr("Use Global Orientation") onCheckedChanged: cameraControl.forceActiveFocus() } - Column { - x: 8 - RadioButton { - id: moveToolControl - checked: true - text: qsTr("Move Tool") - } - RadioButton { - id: scaleToolControl - checked: false - text: qsTr("Scale Tool") - } - } } Text { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ToolBarButton.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/ToolBarButton.qml new file mode 100644 index 00000000000..cbc450ed2bc --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/ToolBarButton.qml @@ -0,0 +1,79 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +import QtQuick 2.12 +import QtQuick 2.0 +import QtQuick.Controls 2.0 + +Rectangle { + property bool selected: false + property string tooltip + property string shortcut + property string currentShortcut + property string tool + property variant buttonsGroup: [] + + id: root + width: img.width + 5 + height: img.height + 5 + color: root.selected ? "#aa000000" : (mouseArea.containsMouse ? "#44000000" : "#00000000") + radius: 3 + + ToolTip { + text: root.tooltip + " (" + root.shortcut + ")" + visible: mouseArea.containsMouse + delay: 1000 + } + + Image { + id: img + anchors.centerIn: parent + source: root.selected ? "qrc:///qtquickplugin/mockfiles/images/" + root.tool + "_selected.png" + : "qrc:///qtquickplugin/mockfiles/images/" + root.tool + "_active.png" + } + + Shortcut { + sequence: root.currentShortcut + onActivated: mouseArea.onClicked(null) + } + + MouseArea { + id: mouseArea + cursorShape: "PointingHandCursor" + anchors.fill: parent + hoverEnabled: true + + onClicked: { + if (!root.selected) { + for (var i = 0; i < root.buttonsGroup.length; ++i) + root.buttonsGroup[i].selected = false; + + root.selected = true; + } + } + } +} + + diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_active.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_active.png new file mode 100644 index 0000000000000000000000000000000000000000..c5801b346542bd419d93f63d9dca1ab30f140a55 GIT binary patch literal 404 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoqdi?5Lp(a)PS*8K4HRjc z|CGI>DQfu%SAoFU5zz2orRIR)$0e;r6HzP9^X)y?j$KbNUqsolD|=jB$_iB^vfO#G!B=w-BmN%Vn> ztp63Y7aAUGpFPj4o7~#*V{*#YE~~ZkQl7rj|LPYTyjZ8X>(_^i0kUEGSNCU?2VH1# ze8M*Mf70Jq_FsKuJ-VU{EYG@K703?XepR~ENHgowgYCQKaFpf-?hSt~ypgk6^s9oP z-PifA*6x~kSI6^&X4K^#?u2CvUvgYvPg%c*J%Zh=(XdocDXZ6)>$;yT%Q@vm=Ktq2 z@il5c(EK0Q!2UqgqOW7^l0d<%*}rDw_S{+-c6Djf7bh-v5yAYM@0b@Kkomy#Mzu3u z@%|Fot;_tT+?uoN;HuIx;f*TIl3%0V`W~6Y({|;i%a3Iy4duG0KTlBX^!~uWz`)?? L>gTe~DWM4fDxI~r literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_active@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_active@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..85851c7c130ab8c8312494a4c552aaad9c369922 GIT binary patch literal 779 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F}763vT7)TC!rnBG+!SKt~ZrMVAL!x1KIqP^RSJsM}PwHY$W; zT1ukp+DR{%n@(LhGyTt_Pv;I?eY|4*^Wt}le;!PpQT@OC-v2u@tDnuA*wfR~^NC>x z=Nay^IjxzV%N$+gn7oBV6`8k8dd_@7pzEsBJBNO`>76H(A8ZJ0;knSURI=lgYJ=3) z|I#~NwHAr5Fk*H(eAeW``eoUT$p<#fD`z}?TCpQNt784UeCB-_x6>0=ONt0N%$}9| zsVR!FB>T5OfyonwSywV{&-nK9fNg$k3}f0%?j^m|C6ChU<~+C~wet;Yp?riu6vNi6 zJOj;ICijN;Rn?qpOcrfn(7Li`vD!(t4U#`r>{@@IOxeq@L(lYDhL!v4X-xj1uP?nV zRQ6)l7oI!cX+!7%-Tc@sOZM$(?9N(twWP0E@11v?0DpsPn58qr?<*eZjg9Zw*-G9> zFVI`d5VpGW-x8lGEE@zX)<53QXf3>C>0#T$zmCl{5LRUjVfHWi!%<-67rQm;SWtfO;i;=f-Ap*A3YV*Y^0L0B&e@==6tp~a z{%I?{+Fff~XJ>}n@8D;7cU@cQUEm!>rMU;@X>?VcVO=hKR->=)qaOE~PuqlBFPY!; zzVtl){ef)Tb;h=p>t6Hhzr6dZx{|WeC+B{9*OUksHrEu7dS<0b!MW#R3auEm_GaaT zsItjiDhsb#r@3-s5<}dIi?Q>5wjNN=&F8ze=gHZ7VT;rEZp*&)t!&x8N1~r%Gjs~o zR!!gY(^sh|=(eA0ph=2b3rm4R`tObV=00xPZ=3Ph@IaL5A6bjXZ}V66TDUaabnxpv zZu#FOaz;O6)t>1g?b?>T8YvCdS^xMqDDtj8dM;v5dS>UM6}P{%@f8TXD3#xK>fD|u p%qz-Om%Ti3;>3v`_5u_4KPX9+ZQm5_&%nUI;OXk;vd$@?2>_mlW&QvF literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_selected.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..bfb848aa384d7aa0694c22c281eff34094c0aaaa GIT binary patch literal 438 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoYdu{YLp(a)UfJKz8z^z? zBY#+v%i_xxy&Pd%d9_-dRtip<8al^q(WNdo5seN3m06$pUvze~xG26TyWZcm{gUQ{ zjtwW??B%RJe`fE&DZhP}&G=q>uJY5r85>XS4}7#uNcz`{d$+WV64?5u+=xo8GKx6D zXA_>Z?9{iE4+7yIBRZ3(KC+`7WK~F#X^HSJi8$U&?)ZZ1GNG zB^UB0T=w5{aGiaUd;y35N1x8xt2@PR@z!n6 zJm2xr+;Z-rN}GVBbylW_ESe84xP9WK7~kVrLer;2TwfHGwyJB5$&6S*O~c-^8T&r< z?r7+q5tbC@H~-(U1V-zrGbUXwSLJ)8ckkip51C>Q?WPq7O?TISdGEE5?{7Q)dg*+_ ze(9oJahb<2*f!6pd+@b@Fa5%l`puVo6Jok~%vVZ26O@^7IcVt&hjLctSzLZ5ypu0? wYu#>k3_e&rXRVQ~)SPLTk85rA(tjY{cr!s&i*3U*1_lNOPgg&ebxsLQ0A8ERr~m)} literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_selected@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/group_selection_selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f18895dc4400ab6fd4265573925cece156414df2 GIT binary patch literal 904 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?FS zPc~Sg8Kkml#*vg`&6?L;IzKf`Vi(c()|fd(T;*e$&5DIjg03|yeN(8bk6-0+ zUGzr>xjXBP_0|^ed;BKzY}z-w-*b!?|6P6gUiI4ixqJV;{=KjC=8`2#mV6QDv2ED+ zcUN?Jb*1V<69#dEvWOL~k{wD5L}xI?9KXS~ep@?70S~)g;v1p!i+EfF3)Bnl%UiT< zyluGc&}JRQLYoH`O4oA_aQ4VPh@9S`!KCxS^IbXf>jwD)Nt`Pu#&ru_C}oWL%k=Ja zux!*@)@O|Q4V?!}d*;5{s%;c#GaZLKt_t$o*gLvbw!N z`sZc`(E^F&*#_G#Wyi8S;#%=KVAa*=gnduil9daDl2`Ao_n46pykMj0f#k|nZmav} z-dMx(jj^`j_5r6YRj+QUx`goCFz-82yEfeWm~?xC<$>%4abfRf&Wnv?$@nU~L*4)J z-d}s}x+ZL@NHDn2v~jiVZkCQ$j7-LXI~vw-JYW0rfF`H<_Sw09Ry!Ya{MgQ3l<}1@ zg5}MWNna00_Q<}td2ERQ|CMUfxepKdt@b@o^g!A`d`Hv9$ES1?LYCN02+R9#!d=1H zBP>{Kv%BMn;0G7CO-dzdT+XXkA5eL~_TbP9nPX;c5#^mPn6~^9Jkh+aHSqX1{RYVc zg_Zy1dhYgbthK$ZCvcpZ<&efK_D@Q7%-)S}gEp~Q^lxmoyFdMg2U;(M|J->vX!eb5 zmH9l1>l)lYO|qNBZq8h~x*_w@!Jipl4`k0(_&6zI^|u2)Q}~sW+ZlX6ZCQL{?(&An z4nKbL4crnc3ok#}s=?&RaiZ$LjhmZd3)Z}yAbvOGK<>_KNjXzxl4RVUu89%i5}fec z$&l>^R}br*i$%@pkuF?<4}`YFE<3Fov`untT;;U8K@DNKN=ogwSIB;O)8(Tmr!e6} zUSX83`#CvPh3)B?ZmXl?aydPm4ix`95iK@}W1-uYUr(-r()XYL4Eq^F-(S-xlw^I+ Qz`(%Z>FVdQ&MBb@0IqweK>z>% literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_active.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_active.png new file mode 100644 index 0000000000000000000000000000000000000000..5fa81302cde8c2b80208ec82955825787231cbc8 GIT binary patch literal 353 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoH9TD$Lp(a)PTK9o94O*C zo&N$yk(c1XbNmLq|JoN!-TJQ~A|gX_gRn@>S{7;hgNMA1o?`J{yT)8&k-$_#W0jP2 zqZvK1Vmv(6^6wtW=_#{0U0S*1rO`I?JkM^e0@ciWvnH{WCa~_98nShpisK=s0^Q8R zYHcDWR{yjQ>|Da^nQRv6FmFK~=No46Noi|dI?sC`S+QB<+NG(wQInnh9bIae`@^3cGL#hbZ=mNgiAntBRfTgIb&;s&dp>e(n}pQuaE4hsEX znb+|B%WsCbMzsyRGXGpB$cDT;QKt0hgxc>3yBBr*cva>3{lG?Eu?gB9C$CL8u}x`F zrZB4r=O*bnE=T5WRppp8{R`8Z$Y8cf(^S^}KmAa-j zx_j_ipaonQuornljOJlelNpqx{9R1=JyAL)wiTc%$QoTBsI)0NZTPv+Eju?&%-ME%ae1-3$6y; z>eGC%YsuN%Pgcvam?ha8c27FCOXj(FCC{1?HLp~i88_~~b*SXo!?15hhE=5W-3cXY zf|%33=^pnIQLg^KvmjQs>&X@se^!kZy|ZSrWYa)5)t&Y1{4`^eWl)rhj?2rNivbIa|;5bWd}LWb2!Cb5ZxV8I3nq ze%Unh?5+$?k=VxV2MWdC1~Q*-d|IERe)di8X`P98*baGJ*>ma)vv_RMdMOT*TN=0L zs2!fVIcS&Z1&g3LhMU>_);1{d>|t9r_mVo>Cb3yYoB91#u3WkD=YPgJCgb3(S!zKE SPZ<~(7(8A5T-G@yGywqE#v}#+ literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_selected.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/item_selection_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..2b685d3d00a8d06631fbe3678b9997f258c77d1a GIT binary patch literal 355 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJowLD!MLp(a)PO@}b#-f0!6I!P2 z^K8yNW+%Y$zWT&r+n7T$9vavmui4i3*4Jy&C6+vc_$kZO9JwP{-x=n6MNd{pw|I+GqHmNMTKFnx;~~5R+)9ewN`B3tx=~*Xx_7rY+T67$I<2|AS8D zDXxO{pR-I@MYw}*O)7~zvF_tClUg2aj~R@52KI+)yl(XbvRGChFn#v<62s+5C6$v{ z_BDz>Fs|O$P`-dUhxzz_!6))rUs84-DNvfstPvl`V_$3jQqW@RPOej|nm=a=-4rt{ zNmeAmF@af9)W^OqGXBUo#gOswkinbs*=HNKDvj#N~% zzHqYg0o$V4y}^QZj3P6PwPXr)w_dgoy-?j?@r!kjK~?wN1IjMnrI)AFlr`uv3TVLxT?t7cb6vZNka9;gZjj(<`_OHQqZZGTvjf?|J2a$!)u! z?bP&%8v-M~aBevL;-Qb}d3PDzAL|4*F^gPrn>&Z$oq|=)93Cg;FIGW63NF}wIkt); z;0xat$->9ScN7Li?B6uUbN%*9*YmdTV>o>v{rg{0k6(YK4c^R1!)r2!U%EjLz z8@8|Bmd|WIAR2sqJ7d(A z+Zj78&u@vd)K<-J_~ubK(V{Br4wr_~0rrGL7R*8m9zOdK`S{9}D_8#fXV}lEFlVAl U^4&;v1_lNOPgg&ebxsLQ07c>=(f|Me literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/move_active.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/move_active.png new file mode 100644 index 0000000000000000000000000000000000000000..d21d290349ce216e263c91151198bb31c15e4e57 GIT binary patch literal 294 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJo-g>$?hIn+oonp(^fSUemd)ob!$x;$9)X;e$#QQ-d8`IXSZFLTXW30NK0vX!xpDA y;x<>hR@!~%Ke@Vd#v#M{;KTP$@{}+gked?W%m?%TPH zfq{XiB*-tAfl*D}!6RV7juYqa*d!kO#lXO@+SA1`#Nu>vg2bB!UB>p7D^4;(md7`A z8?UoeZMfTIoW3Disq`67nRn5-IS2DPJKejD%WmJ~mSCI8l5FI3h(|Ltwab~A#_k)v3g%fFGp=TNJ=2)+hVIN_q4w2DeUBzQnA70gWSVecIvc~+ YM~-u+nVXa`FfcH9y85}Sb4q9e02|zdS^xk5 literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/move_selected.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/move_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8ce42a7588ce13303070ea892765582c05b951 GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|7G?$p2BAoW(+ms@iUB?$t_%ze4D%l1LGKf8 zyk}rw;4TUB3ua*S2*@jH-*@8tAFu4k{0s~XPM$7~Are!Q6BHN?G!+Uhq$XHIbx*K( zr|Kb-#(YTTA%j5sRRJBV)i-YF+`LhmdKI;Vst07ij69smFU literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/move_selected@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/move_selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fad362a3e6a5b51b12c94e97374f7e4bb1e1be2c GIT binary patch literal 272 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-7G?$phNU`BwlFX-=mz+NxH2#>FwA>MBr<7B z$z)();42C83ua(cQ+MzPSg_;7`8%J#99t3ig@J*g#nZ(x#Nu>vg2bB!Q-*ey=PWWp zh5m&eXR137cWwW^A^OnIXEJ5pkM8X~oY&dq-Ys0_eS=$qZ7NH$k<%d`22Y#UoKA=G zXEHebk==B}dWX-o-PZc28W&Vqcf7IwohPZtImhkc7MbnE?3phf`SVyz=0C^MZru6E l=gN-FjOTiqjaT!^F)*m@b)6~t`d}8wYo4xtF6*2UngCeBY6AcO literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_active.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_active.png new file mode 100644 index 0000000000000000000000000000000000000000..bdabaf30285f9a7468f9fb7f6c14e78359a42f1a GIT binary patch literal 451 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoyF6VSLp(a)PBruhOB89F z@1x>kgPw#zRbN{JCuEoV8t0y1GeZXeG&BJ`Zar=Sd2dOT9 zypGB7EcM#{Q#V0)2bT@YvxdwB!5=&}OxLb%K6!_&)b(zlxOY%#OzoPy)yAFyO}iHS z3pp>Y^4D?ot7TTxPDp+1*tJwobrZwaCBOXk2Cx5N|6tj!g=T#FkC`w37vTT3_^)#u z!#uYm@2@On6x_&H!}{zt(<1d*y%NwTKlL6x2T8;!@+IvPNuPu!HHE(jIZYa57`u2fbfxXf<;m_jDGF#-{2b`YvS6J@VDhUqT>36>_{-#y;`dsN> zh93+z%w`S#f*WTa;nn!Zuk?u1fOQYsG;8THRnGoG6^43-t*7>wJZ(E9#K6G7;OXk; Jvd$@?2>{-k$P)kn literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_active@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_active@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..8c81f409d326592bf944d13e7fea01ca58ef479a GIT binary patch literal 869 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_-2;3=Tp1V`K8^y4L*USc zGFt`)hMbZhzhDMNCT12^Hg+CfegP3taS0hYMI~hwH4QBTV>3%DYa2&r?|{&-@TmBN zl+?7$yn@1_vdY@J=9bpBt_c&TO`p49$eDv6flNYYvxOwZ& z-TM!oK6~-(AeR>f-00GcYhFdb&77p=^J^c-w5XV?{5rMgZHoHywDNZ@lUDuU-u0Y6c>a@18$TrU zwwBd5#ouY0BYNw0l7o@ayVrru54|6_nZD)Ub2u-4852_D7i3y(YMnC!1`GnvV z63w>L+a`xAD7}#Xk#v0F^5+ScHr)SuVCCT#2c>4}Dc4PXu6EemQfQ9Eg?BoK7x_Mu zxU@NOUCZSgPa=+=%xpSTSpMwu+9=0j_G$M|Vl0cF z$?HxRVQ0`>{&nLjhRbDQ<&5j~tgmq#*d+Vev&iUn&hdMbOg1K#G`byWvg+^E)@m|f zX%RTm!`ahxM&{RwH7vdo(GG_1Y^SOIvtS6^y?@P$kfZetkKBWFnfLtX+?k)x$Z+!{Uv#j2I@O}7`9?!v&B5e5hiVP~ ztb0`@u~NzStojG8-G!2mBijE~bZXC-^l8?rZSCJgm(*}QwbW{>o_gv9$;fYvI+eWlQpQvp^SosL?M2*XU!xDQugTilv2aeep`p!slT$199p|3& zRy0j|O8?f)TJsHm1|FUDLwS$ePq%V5Nt**LQ(iM$%=z?8{K$vm363{Ui(1&QH}BpN z<*I!ubmFIQ&HOc6{=4mb6ZB8#Df8#toAv8wzy75(?*ZGqq$r;ItM4#=`7eK@fH(W& mhT@;5!rNA#icW}opdVk9erb(qzY_xk1B0ilpUXO@geCy0@8To? literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_selected@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/rotate_selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b6cc48c053351c5ec94b98bcfd108b13af604cff GIT binary patch literal 906 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_V*-3aTp1V`80I}3MYITk z#zZ3y+qx!9oHl*t+y#r5u3EQo^VV(KckbG|Z~x&VM~|I2 zdExqvo40P?xqJV?!>7+)ynOra^SAFme*XIN_uuq{R5=C)#w<@4#}JR>Z>NR_A94_B z4L=}sv}>=nR>FH$?r--tCcAD-di?vpv7JG4;>lw!@wWNj-`LK)TkPHP<9L36@g~9A z$I9EpbIxv>@Xq>y^z*;#WdN)k}qegQXS2;`nthv`d9B!HWOt{Zu&k4V3?u*vh z=?yIcmU7a{tD4G|MlgAqNUxU^E;+m^&3ocbt@@@dJ-P~8-`P%6-DkkiT~;62{Ybw4 Zpm^W9xOb+qd4ix!<>~6@vd$@?2>|Cjq#*zR literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_active.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_active.png new file mode 100644 index 0000000000000000000000000000000000000000..cd63c1d03bca5b4993cf2c2e3e18a233c3b6aa4b GIT binary patch literal 242 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4mJh`h6m-gKNuJoc6z!vhIn+ooxGR#kb!{P zc|lbJ*3=al677>%Z#1%LGN*`3G&FG?t31)geOp|{S&3y*eDeMNzjN(XgDSWmu)TS! z75nGoKJf<^rvKM$I5vOzr{*W0l^B?F8ifnCZG1grb(+7zZKVXxn3oo-+BPy|KX~Y3 zHm~6Gr&lrE4N^O-C%T4YUu9fBBUNz2rs=B>nRn>Ua-D2w(rkEaMT*ArB5tHl6!>JezSriPWON%h z9%M^Cz=G_v_RC?NAN%-K6j&((n_TSGN{> UfY6dV3=9kmp00i_>zopr0EsrR`Tzg` literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_selected.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_selected.png new file mode 100644 index 0000000000000000000000000000000000000000..4cca7726170335abb9f8e413eb4b6245e2da8c10 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|4rT@hhU+WOo?>8N@DA_^ab;j&V3_xiD(H%I z_cM?kB|(0{42-;d0`e+4y2cg>8KoV)6XxtcaOT3b>r)puvNA9*Bzn3yhG!CByd_ZC4WgT(?)Ju!crdU%>#~L!-=i2+ zMrH%f8G%A;bP^OA*9AARdL>J=>M3@3H;K6&{CiNB$2EkN;mQp*8-XAjeUSe=UHx3v IIVCg!0QH4pLI3~& literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_selected@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/scale_selected@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..690cf5f924fc3dbb2146954f62f93b43fdc1bb67 GIT binary patch literal 364 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_LIQk3Tp1V`80I~sE_(G; zse*xlLAoT!FPMRmSwLP#-`K*^!K0#~qj$pec}ox6ef073mmiiHIujTe7}j{YIEHu} ze>?Rw*C7J|*Y{hp9xIy}W?lXL|Nl#;31$=1lDO}F(PLvPN_Zw9l+bHcqQIH*ilN{f z<4h|CvGWJTn5LbQJ+dV{kU8m=btPNF;!~H_DW6=HQ1n?LpY{3C{qyE`mP|Wh{ARaX zuBVN2>)N>2tqXsdNqH~7SNZf@_r0YmlN)acnU~sY3fMEPSzKo%5P6FE{ rkJJ6j`e(bP0l+XkKa`l^( literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index fd17d551d8a..1a1c4b2cd26 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -21,11 +21,32 @@ mockfiles/PlanarScaleHandle.qml mockfiles/ScaleRod.qml mockfiles/ScaleGizmo.qml + mockfiles/ToolbarButton.qml mockfiles/meshes/arrow.mesh mockfiles/meshes/scalerod.mesh mockfiles/images/camera-pick-icon.png mockfiles/images/camera-pick-icon@2x.png mockfiles/images/light-pick-icon.png mockfiles/images/light-pick-icon@2x.png + mockfiles/images/item_selection_active.png + mockfiles/images/item_selection_active@2x.png + mockfiles/images/item_selection_selected.png + mockfiles/images/item_selection_selected@2x.png + mockfiles/images/group_selection_selected.png + mockfiles/images/group_selection_selected@2x.png + mockfiles/images/group_selection_active.png + mockfiles/images/group_selection_active@2x.png + mockfiles/images/move_active.png + mockfiles/images/move_active@2x.png + mockfiles/images/move_selected.png + mockfiles/images/move_selected@2x.png + mockfiles/images/rotate_active.png + mockfiles/images/rotate_active@2x.png + mockfiles/images/rotate_selected.png + mockfiles/images/rotate_selected@2x.png + mockfiles/images/scale_active.png + mockfiles/images/scale_active@2x.png + mockfiles/images/scale_selected.png + mockfiles/images/scale_selected@2x.png From d9981135c1168002f60049a50ed5d6807aca57e3 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Tue, 12 Nov 2019 18:04:40 +0100 Subject: [PATCH 15/59] QmlDesigner: PropertyEditor TextSection cleanup Change-Id: I042f38303aad016d939a39c7a638d330fca2ba58 Reviewed-by: Thomas Hartmann --- .../QtQuick/TextEditSpecifics.qml | 15 ++++- .../QtQuick/TextInputSection.qml | 64 +++++++++++++++++++ .../QtQuick/TextInputSpecifics.qml | 15 ++++- .../QtQuick/TextSpecifics.qml | 3 +- .../HelperWidgets/StandardTextSection.qml | 8 ++- 5 files changed, 97 insertions(+), 8 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextEditSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextEditSpecifics.qml index c1a7a1e8d6d..6a09b44a29c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextEditSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextEditSpecifics.qml @@ -32,8 +32,7 @@ Column { anchors.right: parent.right StandardTextSection { - showIsWrapping: true - useLineEdit: true + showVerticalAlignment: true showFormatProperty: true } @@ -62,6 +61,18 @@ Column { } } + Section { + anchors.left: parent.left + anchors.right: parent.right + caption: qsTr("Selected Text Color") + + ColorEditor { + caption: qsTr("Selected Text Color") + backendValue: backendValues.selectedTextColor + supportGradient: false + } + } + FontSection { showStyle: false } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSection.qml index addcf393dec..0a86f113583 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSection.qml @@ -39,6 +39,16 @@ Section { rows: 4 columns: 2 + Label { + text: qsTr("Mouse selection mode") + } + ComboBox { + Layout.fillWidth: true + backendValue: backendValues.mouseSelectionMode + scope: "TextInput" + model: ["SelectCharacters", "SelectWords"] + } + Label { visible: textInputSection.isTextInput text: qsTr("Input mask") @@ -48,6 +58,7 @@ Section { visible: textInputSection.isTextInput backendValue: backendValues.inputMask Layout.fillWidth: true + showTranslateCheckBox: false } Label { @@ -73,6 +84,33 @@ Section { visible: textInputSection.isTextInput backendValue: backendValues.passwordCharacter Layout.fillWidth: true + showTranslateCheckBox: false + } + + Label { + visible: !textInputSection.isTextInput + text: qsTr("Tab stop distance") + tooltip: qsTr("Sets the default distance, in device units, between tab stops.") + } + SpinBox { + visible: !textInputSection.isTextInput + Layout.fillWidth: true + backendValue: backendValues.tabStopDistance + maximumValue: 200 + minimumValue: 0 + } + + Label { + visible: !textInputSection.isTextInput + text: qsTr("Text margin") + tooltip: qsTr("Sets the margin, in pixels, around the text in the TextEdit..") + } + SpinBox { + visible: !textInputSection.isTextInput + Layout.fillWidth: true + backendValue: backendValues.textMargin + maximumValue: 200 + minimumValue: -200 } Label { @@ -101,10 +139,36 @@ Section { } CheckBox { + visible: textInputSection.isTextInput Layout.fillWidth: true text: qsTr("Auto scroll") backendValue: backendValues.autoScroll } + + CheckBox { + Layout.fillWidth: true + text: qsTr("Overwrite mode") + backendValue: backendValues.overwriteMode + } + + CheckBox { + Layout.fillWidth: true + text: qsTr("Persistent selection") + backendValue: backendValues.persistentSelection + } + + CheckBox { + Layout.fillWidth: true + text: qsTr("Select by mouse") + backendValue: backendValues.selectByMouse + } + + CheckBox { + visible: !textInputSection.isTextInput + Layout.fillWidth: true + text: qsTr("Select by keyboard") + backendValue: backendValues.selectByKeyboard + } } } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSpecifics.qml index 615ce16aefe..29702303b26 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextInputSpecifics.qml @@ -32,8 +32,7 @@ Column { anchors.right: parent.right StandardTextSection { - useLineEdit: false - showIsWrapping: false + showVerticalAlignment: true } Section { @@ -61,6 +60,18 @@ Column { } } + Section { + anchors.left: parent.left + anchors.right: parent.right + caption: qsTr("Selected Text Color") + + ColorEditor { + caption: qsTr("Selected Text Color") + backendValue: backendValues.selectedTextColor + supportGradient: false + } + } + FontSection { showStyle: false } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextSpecifics.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextSpecifics.qml index 64ea73f1cd6..550ffb32408 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextSpecifics.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TextSpecifics.qml @@ -32,12 +32,11 @@ Column { anchors.right: parent.right StandardTextSection { - useLineEdit: true - showIsWrapping: true showVerticalAlignment: true showFormatProperty: true showElide: true showFontSizeMode: true + showLineHeight: true } Section { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/StandardTextSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/StandardTextSection.qml index 917cad87342..6ecc8d525ce 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/StandardTextSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/StandardTextSection.qml @@ -35,9 +35,10 @@ Section { property bool showIsWrapping: false property bool showElide: false property bool showVerticalAlignment: false - property bool useLineEdit: true property bool showFormatProperty: false property bool showFontSizeMode: false + property bool showLineHeight: false + SectionLayout { columns: 2 @@ -46,7 +47,6 @@ Section { text: qsTr("Text") } LineEdit { - //visible: useLineEdit backendValue: backendValues.text Layout.fillWidth: true } @@ -119,10 +119,12 @@ Section { } Label { + visible: showFontSizeMode text: qsTr("Font size mode") toolTip: qsTr("Specifies how the font size of the displayed text is determined.") } ComboBox { + visible: showFontSizeMode scope: "Text" model: ["FixedSize", "HorizontalFit", "VerticalFit", "Fit"] backendValue: backendValues.fontSizeMode @@ -131,11 +133,13 @@ Section { Label { + visible: showLineHeight text: qsTr("Line height") tooltip: qsTr("Sets the line height for the text.") } SpinBox { + visible: showLineHeight Layout.fillWidth: true backendValue: (backendValues.lineHeight === undefined) ? dummyBackendValue : backendValues.lineHeight maximumValue: 500 From 5bb0298f693e82ec829ac6777d68230656d08a69 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Tue, 12 Nov 2019 17:06:06 +0100 Subject: [PATCH 16/59] QmlDesigner Add Binding Editor support to States Change-Id: I3ccce5e2bfbbfa0dfba1e438d527fa18348005b5 Reviewed-by: Thomas Hartmann --- .../statesEditorQmlSources/StatesDelegate.qml | 3 + .../bindingeditor/bindingeditor.cpp | 69 ++++++++++++------- .../components/bindingeditor/bindingeditor.h | 6 ++ .../stateseditor/stateseditormodel.cpp | 5 ++ .../stateseditor/stateseditormodel.h | 1 + 5 files changed, 58 insertions(+), 26 deletions(-) diff --git a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml index 5f044b73f44..9f525f2fc5a 100644 --- a/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml +++ b/share/qtcreator/qmldesigner/statesEditorQmlSources/StatesDelegate.qml @@ -114,6 +114,7 @@ Rectangle { var y = root.mapToGlobal(0,0).y - 32 bindingEditor.showWidget(x, y) bindingEditor.text = delegateWhenConditionString + bindingEditor.prepareBindings() } } @@ -205,6 +206,8 @@ Rectangle { id: bindingEditor + stateModelNodeProperty: statesEditorModel.stateModelNode() + onRejected: { hideWidget() } diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp index c98789587f3..e56822b2a3b 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.cpp @@ -134,7 +134,7 @@ bool BindingEditorWidget::event(QEvent *event) TextEditor::AssistInterface *BindingEditorWidget::createAssistInterface( TextEditor::AssistKind assistKind, TextEditor::AssistReason assistReason) const { - Q_UNUSED(assistKind); + Q_UNUSED(assistKind) return new QmlJSEditor::QmlJSCompletionAssistInterface( document(), position(), QString(), assistReason, qmljsdocument->semanticInfo()); @@ -489,44 +489,56 @@ void BindingEditor::setModelNodeBackend(const QVariant &modelNodeBackend) if (!modelNodeBackend.isNull() && modelNodeBackend.isValid()) { m_modelNodeBackend = modelNodeBackend; + const auto modelNodeBackendObject = m_modelNodeBackend.value(); + + const auto backendObjectCasted = + qobject_cast(modelNodeBackendObject); + + if (backendObjectCasted) { + m_modelNode = backendObjectCasted->qmlObjectNode().modelNode(); + } + emit modelNodeBackendChanged(); } } +void BindingEditor::setStateModelNode(const QVariant &stateModelNode) +{ + if (stateModelNode.isValid()) + { + m_stateModelNode = stateModelNode; + m_modelNode = m_stateModelNode.value(); + + if (m_modelNode.isValid()) + m_backendValueTypeName = "bool"; + + emit stateModelNodeChanged(); + } +} + void BindingEditor::prepareBindings() { - if (m_backendValue.isNull() || m_modelNodeBackend.isNull()) + if (!m_modelNode.isValid() || m_backendValueTypeName.isEmpty()) return; - if (!(m_backendValue.isValid() && m_modelNodeBackend.isValid())) - return; + const QList allNodes = m_modelNode.view()->allModelNodes(); - const auto modelNodeBackendObject = m_modelNodeBackend.value(); + QList bindings; - const auto backendObjectCasted = - qobject_cast(modelNodeBackendObject); + for (auto objnode : allNodes) { + BindingEditorDialog::BindingOption binding; + for (auto propertyName : objnode.metaInfo().propertyNames()) + if (m_backendValueTypeName == objnode.metaInfo().propertyTypeName(propertyName)) + binding.properties.append(QString::fromUtf8(propertyName)); - if (backendObjectCasted) { - const QmlDesigner::ModelNode a = backendObjectCasted->qmlObjectNode().modelNode(); - const QList allNodes = a.view()->allModelNodes(); - - QList bindings; - - for (auto objnode : allNodes) { - BindingEditorDialog::BindingOption binding; - for (auto propertyName : objnode.metaInfo().propertyNames()) - if (m_backendValueTypeName == objnode.metaInfo().propertyTypeName(propertyName)) - binding.properties.append(QString::fromUtf8(propertyName)); - - if (!binding.properties.isEmpty() && objnode.hasId()) { - binding.item = objnode.displayName(); - bindings.append(binding); - } + if (!binding.properties.isEmpty() && objnode.hasId()) { + binding.item = objnode.displayName(); + bindings.append(binding); } - - if (!bindings.isEmpty() && !m_dialog.isNull()) - m_dialog->setAllBindings(bindings); } + + if (!bindings.isEmpty() && !m_dialog.isNull()) + m_dialog->setAllBindings(bindings); } QVariant BindingEditor::backendValue() const @@ -539,5 +551,10 @@ QVariant BindingEditor::modelNodeBackend() const return m_modelNodeBackend; } +QVariant BindingEditor::stateModelNode() const +{ + return m_stateModelNode; +} + } diff --git a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h index 78614004770..a1deb741080 100644 --- a/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h +++ b/src/plugins/qmldesigner/components/bindingeditor/bindingeditor.h @@ -144,6 +144,7 @@ class BindingEditor : public QObject Q_PROPERTY(QString text READ bindingValue WRITE setBindingValue) Q_PROPERTY(QVariant backendValueProperty READ backendValue WRITE setBackendValue NOTIFY backendValueChanged) Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend NOTIFY modelNodeBackendChanged) + Q_PROPERTY(QVariant stateModelNodeProperty READ stateModelNode WRITE setStateModelNode NOTIFY stateModelNodeChanged) public: BindingEditor(QObject *parent = nullptr); @@ -159,6 +160,7 @@ public: void setBackendValue(const QVariant &backendValue); void setModelNodeBackend(const QVariant &modelNodeBackend); + void setStateModelNode(const QVariant &stateModelNode); Q_INVOKABLE void prepareBindings(); @@ -167,15 +169,19 @@ signals: void rejected(); void backendValueChanged(); void modelNodeBackendChanged(); + void stateModelNodeChanged(); private: QVariant backendValue() const; QVariant modelNodeBackend() const; + QVariant stateModelNode() const; private: QPointer m_dialog; QVariant m_backendValue; QVariant m_modelNodeBackend; + QVariant m_stateModelNode; + QmlDesigner::ModelNode m_modelNode; TypeName m_backendValueTypeName; }; diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp index 5676cc2ca40..d5e21ebe945 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.cpp @@ -216,4 +216,9 @@ QStringList StatesEditorModel::autoComplete(const QString &text, int pos, bool e return QStringList(); } +QVariant StatesEditorModel::stateModelNode() +{ + return QVariant::fromValue(m_statesEditorView->currentStateNode()); +} + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h index 2ea806c9bad..40cad6efefc 100644 --- a/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h +++ b/src/plugins/qmldesigner/components/stateseditor/stateseditormodel.h @@ -61,6 +61,7 @@ public: Q_INVOKABLE void setWhenCondition(int internalNodeId, const QString &condition); Q_INVOKABLE void resetWhenCondition(int internalNodeId); Q_INVOKABLE QStringList autoComplete(const QString &text, int pos, bool explicitComplete); + Q_INVOKABLE QVariant stateModelNode(); void reset(); From a48497d66329a769361a92308068797cc84f15f0 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Wed, 13 Nov 2019 11:49:42 +0100 Subject: [PATCH 17/59] QmlDesigner: Fix filename spelling in qrc Change-Id: I90fb27156d51ad5160b57ea476017a17dc757043 Reviewed-by: Robert Loehning --- share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index 1a1c4b2cd26..fbdec743e41 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -21,7 +21,7 @@ mockfiles/PlanarScaleHandle.qml mockfiles/ScaleRod.qml mockfiles/ScaleGizmo.qml - mockfiles/ToolbarButton.qml + mockfiles/ToolBarButton.qml mockfiles/meshes/arrow.mesh mockfiles/meshes/scalerod.mesh mockfiles/images/camera-pick-icon.png From 7f8576d49f54f9aaa448aa97677bd7701c4fca80 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 13 Nov 2019 18:37:27 +0100 Subject: [PATCH 18/59] McuSupport: Improve kit creation UX Create a kit only for the currently selected target. Kits are listed as auto-detected. Extisting, auto-detected kits with same name get replaced with new ones. Less text in the UI. Change-Id: I89f952cc6ff694dc5c2750ebf9a7698d7839ec3a Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 83 ++++++++++--------- src/plugins/mcusupport/mcusupportoptions.h | 6 +- .../mcusupport/mcusupportoptionspage.cpp | 74 +++++++++-------- 3 files changed, 89 insertions(+), 74 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 91d69ceb8d6..916b8894879 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -90,11 +90,6 @@ QWidget *PackageOptions::widget() m_widget = new QWidget; m_fileChooser = new Utils::PathChooser; - QObject::connect(m_fileChooser, &Utils::PathChooser::pathChanged, - [this](){ - updateStatus(); - emit changed(); - }); auto layout = new QGridLayout(m_widget); layout->setContentsMargins(0, 0, 0, 0); @@ -119,7 +114,15 @@ QWidget *PackageOptions::widget() layout->addWidget(m_statusIcon, 1, 0); layout->addWidget(m_statusLabel, 1, 1, 1, -1); - m_fileChooser->setPath(m_path); // Triggers updateStatus() call + m_fileChooser->setPath(m_path); + + QObject::connect(m_fileChooser, &Utils::PathChooser::pathChanged, + [this](){ + updateStatus(); + emit changed(); + }); + + updateStatus(); return m_widget; } @@ -229,6 +232,13 @@ QVector BoardOptions::packages() const return m_packages; } +bool BoardOptions::isValid() const +{ + return !Utils::anyOf(packages(), [](PackageOptions *package) { + return package->status() != PackageOptions::ValidPackage; + }); +} + QString BoardOptions::vendor() const { return m_vendor; @@ -404,14 +414,6 @@ McuSupportOptions::~McuSupportOptions() boards.clear(); } -QVector McuSupportOptions::validBoards() const -{ - return Utils::filtered(boards, [](BoardOptions *board){ - return !Utils::anyOf(board->packages(), [](PackageOptions *package){ - return package->status() != PackageOptions::ValidPackage;}); - }); -} - static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path, Core::Id language) { using namespace ProjectExplorer; @@ -451,7 +453,8 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k, k->setUnexpandedDisplayName(kitName); k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor()); k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); - k->setAutoDetected(false); + k->setAutoDetected(true); + k->makeSticky(); if (!isDesktop(board)) { k->setIrrelevantAspects({SysRootKitAspect::id(), "QtSupport.QtInformation" // QtKitAspect::id() @@ -552,34 +555,38 @@ QString McuSupportOptions::kitName(const BoardOptions *board) const return QString::fromLatin1("QtMCU - %1 %2").arg(board->vendor(), board->model()); } -ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board) +QList McuSupportOptions::existingKits(const BoardOptions *board) +{ + using namespace ProjectExplorer; + const QString boardKitName = kitName(board); + return Utils::filtered(KitManager::kits(), [&boardKitName](Kit *kit) { + return kit->isAutoDetected() && kit->unexpandedDisplayName() == boardKitName; + }); +} + +ProjectExplorer::Kit *McuSupportOptions::newKit(const BoardOptions* board) { using namespace ProjectExplorer; - Kit *kit = KitManager::kit([board](const Kit *k){ - return board->model() == k->value(Constants::KIT_BOARD_MODEL_KEY).toString(); - }); - if (!kit) { - const QString armGccPath = toolchainPackage->path(); - const QString qulDir = qulSdkPackage->path(); - const auto init = [this, board](Kit *k) { - KitGuard kitGuard(k); + const QString armGccPath = toolchainPackage->path(); + const QString qulDir = qulSdkPackage->path(); + const auto init = [this, board](Kit *k) { + KitGuard kitGuard(k); - setKitProperties(kitName(board), k, board); - if (!isDesktop(board)) { - setKitToolchains(k, toolchainPackage->path()); - setKitDebugger(k, toolchainPackage->path()); - setKitDevice(k); - } - setKitEnvironment(k, board); - setKitCMakeOptions(k, board, qulSdkPackage->path()); + setKitProperties(kitName(board), k, board); + if (!isDesktop(board)) { + setKitToolchains(k, toolchainPackage->path()); + setKitDebugger(k, toolchainPackage->path()); + setKitDevice(k); + } + setKitEnvironment(k, board); + setKitCMakeOptions(k, board, qulSdkPackage->path()); - k->setup(); - k->fix(); - }; - kit = KitManager::registerKit(init); - } - return kit; + k->setup(); + k->fix(); + }; + + return KitManager::registerKit(init); } } // Internal diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index c5d64171a9e..2cf4bd61a17 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -109,6 +109,7 @@ public: QString toolChainFile() const; QString qulPlatform() const; QVector packages() const; + bool isValid() const; private: const QString m_vendor; @@ -126,8 +127,6 @@ public: McuSupportOptions(QObject *parent = nullptr); ~McuSupportOptions() override; - QVector validBoards() const; - QVector packages; QVector boards; PackageOptions *toolchainPackage = nullptr; @@ -135,7 +134,8 @@ public: QString kitName(const BoardOptions* board) const; - ProjectExplorer::Kit *kit(const BoardOptions* board); + QList existingKits(const BoardOptions* board); + ProjectExplorer::Kit *newKit(const BoardOptions* board); signals: void changed(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 3ddf08fd2ab..73f39cb42ba 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -28,6 +28,7 @@ #include "mcusupportoptions.h" #include +#include #include #include #include @@ -49,16 +50,17 @@ public: McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent = nullptr); void updateStatus(); - void showBoardPackages(int boardIndex); + void showBoardPackages(); + BoardOptions *currentBoard() const; private: QString m_armGccPath; const McuSupportOptions *m_options; - int m_currentBoardIndex = 0; QMap m_packageWidgets; QMap m_boardPacketWidgets; QFormLayout *m_packagesLayout = nullptr; QLabel *m_statusLabel = nullptr; + QComboBox *m_boardComboBox = nullptr; }; McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent) @@ -70,14 +72,14 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option auto boardChooserlayout = new QHBoxLayout; auto boardChooserLabel = new QLabel(McuSupportOptionsPage::tr("Target:")); boardChooserlayout->addWidget(boardChooserLabel); - auto boardComboBox = new QComboBox; - boardChooserLabel->setBuddy(boardComboBox); + m_boardComboBox = new QComboBox; + boardChooserLabel->setBuddy(m_boardComboBox); boardChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - boardComboBox->addItems( + m_boardComboBox->addItems( Utils::transform(m_options->boards, [this](BoardOptions *b){ return m_options->kitName(b); })); - boardChooserlayout->addWidget(boardComboBox); + boardChooserlayout->addWidget(m_boardComboBox); mainLayout->addLayout(boardChooserlayout); auto m_packagesGroupBox = new QGroupBox(McuSupportOptionsPage::tr("Packages")); @@ -85,56 +87,59 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option m_packagesLayout = new QFormLayout; m_packagesGroupBox->setLayout(m_packagesLayout); - mainLayout->addStretch(1); - m_statusLabel = new QLabel; - mainLayout->addWidget(m_statusLabel); - m_statusLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding); + mainLayout->addWidget(m_statusLabel, 2); m_statusLabel->setWordWrap(true); - m_statusLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); + m_statusLabel->setAlignment(Qt::AlignBottom | Qt::AlignLeft); connect(options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus); - connect(boardComboBox, QOverload::of(&QComboBox::currentIndexChanged), + connect(m_boardComboBox, &QComboBox::currentTextChanged, this, &McuSupportOptionsWidget::showBoardPackages); - showBoardPackages(m_currentBoardIndex); + showBoardPackages(); + updateStatus(); } void McuSupportOptionsWidget::updateStatus() { - const QVector validBoards = m_options->validBoards(); + const BoardOptions *board = currentBoard(); + if (!board) + return; - QString list("
    "); - for (auto board : validBoards) - list.append("
  • " + m_options->kitName(board) + "
  • "); - list.append("
"); - - m_statusLabel->setText( - validBoards.isEmpty() - ? QString::fromLatin1("No kits can currently be generated. " - "Select a target and provide the package paths. " - "Afterwards, press Apply to generate a kit for your target.") - : QString::fromLatin1("The following Kits can be generated: %1 " - "Press Apply to generate a kit for your target.").arg(list)); + m_statusLabel->setText(board->isValid() + ? QString::fromLatin1("A kit %1 for the selected target can be generated. " + "Press Apply to generate it.").arg(m_options->kitName(board)) + : QString::fromLatin1("Provide the package paths in order to create a kit for " + "your target.")); } -void McuSupportOptionsWidget::showBoardPackages(int boardIndex) +void McuSupportOptionsWidget::showBoardPackages() { + const BoardOptions *board = currentBoard(); + if (!board) + return; + while (m_packagesLayout->rowCount() > 0) { QFormLayout::TakeRowResult row = m_packagesLayout->takeRow(0); row.labelItem->widget()->hide(); row.fieldItem->widget()->hide(); } - const BoardOptions *currentBoard = m_options->boards.at(boardIndex); - for (auto package : m_options->packages) { QWidget *packageWidget = package->widget(); - if (!currentBoard->packages().contains(package)) + if (!board->packages().contains(package)) continue; m_packagesLayout->addRow(package->label(), packageWidget); packageWidget->show(); } + + updateStatus(); +} + +BoardOptions *McuSupportOptionsWidget::currentBoard() const +{ + const int boardIndex = m_boardComboBox->currentIndex(); + return m_options->boards.isEmpty() ? nullptr : m_options->boards.at(boardIndex); } McuSupportOptionsPage::McuSupportOptionsPage(QObject* parent) @@ -162,12 +167,15 @@ void McuSupportOptionsPage::apply() QTC_ASSERT(m_options->toolchainPackage, return); QTC_ASSERT(m_options->qulSdkPackage, return); - const QVector validBoards = m_options->validBoards(); + const BoardOptions *board = m_widget->currentBoard(); + if (!board) + return; using namespace ProjectExplorer; - for (auto board : validBoards) - m_options->kit(board); + for (auto existingKit : m_options->existingKits(board)) + ProjectExplorer::KitManager::deregisterKit(existingKit); + m_options->newKit(board); } void McuSupportOptionsPage::finish() From a035635f1fd901a94dc79c978ab5492be9d49fd6 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 13 Nov 2019 23:32:51 +0100 Subject: [PATCH 19/59] McuSupport: Add compilers to CMake configuration To get rid of the warning triangle on the kit icon, CMAKE_CXX_COMPILER and CMAKE_C_COMPILER get defined. Change-Id: I40ee47e4059e8986557609048f465972985e3d5b Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 916b8894879..8a639c6705f 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -533,6 +533,8 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar using namespace CMakeProjectManager; CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); + config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}")); + config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}")); if (!board->toolChainFile().isEmpty()) config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", (qulDir + "/" + board->toolChainFile()).toUtf8())); From 0d35690682ec9735760dce2a4fe5c52a54c20989 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 13 Nov 2019 23:39:08 +0100 Subject: [PATCH 20/59] McuSupport: Assign "QtMCU Qt Desktop" kit the QtMCU icon It is in fact more a QtMCU kit than a (Desktop) Qt kit. Change-Id: If55699c13f76f75b8326074f9d7c1989f571dd7c Reviewed-by: Alessandro Portale --- src/plugins/mcusupport/mcusupportoptions.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 8a639c6705f..9aa219d7ec3 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -455,7 +455,9 @@ static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k, k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); k->setAutoDetected(true); k->makeSticky(); - if (!isDesktop(board)) { + if (isDesktop(board)) { + k->setDeviceTypeForIcon(Constants::DEVICE_TYPE); + } else { k->setIrrelevantAspects({SysRootKitAspect::id(), "QtSupport.QtInformation" // QtKitAspect::id() }); From 05ef46efdb54752e36535b39f938f0edc972c9ef Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 31 Oct 2019 14:14:17 +0100 Subject: [PATCH 21/59] BinEditor: Fix a dead store Change-Id: I44d8a60037f02f4467ea085e4ad0d366c6c7aa86 Reviewed-by: hjk --- src/plugins/bineditor/bineditorwidget.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/plugins/bineditor/bineditorwidget.cpp b/src/plugins/bineditor/bineditorwidget.cpp index 561b133925a..9cf0a06c4d1 100644 --- a/src/plugins/bineditor/bineditorwidget.cpp +++ b/src/plugins/bineditor/bineditorwidget.cpp @@ -1179,7 +1179,6 @@ QString BinEditorWidget::toolTip(const QHelpEvent *helpEvent) const if (!pos) return QString(); selStart = pos.value(); - selEnd = selStart; byteCount = 1; } From 4973af165ee3b8ec010be97084c87f1910c3dcc7 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 14 Nov 2019 10:38:12 +0100 Subject: [PATCH 22/59] McuSupport: Unify and clean-up strings that end up in the settings Change-Id: I65c10f6865f8f2a4670c5bc9a8c7269488dd937e Reviewed-by: Aurindam Jana --- src/plugins/mcusupport/mcusupportconstants.h | 10 +--------- src/plugins/mcusupport/mcusupportoptions.cpp | 12 ++++++------ 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportconstants.h b/src/plugins/mcusupport/mcusupportconstants.h index 4643ed34758..6d63a3f1e22 100644 --- a/src/plugins/mcusupport/mcusupportconstants.h +++ b/src/plugins/mcusupport/mcusupportconstants.h @@ -28,23 +28,15 @@ namespace McuSupport { namespace Constants { -const char TOOLCHAIN_TYPEID[] = "McuSupport.ToolChain.ARM-GCC"; const char DEVICE_TYPE[] = "McuSupport.DeviceType"; const char DEVICE_ID[] = "McuSupport.Device"; -const char MCUSUPPORT_QT_VERSION[] = "Qt4ProjectManager.QtVersion.McuSupport"; const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration"; const char SETTINGS_ID[] = "CC.McuSupport.Configuration"; const char KIT_BOARD_VENDOR_KEY[] = "McuSupport.BoardVendor"; const char KIT_BOARD_MODEL_KEY[] = "McuSupport.BoardModel"; -const char ENVVAR_ARMGCC_DIR[] = "ARMGCC_DIR"; -const char ENVVAR_STM32CUBE_FW_F7_SDK_PATH[] = "STM32Cube_FW_F7_SDK_PATH"; - const char SETTINGS_GROUP[] = "McuSupport"; -const char SETTINGS_KEY_PACKAGE_PREFIX[] = "package_"; -const char SETTINGS_KEY_PACKAGE_ARMGCC[] = "ArmGcc"; -const char SETTINGS_KEY_STM32CUBE_FW_F7_SDK_PATH[] = "STM32Cube_FW_F7_SDK_PATH"; -const char SETTINGS_KEY_STM32CUBE_PROGRAMMER_PATH[] = "STM32Cube_Cube_Programmer_Path"; +const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_"; } // namespace McuSupport } // namespace Constants diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 9aa219d7ec3..6f8c65da75c 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -250,7 +250,7 @@ static PackageOptions *createQulPackage() PackageOptions::tr("Qt MCU SDK"), QDir::homePath(), Utils::HostOsInfo::withExecutableSuffix("bin/qmltocpp"), - "qulSdk"); + "QtMCUSdk"); result->setEnvironmentVariableName("Qul_DIR"); return result; } @@ -281,7 +281,7 @@ static PackageOptions *createArmGccPackage() PackageOptions::tr("GNU Arm Embedded Toolchain"), defaultPath, Utils::HostOsInfo::withExecutableSuffix("bin/arm-none-eabi-g++"), - Constants::SETTINGS_KEY_PACKAGE_ARMGCC); + "GNUArmEmbeddedToolchain"); result->setDownloadUrl( "https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads"); result->setEnvironmentVariableName(envVar); @@ -294,7 +294,7 @@ static PackageOptions *createStm32CubeFwF7SdkPackage() PackageOptions::tr("STM32Cube SDK"), "%{Env:STM32Cube_FW_F7_SDK_PATH}", "Drivers/STM32F7xx_HAL_Driver", - "stm32CubeFwF7Sdk"); + "Stm32CubeFwF7Sdk"); result->setDownloadUrl( "https://www.st.com/content/st_com/en/products/embedded-software/mcus-embedded-software/stm32-embedded-software/stm32cube-mcu-packages/stm32cubef7.html"); result->setEnvironmentVariableName("STM32Cube_FW_F7_SDK_PATH"); @@ -313,7 +313,7 @@ static PackageOptions *createStm32CubeProgrammerPackage() defaultPath, QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "/bin/STM32_Programmer_CLI.exe" : "/bin/STM32_Programmer.sh"), - "stm32CubeProgrammer"); + "Stm32CubeProgrammer"); result->setRelativePathModifier("/bin"); result->setDownloadUrl( "https://www.st.com/en/development-tools/stm32cubeprog.html"); @@ -327,7 +327,7 @@ static PackageOptions *createEvkbImxrt1050SdkPackage() PackageOptions::tr("NXP i.MXRT SDK"), "%{Env:EVKB_IMXRT1050_SDK_PATH}", // TODO: Try to not use 1050 specifics "EVKB-IMXRT1050_manifest_v3_5.xml", - "evkbImxrt1050Sdk"); + "EvkbImxrt1050Sdk"); result->setDownloadUrl("https://mcuxpresso.nxp.com/en/welcome"); return result; } @@ -343,7 +343,7 @@ static PackageOptions *createSeggerJLinkPackage() PackageOptions::tr("SEGGER JLink"), defaultPath, Utils::HostOsInfo::withExecutableSuffix("JLink"), - "seggerJLink"); + "SeggerJLink"); result->setDownloadUrl("https://www.segger.com/downloads/jlink"); result->setEnvironmentVariableName("SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH"); return result; From 631efb8611bdebdbcaf3c07beca9b5aaed933069 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 14 Nov 2019 11:26:07 +0100 Subject: [PATCH 23/59] McuSupport: Use the official product name "Qt for MCUs" a bit more ... for the Kit names and the SDK path label Change-Id: Idb87b20c944760e599df5edb4b1eafc7d28bde92 Reviewed-by: hjk --- src/plugins/mcusupport/mcusupportoptions.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 6f8c65da75c..437b75aa7f6 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -247,7 +247,7 @@ QString BoardOptions::vendor() const static PackageOptions *createQulPackage() { auto result = new PackageOptions( - PackageOptions::tr("Qt MCU SDK"), + PackageOptions::tr("Qt for MCUs SDK"), QDir::homePath(), Utils::HostOsInfo::withExecutableSuffix("bin/qmltocpp"), "QtMCUSdk"); @@ -556,7 +556,7 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar QString McuSupportOptions::kitName(const BoardOptions *board) const { // TODO: get version from qulSdkPackage and insert into name - return QString::fromLatin1("QtMCU - %1 %2").arg(board->vendor(), board->model()); + return QString::fromLatin1("Qt for MCUs - %1 %2").arg(board->vendor(), board->model()); } QList McuSupportOptions::existingKits(const BoardOptions *board) From cca33e2e2695773890660002608ec59330e118d1 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Thu, 14 Nov 2019 15:50:00 +0100 Subject: [PATCH 24/59] CMake: Do not make the CMake tool invalid on timeout Do no mark the CMake tool as invalid when it times out when fetching auto-completion information. This happens the first time a CMakeLists.txt file is edited in Creator. Also increase the timeout so that there is less of a chance to trigger have the information retrival time out -- which breaks auto-completion of cmake variables, etc. in the CMakeLists.txt editor. Closes: QTCREATORBUG-18530 Change-Id: I914377a6ece90c6f78ea5eb007da8fbe07785563 Reviewed-by: Cristian Adam Reviewed-by: Alessandro Portale --- src/plugins/cmakeprojectmanager/cmaketool.cpp | 75 +++++++++---------- src/plugins/cmakeprojectmanager/cmaketool.h | 2 +- 2 files changed, 37 insertions(+), 40 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp index 361e0acd889..c1623bcebf2 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp @@ -105,7 +105,7 @@ class IntrospectionData { public: bool m_didAttemptToRun = false; - bool m_didRun = false; + bool m_didRun = true; bool m_hasServerMode = false; bool m_queriedServerMode = false; @@ -200,26 +200,17 @@ bool CMakeTool::isValid() const return m_introspection->m_didRun; } -Utils::SynchronousProcessResponse CMakeTool::run(const QStringList &args, bool mayFail) const +Utils::SynchronousProcessResponse CMakeTool::run(const QStringList &args, int timeoutS) const { - if (m_introspection->m_didAttemptToRun && !m_introspection->m_didRun) { - Utils::SynchronousProcessResponse response; - response.result = Utils::SynchronousProcessResponse::StartFailed; - return response; - } - Utils::SynchronousProcess cmake; - cmake.setTimeoutS(1); + cmake.setTimeoutS(timeoutS); cmake.setFlags(Utils::SynchronousProcess::UnixTerminalDisabled); Utils::Environment env = Utils::Environment::systemEnvironment(); Utils::Environment::setupEnglishOutput(&env); cmake.setProcessEnvironment(env.toProcessEnvironment()); cmake.setTimeOutMessageBoxEnabled(false); - Utils::SynchronousProcessResponse response = cmake.runBlocking({cmakeExecutable(), args}); - m_introspection->m_didAttemptToRun = true; - m_introspection->m_didRun = mayFail ? true : (response.result == Utils::SynchronousProcessResponse::Finished); - return response; + return cmake.runBlocking({cmakeExecutable(), args}); } QVariantMap CMakeTool::toMap() const @@ -280,21 +271,21 @@ QList CMakeTool::supportedGenerators() const TextEditor::Keywords CMakeTool::keywords() { - if (m_introspection->m_functions.isEmpty()) { + if (m_introspection->m_functions.isEmpty() && m_introspection->m_didRun) { Utils::SynchronousProcessResponse response; - response = run({"--help-command-list"}); + response = run({"--help-command-list"}, 5); if (response.result == Utils::SynchronousProcessResponse::Finished) m_introspection->m_functions = response.stdOut().split('\n'); - response = run({"--help-commands"}); + response = run({"--help-commands"}, 5); if (response.result == Utils::SynchronousProcessResponse::Finished) parseFunctionDetailsOutput(response.stdOut()); - response = run({"--help-property-list"}); + response = run({"--help-property-list"}, 5); if (response.result == Utils::SynchronousProcessResponse::Finished) m_introspection->m_variables = parseVariableOutput(response.stdOut()); - response = run({"--help-variable-list"}); + response = run({"--help-variable-list"}, 5); if (response.result == Utils::SynchronousProcessResponse::Finished) { m_introspection->m_variables.append(parseVariableOutput(response.stdOut())); m_introspection->m_variables = Utils::filteredUnique(m_introspection->m_variables); @@ -377,6 +368,11 @@ CMakeTool::ReaderType CMakeTool::readerType() const void CMakeTool::readInformation(CMakeTool::QueryType type) const { + if (!m_introspection->m_didRun && m_introspection->m_didAttemptToRun) + return; + + m_introspection->m_didAttemptToRun = true; + if ((type == QueryType::GENERATORS && !m_introspection->m_generators.isEmpty()) || (type == QueryType::SERVER_MODE && m_introspection->m_queriedServerMode) || (type == QueryType::VERSION && !m_introspection->m_version.fullVersion.isEmpty())) @@ -386,18 +382,16 @@ void CMakeTool::readInformation(CMakeTool::QueryType type) const fetchFromCapabilities(); m_introspection->m_triedCapabilities = true; m_introspection->m_queriedServerMode = true; // Got added after "-E capabilities" support! - if (type == QueryType::GENERATORS && !m_introspection->m_generators.isEmpty()) - return; - } - - if (type == QueryType::GENERATORS) { - fetchGeneratorsFromHelp(); - } else if (type == QueryType::SERVER_MODE) { - // Nothing to do... - } else if (type == QueryType::VERSION) { - fetchVersionFromVersionOutput(); } else { - QTC_ASSERT(false, return ); + if (type == QueryType::GENERATORS) { + fetchGeneratorsFromHelp(); + } else if (type == QueryType::SERVER_MODE) { + // Nothing to do... + } else if (type == QueryType::VERSION) { + fetchVersionFromVersionOutput(); + } else { + QTC_ASSERT(false, return ); + } } } @@ -495,9 +489,11 @@ QStringList CMakeTool::parseVariableOutput(const QString &output) void CMakeTool::fetchGeneratorsFromHelp() const { Utils::SynchronousProcessResponse response = run({"--help"}); - if (response.result != Utils::SynchronousProcessResponse::Finished) - return; - parseGeneratorsFromHelp(response.stdOut().split('\n')); + m_introspection->m_didRun = m_introspection->m_didRun + && response.result == Utils::SynchronousProcessResponse::Finished; + + if (response.result == Utils::SynchronousProcessResponse::Finished) + parseGeneratorsFromHelp(response.stdOut().split('\n')); } void CMakeTool::parseGeneratorsFromHelp(const QStringList &lines) const @@ -550,10 +546,12 @@ void CMakeTool::parseGeneratorsFromHelp(const QStringList &lines) const void CMakeTool::fetchVersionFromVersionOutput() const { Utils::SynchronousProcessResponse response = run({"--version"}); - if (response.result != Utils::SynchronousProcessResponse::Finished) - return; - parseVersionFormVersionOutput(response.stdOut().split('\n')); + m_introspection->m_didRun = m_introspection->m_didRun + && response.result == Utils::SynchronousProcessResponse::Finished; + + if (response.result == Utils::SynchronousProcessResponse::Finished) + parseVersionFormVersionOutput(response.stdOut().split('\n')); } void CMakeTool::parseVersionFormVersionOutput(const QStringList &lines) const @@ -574,11 +572,10 @@ void CMakeTool::parseVersionFormVersionOutput(const QStringList &lines) const void CMakeTool::fetchFromCapabilities() const { - Utils::SynchronousProcessResponse response = run({"-E", "capabilities"}, true); - if (response.result != Utils::SynchronousProcessResponse::Finished) - return; + Utils::SynchronousProcessResponse response = run({"-E", "capabilities"}); - parseFromCapabilities(response.stdOut()); + if (response.result == Utils::SynchronousProcessResponse::Finished) + parseFromCapabilities(response.stdOut()); } static int getVersion(const QVariantMap &obj, const QString value) diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h index 579f6e4d722..878cffb7483 100644 --- a/src/plugins/cmakeprojectmanager/cmaketool.h +++ b/src/plugins/cmakeprojectmanager/cmaketool.h @@ -122,7 +122,7 @@ private: }; void readInformation(QueryType type) const; - Utils::SynchronousProcessResponse run(const QStringList &args, bool mayFail = false) const; + Utils::SynchronousProcessResponse run(const QStringList &args, int timeoutS = 1) const; void parseFunctionDetailsOutput(const QString &output); QStringList parseVariableOutput(const QString &output); From a2355841f5f4bba4255940e89b9fb5d0cac38df7 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Fri, 15 Nov 2019 08:38:55 +0100 Subject: [PATCH 25/59] McuSupport: Rename internal types "PackageOptions" -> "McuPackage" "BoardOptions" -> "McuTarget" "qul" -> "qtForMCUs" Change-Id: I209cc82c7516fbf6a960b26c440159dbab02a4db Reviewed-by: hjk --- src/plugins/mcusupport/mcusupportconstants.h | 4 +- src/plugins/mcusupport/mcusupportoptions.cpp | 230 +++++++++--------- src/plugins/mcusupport/mcusupportoptions.h | 30 +-- .../mcusupport/mcusupportoptionspage.cpp | 73 +++--- .../mcusupport/mcusupportrunconfiguration.cpp | 2 +- 5 files changed, 175 insertions(+), 164 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportconstants.h b/src/plugins/mcusupport/mcusupportconstants.h index 6d63a3f1e22..cc9233eee4f 100644 --- a/src/plugins/mcusupport/mcusupportconstants.h +++ b/src/plugins/mcusupport/mcusupportconstants.h @@ -32,8 +32,8 @@ const char DEVICE_TYPE[] = "McuSupport.DeviceType"; const char DEVICE_ID[] = "McuSupport.Device"; const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration"; const char SETTINGS_ID[] = "CC.McuSupport.Configuration"; -const char KIT_BOARD_VENDOR_KEY[] = "McuSupport.BoardVendor"; -const char KIT_BOARD_MODEL_KEY[] = "McuSupport.BoardModel"; +const char KIT_MCUTARGET_VENDOR_KEY[] = "McuSupport.McuTargetVendor"; +const char KIT_MCUTARGET_MODEL_KEY[] = "McuSupport.McuTargetModel"; const char SETTINGS_GROUP[] = "McuSupport"; const char SETTINGS_KEY_PACKAGE_PREFIX[] = "Package_"; diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 437b75aa7f6..ed678c575cb 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -54,8 +54,8 @@ namespace McuSupport { namespace Internal { -PackageOptions::PackageOptions(const QString &label, const QString &defaultPath, - const QString &detectionPath, const QString &settingsKey) +McuPackage::McuPackage(const QString &label, const QString &defaultPath, + const QString &detectionPath, const QString &settingsKey) : m_label(label) , m_defaultPath(defaultPath) , m_detectionPath(detectionPath) @@ -68,22 +68,22 @@ PackageOptions::PackageOptions(const QString &label, const QString &defaultPath, s->endGroup(); } -QString PackageOptions::path() const +QString McuPackage::path() const { return QFileInfo(m_fileChooser->path() + m_relativePathModifier).absoluteFilePath(); } -QString PackageOptions::label() const +QString McuPackage::label() const { return m_label; } -QString PackageOptions::detectionPath() const +QString McuPackage::detectionPath() const { return m_detectionPath; } -QWidget *PackageOptions::widget() +QWidget *McuPackage::widget() { if (m_widget) return m_widget; @@ -126,37 +126,37 @@ QWidget *PackageOptions::widget() return m_widget; } -PackageOptions::Status PackageOptions::status() const +McuPackage::Status McuPackage::status() const { return m_status; } -void PackageOptions::setDownloadUrl(const QString &url) +void McuPackage::setDownloadUrl(const QString &url) { m_downloadUrl = url; } -void PackageOptions::setEnvironmentVariableName(const QString &name) +void McuPackage::setEnvironmentVariableName(const QString &name) { m_environmentVariableName = name; } -QString PackageOptions::environmentVariableName() const +QString McuPackage::environmentVariableName() const { return m_environmentVariableName; } -void PackageOptions::setAddToPath(bool addToPath) +void McuPackage::setAddToPath(bool addToPath) { m_addToPath = addToPath; } -bool PackageOptions::addToPath() const +bool McuPackage::addToPath() const { return m_addToPath; } -void PackageOptions::writeToSettings() const +void McuPackage::writeToSettings() const { if (m_path.compare(m_defaultPath) == 0) return; @@ -166,12 +166,12 @@ void PackageOptions::writeToSettings() const s->endGroup(); } -void PackageOptions::setRelativePathModifier(const QString &path) +void McuPackage::setRelativePathModifier(const QString &path) { m_relativePathModifier = path; } -void PackageOptions::updateStatus() +void McuPackage::updateStatus() { m_path = m_fileChooser->rawPath(); const bool validPath = m_fileChooser->isValid(); @@ -201,9 +201,9 @@ void PackageOptions::updateStatus() m_statusLabel->setText(statusText); } -BoardOptions::BoardOptions(const QString &vendor, const QString &model, - const QString &toolChainFileName, const QString &qulPlatform, - const QVector &packages) +McuTarget::McuTarget(const QString &vendor, const QString &model, + const QString &toolChainFileName, const QString &qulPlatform, + const QVector &packages) : m_vendor(vendor) , m_model(model) , m_toolChainFile(toolChainFileName) @@ -212,42 +212,42 @@ BoardOptions::BoardOptions(const QString &vendor, const QString &model, { } -QString BoardOptions::model() const +QString McuTarget::model() const { return m_model; } -QString BoardOptions::toolChainFile() const +QString McuTarget::toolChainFile() const { return m_toolChainFile; } -QString BoardOptions::qulPlatform() const +QString McuTarget::qulPlatform() const { return m_qulPlatform; } -QVector BoardOptions::packages() const +QVector McuTarget::packages() const { return m_packages; } -bool BoardOptions::isValid() const +bool McuTarget::isValid() const { - return !Utils::anyOf(packages(), [](PackageOptions *package) { - return package->status() != PackageOptions::ValidPackage; + return !Utils::anyOf(packages(), [](McuPackage *package) { + return package->status() != McuPackage::ValidPackage; }); } -QString BoardOptions::vendor() const +QString McuTarget::vendor() const { return m_vendor; } -static PackageOptions *createQulPackage() +static McuPackage *createQtForMCUsPackage() { - auto result = new PackageOptions( - PackageOptions::tr("Qt for MCUs SDK"), + auto result = new McuPackage( + McuPackage::tr("Qt for MCUs SDK"), QDir::homePath(), Utils::HostOsInfo::withExecutableSuffix("bin/qmltocpp"), "QtMCUSdk"); @@ -255,7 +255,7 @@ static PackageOptions *createQulPackage() return result; } -static PackageOptions *createArmGccPackage() +static McuPackage *createArmGccPackage() { const char envVar[] = "ARMGCC_DIR"; @@ -277,8 +277,8 @@ static PackageOptions *createArmGccPackage() if (defaultPath.isEmpty()) defaultPath = QDir::homePath(); - auto result = new PackageOptions( - PackageOptions::tr("GNU Arm Embedded Toolchain"), + auto result = new McuPackage( + McuPackage::tr("GNU Arm Embedded Toolchain"), defaultPath, Utils::HostOsInfo::withExecutableSuffix("bin/arm-none-eabi-g++"), "GNUArmEmbeddedToolchain"); @@ -288,10 +288,10 @@ static PackageOptions *createArmGccPackage() return result; } -static PackageOptions *createStm32CubeFwF7SdkPackage() +static McuPackage *createStm32CubeFwF7SdkPackage() { - auto result = new PackageOptions( - PackageOptions::tr("STM32Cube SDK"), + auto result = new McuPackage( + McuPackage::tr("STM32Cube SDK"), "%{Env:STM32Cube_FW_F7_SDK_PATH}", "Drivers/STM32F7xx_HAL_Driver", "Stm32CubeFwF7Sdk"); @@ -301,15 +301,15 @@ static PackageOptions *createStm32CubeFwF7SdkPackage() return result; } -static PackageOptions *createStm32CubeProgrammerPackage() +static McuPackage *createStm32CubeProgrammerPackage() { const QString defaultPath = Utils::HostOsInfo::isWindowsHost() ? QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles")) + "/STMicroelectronics/STM32Cube/STM32CubeProgrammer/" : QDir::homePath(); - auto result = new PackageOptions( - PackageOptions::tr("STM32CubeProgrammer"), + auto result = new McuPackage( + McuPackage::tr("STM32CubeProgrammer"), defaultPath, QLatin1String(Utils::HostOsInfo::isWindowsHost() ? "/bin/STM32_Programmer_CLI.exe" : "/bin/STM32_Programmer.sh"), @@ -321,10 +321,10 @@ static PackageOptions *createStm32CubeProgrammerPackage() return result; } -static PackageOptions *createEvkbImxrt1050SdkPackage() +static McuPackage *createEvkbImxrt1050SdkPackage() { - auto result = new PackageOptions( - PackageOptions::tr("NXP i.MXRT SDK"), + auto result = new McuPackage( + McuPackage::tr("NXP i.MXRT SDK"), "%{Env:EVKB_IMXRT1050_SDK_PATH}", // TODO: Try to not use 1050 specifics "EVKB-IMXRT1050_manifest_v3_5.xml", "EvkbImxrt1050Sdk"); @@ -332,15 +332,15 @@ static PackageOptions *createEvkbImxrt1050SdkPackage() return result; } -static PackageOptions *createSeggerJLinkPackage() +static McuPackage *createSeggerJLinkPackage() { const QString defaultPath = Utils::HostOsInfo::isWindowsHost() ? QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles(x86)")) + "/SEGGER/JLink" : QString("%{Env:SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH}"); - auto result = new PackageOptions( - PackageOptions::tr("SEGGER JLink"), + auto result = new McuPackage( + McuPackage::tr("SEGGER JLink"), defaultPath, Utils::HostOsInfo::withExecutableSuffix("JLink"), "SeggerJLink"); @@ -352,56 +352,66 @@ static PackageOptions *createSeggerJLinkPackage() McuSupportOptions::McuSupportOptions(QObject *parent) : QObject(parent) { - PackageOptions* qulPackage = createQulPackage(); - PackageOptions* armGccPackage = createArmGccPackage(); - PackageOptions* stm32CubeFwF7SdkPackage = createStm32CubeFwF7SdkPackage(); - PackageOptions* stm32CubeProgrammerPackage = createStm32CubeProgrammerPackage(); - PackageOptions* evkbImxrt1050SdkPackage = createEvkbImxrt1050SdkPackage(); - PackageOptions* seggerJLinkPackage = createSeggerJLinkPackage(); - - toolchainPackage = armGccPackage; - qulSdkPackage = qulPackage; + qtForMCUsSdkPackage = createQtForMCUsPackage(); + armGccPackage = createArmGccPackage(); + McuPackage* stm32CubeFwF7SdkPackage = createStm32CubeFwF7SdkPackage(); + McuPackage* stm32CubeProgrammerPackage = createStm32CubeProgrammerPackage(); + McuPackage* evkbImxrt1050SdkPackage = createEvkbImxrt1050SdkPackage(); + McuPackage* seggerJLinkPackage = createSeggerJLinkPackage(); auto stmEvalPackages = { - armGccPackage, stm32CubeProgrammerPackage, qulPackage}; + armGccPackage, stm32CubeProgrammerPackage, qtForMCUsSdkPackage}; auto stmEngPackages = { - armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, qulPackage}; + armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, qtForMCUsSdkPackage}; auto nxpEvalPackages = { - armGccPackage, seggerJLinkPackage, qulPackage}; + armGccPackage, seggerJLinkPackage, qtForMCUsSdkPackage}; auto nxpEngPackages = { - armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage}; + armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, qtForMCUsSdkPackage}; auto desktopPackages = { - qulPackage}; + qtForMCUsSdkPackage}; packages = { armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, - seggerJLinkPackage, qulPackage}; + seggerJLinkPackage, qtForMCUsSdkPackage}; const QString vendorStm = "STM"; const QString vendorNxp = "NXP"; const QString vendorQt = "Qt"; - boards.append(new BoardOptions(vendorStm, - "stm32f7508", - "CMake/stm32f7508-discovery.cmake", "", stmEvalPackages)); - boards.append(new BoardOptions(vendorStm, - "stm32f769i", - "CMake/stm32f769i-discovery.cmake", "", stmEvalPackages)); - boards.append(new BoardOptions(vendorStm, - "Engineering", - "CMake/", "", stmEngPackages)); + mcuTargets.append(new McuTarget(vendorStm, + "stm32f7508", + "CMake/stm32f7508-discovery.cmake", + "", + stmEvalPackages)); + mcuTargets.append(new McuTarget(vendorStm, + "stm32f769i", + "CMake/stm32f769i-discovery.cmake", + "", + stmEvalPackages)); + mcuTargets.append(new McuTarget(vendorStm, + "Engineering", + "CMake/", + "", + stmEngPackages)); - boards.append(new BoardOptions(vendorNxp, - "evkbimxrt1050", - "CMake/evkbimxrt1050-toolchain.cmake", "", nxpEvalPackages)); - boards.append(new BoardOptions(vendorNxp, - "Engineering", - "CMake/", "", nxpEngPackages)); + mcuTargets.append(new McuTarget(vendorNxp, + "evkbimxrt1050", + "CMake/evkbimxrt1050-toolchain.cmake", + "", + nxpEvalPackages)); + mcuTargets.append(new McuTarget(vendorNxp, + "Engineering", + "CMake/", + "", + nxpEngPackages)); - boards.append(new BoardOptions(vendorQt, - "Desktop", "", "Qt", desktopPackages)); + mcuTargets.append(new McuTarget(vendorQt, + "Desktop", + "", + "Qt", + desktopPackages)); for (auto package : packages) - connect(package, &PackageOptions::changed, [this](){ + connect(package, &McuPackage::changed, [this](){ emit changed(); }); } @@ -410,8 +420,8 @@ McuSupportOptions::~McuSupportOptions() { qDeleteAll(packages); packages.clear(); - qDeleteAll(boards); - boards.clear(); + qDeleteAll(mcuTargets); + mcuTargets.clear(); } static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path, Core::Id language) @@ -440,22 +450,22 @@ static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path, return toolChain; } -static bool isDesktop(const BoardOptions* board) +static bool mcuTargetIsDesktop(const McuTarget* mcuTarget) { - return board->qulPlatform() == "Qt"; + return mcuTarget->qulPlatform() == "Qt"; } static void setKitProperties(const QString &kitName, ProjectExplorer::Kit *k, - const BoardOptions* board) + const McuTarget* mcuTarget) { using namespace ProjectExplorer; k->setUnexpandedDisplayName(kitName); - k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor()); - k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); + k->setValue(Constants::KIT_MCUTARGET_VENDOR_KEY, mcuTarget->vendor()); + k->setValue(Constants::KIT_MCUTARGET_MODEL_KEY, mcuTarget->model()); k->setAutoDetected(true); k->makeSticky(); - if (isDesktop(board)) { + if (mcuTargetIsDesktop(mcuTarget)) { k->setDeviceTypeForIcon(Constants::DEVICE_TYPE); } else { k->setIrrelevantAspects({SysRootKitAspect::id(), @@ -492,7 +502,7 @@ static void setKitDebugger(ProjectExplorer::Kit *k, const QString &armGccPath) DebuggerItem newDebugger; newDebugger.setCommand(command); newDebugger.setUnexpandedDisplayName( - PackageOptions::tr("Arm GDB at %1").arg(command.toUserOutput())); + McuPackage::tr("Arm GDB at %1").arg(command.toUserOutput())); debuggerId = DebuggerItemManager::registerDebugger(newDebugger); } else { debuggerId = debugger->id(); @@ -508,13 +518,13 @@ static void setKitDevice(ProjectExplorer::Kit *k) DeviceTypeKitAspect::setDeviceTypeId(k, Constants::DEVICE_TYPE); } -static void setKitEnvironment(ProjectExplorer::Kit *k, const BoardOptions* board) +static void setKitEnvironment(ProjectExplorer::Kit *k, const McuTarget* mcuTarget) { using namespace ProjectExplorer; Utils::EnvironmentItems changes; QStringList pathAdditions; - for (auto package : board->packages()) { + for (auto package : mcuTarget->packages()) { if (package->addToPath()) pathAdditions.append(QDir::toNativeSeparators(package->path())); if (!package->environmentVariableName().isEmpty()) @@ -529,7 +539,7 @@ static void setKitEnvironment(ProjectExplorer::Kit *k, const BoardOptions* board EnvironmentKitAspect::setEnvironmentChanges(k, changes); } -static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* board, +static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarget, const QString &qulDir) { using namespace CMakeProjectManager; @@ -537,13 +547,13 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); config.append(CMakeConfigItem("CMAKE_CXX_COMPILER", "%{Compiler:Executable:Cxx}")); config.append(CMakeConfigItem("CMAKE_C_COMPILER", "%{Compiler:Executable:C}")); - if (!board->toolChainFile().isEmpty()) + if (!mcuTarget->toolChainFile().isEmpty()) config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", - (qulDir + "/" + board->toolChainFile()).toUtf8())); - if (!board->qulPlatform().isEmpty()) + (qulDir + "/" + mcuTarget->toolChainFile()).toUtf8())); + if (!mcuTarget->qulPlatform().isEmpty()) config.append(CMakeConfigItem("QUL_PLATFORM", - board->qulPlatform().toUtf8())); - if (isDesktop(board)) { + mcuTarget->qulPlatform().toUtf8())); + if (mcuTargetIsDesktop(mcuTarget)) { config.append(CMakeConfigItem("CMAKE_PREFIX_PATH", "%{Qt:QT_INSTALL_PREFIX}")); // TODO: Hack! Implement color depth variants of all targets config.append(CMakeConfigItem("QUL_COLOR_DEPTH", "32")); @@ -553,38 +563,38 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM"); } -QString McuSupportOptions::kitName(const BoardOptions *board) const +QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const { // TODO: get version from qulSdkPackage and insert into name - return QString::fromLatin1("Qt for MCUs - %1 %2").arg(board->vendor(), board->model()); + return QString::fromLatin1("Qt for MCUs - %1 %2").arg(mcuTarget->vendor(), mcuTarget->model()); } -QList McuSupportOptions::existingKits(const BoardOptions *board) +QList McuSupportOptions::existingKits(const McuTarget *mcuTargt) { using namespace ProjectExplorer; - const QString boardKitName = kitName(board); - return Utils::filtered(KitManager::kits(), [&boardKitName](Kit *kit) { - return kit->isAutoDetected() && kit->unexpandedDisplayName() == boardKitName; + const QString mcuTargetKitName = kitName(mcuTargt); + return Utils::filtered(KitManager::kits(), [&mcuTargetKitName](Kit *kit) { + return kit->isAutoDetected() && kit->unexpandedDisplayName() == mcuTargetKitName; }); } -ProjectExplorer::Kit *McuSupportOptions::newKit(const BoardOptions* board) +ProjectExplorer::Kit *McuSupportOptions::newKit(const McuTarget *mcuTarget) { using namespace ProjectExplorer; - const QString armGccPath = toolchainPackage->path(); - const QString qulDir = qulSdkPackage->path(); - const auto init = [this, board](Kit *k) { + const QString armGccPath = armGccPackage->path(); + const QString qulDir = qtForMCUsSdkPackage->path(); + const auto init = [this, mcuTarget](Kit *k) { KitGuard kitGuard(k); - setKitProperties(kitName(board), k, board); - if (!isDesktop(board)) { - setKitToolchains(k, toolchainPackage->path()); - setKitDebugger(k, toolchainPackage->path()); + setKitProperties(kitName(mcuTarget), k, mcuTarget); + if (!mcuTargetIsDesktop(mcuTarget)) { + setKitToolchains(k, armGccPackage->path()); + setKitDebugger(k, armGccPackage->path()); setKitDevice(k); } - setKitEnvironment(k, board); - setKitCMakeOptions(k, board, qulSdkPackage->path()); + setKitEnvironment(k, mcuTarget); + setKitCMakeOptions(k, mcuTarget, qtForMCUsSdkPackage->path()); k->setup(); k->fix(); diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 2cf4bd61a17..e85498e79d0 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -42,7 +42,7 @@ class Kit; namespace McuSupport { namespace Internal { -class PackageOptions : public QObject +class McuPackage : public QObject { Q_OBJECT @@ -53,8 +53,8 @@ public: ValidPackage }; - PackageOptions(const QString &label, const QString &defaultPath, const QString &detectionPath, - const QString &settingsKey); + McuPackage(const QString &label, const QString &defaultPath, const QString &detectionPath, + const QString &settingsKey); QString path() const; QString label() const; @@ -96,19 +96,19 @@ private: Status m_status = InvalidPath; }; -class BoardOptions : public QObject +class McuTarget : public QObject { Q_OBJECT public: - BoardOptions(const QString &vendor, const QString &model, const QString &toolChainFile, - const QString &qulPlatform, const QVector &packages); + McuTarget(const QString &vendor, const QString &model, const QString &toolChainFile, + const QString &qulPlatform, const QVector &packages); QString vendor() const; QString model() const; QString toolChainFile() const; QString qulPlatform() const; - QVector packages() const; + QVector packages() const; bool isValid() const; private: @@ -116,7 +116,7 @@ private: const QString m_model; const QString m_toolChainFile; const QString m_qulPlatform; - const QVector m_packages; + const QVector m_packages; }; class McuSupportOptions : public QObject @@ -127,15 +127,15 @@ public: McuSupportOptions(QObject *parent = nullptr); ~McuSupportOptions() override; - QVector packages; - QVector boards; - PackageOptions *toolchainPackage = nullptr; - PackageOptions *qulSdkPackage = nullptr; + QVector packages; + QVector mcuTargets; + McuPackage *armGccPackage = nullptr; + McuPackage *qtForMCUsSdkPackage = nullptr; - QString kitName(const BoardOptions* board) const; + QString kitName(const McuTarget* mcuTarget) const; - QList existingKits(const BoardOptions* board); - ProjectExplorer::Kit *newKit(const BoardOptions* board); + QList existingKits(const McuTarget *mcuTargt); + ProjectExplorer::Kit *newKit(const McuTarget *mcuTarget); signals: void changed(); diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 73f39cb42ba..06bb9a86e63 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -50,17 +50,17 @@ public: McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent = nullptr); void updateStatus(); - void showBoardPackages(); - BoardOptions *currentBoard() const; + void showMcuTargetPackages(); + McuTarget *currentMcuTarget() const; private: QString m_armGccPath; const McuSupportOptions *m_options; - QMap m_packageWidgets; - QMap m_boardPacketWidgets; + QMap m_packageWidgets; + QMap m_mcuTargetPacketWidgets; QFormLayout *m_packagesLayout = nullptr; QLabel *m_statusLabel = nullptr; - QComboBox *m_boardComboBox = nullptr; + QComboBox *m_mcuTargetComboBox = nullptr; }; McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *options, QWidget *parent) @@ -69,18 +69,18 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option { auto mainLayout = new QVBoxLayout(this); - auto boardChooserlayout = new QHBoxLayout; - auto boardChooserLabel = new QLabel(McuSupportOptionsPage::tr("Target:")); - boardChooserlayout->addWidget(boardChooserLabel); - m_boardComboBox = new QComboBox; - boardChooserLabel->setBuddy(m_boardComboBox); - boardChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - m_boardComboBox->addItems( - Utils::transform(m_options->boards, [this](BoardOptions *b){ - return m_options->kitName(b); + auto mcuTargetChooserlayout = new QHBoxLayout; + auto mcuTargetChooserLabel = new QLabel(McuSupportOptionsPage::tr("Target:")); + mcuTargetChooserlayout->addWidget(mcuTargetChooserLabel); + m_mcuTargetComboBox = new QComboBox; + mcuTargetChooserLabel->setBuddy(m_mcuTargetComboBox); + mcuTargetChooserLabel->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + m_mcuTargetComboBox->addItems( + Utils::transform(m_options->mcuTargets, [this](McuTarget *t){ + return m_options->kitName(t); })); - boardChooserlayout->addWidget(m_boardComboBox); - mainLayout->addLayout(boardChooserlayout); + mcuTargetChooserlayout->addWidget(m_mcuTargetComboBox); + mainLayout->addLayout(mcuTargetChooserlayout); auto m_packagesGroupBox = new QGroupBox(McuSupportOptionsPage::tr("Packages")); mainLayout->addWidget(m_packagesGroupBox); @@ -93,30 +93,31 @@ McuSupportOptionsWidget::McuSupportOptionsWidget(const McuSupportOptions *option m_statusLabel->setAlignment(Qt::AlignBottom | Qt::AlignLeft); connect(options, &McuSupportOptions::changed, this, &McuSupportOptionsWidget::updateStatus); - connect(m_boardComboBox, &QComboBox::currentTextChanged, - this, &McuSupportOptionsWidget::showBoardPackages); + connect(m_mcuTargetComboBox, &QComboBox::currentTextChanged, + this, &McuSupportOptionsWidget::showMcuTargetPackages); - showBoardPackages(); + showMcuTargetPackages(); updateStatus(); } void McuSupportOptionsWidget::updateStatus() { - const BoardOptions *board = currentBoard(); - if (!board) + const McuTarget *mcuTarget = currentMcuTarget(); + if (!mcuTarget) return; - m_statusLabel->setText(board->isValid() + m_statusLabel->setText(mcuTarget->isValid() ? QString::fromLatin1("A kit %1 for the selected target can be generated. " - "Press Apply to generate it.").arg(m_options->kitName(board)) + "Press Apply to generate it.").arg(m_options->kitName( + mcuTarget)) : QString::fromLatin1("Provide the package paths in order to create a kit for " "your target.")); } -void McuSupportOptionsWidget::showBoardPackages() +void McuSupportOptionsWidget::showMcuTargetPackages() { - const BoardOptions *board = currentBoard(); - if (!board) + const McuTarget *mcuTarget = currentMcuTarget(); + if (!mcuTarget) return; while (m_packagesLayout->rowCount() > 0) { @@ -127,7 +128,7 @@ void McuSupportOptionsWidget::showBoardPackages() for (auto package : m_options->packages) { QWidget *packageWidget = package->widget(); - if (!board->packages().contains(package)) + if (!mcuTarget->packages().contains(package)) continue; m_packagesLayout->addRow(package->label(), packageWidget); packageWidget->show(); @@ -136,10 +137,10 @@ void McuSupportOptionsWidget::showBoardPackages() updateStatus(); } -BoardOptions *McuSupportOptionsWidget::currentBoard() const +McuTarget *McuSupportOptionsWidget::currentMcuTarget() const { - const int boardIndex = m_boardComboBox->currentIndex(); - return m_options->boards.isEmpty() ? nullptr : m_options->boards.at(boardIndex); + const int mcuTargetIndex = m_mcuTargetComboBox->currentIndex(); + return m_options->mcuTargets.isEmpty() ? nullptr : m_options->mcuTargets.at(mcuTargetIndex); } McuSupportOptionsPage::McuSupportOptionsPage(QObject* parent) @@ -164,18 +165,18 @@ void McuSupportOptionsPage::apply() for (auto package : m_options->packages) package->writeToSettings(); - QTC_ASSERT(m_options->toolchainPackage, return); - QTC_ASSERT(m_options->qulSdkPackage, return); + QTC_ASSERT(m_options->armGccPackage, return); + QTC_ASSERT(m_options->qtForMCUsSdkPackage, return); - const BoardOptions *board = m_widget->currentBoard(); - if (!board) + const McuTarget *mcuTarget = m_widget->currentMcuTarget(); + if (!mcuTarget) return; using namespace ProjectExplorer; - for (auto existingKit : m_options->existingKits(board)) + for (auto existingKit : m_options->existingKits(mcuTarget)) ProjectExplorer::KitManager::deregisterKit(existingKit); - m_options->newKit(board); + m_options->newKit(mcuTarget); } void McuSupportOptionsPage::finish() diff --git a/src/plugins/mcusupport/mcusupportrunconfiguration.cpp b/src/plugins/mcusupport/mcusupportrunconfiguration.cpp index 83acc2035bf..47e2d6af4fb 100644 --- a/src/plugins/mcusupport/mcusupportrunconfiguration.cpp +++ b/src/plugins/mcusupport/mcusupportrunconfiguration.cpp @@ -51,7 +51,7 @@ static CommandLine flashAndRunCommand(Target *target) // TODO: Hack! Implement flash target name handling, properly const QString targetName = - target->kit()->value(Constants::KIT_BOARD_VENDOR_KEY).toString() == "NXP" + target->kit()->value(Constants::KIT_MCUTARGET_VENDOR_KEY).toString() == "NXP" ? QString("flash_%1").arg(projectName) : QString("flash_%1_and_bootloader").arg(projectName); From 61fa3e87046694b3d4c772a49ff341b655c1e796 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 15 Nov 2019 09:00:34 +0100 Subject: [PATCH 26/59] Wizards: Fix Qt Quick2 Extension wizard Show kits selection page already while configuring the project via wizard instead of falling back to the target selection after the project had been opened. Regression with 6c9f75ff4a6a98cb45fa48928b1d8ef25d3d14ad. Change-Id: I9bf70f306dde3a570ab4ca3e4380040d6c6e4e23 Reviewed-by: Eike Ziller --- .../wizards/projects/qtquick2-extension/wizard.json | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/share/qtcreator/templates/wizards/projects/qtquick2-extension/wizard.json b/share/qtcreator/templates/wizards/projects/qtquick2-extension/wizard.json index b0f9e33ae38..6be8cbff6d0 100644 --- a/share/qtcreator/templates/wizards/projects/qtquick2-extension/wizard.json +++ b/share/qtcreator/templates/wizards/projects/qtquick2-extension/wizard.json @@ -61,6 +61,16 @@ } ] }, + { + "trDisplayName": "Kit Selection", + "trShortTitle": "Kits", + "typeId": "Kits", + "enabled": "%{JS: !value('IsSubproject')}", + "data": { + "projectFilePath": "%{ProjectFile}", + "requiredFeatures": [ "QtSupport.Wizards.FeatureQt.5"] + } + }, { "trDisplayName": "Project Management", "trShortTitle": "Summary", @@ -84,7 +94,8 @@ }, { "source": "plugin.cpp", - "target": "%{PluginSrc}" + "target": "%{PluginSrc}", + "openInEditor": true }, { "source": "plugin.h", From 775c78eca8e5272c8dad2a76a3eb0023347f5e38 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Tue, 29 Oct 2019 13:34:55 +0100 Subject: [PATCH 27/59] Squish: Stabilize selectBuildConfig(...) Change-Id: Iba111e8cbbe652dd488b4dc91c58b92f53eccba3 Reviewed-by: Christian Stenger --- tests/system/shared/build_utils.py | 2 +- tests/system/shared/project.py | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/system/shared/build_utils.py b/tests/system/shared/build_utils.py index db1b11c6c49..6e03a0735b2 100644 --- a/tests/system/shared/build_utils.py +++ b/tests/system/shared/build_utils.py @@ -155,7 +155,7 @@ def selectBuildConfig(wantedKit, configName, afterSwitchTo=ViewConstants.EDIT): switchViewTo(ViewConstants.PROJECTS) if any((switchToBuildOrRunSettingsFor(wantedKit, ProjectSettings.BUILD), selectFromCombo(":scrollArea.Edit build configuration:_QComboBox", configName))): - progressBarWait(30000) + waitForProjectParsing(5000, 30000, 0) if afterSwitchTo: if ViewConstants.FIRST_AVAILABLE <= afterSwitchTo <= ViewConstants.LAST_AVAILABLE: switchViewTo(afterSwitchTo) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 4ad7889cb7e..fc2f9f887e7 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -673,11 +673,15 @@ def addCPlusPlusFile(name, template, projectName, forceOverwrite=False, addToVCS clickButton("{text='%s' type='QPushButton' unnamed='1' visible='1' window=%s}" % (buttonToClick, overwriteDialog)) -# if one of the parameters is set to 0 or below the respective parsing won't be waited for -def waitForProjectParsing(projectParsingTimeout=10000, codemodelParsingTimeout=10000): - if projectParsingTimeout > 0: - runButton = findObject(':*Qt Creator.Run_Core::Internal::FancyToolButton') - # Wait for parsing to complete - waitFor("runButton.enabled", projectParsingTimeout) +# if one of the parameters is set to 0 the function will not wait in this step +# beginParsingTimeout milliseconds to wait for parsing to begin +# projectParsingTimeout milliseconds to wait for project parsing +# codemodelParsingTimeout milliseconds to wait for C++ parsing +def waitForProjectParsing(beginParsingTimeout=0, projectParsingTimeout=10000, + codemodelParsingTimeout=10000): + runButton = findObject(':*Qt Creator.Run_Core::Internal::FancyToolButton') + waitFor("not runButton.enabled", beginParsingTimeout) + # Wait for parsing to complete + waitFor("runButton.enabled", projectParsingTimeout) if codemodelParsingTimeout > 0: progressBarWait(codemodelParsingTimeout) From 40612bceeed36cb688b699a7531dbc65fd5bdd6a Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 14 Nov 2019 14:22:28 +0100 Subject: [PATCH 28/59] Python: Fix python run configuration Add the WorkingDirectoryAspect to prevent running the main script in an unpredictable location. Change-Id: I1be206261b7983e933b53ccd57c93089154d8417 Reviewed-by: Eike Ziller Reviewed-by: Cristian Maureira-Fredes --- src/plugins/python/pythonrunconfiguration.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp index d6bc6061e10..047d15e6ef1 100644 --- a/src/plugins/python/pythonrunconfiguration.cpp +++ b/src/plugins/python/pythonrunconfiguration.cpp @@ -274,6 +274,7 @@ PythonRunConfiguration::PythonRunConfiguration(Target *target, Core::Id id) auto argumentsAspect = addAspect(); + addAspect(); addAspect(); setCommandLineGetter([this, interpreterAspect, argumentsAspect] { @@ -305,6 +306,9 @@ void PythonRunConfiguration::updateLanguageServer() PyLSConfigureAssistant::instance()->openDocumentWithPython(python, document); } } + + aspect()->setDefaultWorkingDirectory( + Utils::FilePath::fromString(mainScript()).parentDir()); } bool PythonRunConfiguration::supportsDebugger() const From b2e1499782fde73d98b5f31444aec8cce1c7e1f7 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 14 Nov 2019 14:23:34 +0100 Subject: [PATCH 29/59] Python: Use native separator in user visible path Change-Id: I7ef46a2cae7744162a6f9da92a4736d74a029705 Reviewed-by: Eike Ziller --- src/plugins/python/pythonrunconfiguration.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/python/pythonrunconfiguration.cpp b/src/plugins/python/pythonrunconfiguration.cpp index 047d15e6ef1..7a362e31f91 100644 --- a/src/plugins/python/pythonrunconfiguration.cpp +++ b/src/plugins/python/pythonrunconfiguration.cpp @@ -334,7 +334,7 @@ QString PythonRunConfiguration::interpreter() const void PythonRunConfiguration::updateTargetInformation() { const BuildTargetInfo bti = buildTargetInfo(); - const QString script = bti.targetFilePath.toString(); + const QString script = bti.targetFilePath.toUserOutput(); setDefaultDisplayName(tr("Run %1").arg(script)); aspect()->setValue(script); } From 3b57edf272ea5f1f29f26bfae08db12a284dc697 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 15 Nov 2019 15:30:06 +0100 Subject: [PATCH 30/59] Doc: Move Using External Tools away from the creator-only folder ...so that it can be included in the Qt Design Studio Manual. Change-Id: I2ce16d1162211e0f8fdd506fe53067ea3116cff6 Reviewed-by: Eike Ziller --- .../{creator-only => }/creator-external-tools.qdoc | 11 ++++++++--- doc/src/qtquick/qtquick-profiler.qdoc | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) rename doc/src/howto/{creator-only => }/creator-external-tools.qdoc (96%) diff --git a/doc/src/howto/creator-only/creator-external-tools.qdoc b/doc/src/howto/creator-external-tools.qdoc similarity index 96% rename from doc/src/howto/creator-only/creator-external-tools.qdoc rename to doc/src/howto/creator-external-tools.qdoc index 546efaf72a3..2ba985e2083 100644 --- a/doc/src/howto/creator-only/creator-external-tools.qdoc +++ b/doc/src/howto/creator-external-tools.qdoc @@ -31,9 +31,14 @@ /*! \contentspage index.html - \previouspage creator-keyboard-shortcuts.html \page creator-editor-external.html + \if defined(qtdesignstudio) + \previouspage creator-qml-performance-monitor.html + \nextpage studio-help.html + \else + \previouspage creator-keyboard-shortcuts.html \nextpage creator-task-lists.html + \endif \title Using External Tools @@ -69,8 +74,8 @@ External > Configure}. To open TS files in Qt Linguist, right-click a TS file in the - \uicontrol Projects view and select \uicontrol {Open With} > - \uicontrol {Qt Linguist} in the context menu. + \uicontrol Projects or \uicontrol {File System} view and select + \uicontrol {Open With} > \uicontrol {Qt Linguist} in the context menu. For more information about Qt Linguist, see \l{Qt Linguist Manual}. \section1 Previewing QML Files diff --git a/doc/src/qtquick/qtquick-profiler.qdoc b/doc/src/qtquick/qtquick-profiler.qdoc index f94f4f0b259..0b772d8e062 100644 --- a/doc/src/qtquick/qtquick-profiler.qdoc +++ b/doc/src/qtquick/qtquick-profiler.qdoc @@ -34,7 +34,7 @@ \page creator-qml-performance-monitor.html \if defined(qtdesignstudio) \previouspage creator-qml-debugging-example.html - \nextpage studio-help.html + \nextpage creator-editor-external.html \else \previouspage creator-analyze-mode.html \nextpage creator-valgrind-overview.html From 65cfdf569921d4b2b70a03feb2005b0078563ac4 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 15 Nov 2019 15:57:40 +0100 Subject: [PATCH 31/59] Doc: Hide links to content excluded from Qt Design Studio Manual The links lead to strange places or generate QDoc warnings when building the Qt Design Studio Manual. Change-Id: Ic8311b54f9d49a8d56572c2f049b84cbe3933812 Reviewed-by: Eike Ziller --- doc/src/howto/creator-external-tools.qdoc | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/doc/src/howto/creator-external-tools.qdoc b/doc/src/howto/creator-external-tools.qdoc index 2ba985e2083..def82871b49 100644 --- a/doc/src/howto/creator-external-tools.qdoc +++ b/doc/src/howto/creator-external-tools.qdoc @@ -135,17 +135,24 @@ \li In the \uicontrol {Error output} field, select how to handle error messages from the tool. + \if defined(qtcreator) \li In the \uicontrol {Base environment} field, select whether to run the tool in the system environment or the \l{Build Environment} {build environment} or \l {Selecting the Run Environment} {run environment} of the active project. Select the build or run environment if the system environment does not contain the necessary PATH settings to find the tool chain, for example. + \else + \li In the \uicontrol {Base environment} field, use the default settings. + \endif \li In the \uicontrol Environment field, select \uicontrol Change to modify environment variable values for build and run environments in - the \uicontrol {Edit Environment Changes} dialog. For more information - about how to add and remove variable values, see \l{Batch Editing}. + the \uicontrol {Edit Environment Changes} dialog. + \if defined(qtcreator) + For more information about how to add and remove variable values, + see \l{Batch Editing}. + \endif \li Select the \uicontrol {Modifies current document} check box to make sure that if the current document is modified by the tool, it is saved From a08a5499e930989a4eb8584fb6b4a9232d31d591 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 15 Nov 2019 09:02:12 +0100 Subject: [PATCH 32/59] Squish: Fix expected ui elements and page order The wizard had been transformed to use the JsonWizard nowadays. Order of wizard pages has slightly changed to be consistent with the rest of the wizards. Change-Id: I841349d3b20dbc03a56a3dc4d15f717d0d21acdb Reviewed-by: Robert Loehning --- tests/system/shared/project.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index fc2f9f887e7..471abd8a1ed 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -321,15 +321,13 @@ def createNewQmlExtension(workingDir, targets=[Targets.DESKTOP_5_6_1_DEFAULT]): if workingDir == None: workingDir = tempDir() __createProjectSetNameAndPath__(workingDir) - __chooseTargets__(targets, available) + nameLineEd = waitForObject("{name='ObjectName' type='Utils::FancyLineEdit' visible='1'}") + replaceEditorContent(nameLineEd, "TestItem") + uriLineEd = waitForObject("{name='Uri' type='Utils::FancyLineEdit' visible='1'}") + replaceEditorContent(uriLineEd, "org.qt-project.test.qmlcomponents") nextButton = waitForObject(":Next_QPushButton") clickButton(nextButton) - nameLineEd = waitForObject("{buddy={type='QLabel' text='Object class-name:' unnamed='1' visible='1'} " - "type='QLineEdit' unnamed='1' visible='1'}") - replaceEditorContent(nameLineEd, "TestItem") - uriLineEd = waitForObject("{buddy={type='QLabel' text='URI:' unnamed='1' visible='1'} " - "type='QLineEdit' unnamed='1' visible='1'}") - replaceEditorContent(uriLineEd, "org.qt-project.test.qmlcomponents") + __chooseTargets__(targets, available) clickButton(nextButton) __createProjectHandleLastPage__() From ebcde98b722c9a29e5a26a9a4a585a872ca91948 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 15 Nov 2019 09:04:13 +0100 Subject: [PATCH 33/59] Squish: Re-enable testing Qt Quick 2 Extension Plugin wizard This effectively reverts commit 4f2f86b5bfd45e0bc9fc690d0ec7b7880eac7f36. Additionally fixes the expected kits for this template. Change-Id: Ie90f113894d331fa4023b8c58f30da5c4886c76d Reviewed-by: Robert Loehning --- tests/system/shared/project.py | 2 +- tests/system/suite_general/tst_create_proj_wizard/test.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 471abd8a1ed..7ea25299e52 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -513,7 +513,7 @@ def __getSupportedPlatforms__(text, templateName, getAsStrings=False): supports = text[text.find('Supported Platforms'):].split(":")[1].strip().split(" ") result = set() if 'Desktop' in supports: - if (version == None or version < "5.0"): + if (version == None or version < "5.0") and not templateName.startswith("Qt Quick 2"): result.add(Targets.DESKTOP_4_8_7_DEFAULT) if platform.system() in ("Linux", "Darwin"): result.add(Targets.EMBEDDED_LINUX) diff --git a/tests/system/suite_general/tst_create_proj_wizard/test.py b/tests/system/suite_general/tst_create_proj_wizard/test.py index 69d1c4de4d7..3fdce9645be 100644 --- a/tests/system/suite_general/tst_create_proj_wizard/test.py +++ b/tests/system/suite_general/tst_create_proj_wizard/test.py @@ -62,8 +62,7 @@ def main(): template = template.replace(".", "\\.") # skip non-configurable if template not in ["Qt Quick UI Prototype", "Auto Test Project", # FIXME - "Qt for Python - Empty", "Qt for Python - Window", - "Qt Quick 2 Extension Plugin"]: + "Qt for Python - Empty", "Qt for Python - Window"]: availableProjectTypes.append({category:template}) safeClickButton("Cancel") for current in availableProjectTypes: @@ -82,7 +81,7 @@ def main(): # are there more Quick combinations - then recreate this project if counter < len(qtVersionsForQuick) - 1: displayedPlatforms = __createProject__(category, template) - elif template in ("Qt Widgets Application", "C++ Library"): + elif template in ("Qt Widgets Application", "Qt Quick 2 Extension Plugin", "C++ Library"): def skipDetails(_): clickButton(waitForObject(":Next_QPushButton")) handleBuildSystemVerifyKits(category, template, kits, From a87293d1c4d1c5e12dc8311cfa49283ab6d977ab Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 13 Nov 2019 09:56:18 +0100 Subject: [PATCH 34/59] Squish: Update expected tool tips Change-Id: Ibde199b8f88448c9f0e7b235f7ede57735718201 Reviewed-by: Robert Loehning --- tests/system/suite_editors/tst_qml_editor/test.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/system/suite_editors/tst_qml_editor/test.py b/tests/system/suite_editors/tst_qml_editor/test.py index c8e5a66a010..633e9fcbdc1 100644 --- a/tests/system/suite_editors/tst_qml_editor/test.py +++ b/tests/system/suite_editors/tst_qml_editor/test.py @@ -129,7 +129,7 @@ def testHovering(): {'text':'

Rectangle


\n

Paints a filled rectangle with an ' 'optional border

  
'} ] - alternativeValues = [{"text":"FocusScope"}, {"text":"Rectangle"}] + alternativeValues = [{"text":"

FocusScope

"}, {"text":"

Rectangle

"}] verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, expectedValues, alternativeValues) test.log("Testing hovering properties") openDocument(focusDocumentPath % "focus\\.qml") @@ -152,11 +152,12 @@ def testHovering(): 'These define the transitions to be applied to the item whenever it changes its state.' '

  '} ] - alternativeValues = [{"text":"boolean"}, {"text":"string"}, {"text":"State"}, {"text":"Transition"}] + alternativeValues = [{"text":"

boolean

"}, {"text":"

string

"}, + {"text":"

State

"}, {"text":"

Transition

"}] if JIRA.isBugStillOpen(20020): expectedValues[0] = {'text':'
Rectangle  ' '
'} - alternativeValues[0] = {"text":"Rectangle"} + alternativeValues[0] = {"text":"

Rectangle

"} verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, expectedValues, alternativeValues) test.log("Testing hovering expressions") openDocument(focusDocumentPath % "focus\\.qml") @@ -173,5 +174,5 @@ def testHovering(): additionalKeyPresses = ["", "", "", ""] expectedTypes = ["ColorTip", "TextTip"] expectedValues = ["#D1DBBD", {"text":'
number  
'}] - alternativeValues = ["#D6DBBD", None] + alternativeValues = ["#D6DBBD", {"text":"

number

"}] verifyHoveringOnEditor(editor, lines, additionalKeyPresses, expectedTypes, expectedValues, alternativeValues) From 20257e1e4fbaa6530007d3d5ec8fb35f11df8284 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Mon, 4 Nov 2019 16:03:07 +0200 Subject: [PATCH 35/59] QmlDesigner: Implement RotateGizmo for 3D edit view Added a gizmo for rotating selected object either freely or locked around X, Y, Z, or camera axis. Change-Id: Ib43c7dd3fc0f49f384d5920fce21ea932c4fc90d Task-number: QDS-1196 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 35 ++- .../qml/qmlpuppet/mockfiles/RotateGizmo.qml | 221 ++++++++++++++++++ .../qml/qmlpuppet/mockfiles/RotateRing.qml | 133 +++++++++++ .../qml/qmlpuppet/mockfiles/meshes/ring.mesh | Bin 0 -> 45528 bytes .../mockfiles/meshes/ringselect.mesh | Bin 0 -> 50008 bytes .../qml2puppet/editor3d/mousearea3d.cpp | 216 +++++++++++++++-- .../qml2puppet/editor3d/mousearea3d.h | 45 +++- share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 4 + 8 files changed, 629 insertions(+), 25 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/meshes/ring.mesh create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/meshes/ringselect.mesh diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index bed8dd3f9a8..2c908755229 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -100,12 +100,15 @@ Window { PerspectiveCamera { id: overlayPerspectiveCamera clipFar: editPerspectiveCamera.clipFar + clipNear: editPerspectiveCamera.clipNear position: editPerspectiveCamera.position rotation: editPerspectiveCamera.rotation } OrthographicCamera { id: overlayOrthoCamera + clipFar: editOrthoCamera.clipFar + clipNear: editOrthoCamera.clipNear position: editOrthoCamera.position rotation: editOrthoCamera.rotation } @@ -140,6 +143,21 @@ Window { onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale") } + RotateGizmo { + id: rotateGizmo + scale: autoScale.getScale(Qt.vector3d(7, 7, 7)) + highlightOnHover: true + targetNode: viewWindow.selectedNode + position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition + : Qt.vector3d(0, 0, 0) + globalOrientation: globalControl.checked + visible: selectedNode && btnRotate.selected + view3D: overlayView + + onRotateCommit: viewWindow.commitObjectProperty(selectedNode, "rotation") + onRotateChange: viewWindow.changeObjectProperty(selectedNode, "rotation") + } + AutoScaleHelper { id: autoScale view3D: overlayView @@ -193,12 +211,15 @@ Window { y: 200 z: -300 clipFar: 100000 + clipNear: 1 } OrthographicCamera { id: editOrthoCamera y: 200 z: -300 + clipFar: 100000 + clipNear: 1 } } } @@ -346,7 +367,19 @@ Window { id: usePerspectiveCheckbox checked: true text: qsTr("Use Perspective Projection") - onCheckedChanged: cameraControl.forceActiveFocus() + onCheckedChanged: { + // Since WasdController always acts on active camera, we need to update pos/rot + // to the other camera when we change + if (checked) { + editPerspectiveCamera.position = editOrthoCamera.position; + editPerspectiveCamera.rotation = editOrthoCamera.rotation; + } else { + editOrthoCamera.position = editPerspectiveCamera.position; + editOrthoCamera.rotation = editPerspectiveCamera.rotation; + } + designStudioNativeCameraControlHelper.requestOverlayUpdate(); + cameraControl.forceActiveFocus(); + } } CheckBox { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml new file mode 100644 index 00000000000..b2f42b39e2f --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateGizmo.qml @@ -0,0 +1,221 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +Node { + id: rotateGizmo + + property View3D view3D + property bool highlightOnHover: true + property Node targetNode: null + property bool globalOrientation: true + readonly property bool dragging: cameraRing.dragging + || rotRingX.dragging || rotRingY.dragging || rotRingZ.dragging + property real currentAngle + property point currentMousePos + + signal rotateCommit() + signal rotateChange() + + Rectangle { + id: angleLabel + color: "white" + x: rotateGizmo.currentMousePos.x - (10 + width) + y: rotateGizmo.currentMousePos.y - (10 + height) + width: gizmoLabelText.width + 4 + height: gizmoLabelText.height + 4 + border.width: 1 + visible: rotateGizmo.dragging + parent: rotateGizmo.view3D + + Text { + id: gizmoLabelText + text: { + var l = Qt.locale(); + if (rotateGizmo.targetNode) { + var degrees = currentAngle * (180 / Math.PI); + return qsTr(Number(degrees).toLocaleString(l, 'f', 1)); + } else { + return ""; + } + } + anchors.centerIn: parent + } + } + + Node { + rotation: globalOrientation || !targetNode ? Qt.vector3d(0, 0, 0) : targetNode.sceneRotation + + RotateRing { + id: rotRingX + objectName: "Rotate Ring X" + rotation: Qt.vector3d(0, 90, 0) + targetNode: rotateGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + priority: 40 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + + RotateRing { + id: rotRingY + objectName: "Rotate Ring Y" + rotation: Qt.vector3d(90, 0, 0) + targetNode: rotateGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + // Just a smidge smaller than higher priority rings so that it doesn't obscure them + scale: Qt.vector3d(0.998, 0.998, 0.998) + priority: 30 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + + RotateRing { + id: rotRingZ + objectName: "Rotate Ring Z" + rotation: Qt.vector3d(0, 0, 0) + targetNode: rotateGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + // Just a smidge smaller than higher priority rings so that it doesn't obscure them + scale: Qt.vector3d(0.996, 0.996, 0.996) + priority: 20 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + } + + RotateRing { + id: cameraRing + objectName: "cameraRing" + rotation: rotateGizmo.view3D.camera.rotation + targetNode: rotateGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + // Just a smidge smaller than higher priority rings so that it doesn't obscure them + scale: Qt.vector3d(0.994, 0.994, 0.994) + priority: 10 + view3D: rotateGizmo.view3D + active: rotateGizmo.visible + + onRotateCommit: rotateGizmo.rotateCommit() + onRotateChange: rotateGizmo.rotateChange() + onCurrentAngleChanged: rotateGizmo.currentAngle = currentAngle + onCurrentMousePosChanged: rotateGizmo.currentMousePos = currentMousePos + } + + Model { + id: freeRotator + + source: "#Sphere" + materials: DefaultMaterial { + id: material + emissiveColor: "black" + opacity: mouseAreaFree.hovering ? 0.15 : 0 + lighting: DefaultMaterial.NoLighting + } + scale: Qt.vector3d(0.15, 0.15, 0.15) + + property vector3d _pointerPosPressed + property vector3d _targetPosOnScreen + property vector3d _startRotation + + function handlePressed(screenPos) + { + if (!rotateGizmo.targetNode) + return; + + _targetPosOnScreen = view3D.mapFrom3DScene(rotateGizmo.targetNode.scenePosition); + _targetPosOnScreen.z = 0; + _pointerPosPressed = Qt.vector3d(screenPos.x, screenPos.y, 0); + + // Recreate vector so we don't follow the changes in targetNode.rotation + _startRotation = Qt.vector3d(rotateGizmo.targetNode.rotation.x, + rotateGizmo.targetNode.rotation.y, + rotateGizmo.targetNode.rotation.z); + } + + function handleDragged(screenPos) + { + if (!rotateGizmo.targetNode) + return; + + mouseAreaFree.applyFreeRotation( + rotateGizmo.targetNode, _startRotation, _pointerPosPressed, + Qt.vector3d(screenPos.x, screenPos.y, 0), _targetPosOnScreen); + + rotateGizmo.rotateChange(); + } + + function handleReleased(screenPos) + { + if (!rotateGizmo.targetNode) + return; + + mouseAreaFree.applyFreeRotation( + rotateGizmo.targetNode, _startRotation, _pointerPosPressed, + Qt.vector3d(screenPos.x, screenPos.y, 0), _targetPosOnScreen); + + rotateGizmo.rotateCommit(); + } + + MouseArea3D { + id: mouseAreaFree + view3D: rotateGizmo.view3D + rotation: rotateGizmo.view3D.camera.rotation + objectName: "Free rotator plane" + x: -50 + y: -50 + width: 100 + height: 100 + circlePickArea: Qt.point(25, 50) + grabsMouse: rotateGizmo.targetNode + active: rotateGizmo.visible + onPressed: freeRotator.handlePressed(screenPos) + onDragged: freeRotator.handleDragged(screenPos) + onReleased: freeRotator.handleReleased(screenPos) + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml new file mode 100644 index 00000000000..634eb017c9b --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/RotateRing.qml @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +Model { + id: rotateRing + + property View3D view3D + property alias color: material.emissiveColor + property Node targetNode: null + property bool dragging: false + property bool active: false + property alias hovering: mouseAreaMain.hovering + property alias priority: mouseAreaMain.priority + property real currentAngle + property point currentMousePos + + property vector3d _pointerPosPressed + property vector3d _targetPosOnScreen + property vector3d _startRotation + property bool _trackBall + + signal rotateCommit() + signal rotateChange() + + source: "meshes/ring.mesh" + + Model { + id: pickModel + objectName: "PickModel for " + rotateRing.objectName + source: "meshes/ringselect.mesh" + pickable: true + } + + materials: DefaultMaterial { + id: material + emissiveColor: "white" + lighting: DefaultMaterial.NoLighting + } + + function applyLocalRotation(screenPos) + { + currentAngle = mouseAreaMain.getNewRotationAngle(targetNode, _pointerPosPressed, + Qt.vector3d(screenPos.x, screenPos.y, 0), + _targetPosOnScreen, currentAngle, + _trackBall); + mouseAreaMain.applyRotationAngleToNode(targetNode, _startRotation, currentAngle); + } + + function handlePressed(screenPos, angle) + { + if (!targetNode) + return; + + _targetPosOnScreen = view3D.mapFrom3DScene(targetNode.scenePosition); + _targetPosOnScreen.z = 0; + _pointerPosPressed = Qt.vector3d(screenPos.x, screenPos.y, 0); + dragging = true; + _trackBall = angle < 0.1; + + // Recreate vector so we don't follow the changes in targetNode.rotation + _startRotation = Qt.vector3d(targetNode.rotation.x, + targetNode.rotation.y, + targetNode.rotation.z); + currentAngle = 0; + currentMousePos = screenPos; + } + + function handleDragged(screenPos) + { + if (!targetNode) + return; + + applyLocalRotation(screenPos); + currentMousePos = screenPos; + rotateChange(); + } + + function handleReleased(screenPos) + { + if (!targetNode) + return; + + applyLocalRotation(screenPos); + rotateCommit(); + dragging = false; + currentAngle = 0; + currentMousePos = screenPos; + } + + MouseArea3D { + id: mouseAreaMain + view3D: rotateRing.view3D + objectName: "Main plane of " + rotateRing.objectName + x: -30 + y: -30 + width: 60 + height: 60 + circlePickArea: Qt.point(9.2, 1.4) + grabsMouse: targetNode + active: rotateRing.active + pickNode: pickModel + minAngle: 0.05 + onPressed: rotateRing.handlePressed(screenPos, angle) + onDragged: rotateRing.handleDragged(screenPos) + onReleased: rotateRing.handleReleased(screenPos) + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/ring.mesh b/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/ring.mesh new file mode 100644 index 0000000000000000000000000000000000000000..56e1b82f29db01f0d26af02fa513a194a118d38a GIT binary patch literal 45528 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 literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/ringselect.mesh b/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/ringselect.mesh new file mode 100644 index 0000000000000000000000000000000000000000..b110b308f03d66c44c9d456ab8eaa601c90df3ae GIT binary patch literal 50008 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 J6k%)-4FL4P-);Z^ literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp index d4135de9732..31ed6611250 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp @@ -29,11 +29,15 @@ #include #include +#include +#include +#include namespace QmlDesigner { namespace Internal { MouseArea3D *MouseArea3D::s_mouseGrab = nullptr; +static const qreal s_mouseDragMultiplier = .02; MouseArea3D::MouseArea3D(QQuick3DNode *parent) : QQuick3DNode(parent) @@ -65,6 +69,21 @@ bool MouseArea3D::active() const return m_active; } +QPointF MouseArea3D::circlePickArea() const +{ + return m_circlePickArea; +} + +qreal MouseArea3D::minAngle() const +{ + return m_minAngle; +} + +QQuick3DNode *MouseArea3D::pickNode() const +{ + return m_pickNode; +} + qreal MouseArea3D::x() const { return m_x; @@ -105,7 +124,7 @@ void MouseArea3D::setGrabsMouse(bool grabsMouse) return; m_grabsMouse = grabsMouse; - emit grabsMouseChanged(grabsMouse); + emit grabsMouseChanged(); } void MouseArea3D::setActive(bool active) @@ -114,7 +133,37 @@ void MouseArea3D::setActive(bool active) return; m_active = active; - emit activeChanged(active); + emit activeChanged(); +} + +void MouseArea3D::setCirclePickArea(const QPointF &pickArea) +{ + if (m_circlePickArea == pickArea) + return; + + m_circlePickArea = pickArea; + emit circlePickAreaChanged(); +} + +// This is the minimum angle for circle picking. At lower angles we fall back to picking on pickNode +void MouseArea3D::setMinAngle(qreal angle) +{ + if (qFuzzyCompare(m_minAngle, angle)) + return; + + m_minAngle = angle; + emit minAngleChanged(); +} + +// This is the fallback pick node when circle picking can't be done due to low angle +// Pick node can't be used except in low angles, as long as only bounding box picking is supported +void MouseArea3D::setPickNode(QQuick3DNode *node) +{ + if (m_pickNode == node) + return; + + m_pickNode = node; + emit pickNodeChanged(); } void MouseArea3D::setX(qreal x) @@ -123,7 +172,7 @@ void MouseArea3D::setX(qreal x) return; m_x = x; - emit xChanged(x); + emit xChanged(); } void MouseArea3D::setY(qreal y) @@ -132,7 +181,7 @@ void MouseArea3D::setY(qreal y) return; m_y = y; - emit yChanged(y); + emit yChanged(); } void MouseArea3D::setWidth(qreal width) @@ -141,7 +190,7 @@ void MouseArea3D::setWidth(qreal width) return; m_width = width; - emit widthChanged(width); + emit widthChanged(); } void MouseArea3D::setHeight(qreal height) @@ -150,7 +199,7 @@ void MouseArea3D::setHeight(qreal height) return; m_height = height; - emit heightChanged(height); + emit heightChanged(); } void MouseArea3D::setPriority(int level) @@ -159,7 +208,7 @@ void MouseArea3D::setPriority(int level) return; m_priority = level; - emit priorityChanged(level); + emit priorityChanged(); } void MouseArea3D::componentComplete() @@ -278,6 +327,84 @@ QVector3D MouseArea3D::getNewScale(QQuick3DNode *node, const QVector3D &startSca return startScale; } +qreal QmlDesigner::Internal::MouseArea3D::getNewRotationAngle( + QQuick3DNode *node, const QVector3D &pressPos, const QVector3D ¤tPos, + const QVector3D &nodePos, qreal prevAngle, bool trackBall) +{ + const QVector3D cameraToNodeDir = getCameraToNodeDir(node); + if (trackBall) { + // Only the distance in plane direction is relevant in trackball drag + QVector3D dragDir = QVector3D::crossProduct(getNormal(), cameraToNodeDir).normalized(); + QVector3D screenDragDir = m_view3D->mapFrom3DScene(node->scenePosition() + dragDir); + screenDragDir.setZ(0); + dragDir = (screenDragDir - nodePos).normalized(); + const QVector3D pressToCurrent = (currentPos - pressPos); + float magnitude = QVector3D::dotProduct(pressToCurrent, dragDir); + qreal angle = -s_mouseDragMultiplier * qreal(magnitude); + return angle; + } else { + const QVector3D nodeToPress = (pressPos - nodePos).normalized(); + const QVector3D nodeToCurrent = (currentPos - nodePos).normalized(); + qreal angle = qAcos(qreal(QVector3D::dotProduct(nodeToPress, nodeToCurrent))); + + // Determine drag direction left/right + const QVector3D dragNormal = QVector3D::crossProduct(nodeToPress, nodeToCurrent).normalized(); + angle *= QVector3D::dotProduct(QVector3D(0.f, 0.f, 1.f), dragNormal) < 0 ? -1.0 : 1.0; + + // Determine drag ring orientation relative to camera + angle *= QVector3D::dotProduct(getNormal(), cameraToNodeDir) < 0 ? 1.0 : -1.0; + + qreal adjustedPrevAngle = prevAngle; + const qreal PI_2 = M_PI * 2.0; + while (adjustedPrevAngle < -PI_2) + adjustedPrevAngle += PI_2; + while (adjustedPrevAngle > PI_2) + adjustedPrevAngle -= PI_2; + + // at M_PI rotation, the angle flips to negative + if (qAbs(angle - adjustedPrevAngle) > M_PI) { + if (angle > adjustedPrevAngle) + return prevAngle - (PI_2 - angle + adjustedPrevAngle); + else + return prevAngle + (PI_2 + angle - adjustedPrevAngle); + } else { + return prevAngle + angle - adjustedPrevAngle; + } + } + +} + +void QmlDesigner::Internal::MouseArea3D::applyRotationAngleToNode( + QQuick3DNode *node, const QVector3D &startRotation, qreal angle) +{ + if (!qFuzzyIsNull(angle)) { + node->setRotation(startRotation); + node->rotate(qRadiansToDegrees(angle), getNormal(), QQuick3DNode::SceneSpace); + } +} + +void MouseArea3D::applyFreeRotation(QQuick3DNode *node, const QVector3D &startRotation, + const QVector3D &pressPos, const QVector3D ¤tPos) +{ + QVector3D dragVector = currentPos - pressPos; + + if (dragVector.length() < 0.001f) + return; + + const float *dataPtr(sceneTransform().data()); + QVector3D xAxis = QVector3D(-dataPtr[0], -dataPtr[1], -dataPtr[2]).normalized(); + QVector3D yAxis = QVector3D(-dataPtr[4], -dataPtr[5], -dataPtr[6]).normalized(); + + QVector3D finalAxis = (dragVector.x() * yAxis + dragVector.y() * xAxis); + + qreal degrees = qRadiansToDegrees(qreal(finalAxis.length()) * s_mouseDragMultiplier); + + finalAxis.normalize(); + + node->setRotation(startRotation); + node->rotate(degrees, finalAxis, QQuick3DNode::SceneSpace); +} + QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const { const QVector3D mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0); @@ -300,12 +427,50 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) return false; } - auto mouseOnTopOfMouseArea = [this](const QVector3D &mousePosInPlane) -> bool { - return !qFuzzyCompare(mousePosInPlane.z(), -1) + qreal pickAngle = 0.; + + auto mouseOnTopOfMouseArea = [this, &pickAngle]( + const QVector3D &mousePosInPlane, const QPointF &mousePos) -> bool { + const bool onPlane = !qFuzzyCompare(mousePosInPlane.z(), -1) && mousePosInPlane.x() >= float(m_x) && mousePosInPlane.x() <= float(m_x + m_width) && mousePosInPlane.y() >= float(m_y) && mousePosInPlane.y() <= float(m_y + m_height); + + bool onCircle = true; + bool pickSuccess = false; + if (!qFuzzyIsNull(m_circlePickArea.y()) || !qFuzzyIsNull(m_minAngle)) { + + QVector3D cameraToMouseAreaDir = getCameraToNodeDir(this); + const QVector3D mouseAreaDir = getNormal(); + qreal angle = qreal(QVector3D::dotProduct(cameraToMouseAreaDir, mouseAreaDir)); + // Do not allow selecting ring that is nearly perpendicular to camera, as dragging along + // that plane would be difficult + pickAngle = qAcos(angle); + pickAngle = pickAngle > M_PI_2 ? pickAngle - M_PI_2 : M_PI_2 - pickAngle; + if (pickAngle > m_minAngle) { + if (!qFuzzyIsNull(m_circlePickArea.y())) { + qreal ringCenter = m_circlePickArea.x(); + // Thickness is increased according to the angle to camera to keep projected + // circle thickness constant at all angles. + qreal divisor = qSin(pickAngle) * 2.; // This is never zero + qreal thickness = ((m_circlePickArea.y() / divisor)); + qreal mousePosRadius = qSqrt(qreal(mousePosInPlane.x() * mousePosInPlane.x()) + + qreal(mousePosInPlane.y() * mousePosInPlane.y())); + onCircle = ringCenter - thickness <= mousePosRadius + && ringCenter + thickness >= mousePosRadius; + } + } else { + // Fall back to picking on the pickNode. At this angle, bounding box pick is not + // a problem + onCircle = false; + if (m_pickNode) { + QQuick3DPickResult pr = m_view3D->pick(float(mousePos.x()), float(mousePos.y())); + pickSuccess = pr.objectHit() == m_pickNode; + } + } + } + return (onCircle && onPlane) || pickSuccess; }; switch (event->type()) { @@ -313,9 +478,9 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) auto const mouseEvent = static_cast(event); if (mouseEvent->button() == Qt::LeftButton) { m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos()); - if (mouseOnTopOfMouseArea(m_mousePosInPlane)) { + if (mouseOnTopOfMouseArea(m_mousePosInPlane, mouseEvent->pos())) { setDragging(true); - emit pressed(m_mousePosInPlane, mouseEvent->globalPos()); + emit pressed(m_mousePosInPlane, mouseEvent->pos(), pickAngle); if (m_grabsMouse) { if (s_mouseGrab && s_mouseGrab != this) { s_mouseGrab->setDragging(false); @@ -338,13 +503,13 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) if (qFuzzyCompare(mousePosInPlane.z(), -1)) mousePosInPlane = m_mousePosInPlane; setDragging(false); - emit released(mousePosInPlane, mouseEvent->globalPos()); + emit released(mousePosInPlane, mouseEvent->pos()); if (m_grabsMouse) { if (s_mouseGrab && s_mouseGrab != this) { s_mouseGrab->setDragging(false); s_mouseGrab->setHovering(false); } - if (mouseOnTopOfMouseArea(mousePosInPlane)) { + if (mouseOnTopOfMouseArea(mousePosInPlane, mouseEvent->pos())) { s_mouseGrab = this; setHovering(true); } else { @@ -362,7 +527,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) case QEvent::HoverMove: { auto const mouseEvent = static_cast(event); const QVector3D mousePosInPlane = getMousePosInPlane(mouseEvent->pos()); - const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane); + const bool hasMouse = mouseOnTopOfMouseArea(mousePosInPlane, mouseEvent->pos()); setHovering(hasMouse); @@ -376,9 +541,9 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) s_mouseGrab = nullptr; } - if (m_dragging && !qFuzzyCompare(mousePosInPlane.z(), -1)) { + if (m_dragging && (m_circlePickArea.y() > 0. || !qFuzzyCompare(mousePosInPlane.z(), -1))) { m_mousePosInPlane = mousePosInPlane; - emit dragged(mousePosInPlane, mouseEvent->globalPos()); + emit dragged(mousePosInPlane, mouseEvent->pos()); } break; @@ -408,6 +573,25 @@ void MouseArea3D::setHovering(bool enable) emit hoveringChanged(); } +QVector3D MouseArea3D::getNormal() const +{ + const float *dataPtr(sceneTransform().data()); + return QVector3D(dataPtr[8], dataPtr[9], dataPtr[10]).normalized(); +} + +QVector3D MouseArea3D::getCameraToNodeDir(QQuick3DNode *node) const +{ + QVector3D dir; + if (qobject_cast(m_view3D->camera())) { + dir = m_view3D->camera()->cameraNode()->getDirection(); + // Camera direction has x and y flipped + dir = QVector3D(-dir.x(), -dir.y(), dir.z()); + } else { + dir = (node->scenePosition() - m_view3D->camera()->scenePosition()).normalized(); + } + return dir; +} + } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h index af465576829..e227b3f9dde 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h @@ -28,9 +28,11 @@ #ifdef QUICK3D_MODULE #include +#include #include #include +#include #include #include @@ -50,6 +52,9 @@ class MouseArea3D : public QQuick3DNode Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged) Q_PROPERTY(int priority READ priority WRITE setPriority NOTIFY priorityChanged) Q_PROPERTY(int active READ active WRITE setActive NOTIFY activeChanged) + Q_PROPERTY(QPointF circlePickArea READ circlePickArea WRITE setCirclePickArea NOTIFY circlePickAreaChanged) + Q_PROPERTY(qreal minAngle READ minAngle WRITE setMinAngle NOTIFY minAngleChanged) + Q_PROPERTY(QQuick3DNode *pickNode READ pickNode WRITE setPickNode NOTIFY pickNodeChanged) Q_INTERFACES(QQmlParserStatus) @@ -68,11 +73,17 @@ public: bool dragging() const; bool grabsMouse() const; bool active() const; + QPointF circlePickArea() const; + qreal minAngle() const; + QQuick3DNode *pickNode() const; public slots: void setView3D(QQuick3DViewport *view3D); void setGrabsMouse(bool grabsMouse); void setActive(bool active); + void setCirclePickArea(const QPointF &pickArea); + void setMinAngle(qreal angle); + void setPickNode(QQuick3DNode *node); void setX(qreal x); void setY(qreal y); @@ -89,22 +100,35 @@ public slots: const QVector3D &pressPos, const QVector3D &sceneRelativeDistance, bool global); + Q_INVOKABLE qreal getNewRotationAngle(QQuick3DNode *node, const QVector3D &pressPos, + const QVector3D ¤tPos, const QVector3D &nodePos, + qreal prevAngle, bool trackBall); + Q_INVOKABLE void applyRotationAngleToNode(QQuick3DNode *node, const QVector3D &startRotation, + qreal angle); + Q_INVOKABLE void applyFreeRotation(QQuick3DNode *node, const QVector3D &startRotation, + const QVector3D &pressPos, const QVector3D ¤tPos); + signals: void view3DChanged(); - void xChanged(qreal x); - void yChanged(qreal y); - void widthChanged(qreal width); - void heightChanged(qreal height); - void priorityChanged(int level); + void xChanged(); + void yChanged(); + void widthChanged(); + void heightChanged(); + void priorityChanged(); void hoveringChanged(); void draggingChanged(); - void activeChanged(bool active); - void pressed(const QVector3D &scenePos, const QPoint &screenPos); + void activeChanged(); + void grabsMouseChanged(); + void circlePickAreaChanged(); + void minAngleChanged(); + void pickNodeChanged(); + + // angle parameter is only set if circlePickArea is specified + void pressed(const QVector3D &scenePos, const QPoint &screenPos, qreal angle); void released(const QVector3D &scenePos, const QPoint &screenPos); void dragged(const QVector3D &scenePos, const QPoint &screenPos); - void grabsMouseChanged(bool grabsMouse); protected: void classBegin() override {} @@ -114,6 +138,8 @@ protected: private: void setDragging(bool enable); void setHovering(bool enable); + QVector3D getNormal() const; + QVector3D getCameraToNodeDir(QQuick3DNode *node) const; Q_DISABLE_COPY(MouseArea3D) QQuick3DViewport *m_view3D = nullptr; @@ -133,6 +159,9 @@ private: static MouseArea3D *s_mouseGrab; bool m_grabsMouse; QVector3D m_mousePosInPlane; + QPointF m_circlePickArea; + qreal m_minAngle = 0.; + QQuick3DNode *m_pickNode = nullptr; }; } diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index fbdec743e41..deb70ba1453 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -22,8 +22,12 @@ mockfiles/ScaleRod.qml mockfiles/ScaleGizmo.qml mockfiles/ToolBarButton.qml + mockfiles/RotateGizmo.qml + mockfiles/RotateRing.qml mockfiles/meshes/arrow.mesh mockfiles/meshes/scalerod.mesh + mockfiles/meshes/ring.mesh + mockfiles/meshes/ringselect.mesh mockfiles/images/camera-pick-icon.png mockfiles/images/camera-pick-icon@2x.png mockfiles/images/light-pick-icon.png From db549197980bc696badb18ed13118646803eaa41 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 13 Nov 2019 13:42:43 +0200 Subject: [PATCH 36/59] QmlDesigner: Finalize camera visualization in edit 3D view Added the UX approved camera icons, which will now turn transparent and ignore mouse events when camera is selected so they do not interfere with transform gizmos. Frustum visualization also changes color according to selection state. Change-Id: Id77066d9abb2b54696fae833201236afa238486a Fixes: QDS-1208 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/mockfiles/CameraGizmo.qml | 4 ++-- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 11 ++++++---- .../qml/qmlpuppet/mockfiles/IconGizmo.qml | 20 ++++++++++++------ .../mockfiles/images/camera-pick-icon.png | Bin 206 -> 0 bytes .../mockfiles/images/camera-pick-icon@2x.png | Bin 279 -> 0 bytes .../mockfiles/images/editor_camera.png | Bin 0 -> 981 bytes .../mockfiles/images/editor_camera@2x.png | Bin 0 -> 1742 bytes share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 4 ++-- 8 files changed, 24 insertions(+), 15 deletions(-) delete mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/camera-pick-icon.png delete mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/camera-pick-icon@2x.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_camera.png create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_camera@2x.png diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml index 6a2a7b3a763..e158128a5fd 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml @@ -30,7 +30,7 @@ import CameraGeometry 1.0 IconGizmo { id: cameraGizmo - iconSource: "qrc:///qtquickplugin/mockfiles/images/camera-pick-icon.png" + iconSource: "qrc:///qtquickplugin/mockfiles/images/editor_camera.png" gizmoModel.geometry: cameraGeometry property alias geometryName: cameraGeometry.name // Name must be unique for each geometry property alias viewPortRect: cameraGeometry.viewPortRect @@ -43,7 +43,7 @@ IconGizmo { gizmoModel.materials: [ DefaultMaterial { id: defaultMaterial - emissiveColor: "blue" + emissiveColor: cameraGizmo.targetNode === cameraGizmo.selectedNode ? "#FF0000" : "#555555" lighting: DefaultMaterial.NoLighting cullingMode: Material.DisableCulling } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 2c908755229..5ca9ab8f9fb 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -66,9 +66,11 @@ Window { var component = Qt.createComponent("LightGizmo.qml"); if (component.status === Component.Ready) { var gizmo = component.createObject(overlayScene, - {"view3D": overlayView, "targetNode": obj}); + {"view3D": overlayView, "targetNode": obj, + "selectedNode": selectedNode}); lightGizmos[lightGizmos.length] = gizmo; - gizmo.selected.connect(emitObjectClicked); + gizmo.clicked.connect(emitObjectClicked); + gizmo.selectedNode = Qt.binding(function() {return selectedNode;}); } } @@ -80,10 +82,11 @@ Window { var gizmo = component.createObject( overlayScene, {"view3D": overlayView, "targetNode": obj, "geometryName": geometryName, - "viewPortRect": viewPortRect}); + "viewPortRect": viewPortRect, "selectedNode": selectedNode}); cameraGizmos[cameraGizmos.length] = gizmo; - gizmo.selected.connect(emitObjectClicked); + gizmo.clicked.connect(emitObjectClicked); gizmo.viewPortRect = Qt.binding(function() {return viewPortRect;}); + gizmo.selectedNode = Qt.binding(function() {return selectedNode;}); } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml index 6fbf17367e0..8623b87a840 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml @@ -32,12 +32,13 @@ Node { property View3D view3D property bool highlightOnHover: true property Node targetNode: null + property Node selectedNode: null property alias gizmoModel: gizmoModel property alias iconSource: iconImage.source signal positionCommit() - signal selected(Node node) + signal clicked(Node node) position: targetNode ? targetNode.scenePosition : Qt.vector3d(0, 0, 0) rotation: targetNode ? targetNode.sceneRotation : Qt.vector3d(0, 0, 0) @@ -57,22 +58,27 @@ Node { parent: view3D Rectangle { - width: 24 - height: 24 + width: iconImage.width + height: iconImage.height x: -width / 2 y: -height color: "transparent" border.color: "#7777ff" - border.width: highlightOnHover && iconMouseArea.containsMouse ? 2 : 0 + border.width: iconGizmo.selectedNode === iconGizmo.targetNode + || (iconGizmo.highlightOnHover && iconMouseArea.containsMouse) ? 2 : 0 radius: 5 + opacity: iconGizmo.selectedNode === iconGizmo.targetNode ? 0.3 : 1 Image { id: iconImage - anchors.fill: parent + fillMode: Image.Pad MouseArea { id: iconMouseArea anchors.fill: parent - onClicked: selected(targetNode) - hoverEnabled: highlightOnHover + onClicked: iconGizmo.clicked(iconGizmo.targetNode) + hoverEnabled: iconGizmo.highlightOnHover + && iconGizmo.selectedNode !== iconGizmo.targetNode + acceptedButtons: iconGizmo.selectedNode !== iconGizmo.targetNode + ? Qt.LeftButton : Qt.NoButton } } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/camera-pick-icon.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/camera-pick-icon.png deleted file mode 100644 index 47610f545019763e6dff750a23274f400c5e5dea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206 zcmeAS@N?(olHy`uVBq!ia0y~yV2}V|7G?$p2BAoW(+ms@1_3@Ht_%zet5*GAwd()E zRo`Zcgzn?`N(8p;@aw%v|-}chiht3=9nXB|(0{49q;z z2A)2-lQy4!{N(eW*FD$$7#JArJY5_^B*K#u7U(71{V&fUAt52%Ad@E`ed6LDh9@7K zEzZ22XkqtXP-fe2k2$;k@37D~6~NOV)tjW*RlI_e;pEL=@0C}LEEyOW7(8A5T-G@y GGywoX@m3%J diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/camera-pick-icon@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/camera-pick-icon@2x.png deleted file mode 100644 index 769934ae01c6e1134b5ffae203a7c3fa6d97c884..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 279 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4rT@hhJ-tuTNxM_%mREuTp1V`R;~KKYSsUR ztG>-%`)$^$_p?@inzj1ltkv<^NQaSACed>ix{s?`MG-5OT9kbrAytgJ4OJUoZnR zkF<<|Pwu2;o6kRa_V)81%kSHz7#JApJzX3_JdVGeVlC95z~jRFgOR25eSIXiuFK3G z>#XCeKeI(l>M)VIf2p-c`Z?3%)4wDGSf#mRnMw}&KCPToy3l_*H&;kvgahYeE;oaH zlV&R2;P5IC)>!Djpv89H^FxB?`_Y a8P5spPED2EEx^FQz~JfX=d#Wzp$P!I$atp! diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_camera.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_camera.png new file mode 100644 index 0000000000000000000000000000000000000000..4b2bf93d414a03c4e988ff5bb9917a9f6332a6ae GIT binary patch literal 981 zcmeAS@N?(olHy`uVBq!ia0y~yU@!n-4mJh`hH$2z?F6|A6De?2E5btG9$ivaR`?+}M0zg;1n)8Dq& zmoVMPy7qH%Be&8&z72d5yfrLWm>xIEH?SXgexUO8pDSL{9lw~b{Va48xZu3&gwf)w zi+lEPS@4`;kYf_=2@5|RrnluMzsLOh+K*&6Xn5Bg$avZqdBAgl`G)08yY35IZhgj( z+_3w=rEf+e%aO-Al*~L+#8d7t(h5n^HggZ+nUeCE`RnPC|P`U=aJoO4`?P#uz4jI7$5Gby=}!( z_K!)P+f|Q#-o@W8mhWNnOJ&i%iIe^b2X52IWL8%BtE~M0edp_+f?v;0{!-#{bI}ss zKkAw5d;Zi4U)Nsqx!LH`)&o}ZVJ}%P)qdMPz0u8cddidkW`%c!Ez;($*A49~-8bKd zBauhOAS$*~Fng|i&fNQ{bM5D)Ca4RD&27E*Q}^0W{-p`MrFEKBd$s02Jj>FcK%NmzY{o!HC+j91zo25g?vRQ0$(re8a539QLTdnkvstB~q zeSc)NUdonTsav9y*wgB_eO2~k-Zr&n>a(C~&E! zh`O8q*7({_ffPMvGu3UI&Sq>>e%%xCy!!OC(y4QrRQ^XiHxD>qW$*IsO6%m0-%mR* uzOJ!2_S5i8jN9tQxz3?}ettFw{tG1kGBHVg_LqTyfx*+&&t;ucLK6T2-qG3s literal 0 HcmV?d00001 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_camera@2x.png b/share/qtcreator/qml/qmlpuppet/mockfiles/images/editor_camera@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..1c690433c2b54f457ba338aa8b5518233d031d9f GIT binary patch literal 1742 zcmeAS@N?(olHy`uVBq!ia0y~yU`POA4rT@hhO2JvTnr3MwgEmNt_%zeGgrMEMWZ1= zMhJYc5nj!}z_70*$S;_Ik%^gwjh%y&i<^g+UqDbuSVUAzTtZSxR!%`tNm)frLsLsf zS5M!-(AdP(%+lJ%&fd|<+0EU<)63h(*Uvv7BrGB-HZDFPIVCkMJtH$GH!r`Su&AW0 zqOz*4zM-+DwXMCgr?;`A>maW^i@7%R} z@4o#94jwvs?8M1aXU<=^c=^h;>o;!Rx_#&F{RfX8KY9A>`HPpY-@JYI;p3;zU%q|+ z@$=X3KY#x{%X}Tgz`)$(>EalYaqsQS>+!;oA`ScsN=l0sC6!F=L8d-7~a zLGwEWkF7gDN}raieBk``*QCBl42iY zw^x5jEGRp{sc?PAPlgRgA06Mn(r?T5^^Km#?rJye*ZEj|o#ljYuif2C$9L4udfHmW z_~7U-My0!AVcWQU)c#vMm?ru!slnU!wtk|c!-Rx8_M9uW?0U7@s-cyE$LQUB?m3$e z__Nn6w(3h>&6p;&UyyEbMzyBwqu|??ymrRiGW@hfv%pc$89yo3n#kesDXR z;~rbC9MACmI)e@W%!=+=jQ6LU`_M4!^-rD!CcZ8zcHeCe=-lLga975}uxe_I{CIQgFB86XXYx63J(_l;(<3MF z!Gg6#;eOX9mHvLu!nb#I@5irPk5@lB@>_Q4v#oDWvMSEb-ZA%|Z$+rV^C`9UEh_Wir}W!7^{6AZkvRO3gBz#gR){XPzL$IS|ylV|LT>zlBifBJ_C zX_j{1k7k@bAGdK#`Xuf9Dv;YxY>(Mmcik5{F^$>wU%?OY zsjPnwcE;XI&=ByH%duo@y;JY6^Cv@NgXSf#Kj*kyj{SMO!6D^bY&+{E)!$1uGfk9p zl}l$;V*bzYr_XNQoPc-t-`XuHJ>2`>yM|52vte(?vZ*o*3=9mOu6{1-oD!Mmockfiles/meshes/scalerod.mesh mockfiles/meshes/ring.mesh mockfiles/meshes/ringselect.mesh - mockfiles/images/camera-pick-icon.png - mockfiles/images/camera-pick-icon@2x.png + mockfiles/images/editor_camera.png + mockfiles/images/editor_camera@2x.png mockfiles/images/light-pick-icon.png mockfiles/images/light-pick-icon@2x.png mockfiles/images/item_selection_active.png From 49f7cfb7a1a98e79e84c7c0cdc7d484b7c0912fb Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Wed, 13 Nov 2019 17:02:52 +0200 Subject: [PATCH 37/59] QmlDesigner: Implement proper helper grid for 3D edit view Change-Id: I9e33218d4b1528610155c5fb9bf94a9597ee23df Fixes: QDS-1204 Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../qml/qmlpuppet/mockfiles/EditView3D.qml | 24 +-- .../qml/qmlpuppet/mockfiles/HelperGrid.qml | 87 ++++++++++ .../qml2puppet/editor3d/editor3d.pri | 6 +- .../qml2puppet/editor3d/gridgeometry.cpp | 163 ++++++++++++++++++ .../qml2puppet/editor3d/gridgeometry.h | 76 ++++++++ .../qt5informationnodeinstanceserver.cpp | 2 + share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc | 1 + src/tools/qml2puppet/CMakeLists.txt | 1 + src/tools/qml2puppet/qml2puppet.qbs | 2 + 9 files changed, 349 insertions(+), 13 deletions(-) create mode 100644 share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.cpp create mode 100644 share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.h diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index 5ca9ab8f9fb..9db9d0c8a83 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -194,10 +194,10 @@ Window { Node { id: mainSceneHelpers - AxisHelper { - id: axisGrid - enableXZGrid: true - enableAxisLines: false + HelperGrid { + id: helperGrid + lines: 50 + step: 50 } PointLight { @@ -211,16 +211,18 @@ Window { PerspectiveCamera { id: editPerspectiveCamera + z: -600 y: 200 - z: -300 + rotation.x: 30 clipFar: 100000 clipNear: 1 } OrthographicCamera { id: editOrthoCamera + z: -600 y: 200 - z: -300 + rotation.x: 30 clipFar: 100000 clipNear: 1 } @@ -301,7 +303,7 @@ Window { property var group: [btnSelectItem, btnSelectGroup, btnMove, btnRotate, btnScale] - ToolbarButton { + ToolBarButton { id: btnSelectItem selected: true tooltip: qsTr("Select Item") @@ -311,7 +313,7 @@ Window { buttonsGroup: col.group } - ToolbarButton { + ToolBarButton { id: btnSelectGroup tooltip: qsTr("Select Group") shortcut: "Q" @@ -327,7 +329,7 @@ Window { anchors.horizontalCenter: parent.horizontalCenter } - ToolbarButton { + ToolBarButton { id: btnMove tooltip: qsTr("Move current selection") shortcut: "M" @@ -336,7 +338,7 @@ Window { buttonsGroup: col.group } - ToolbarButton { + ToolBarButton { id: btnRotate tooltip: qsTr("Rotate current selection") shortcut: "E" @@ -345,7 +347,7 @@ Window { buttonsGroup: col.group } - ToolbarButton { + ToolBarButton { id: btnScale tooltip: qsTr("Scale current selection") shortcut: "T" diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml new file mode 100644 index 00000000000..54af572a7ba --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/HelperGrid.qml @@ -0,0 +1,87 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import GridGeometry 1.0 + +Node { + id: grid + + property alias lines: gridGeometry.lines + property alias step: gridGeometry.step + + rotation.x: 90 + + // Note: Only one instance of HelperGrid is supported, as the geometry names are fixed + Model { + geometry: GridGeometry { + id: gridGeometry + name: "3D Edit View Helper Grid" + } + + materials: [ + DefaultMaterial { + id: mainGridMaterial + emissiveColor: "#e6e6e6" + lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling + } + ] + } + Model { + geometry: GridGeometry { + lines: gridGeometry.lines + step: gridGeometry.step + isCenterLine: true + name: "3D Edit View Helper Grid Z Axis" + } + materials: [ + DefaultMaterial { + id: vCenterLineMaterial + emissiveColor: "#00a1d2" + lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling + } + ] + } + Model { + rotation.z: 90 + geometry: GridGeometry { + lines: gridGeometry.lines + step: gridGeometry.step + isCenterLine: true + name: "3D Edit View Helper Grid X Axis" + } + materials: [ + DefaultMaterial { + id: hCenterLineMaterial + emissiveColor: "#cb211a" + lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling + } + ] + } +} diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri index 4e39a4cba9a..e8f546e8187 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri @@ -1,7 +1,9 @@ HEADERS += $$PWD/cameracontrolhelper.h \ $$PWD/mousearea3d.h \ - $$PWD/camerageometry.h + $$PWD/camerageometry.h \ + $$PWD/gridgeometry.h SOURCES += $$PWD/cameracontrolhelper.cpp \ $$PWD/mousearea3d.cpp \ - $$PWD/camerageometry.cpp + $$PWD/camerageometry.cpp \ + $$PWD/gridgeometry.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.cpp new file mode 100644 index 00000000000..55158180819 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.cpp @@ -0,0 +1,163 @@ +/**************************************************************************** +** +** 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. +** +****************************************************************************/ + +#ifdef QUICK3D_MODULE + +#include "gridgeometry.h" + +#include + +namespace QmlDesigner { +namespace Internal { + +GridGeometry::GridGeometry() + : QQuick3DGeometry() +{ +} + +GridGeometry::~GridGeometry() +{ +} + +int GridGeometry::lines() const +{ + return m_lines; +} + +float GridGeometry::step() const +{ + return m_step; +} + +bool GridGeometry::isCenterLine() const +{ + return m_isCenterLine; +} + +// Number of lines on each side of the center lines. +// These lines are not drawn if m_isCenterLine is true; lines and step are simply used to calculate +// the length of the center line in that case. +void GridGeometry::setLines(int count) +{ + count = qMax(count, 1); + if (m_lines == count) + return; + m_lines = qMax(count, 1); + emit linesChanged(); + update(); +} + +// Space between lines +void GridGeometry::setStep(float step) +{ + step = qMax(step, 0.0f); + if (qFuzzyCompare(m_step, step)) + return; + m_step = step; + emit stepChanged(); + update(); +} + +void GridGeometry::setIsCenterLine(bool enabled) +{ + if (m_isCenterLine == enabled) + return; + + m_isCenterLine = enabled; + emit isCenterLineChanged(); + update(); +} + +QSSGRenderGraphObject *GridGeometry::updateSpatialNode(QSSGRenderGraphObject *node) +{ + node = QQuick3DGeometry::updateSpatialNode(node); + QSSGRenderGeometry *geometry = static_cast(node); + geometry->clear(); + + QByteArray vertexData; + fillVertexData(vertexData); + + geometry->addAttribute(QSSGRenderGeometry::Attribute::PositionSemantic, 0, + QSSGRenderGeometry::Attribute::ComponentType::F32Type); + geometry->setStride(12); + geometry->setVertexData(vertexData); + geometry->setPrimitiveType(QSSGRenderGeometry::Lines); + + int lastIndex = (vertexData.size() - 1) / int(sizeof(QVector3D)); + auto vertexPtr = reinterpret_cast(vertexData.data()); + geometry->setBounds(QVector3D(vertexPtr[0][0], vertexPtr[0][1], 0.0), + QVector3D(vertexPtr[lastIndex][0], vertexPtr[lastIndex][1], 0.0)); + return node; +} + +void GridGeometry::fillVertexData(QByteArray &vertexData) +{ + const int size = m_isCenterLine + ? int(sizeof(float)) * 3 * 2 + : 4 * m_lines * int(sizeof(float)) * 3 * 2; + vertexData.resize(size); + float *dataPtr = reinterpret_cast(vertexData.data()); + + float y0 = -float(m_lines) * m_step; + float x0 = -float(m_lines) * m_step; + float y1 = -y0; + float x1 = -x0; + + if (m_isCenterLine) { + // start position + dataPtr[0] = 0.f; + dataPtr[1] = y0; + dataPtr[2] = 0.f; + // end position + dataPtr[3] = 0.f; + dataPtr[4] = y1; + dataPtr[5] = 0.f; + } else { + auto generateLines = [this, &dataPtr](float x0, float y0, float x1, float y1, bool vertical) { + for (int i = 0; i < m_lines; ++i) { + // start position + dataPtr[0] = vertical ? x0 + i * m_step : x0; + dataPtr[1] = vertical ? y0 : y0 + i * m_step; + dataPtr[2] = .0f; + // end position + dataPtr[3] = vertical ? x0 + i * m_step : x1; + dataPtr[4] = vertical ? y1 : y0 + i * m_step; + dataPtr[5] = .0f; + dataPtr += 6; + } + }; + + // Lines are created so that bounding box can later be calculated from first and last vertex + generateLines(x0, y0, x1, y1, true); + generateLines(x0, y0, x1, y1, false); + generateLines(x0, m_step, x1, y1, false); + generateLines(m_step, y0, x1, y1, true); + } +} + +} +} + +#endif // QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.h new file mode 100644 index 00000000000..41b83abca6e --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/gridgeometry.h @@ -0,0 +1,76 @@ +/**************************************************************************** +** +** 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 + +#ifdef QUICK3D_MODULE + +#include + +namespace QmlDesigner { +namespace Internal { + +class GridGeometry : public QQuick3DGeometry +{ + Q_OBJECT + Q_PROPERTY(int lines READ lines WRITE setLines NOTIFY linesChanged) + Q_PROPERTY(float step READ step WRITE setStep NOTIFY stepChanged) + Q_PROPERTY(bool isCenterLine READ isCenterLine WRITE setIsCenterLine NOTIFY isCenterLineChanged) + +public: + GridGeometry(); + ~GridGeometry() override; + + int lines() const; + float step() const; + bool isCenterLine() const; + +public Q_SLOTS: + void setLines(int count); + void setStep(float step); + void setIsCenterLine(bool enabled); + +Q_SIGNALS: + void linesChanged(); + void stepChanged(); + void isCenterLineChanged(); + +protected: + QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override; + +private: + void fillVertexData(QByteArray &vertexData); + + int m_lines = 1000; + float m_step = .1f; + bool m_isCenterLine = false; +}; + +} +} + +QML_DECLARE_TYPE(QmlDesigner::Internal::GridGeometry) + +#endif // QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index 546593ca828..2cd59af4607 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -65,6 +65,7 @@ #include "../editor3d/cameracontrolhelper.h" #include "../editor3d/mousearea3d.h" #include "../editor3d/camerageometry.h" +#include "../editor3d/gridgeometry.h" #include @@ -109,6 +110,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) #ifdef QUICK3D_MODULE qmlRegisterType("MouseArea3D", 1, 0, "MouseArea3D"); qmlRegisterType("CameraGeometry", 1, 0, "CameraGeometry"); + qmlRegisterType("GridGeometry", 1, 0, "GridGeometry"); #endif QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml")); diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index 7cb9e7913e0..f818f23fd52 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -15,6 +15,7 @@ mockfiles/LightGizmo.qml mockfiles/IconGizmo.qml mockfiles/Overlay2D.qml + mockfiles/HelperGrid.qml mockfiles/DirectionalDraggable.qml mockfiles/PlanarDraggable.qml mockfiles/PlanarMoveHandle.qml diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index 920d984bd4d..3f8987ee60f 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -111,6 +111,7 @@ extend_qtc_executable(qml2puppet cameracontrolhelper.cpp cameracontrolhelper.h mousearea3d.cpp mousearea3d.h camerageometry.cpp camerageometry.h + gridgeometry.cpp gridgeometry.h ) extend_qtc_executable(qml2puppet diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 2d083714525..ca1c3654fbe 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -203,6 +203,8 @@ QtcTool { "editor3d/mousearea3d.h", "editor3d/camerageometry.cpp", "editor3d/camerageometry.h", + "editor3d/gridgeometry.cpp", + "editor3d/gridgeometry.h", "qml2puppetmain.cpp", ] } From 02b7a529dd002406774f4a6a67aa87cb4a00b335 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Thu, 14 Nov 2019 08:58:04 +0100 Subject: [PATCH 38/59] LanguageClient: request link from active server for the document Instead of sending the link request to all reachable server send it only to the server that is currently used to handle this document. Change-Id: I27a8d0e4573f734baa2931a0af771e60665a4532 Reviewed-by: Christian Stenger --- src/plugins/languageclient/languageclientmanager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index defbd0bdac7..543ec74a20a 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -503,9 +503,9 @@ void LanguageClientManager::findLinkAt(TextEditor::TextDocument *document, } } }); - for (Client *interface : reachableClients()) { - if (interface->findLinkAt(request)) - m_exclusiveRequests[request.id()] << interface; + if (Client *client = clientForUri(uri)) { + if (client->reachable()) + client->findLinkAt(request); } } From 78012fcb66471e55b0255cc2c6e0ace956f1031e Mon Sep 17 00:00:00 2001 From: Sergey Morozov Date: Sun, 17 Nov 2019 12:23:22 +0300 Subject: [PATCH 39/59] Core: Fix wrong current view after session restore Fixes: QTCREATORBUG-23233 Change-Id: I4e5a854769d6aa00f5601b8bd8282523681d0458 Reviewed-by: Eike Ziller --- src/plugins/coreplugin/editormanager/editorview.cpp | 7 ++++--- src/plugins/coreplugin/editormanager/editorview.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/coreplugin/editormanager/editorview.cpp b/src/plugins/coreplugin/editormanager/editorview.cpp index c9adba0206d..fc6e8a296ab 100644 --- a/src/plugins/coreplugin/editormanager/editorview.cpp +++ b/src/plugins/coreplugin/editormanager/editorview.cpp @@ -713,7 +713,7 @@ EditorView *SplitterOrView::takeView() return oldView; } -void SplitterOrView::split(Qt::Orientation orientation) +void SplitterOrView::split(Qt::Orientation orientation, bool activateView) { Q_ASSERT(m_view && m_splitter == nullptr); m_splitter = new MiniSplitter(this); @@ -744,7 +744,8 @@ void SplitterOrView::split(Qt::Orientation orientation) otherView->view()->setCloseSplitIcon(Utils::Icons::CLOSE_SPLIT_BOTTOM.icon()); } - EditorManagerPrivate::activateView(otherView->view()); + if (activateView) + EditorManagerPrivate::activateView(otherView->view()); emit splitStateChanged(); } @@ -911,7 +912,7 @@ void SplitterOrView::restoreState(const QByteArray &state) qint32 orientation; QByteArray splitter, first, second; stream >> orientation >> splitter >> first >> second; - split((Qt::Orientation)orientation); + split((Qt::Orientation) orientation, false); m_splitter->restoreState(splitter); static_cast(m_splitter->widget(0))->restoreState(first); static_cast(m_splitter->widget(1))->restoreState(second); diff --git a/src/plugins/coreplugin/editormanager/editorview.h b/src/plugins/coreplugin/editormanager/editorview.h index a3fae51ff6e..ebced7ec174 100644 --- a/src/plugins/coreplugin/editormanager/editorview.h +++ b/src/plugins/coreplugin/editormanager/editorview.h @@ -171,7 +171,7 @@ public: explicit SplitterOrView(EditorView *view); ~SplitterOrView() override; - void split(Qt::Orientation orientation); + void split(Qt::Orientation orientation, bool activateView = true); void unsplit(); inline bool isView() const { return m_view != nullptr; } From 26e25728527b0aba637b171afd79133d19952932 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 15 Nov 2019 10:33:28 +0100 Subject: [PATCH 40/59] AutoTest: Fix font for results pane Use a correct font on macOS as well. Beside this there had been strange observation made when zooming the command line output. Change-Id: I8b8cdd0d76e415da4bc792b0d646154cfc8fde9d Reviewed-by: David Schulz --- src/plugins/autotest/testresultspane.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/plugins/autotest/testresultspane.cpp b/src/plugins/autotest/testresultspane.cpp index c84be8481c1..894f8e43ea9 100644 --- a/src/plugins/autotest/testresultspane.cpp +++ b/src/plugins/autotest/testresultspane.cpp @@ -45,7 +45,9 @@ #include #include #include +#include #include +#include #include #include @@ -129,9 +131,7 @@ TestResultsPane::TestResultsPane(QObject *parent) : m_textOutput = new QPlainTextEdit; m_textOutput->setPalette(pal); - QFont font("monospace"); - font.setStyleHint(QFont::TypeWriter); - m_textOutput->setFont(font); + m_textOutput->setFont(TextEditor::TextEditorSettings::fontSettings().font()); m_textOutput->setWordWrapMode(QTextOption::WordWrap); m_textOutput->setReadOnly(true); m_outputWidget->addWidget(m_textOutput); From 4797111a4db12444ad095c950d529311d616bbf7 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 15 Nov 2019 12:59:16 +0100 Subject: [PATCH 41/59] AutoTest: Fix detection of GTEST_TEST Googletest allows specifying tests with the GTEST_TEST macro which was ignored until now. Fixes: QTCREATORBUG-23228 Change-Id: I7dffab890e002000b32f7cd5b7444dc06fabe35a Reviewed-by: David Schulz --- src/plugins/autotest/gtest/gtest_utils.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/autotest/gtest/gtest_utils.cpp b/src/plugins/autotest/gtest/gtest_utils.cpp index 94f608b3341..1035cf5bb2a 100644 --- a/src/plugins/autotest/gtest/gtest_utils.cpp +++ b/src/plugins/autotest/gtest/gtest_utils.cpp @@ -34,7 +34,8 @@ namespace GTestUtils { static const QStringList valid = { QStringLiteral("TEST"), QStringLiteral("TEST_F"), QStringLiteral("TEST_P"), - QStringLiteral("TYPED_TEST"), QStringLiteral("TYPED_TEST_P") + QStringLiteral("TYPED_TEST"), QStringLiteral("TYPED_TEST_P"), + QStringLiteral("GTEST_TEST") }; bool isGTestMacro(const QString ¯o) From 09b358cf7235f46110695070aba1363ac2a6a005 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 19 Nov 2019 15:53:04 +0100 Subject: [PATCH 42/59] CppTools: Fix compile for gcc 5.3 Change-Id: I4b0da43dc835de1bc523a52be53da05e2237318c Reviewed-by: hjk --- src/plugins/cpptools/headerpathfilter.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/cpptools/headerpathfilter.cpp b/src/plugins/cpptools/headerpathfilter.cpp index 2fa71b58b27..b656f8e136e 100644 --- a/src/plugins/cpptools/headerpathfilter.cpp +++ b/src/plugins/cpptools/headerpathfilter.cpp @@ -116,7 +116,7 @@ QString clangIncludeDirectory(const QString &clangVersion, const QString &clangR #else Q_UNUSED(clangVersion) Q_UNUSED(clangResourceDirectory) - return CLANG_RESOURCE_DIR; + return {CLANG_RESOURCE_DIR}; #endif } From 748e5bd5b9c4dca86a0784f246507eb23bd1133b Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Tue, 19 Nov 2019 12:15:36 +0100 Subject: [PATCH 43/59] Update platform requirement for binary packages Since these are now based on Qt 5.14 Change-Id: I36167ec73fcedc99f57d1dbc16d6e8efeca8e830 Reviewed-by: Leena Miettinen --- README.md | 2 +- doc/src/overview/creator-only/creator-supported-platforms.qdoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 7ff6307201f..9ebfb460a33 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ The standalone binary packages support the following platforms: * Windows 7 or later * (K)Ubuntu Linux 16.04 (64-bit) or later -* macOS 10.12 or later +* macOS 10.13 or later ## Contributing diff --git a/doc/src/overview/creator-only/creator-supported-platforms.qdoc b/doc/src/overview/creator-only/creator-supported-platforms.qdoc index 55262c469e7..f98d17a503a 100644 --- a/doc/src/overview/creator-only/creator-supported-platforms.qdoc +++ b/doc/src/overview/creator-only/creator-supported-platforms.qdoc @@ -102,7 +102,7 @@ \endlist - \li \macos 10.12 or later with the following: + \li \macos 10.13 or later with the following: \list From b6ab85a4401e14cd6f8ea864ef023948dca757b7 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 19 Nov 2019 18:27:35 +0100 Subject: [PATCH 44/59] Android: Fix debugging on Windows The pid script was wrongly quoted on Windows resulting in not having logcat ability, and no debugging. Change-Id: Ica40d033b61b69bb2372f54f0eba19ae1d2e3c9f Reviewed-by: BogDan Vatra --- src/plugins/android/androidrunnerworker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 96508910e60..197c2fa0c18 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -67,7 +67,7 @@ using namespace Utils; namespace Android { namespace Internal { -static const QString pidScript = "pidof -s \"%1\""; +static const QString pidScript = "pidof -s '%1'"; static const QString pidScriptPreNougat = QStringLiteral("for p in /proc/[0-9]*; " "do cat <$p/cmdline && echo :${p##*/}; done"); static const QString pidPollingScript = QStringLiteral("while [ -d /proc/%1 ]; do sleep 1; done"); From 20f050303a4a3e2f80596843e9994ec54182fef6 Mon Sep 17 00:00:00 2001 From: Richard Weickelt Date: Wed, 20 Nov 2019 07:17:55 +0100 Subject: [PATCH 45/59] Update Qbs submodule Change-Id: I4a3fa1924b61fac55026cf0004c6e6468de57471 Reviewed-by: Christian Kandeler --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/shared/qbs b/src/shared/qbs index 3e5268b0888..de04ecbbf59 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit 3e5268b08883eb98ab539887d63985f149e02241 +Subproject commit de04ecbbf59b361320a174ee0117c2cfa8c10012 From 15b2765dff1cbba30b41da2bc48cd15bfce7f2a7 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Mon, 18 Nov 2019 16:57:44 +0100 Subject: [PATCH 46/59] Update Qt validity in options when changing Android device settings When changing the Android device settings and pressing "Apply", the information in the "Qt Versions" tab is no longer correct. The Abi information is parsed from the mkspec, and that depends on the NDK setting in the environment. When the NDK in the device settings changes, it updates the toolchains, and that triggers a re-validation of the Qt info in QtOptionsPageWidget::validInformation, but since the Android Qt version already has tried parsing the mkspec, and got (possibly empty) Abi information, it never is parsed and updated again. We need a way to force BaseQtVersion to update these things again. Fixes: QTCREATORBUG-23095 Change-Id: I9cb55ad1a73db942804637344e4c856c7e95afd3 Reviewed-by: Christian Kandeler --- src/plugins/android/androidconfigurations.cpp | 1 + src/plugins/android/androidconfigurations.h | 1 + src/plugins/android/androidqtversion.cpp | 5 +++++ src/plugins/android/androidqtversion.h | 1 + src/plugins/qtsupport/baseqtversion.cpp | 5 +++++ src/plugins/qtsupport/baseqtversion.h | 2 ++ 6 files changed, 15 insertions(+) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 87f2d8b60e6..d8714476ed6 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -870,6 +870,7 @@ FilePath AndroidConfig::qtLiveApkPath() const /////////////////////////////////// void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs) { + emit m_instance->aboutToUpdate(); m_instance->m_config = devConfigs; m_instance->save(); diff --git a/src/plugins/android/androidconfigurations.h b/src/plugins/android/androidconfigurations.h index aba533fc279..c19e68dbf44 100644 --- a/src/plugins/android/androidconfigurations.h +++ b/src/plugins/android/androidconfigurations.h @@ -209,6 +209,7 @@ public: static QProcessEnvironment toolsEnvironment(const AndroidConfig &config); signals: + void aboutToUpdate(); void updated(); private: diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index ff8606a1e0a..48aeab8e543 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -49,7 +49,12 @@ namespace Internal { AndroidQtVersion::AndroidQtVersion() : QtSupport::BaseQtVersion() + , m_guard(std::make_unique()) { + QObject::connect(AndroidConfigurations::instance(), + &AndroidConfigurations::aboutToUpdate, + m_guard.get(), + [this] { resetCache(); }); } bool AndroidQtVersion::isValid() const diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h index c9869608191..5098f533565 100644 --- a/src/plugins/android/androidqtversion.h +++ b/src/plugins/android/androidqtversion.h @@ -58,6 +58,7 @@ public: protected: void parseMkSpec(ProFileEvaluator *) const override; private: + std::unique_ptr m_guard; mutable QStringList m_androidAbis; mutable int m_minNdk = -1; }; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 13bab8c6f9c..95f65b12eab 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -2169,6 +2169,11 @@ Abis BaseQtVersion::qtAbisFromLibrary(const FilePathList &coreLibraries) return res; } +void BaseQtVersion::resetCache() const +{ + d->m_hasQtAbis = false; + d->m_mkspecReadUpToDate = false; +} // QtVersionFactory diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index 8de93f138bc..6d0e13b5cdf 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -245,6 +245,8 @@ protected: // helper function for desktop and simulator to figure out the supported abis based on the libraries static ProjectExplorer::Abis qtAbisFromLibrary(const Utils::FilePathList &coreLibraries); + void resetCache() const; + void ensureMkSpecParsed() const; virtual void parseMkSpec(ProFileEvaluator *) const; From e8fe082bf95005e3d5b79d433c36df88b32433f0 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 18 Nov 2019 18:43:24 +0100 Subject: [PATCH 47/59] Debugger: Swap BREAK and unused() in most dumper test To avoid optimizing. Change-Id: I43b39746811a822a0b5677920f9dc2f149291bc0 Reviewed-by: Christian Stenger --- tests/auto/debugger/tst_dumpers.cpp | 1438 +++++++++++++++++---------- 1 file changed, 908 insertions(+), 530 deletions(-) diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp index 76c67e69d10..be539035e5f 100644 --- a/tests/auto/debugger/tst_dumpers.cpp +++ b/tests/auto/debugger/tst_dumpers.cpp @@ -707,8 +707,8 @@ class Data public: Data() {} - Data(const QString &includes, const QString &code) - : includes(includes), code(code) + Data(const QString &includes, const QString &code, const QString &unused) + : includes(includes), code(code), unused(unused) {} const Data &operator+(const Check &check) const @@ -974,6 +974,7 @@ public: mutable QString profileExtra; mutable QString includes; mutable QString code; + mutable QString unused; mutable QList checks; mutable QList checksets; @@ -1326,6 +1327,11 @@ void tst_Dumpers::dumper() QFile source(t->buildPath + '/' + data.mainFile); QVERIFY(source.open(QIODevice::ReadWrite)); + + QString unused; + if (!data.unused.isEmpty()) + unused = "unused(" + data.unused + ");"; + QString fullCode = QString() + "\n\n#ifdef _WIN32" + (data.useQt ? "\n#include " : @@ -1372,28 +1378,29 @@ void tst_Dumpers::dumper() "\n#endif" : "") + "\n\nint main(int argc, char *argv[])" "\n{" - "\n unused(&argc, &argv);\n" - "\n int skipall = 0; unused(&skipall);\n" - "\n int qtversion = " + (data.useQt ? "QT_VERSION" : "0") + "; unused(&qtversion);" + "\n int skipall = 0;" + "\n int qtversion = " + (data.useQt ? "QT_VERSION" : "0") + ";" "\n#ifdef __GNUC__" - "\n int gccversion = 10000 * __GNUC__ + 100 * __GNUC_MINOR__; unused(&gccversion);" + "\n int gccversion = 10000 * __GNUC__ + 100 * __GNUC_MINOR__;" "\n#else" - "\n int gccversion = 0; unused(&gccversion);" + "\n int gccversion = 0;" "\n#endif" "\n#ifdef __clang__" - "\n int clangversion = 10000 * __clang_major__ + 100 * __clang_minor__; unused(&clangversion);" + "\n int clangversion = 10000 * __clang_major__ + 100 * __clang_minor__;" "\n gccversion = 0;" "\n#else" - "\n int clangversion = 0; unused(&clangversion);" + "\n int clangversion = 0;" "\n#endif" "\n#ifdef BOOST_VERSION" - "\n int boostversion = BOOST_VERSION; unused(&boostversion);" + "\n int boostversion = BOOST_VERSION;" "\n#else" - "\n int boostversion = 0; unused(&boostversion);" + "\n int boostversion = 0;" "\n#endif" "\n" + (data.useQHash ? "initHashSeed();" : "") + "\n" + data.code + - "\n BREAK;" + "\n BREAK;" + + "\n" + unused + + "\n unused(&argc, &argv, &skipall, &qtversion, &gccversion, &clangversion, &boostversion);" "\n return 0;" "\n}\n"; if (!data.allCode.isEmpty()) @@ -1898,15 +1905,17 @@ void tst_Dumpers::dumper_data() " } // namespace nsB\n" " } // namespace nsA\n"; + QTest::newRow("QBitArray") - << Data("#include \n", + << Data("#include ", + "QBitArray ba0;\n" - "unused(&ba0);\n" "QBitArray ba1(20, true);\n" "ba1.setBit(1, false);\n" "ba1.setBit(3, false);\n" - "ba1.setBit(16, false);\n" - "unused(&ba1);\n") + "ba1.setBit(16, false);", + + "&ba0, &ba1") + CoreProfile() @@ -1921,6 +1930,7 @@ void tst_Dumpers::dumper_data() + Check("ba1.16", "[16]", "0", "bool") + Check("ba1.17", "[17]", "1", "bool"); + QTest::newRow("QByteArray") << Data("#include \n" "#include \n" @@ -1948,12 +1958,13 @@ void tst_Dumpers::dumper_data() "char data[] = { 'H', 'e', 'l', 'l', 'o' };\n" "QByteArray ba4 = QByteArray::fromRawData(data, 4);\n" - "QByteArray ba5 = QByteArray::fromRawData(data + 1, 4);\n\n" + "QByteArray ba5 = QByteArray::fromRawData(data + 1, 4);", - "unused(&buf1, &buf2, &buf3);\n" - "unused(&ba0, &ba1, &ba2, &ba4, &ba5, &s, &ss);\n") + "&ba0, &ba1, &ba2, &s, &ss, &str1, &str2, &str3, &data, &ba4, &ba5, " + "&buf1, &buf2, &buf3, &ba4, &ba5") + CoreProfile() + + Check("ba0", "ba0", "\"\"", "@QByteArray") + Check("ba1", Value(QString("\"Hello\"World") @@ -1977,10 +1988,12 @@ void tst_Dumpers::dumper_data() QTest::newRow("QChar") - << Data("#include \n", + << Data("#include ", + "QString s = QLatin1String(\"x\");\n" - "QChar c = s.at(0);\n" - "unused(&c);\n") + "QChar c = s.at(0);", + + "&s, &c") + CoreProfile() @@ -1992,28 +2005,33 @@ void tst_Dumpers::dumper_data() "enum Foo { a = 0x1, b = 0x2 };\n" "Q_DECLARE_FLAGS(FooFlags, Foo)\n" "Q_DECLARE_OPERATORS_FOR_FLAGS(FooFlags)\n", + "FooFlags f1(a);\n" - "FooFlags f2(a | b);\n") + "FooFlags f2(a | b);\n", + + "&f1, &f2") + + CoreProfile() + + Check("f1", "a (1)", TypeDef("@QFlags", "FooFlags")) % CdbEngine + Check("f1", "a (0x0001)", "FooFlags") % NoCdbEngine + Check("f2", "(a | b) (0x0003)", "FooFlags") % GdbEngine; + QTest::newRow("QDateTime") - << Data("#include \n", + << Data("#include ", "QDate d0;\n" "QDate d1;\n" "d1.setDate(1980, 1, 1);\n" - "unused(&d0, &d1);\n" "QTime t0;\n" "QTime t1(13, 15, 32);\n" - "unused(&t0, &t1);\n\n" "QDateTime dt0;\n" - "QDateTime dt1(QDate(1980, 1, 1), QTime(13, 15, 32), Qt::UTC);\n" - "unused(&dt0, &dt1);\n") + "QDateTime dt1(QDate(1980, 1, 1), QTime(13, 15, 32), Qt::UTC);", + + "&d0, &d1, &t0, &t1, &dt0, &dt1") + CoreProfile() @@ -2047,6 +2065,7 @@ void tst_Dumpers::dumper_data() //+ Check("dt1.toUTC", // Value5("Tue Jan 1 13:15:32 1980 GMT"), "@QDateTime") % Optional(); + #ifdef Q_OS_WIN QString tempDir = "C:/Program Files"; #else @@ -2056,11 +2075,13 @@ void tst_Dumpers::dumper_data() QTest::newRow("QDir") << Data("#include \n", + "QDir dir(" + quoted(tempDir) + ");\n" "QString s = dir.absolutePath();\n" "QFileInfoList fil = dir.entryInfoList();\n" - "QFileInfo fi = fil.first();\n" - "unused(&dir, &s, &fi);\n") + "QFileInfo fi = fil.first();", + + "&dir, &s, &fi") + CoreProfile() + QtVersion(0x50300) @@ -2078,22 +2099,32 @@ void tst_Dumpers::dumper_data() #ifdef Q_OS_WIN << Data("#include \n" "#include \n", + "QFile file(\"C:\\\\Program Files\\\\t\");\n" "file.setObjectName(\"A QFile instance\");\n" "QFileInfo fi(\"C:\\\\Program Files\\\\tt\");\n" - "QString s = fi.absoluteFilePath();\n") + "QString s = fi.absoluteFilePath();", + + "&s") + + CoreProfile() + + Check("fi", "\"C:/Program Files/tt\"", "@QFileInfo") + Check("file", "\"C:\\Program Files\\t\"", "@QFile") + Check("s", "\"C:/Program Files/tt\"", "@QString"); #else << Data("#include \n" "#include \n", + "QFile file(\"/tmp/t\");\n" "file.setObjectName(\"A QFile instance\");\n" "QFileInfo fi(\"/tmp/tt\");\n" - "QString s = fi.absoluteFilePath();\n") + "QString s = fi.absoluteFilePath();\n", + + "&s") + + CoreProfile() + + Check("fi", "\"/tmp/tt\"", "@QFileInfo") + Check("file", "\"/tmp/t\"", "@QFile") + Check("s", "\"/tmp/tt\"", "@QString"); @@ -2102,7 +2133,8 @@ void tst_Dumpers::dumper_data() QTest::newRow("QFixed") << Data("#include \n", - "QFixed f(1234);\n") + "QFixed f(1234);", + "&f") + Qt5 + GuiPrivateProfile() + Check("f", "78976/64 = 1234.0", "@QFixed"); @@ -2150,7 +2182,9 @@ void tst_Dumpers::dumper_data() "h8[33] = 33.0;\n" "Hash::iterator it1 = h8.begin();\n" "Hash::iterator it2 = it1; ++it2;\n" - "Hash::iterator it3 = it2; ++it3;\n\n") + "Hash::iterator it3 = it2; ++it3;", + + "&it1, &it2, &it3") + CoreProfile() @@ -2209,6 +2243,7 @@ void tst_Dumpers::dumper_data() QTest::newRow("QHostAddress") << Data("#include \n", + "QHostAddress ha1(129u * 256u * 256u * 256u + 130u);\n\n" "QHostAddress ha2;\n" "ha2.setAddress(\"127.0.0.1\");\n\n" @@ -2229,8 +2264,9 @@ void tst_Dumpers::dumper_data() "addr.c[13] = 0;\n" "addr.c[14] = 0;\n" "addr.c[15] = 0;\n" - "QHostAddress ha3(addr);\n" - "unused(&ha1, &ha2, &ha3);\n") + "QHostAddress ha3(addr);", + + "&ha1, &ha2, &ha3") + NetworkProfile() @@ -2252,8 +2288,8 @@ void tst_Dumpers::dumper_data() "pain.begin(&im);\n" "pain.drawLine(2, 2, 130, 130);\n" "pain.end();\n" - "QPixmap pm = QPixmap::fromImage(im);\n" - "unused(&app, &pm);\n") + "QPixmap pm = QPixmap::fromImage(im);", + "&app, &pm") + GuiProfile() @@ -2267,39 +2303,34 @@ void tst_Dumpers::dumper_data() "#include \n" + fooData, - "QLinkedList l0;\n" - "unused(&l0);\n\n" + "QLinkedList l0;\n\n" "QLinkedList l1;\n" "l1.append(101);\n" - "l1.append(102);\n" - "unused(&l1);\n\n" + "l1.append(102);\n\n" "QLinkedList l2;\n" "l2.append(103);\n" - "l2.append(104);\n" - "unused(&l2);\n\n" + "l2.append(104);\n\n" "QLinkedList l3;\n" "l3.append(new Foo(1));\n" "l3.append(0);\n" - "l3.append(new Foo(3));\n" - "unused(&l3);\n\n" + "l3.append(new Foo(3));\n\n" "QLinkedList l4;\n" "l4.append(42);\n" - "l4.append(43);\n" - "unused(&l4);\n\n" + "l4.append(43);\n\n" "QLinkedList l5;\n" "l5.append(Foo(1));\n" - "l5.append(Foo(2));\n" - "unused(&l5);\n\n" + "l5.append(Foo(2));\n\n" "QLinkedList l6;\n" "l6.push_back(\"aa\");\n" - "l6.push_back(\"bb\");\n" - "unused(&l6);\n\n") + "l6.push_back(\"bb\");\n\n", + + "&l1, &l2, &l3, &l4, &l5, &l6") + CoreProfile() @@ -2344,79 +2375,69 @@ void tst_Dumpers::dumper_data() "#include \n", "QList l0;\n" - "unused(&l0);\n\n" "QList l1;\n" "for (int i = 0; i < 10; ++i)\n" " l1.push_back(i);\n" - "unused(&l1);\n\n" "QList l2;\n" "l2.append(0);\n" "l2.append(1);\n" "l2.append(2);\n" "l2.takeFirst();\n" - "unused(&l2);\n\n" "QList l3;\n" "l3.append(\"0\");\n" "l3.append(\"1\");\n" "l3.append(\"2\");\n" "l3.takeFirst();\n" - "unused(&l3);\n\n" "QStringList l4;\n" "l4.append(\"0\");\n" "l4.append(\"1\");\n" "l4.append(\"2\");\n" "l4.takeFirst();\n" - "unused(&l4);\n\n" "QList l5;\n" "l5.append(new int(1));\n" "l5.append(new int(2));\n" "l5.append(0);\n" - "unused(&l5);\n\n" "QList l6;\n" - "unused(&l6);\n\n" "QList l7;\n" "l7.append(101);\n" "l7.append(102);\n" "l7.append(102);\n" - "unused(&l7);\n\n" "QStringList sl;\n" "sl.append(\"aaa\");\n" "QList l8;\n" "l8.append(sl);\n" "l8.append(sl);\n" - "unused(&l8, &sl);\n\n" "QList l9;\n" "l9.append(101);\n" "l9.append(102);\n" "l9.append(102);\n" - "unused(&l9);\n\n" "QList l10;\n" "l10.append(QChar('a'));\n" "l10.append(QChar('b'));\n" "l10.append(QChar('c'));\n" - "unused(&l10);\n\n" "QList l11;\n" "l11.append(100);\n" "l11.append(101);\n" "l11.append(102);\n" - "unused(&l11);\n\n" "QList l12, l13;\n" "l13.push_back(\"aa\");\n" "l13.push_back(\"bb\");\n" "l13.push_back(\"cc\");\n" - "l13.push_back(\"dd\");") + "l13.push_back(\"dd\");", + + "&l1, &l2, &l3, &l4, &l5, &l6, &l7, &l8, &l9, &l10, &l11, &l12, &l13, &sl") + CoreProfile() @@ -2486,7 +2507,9 @@ void tst_Dumpers::dumper_data() "Reverse rend(l.begin());\n" "QList r;\n" "while (rit != rend)\n" - " r.append(*rit++);\n") + " r.append(*rit++);\n", + + "&r, &l0, &l1, &l") + CoreProfile() @@ -2509,14 +2532,18 @@ void tst_Dumpers::dumper_data() QTest::newRow("QLocale") << Data("#include \n", + "QLocale loc0;\n" "QLocale loc = QLocale::system();\n" "QLocale::MeasurementSystem m = loc.measurementSystem();\n" "QLocale loc1(\"en_US\");\n" - "QLocale::MeasurementSystem m1 = loc1.measurementSystem();\n" - "unused(&loc0, &loc, &m, &loc1, &m1);\n") + "QLocale::MeasurementSystem m1 = loc1.measurementSystem();", + + "&loc0, &loc, &m, &loc1, &m1") + + CoreProfile() + NoCdbEngine + + CheckType("loc", "@QLocale") + CheckType("m", "@QLocale::MeasurementSystem") + Check("loc1", "\"en_US\"", "@QLocale") @@ -2542,7 +2569,6 @@ void tst_Dumpers::dumper_data() "#include \n" + fooData + nsData, "QMap m0;\n" - "unused(&m0);\n\n" "QMap m1;\n" "m1[11] = QStringList() << \"11\";\n" @@ -2581,7 +2607,9 @@ void tst_Dumpers::dumper_data() "m8[\"foo\"] = x;\n" "m8[\"bar\"] = x;\n" "m8[\"1\"] = x;\n" - "m8[\"2\"] = x;\n\n") + "m8[\"2\"] = x;\n\n", + + "&m0, &m1, &m2, &m3, &m4, &m5, &m6, &m7, &m8") + CoreProfile() @@ -2648,7 +2676,6 @@ void tst_Dumpers::dumper_data() "#include \n" + fooData, "QMultiMap m0;\n" - "unused(&m0);\n\n" "QMultiMap m1;\n" "m1.insert(11, 11.0);\n" @@ -2674,7 +2701,9 @@ void tst_Dumpers::dumper_data() "m5.insert(\"Hallo\", QPointer(&ob));\n" "m5.insert(\"Welt\", QPointer(&ob));\n" "m5.insert(\".\", QPointer(&ob));\n" - "m5.insert(\".\", QPointer(&ob));\n\n") + "m5.insert(\".\", QPointer(&ob));", + + "&m0, &m1, &m2, &m3, &m4, &m5, &ob") + CoreProfile() @@ -2709,13 +2738,16 @@ void tst_Dumpers::dumper_data() QTest::newRow("QObject1") << Data("#include \n", + "QObject parent;\n" "parent.setObjectName(\"A Parent\");\n" "QObject child(&parent);\n" "child.setObjectName(\"A Child\");\n" "QObject::connect(&child, SIGNAL(destroyed()), &parent, SLOT(deleteLater()));\n" "QObject::disconnect(&child, SIGNAL(destroyed()), &parent, SLOT(deleteLater()));\n" - "child.setObjectName(\"A renamed Child\");\n") + "child.setObjectName(\"A renamed Child\");", + + "&parent, &child") + CoreProfile() @@ -2758,8 +2790,8 @@ void tst_Dumpers::dumper_data() " };\n" "} // namespace Bar\n" "#include \n", - "" - "QApplication app(argc, argv); unused(&app);\n" + + "QApplication app(argc, argv);\n" "Bar::TestObject test;\n" "test.setObjectName(\"Name\");\n" "test.setMyProp1(\"Hello\");\n" @@ -2770,24 +2802,28 @@ void tst_Dumpers::dumper_data() "s += QString::fromLatin1(test.myProp2());\n" "\n" "const QMetaObject *mo = test.metaObject();\n" - "QMetaMethod mm0; unused(&mm0); \n" + "QMetaMethod mm0;\n" "const QMetaObject smo = test.staticMetaObject;\n" - "QMetaMethod mm = mo->method(0); unused(&mm);\n" + "QMetaMethod mm = mo->method(0);\n" "\n" "QMetaEnum me0;\n" - "QMetaEnum me = mo->enumerator(0); unused(&me);\n" + "QMetaEnum me = mo->enumerator(0);\n" "\n" "QMetaProperty mp0;\n" - "QMetaProperty mp = mo->property(0); unused(&mp);\n" + "QMetaProperty mp = mo->property(0);\n" "\n" "QMetaClassInfo mci0;\n" - "QMetaClassInfo mci = mo->classInfo(0); unused(&mci);\n" + "QMetaClassInfo mci = mo->classInfo(0);\n" "\n" "int n = mo->methodCount();\n" "QVector v(n);\n" "for (int i = 0; i < n; ++i)\n" - " v[i] = mo->method(i);\n") + " v[i] = mo->method(i);\n", + + "&app, &mm0, &mm, &me, &mp, &mci, &smo") + + GuiProfile() + + Check("s", "\"HelloWorld\"", "@QString") + Check("test", "\"Name\"", "Bar::TestObject") + Check("test.[properties]", "<6 items>", "") @@ -2808,6 +2844,7 @@ void tst_Dumpers::dumper_data() + Check("mm.handle", "14", TypeDef("unsigned int", "uint")) + Check("mp", "objectName", "@QMetaProperty"); + QTest::newRow("QObject3") << Data("#include \n" "#include \n" @@ -2832,8 +2869,8 @@ void tst_Dumpers::dumper_data() "obs.append(&ob1);\n" "obs.append(0);\n" "obs.append(&app);\n" - "ob2.setObjectName(\"A Subobject\");\n" - "unused(&ob, &ob1, &ob2);\n") + "ob2.setObjectName(\"A Subobject\");", + "&ob, &ob1, &ob2") + GuiProfile() @@ -2951,8 +2988,12 @@ void tst_Dumpers::dumper_data() " d->m_extraZ = z;\n" " }\n" "#include \"main.moc\"\n", + "DerivedObject ob;\n" - "ob.setX(26);\n") + "ob.setX(26);", + + "&ob") + + CoreProfile() + CorePrivateProfile(); // FIXME: @@ -2962,13 +3003,18 @@ void tst_Dumpers::dumper_data() QTest::newRow("QRegExp") << Data("#include \n" "#include \n", + "QRegExp re(QString(\"a(.*)b(.*)c\"));\n" "QString str1 = \"a1121b344c\";\n" "QString str2 = \"Xa1121b344c\";\n" - "int pos1 = re.indexIn(str1); unused(&pos1);\n" - "int pos2 = re.indexIn(str2); unused(&pos2);\n" - "QStringList caps = re.capturedTexts(); unused(&caps);\n") + "int pos1 = re.indexIn(str1);\n" + "int pos2 = re.indexIn(str2);\n" + "QStringList caps = re.capturedTexts();", + + "&pos1, &pos2, &caps") + + CoreProfile() + + Check("re", "\"a(.*)b(.*)c\"", "@QRegExp") + Check("re.captures.0", "[0]", "\"a1121b344c\"", "@QString") + Check("re.captures.1", "[1]", "\"1121\"", "@QString") @@ -2989,25 +3035,23 @@ void tst_Dumpers::dumper_data() "#include // Dummy for namespace\n", "QString dummy;\n" - "unused(&dummy);\n" "QRect rect0, rect;\n" "rect = QRect(100, 100, 200, 200);\n" "QRectF rectf0, rectf;\n" "rectf = QRectF(100.25, 100.25, 200.5, 200.5);\n" - "unused(&rect0, &rect);\n\n" "QPoint p0, p;\n" "p = QPoint(100, 200);\n" "QPointF pf0, pf;\n" "pf = QPointF(100.5, 200.5);\n" - "unused(&p0, &p);\n" "QSize s0, s;\n" "QSizeF sf0, sf;\n" "sf = QSizeF(100.5, 200.5);\n" - "s = QSize(100, 200);\n" - "unused(&s0, &s);\n") + "s = QSize(100, 200);", + + "&s0, &s, &dummy, &rect0, &rect, &p0, &p") + CoreProfile() @@ -3036,8 +3080,8 @@ void tst_Dumpers::dumper_data() "region1 = region;\n" "QVector rects = region1.rects(); // Warm up internal cache.\n" "region += QRect(300, 300, 400, 500);\n" - "region2 = region;\n" - "unused(®ion0, ®ion1, ®ion2, &rects);\n") + "region2 = region;", + "®ion0, ®ion1, ®ion2, &rects") + GuiProfile() @@ -3061,11 +3105,15 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "#include \n", + "QCoreApplication app(argc, argv);\n" "QSettings settings(\"/tmp/test.ini\", QSettings::IniFormat);\n" - "QVariant value = settings.value(\"item1\", \"\").toString();\n" - "unused(&value);\n") + "QVariant value = settings.value(\"item1\", \"\").toString();", + + "&value, &app, &settings") + + CoreProfile() + + Check("settings", "", "@QSettings") //+ Check("settings.@1", "[@QObject]", "", "@QObject") + Check("value", "\"\"", "@QVariant (QString)"); @@ -3095,9 +3143,12 @@ void tst_Dumpers::dumper_data() "QPointer ptr(&ob);\n" "s3.insert(ptr);\n" "s3.insert(ptr);\n" - "s3.insert(ptr);\n") + "s3.insert(ptr);\n", + + "&s1, &s2, &s3") + CoreProfile() + + Check("s1", "<2 items>", "@QSet") + Check("s1.0", "[0]", "22", "int") + Check("s1.1", "[1]", "11", "int") @@ -3148,6 +3199,7 @@ void tst_Dumpers::dumper_data() " QSharedDataPointer d;\n" " };\n"; + QTest::newRow("QAtomicPointer") << Data("#include \n" "#include \n\n" @@ -3163,13 +3215,17 @@ void tst_Dumpers::dumper_data() "};\n\n" "typedef Pointer SomeStructPointer;\n\n", - "SomeStruct *s = new SomeStruct; unused(s);\n" - "SomeStructPointer p(s); unused(p);\n" - "Pointer pp(s); unused(pp);\n" - "QAtomicPointer ppp(s); unused(ppp);\n") + "SomeStruct *s = new SomeStruct;\n" + "SomeStructPointer p(s);\n" + "Pointer pp(s);\n" + "QAtomicPointer ppp(s);", + + "&s, &p, &pp, &ppp") + + CoreProfile() + Cxx11Profile() + MsvcVersion(1900) + + Check("p.@1.a", "1", "int") + Check("p.@1.e", "<2 items>", "@QList<@QString>") + Check("pp.@1.a", "1", "int") @@ -3180,9 +3236,11 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n", - "QTimer timer; unused(&timer);\n" - "QPointer ptr0; unused(&ptr0);\n" - "QPointer ptr1(&timer); unused(&ptr1);\n\n") + "QTimer timer;\n" + "QPointer ptr0;\n" + "QPointer ptr1(&timer);", + + "&timer, &ptr0, &ptr1") + CoreProfile() @@ -3194,11 +3252,13 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n", - "QScopedPointer ptr10; unused(&ptr10);\n" - "QScopedPointer ptr11(new int(32)); unused(&ptr11);\n\n" + "QScopedPointer ptr10;\n" + "QScopedPointer ptr11(new int(32));\n\n" - "QScopedPointer ptr20; unused(&ptr20);\n" - "QScopedPointer ptr21(new QString(\"ABC\")); unused(&ptr21);\n\n") + "QScopedPointer ptr20;\n" + "QScopedPointer ptr21(new QString(\"ABC\"));", + + "&ptr10, &ptr11, &ptr20, &ptr21") + CoreProfile() @@ -3215,31 +3275,32 @@ void tst_Dumpers::dumper_data() "QSharedPointer ptr10;\n" "QSharedPointer ptr11 = ptr10;\n" - "QSharedPointer ptr12 = ptr10;\n" - "unused(&ptr10, &ptr11, &ptr12);\n\n" + "QSharedPointer ptr12 = ptr10;\n\n" "QSharedPointer ptr20(new QString(\"hallo\"));\n" "QSharedPointer ptr21 = ptr20;\n" - "QSharedPointer ptr22 = ptr20;\n" - "unused(&ptr20, &ptr21, &ptr22);\n\n" + "QSharedPointer ptr22 = ptr20;\n\n" "QSharedPointer ptr30(new int(43));\n" "QWeakPointer ptr31(ptr30);\n" "QWeakPointer ptr32 = ptr31;\n" - "QWeakPointer ptr33 = ptr32;\n" - "unused(&ptr30, &ptr31, &ptr32);\n\n" + "QWeakPointer ptr33 = ptr32;\n\n" "QSharedPointer ptr40(new QString(\"hallo\"));\n" "QWeakPointer ptr41(ptr40);\n" "QWeakPointer ptr42 = ptr40;\n" - "QWeakPointer ptr43 = ptr40;\n" - "unused(&ptr40, &ptr41, &ptr42, &ptr43);\n\n" + "QWeakPointer ptr43 = ptr40;\n\n" "QSharedPointer ptr50(new Foo(1));\n" "QWeakPointer ptr51(ptr50);\n" "QWeakPointer ptr52 = ptr50;\n" - "QWeakPointer ptr53 = ptr50;\n" - "unused(&ptr50, &ptr51, &ptr52, &ptr53);\n") + "QWeakPointer ptr53 = ptr50;\n", + + "&ptr10, &ptr11, &ptr12, " + "&ptr20, &ptr21, &ptr22, " + "&ptr30, &ptr31, &ptr32, &ptr33, " + "&ptr40, &ptr41, &ptr42, &ptr43, " + "&ptr50, &ptr51, &ptr52, &ptr53") + CoreProfile() @@ -3273,9 +3334,14 @@ void tst_Dumpers::dumper_data() QTest::newRow("QLazilyAllocated") << Data("#include \n" "#include \n", + "QLazilyAllocated l;\n" - "l.value() = \"Hi\";\n") + "l.value() = \"Hi\";\n", + + "&l") + + QmlPrivateProfile() + + Check("l", "\"Hi\"", "@QLazilyAllocated<@QString>"); @@ -3310,10 +3376,11 @@ void tst_Dumpers::dumper_data() "QFiniteStack s5;\n" "s5.allocate(10);\n" "s5.push(true);\n" - "s5.push(false);\n\n") + "s5.push(false);", + + "&s1, &s2, &s3, &s4, &s5") + QmlPrivateProfile() - + BigArrayProfile() + Check("s1", "<2 items>", "@QFiniteStack") @@ -3377,34 +3444,30 @@ void tst_Dumpers::dumper_data() "QStack s1;\n" "s1.append(1);\n" - "s1.append(2);\n" - "unused(&s1);\n\n" + "s1.append(2);\n\n" "QStack s2;\n" "for (int i = 0; i != 10000; ++i)\n" " s2.append(i);\n" - "unused(&s2);\n\n" "QStack s3;\n" "s3.append(new Foo(1));\n" "s3.append(0);\n" - "s3.append(new Foo(2));\n" - "unused(&s3);\n\n" + "s3.append(new Foo(2));\n\n" "QStack s4;\n" "s4.append(1);\n" "s4.append(2);\n" "s4.append(3);\n" - "s4.append(4);\n" - "unused(&s4);\n\n" + "s4.append(4);\n\n" "QStack s5;\n" "s5.append(true);\n" - "s5.append(false);\n" - "unused(&s5);\n\n") + "s5.append(false);", + + "&s1, &s2, &s3, &s4, &s5") + CoreProfile() - + BigArrayProfile() + Check("s1", "<2 items>", "@QStack") @@ -3435,9 +3498,11 @@ void tst_Dumpers::dumper_data() QTest::newRow("QTimeZone") << Data("#include \n", + "QTimeZone tz0;\n" - "QTimeZone tz1(\"UTC+05:00\");\n" - "unused(&tz0, &tz1);\n") + "QTimeZone tz1(\"UTC+05:00\");", + + "&tz0, &tz1") + CoreProfile() + QtVersion(0x50200) @@ -3448,11 +3513,13 @@ void tst_Dumpers::dumper_data() QTest::newRow("QUrl") << Data("#include ", + "QUrl url0;\n" "QUrl url1 = QUrl::fromEncoded(\"http://foo@qt-project.org:10/have_fun\");\n" "int port = url1.port();\n" - "QString path = url1.path();\n" - "unused(&url0, &url1, &port, &path);\n") + "QString path = url1.path();", + + "&url0, &url1, &port, &path") + CoreProfile() @@ -3471,11 +3538,15 @@ void tst_Dumpers::dumper_data() QTest::newRow("QUuid") << Data("#include ", + "QUuid uuid1(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);\n" "QUuid uuid2(0xfffffffeu, 0xfffd, 0xfffc, 0xfb, " - " 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4);\n" - "unused(&uuid1, &uuid2);\n") + " 0xfa, 0xf9, 0xf8, 0xf7, 0xf6, 0xf5, 0xf4);", + + "&uuid1, &uuid2") + + CoreProfile() + + Check("uuid1", "{00000001-0002-0003-0405-060708090a0b}", "@QUuid") + Check("uuid2", "{fffffffe-fffd-fffc-fbfa-f9f8f7f6f5f4}", "@QUuid"); @@ -3498,7 +3569,6 @@ void tst_Dumpers::dumper_data() "QByteArray s0 = \"Hello\";\n" "s0.prepend(\"Prefix: \");\n" - "unused(&s0);\n\n" "QByteArray s1 = \"AAA\";\n" "s1 += '\\t';\n" @@ -3507,17 +3577,14 @@ void tst_Dumpers::dumper_data() "s1 += char(0);\n" "s1 += char(1);\n" "s1 += \"BBB\";\n" - "unused(&s1);\n\n" "QChar data[] = { 'H', 'e', 'l', 'l', 'o' };\n" "QString s2 = QString::fromRawData(data, 4);\n" "QString s3 = QString::fromRawData(data + 1, 4);\n" - "unused(&data, &s2, &s3);\n\n" "QString s4 = \"Hello \";\n" "QString s5(\"String Test\");\n" "QString *s6 = new QString(\"Pointer String Test\");\n" - "unused(&s4, &s5, &s6);\n\n" "const wchar_t *w = L\"aöa\";\n" "QString s7;\n" @@ -3525,12 +3592,10 @@ void tst_Dumpers::dumper_data() " s7 = QString::fromUcs4((uint *)w);\n" "else\n" " s7 = QString::fromUtf16((ushort *)w);\n" - "unused(&w, &s7);\n\n" "QString str = \"Hello\";\n" "QStringRef s8(&str, 1, 2);\n" "QStringRef s9;\n" - "unused(&s8, &s9);\n\n" "QStringList l;\n" "l << \"Hello \";\n" @@ -3538,25 +3603,31 @@ void tst_Dumpers::dumper_data() "l.takeFirst();\n" "l << \" World \";\n\n" - "QString str1(\"Hello Qt\"); unused(&str1);\n" - "QString str2(\"Hello\\nQt\"); unused(&str2);\n" - "QString str3(\"Hello\\rQt\"); unused(&str3);\n" - "QString str4(\"Hello\\tQt\"); unused(&str4);\n\n" + "QString str1(\"Hello Qt\");\n" + "QString str2(\"Hello\\nQt\");\n" + "QString str3(\"Hello\\rQt\");\n" + "QString str4(\"Hello\\tQt\");\n\n" "#if QT_VERSION > 0x50000\n" "static const QStaticStringData<3> qstring_literal = {\n" " Q_STATIC_STRING_DATA_HEADER_INITIALIZER(3),\n" " QT_UNICODE_LITERAL(u\"ABC\") };\n" "QStringDataPtr holder = { qstring_literal.data_ptr() };\n" - "const QString qstring_literal_temp(holder); unused(&holder);\n\n" + "const QString qstring_literal_temp(holder);\n\n" "QStaticStringData<1> sd;\n" "sd.data[0] = 'Q';\n" "sd.data[1] = 0;\n" - "#endif\n") + "#else\n" + "int qstring_literal_temp, sd, holder;\n" + "#endif", + + "&s0, &s1, &data, &s2, &s3, &s4, &s5, &s6, &w, &s7, &s8, &s9, " + "&l, &qstring_literal_temp, &sd, &str1, &str2, &str3, &str4, &holder") + CoreProfile() + MsvcVersion(1900) + + Check("s0", "\"Prefix: Hello\"", "@QByteArray") + Check("s1", expected1, "@QByteArray") + Check("s2", "\"Hell\"", "@QString") @@ -3595,7 +3666,10 @@ void tst_Dumpers::dumper_data() " BREAK;\n" " unused(&refstring);\n" "}\n", - "stringRefTest(QString(\"Ref String Test\"));\n") + + "stringRefTest(QString(\"Ref String Test\"));\n", + + "") + CoreProfile() @@ -3607,20 +3681,25 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "#include \n", + "QApplication app(argc, argv);\n" "QTextDocument doc;\n" "doc.setPlainText(\"Hallo\\nWorld\");\n" "QTextCursor tc;\n" "tc = doc.find(\"all\");\n" "int pos = tc.position();\n" - "int anc = tc.anchor();\n" - "unused(&pos, &anc);\n") + "int anc = tc.anchor();", + + "&pos, &anc") + + GuiProfile() + + CheckType("doc", "@QTextDocument") + Check("tc", "4", "@QTextCursor") + Check("pos", "4", "int") + Check("anc", "1", "int"); + QTest::newRow("QThread") << Data("#include \n" "struct Thread : QThread\n" @@ -3629,18 +3708,19 @@ void tst_Dumpers::dumper_data() " {\n" " auto mo = &QThread::metaObject;\n" " auto mc = &QThread::qt_metacast;\n" - " auto p0 = (*(void***)this)[0]; unused(&p0);\n" - " auto p1 = (*(void***)this)[1]; unused(&p1);\n" - " auto p2 = (*(void***)this)[2]; unused(&p2);\n" - " auto p3 = (*(void***)this)[3]; unused(&p3);\n" - " auto p4 = (*(void***)this)[4]; unused(&p4);\n" - " auto p5 = (*(void***)this)[5]; unused(&p5);\n" + " auto p0 = (*(void***)this)[0];\n" + " auto p1 = (*(void***)this)[1];\n" + " auto p2 = (*(void***)this)[2];\n" + " auto p3 = (*(void***)this)[3];\n" + " auto p4 = (*(void***)this)[4];\n" + " auto p5 = (*(void***)this)[5];\n" " if (m_id == 3) {\n" " BREAK;\n" " }\n" + " unused(&mo, &mc, &p0, &p1, &p2, &p3, &p4, &p5);\n" " }\n" " int m_id;\n" - "};\n", + "};", "const int N = 14;\n" "Thread thread[N];\n" @@ -3651,7 +3731,9 @@ void tst_Dumpers::dumper_data() "}\n" "for (int i = 0; i != N; ++i) {\n" " thread[i].wait();\n" - "}\n") + "}", + + "&thread, &N") + CoreProfile() @@ -3672,13 +3754,11 @@ void tst_Dumpers::dumper_data() "Q_DECLARE_METATYPE(QList)\n" "#endif\n", - "QVariant v0;\n" - "unused(&v0);\n\n" + "QVariant v0;\n\n" "QVariant::Type t1 = QVariant::String;\n" "QVariant v1 = QVariant(t1, (void*)0);\n" - //"*(QString*)v1.data() = QString(\"Some string\");\n" - "unused(&v1);\n\n" + //"*(QString*)v1.data() = QString(\"Some string\");\n\n" "MyType my;\n" "my[1] = (QStringList() << \"Hello\");\n" @@ -3686,13 +3766,13 @@ void tst_Dumpers::dumper_data() "QVariant v2;\n" "v2.setValue(my);\n" "int t = QMetaType::type(\"MyType\");\n" - "const char *s = QMetaType::typeName(t);\n" - "unused(&v2, &t, &s);\n\n" + "const char *s = QMetaType::typeName(t);\n\n" "QList list;\n" "list << 1 << 2 << 3;\n" - "QVariant v3 = QVariant::fromValue(list);\n" - "unused(&list, &v3);\n\n") + "QVariant v3 = QVariant::fromValue(list);", + + "&my, &v0, &v1, &v2, &t, &s, &list, &v3, &t1") + CoreProfile() @@ -3834,7 +3914,8 @@ void tst_Dumpers::dumper_data() "QVariant var83 = QVector3D(); unused(&var83); // 83 QVector3D\n" "QVariant var84 = QVector4D(); unused(&var84); // 84 QVector4D\n" "QVariant var85 = QQuaternion(); unused(&var85); // 85 QQuaternion\n" - "QVariant var86 = QVariant::fromValue(QPolygonF()); unused(&var86);\n" + "QVariant var86 = QVariant::fromValue(QPolygonF()); unused(&var86);\n", + "" ) + GuiProfile() @@ -3906,12 +3987,14 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "Q_DECLARE_METATYPE(QHostAddress)\n", + "QVariant var;\n" "QHostAddress ha;\n" "ha.setAddress(\"127.0.0.1\");\n" "var.setValue(ha);\n" - "QHostAddress ha1 = var.value();\n" - "unused(&ha1);\n") + "QHostAddress ha1 = var.value();", + + "&ha1, &var, &ha") + NetworkProfile() @@ -3940,8 +4023,7 @@ void tst_Dumpers::dumper_data() QTest::newRow("QVariantList") << Data("#include \n", - "QVariantList vl0;\n" - "unused(&vl0);\n\n" + "QVariantList vl0;\n\n" "QVariantList vl1;\n" "vl1.append(QVariant(1));\n" @@ -3949,13 +4031,13 @@ void tst_Dumpers::dumper_data() "vl1.append(QVariant(\"Some String\"));\n" "vl1.append(QVariant(21));\n" "vl1.append(QVariant(22));\n" - "vl1.append(QVariant(\"2Some String\"));\n" - "unused(&vl1);\n\n" + "vl1.append(QVariant(\"2Some String\"));\n\n" "QVariantList vl2;\n" "vl2.append(\"one\");\n" - "QVariant v = vl2;\n\n" - "unused(&vl2, &v);\n\n") + "QVariant v = vl2;", + + "&vl0, &vl1, &vl2, &v") + CoreProfile() @@ -3973,7 +4055,6 @@ void tst_Dumpers::dumper_data() << Data("#include \n", "QVariantMap vm0;\n\n" - "unused(&vm0);\n\n" "QVariantMap vm1;\n" "vm1[\"a\"] = QVariant(1);\n" @@ -3981,11 +4062,11 @@ void tst_Dumpers::dumper_data() "vm1[\"c\"] = QVariant(\"Some String\");\n" "vm1[\"d\"] = QVariant(21);\n" "vm1[\"e\"] = QVariant(22);\n" - "vm1[\"f\"] = QVariant(\"2Some String\");\n" - "unused(&vm1);\n\n" + "vm1[\"f\"] = QVariant(\"2Some String\");\n\n" - "QVariant v = vm1;\n" - "unused(&v);\n") + "QVariant v = vm1;\n", + + "&vm0, &vm1, &v") + CoreProfile() @@ -4004,15 +4085,14 @@ void tst_Dumpers::dumper_data() QTest::newRow("QVariantHash") << Data("#include \n", - "QVariantHash h0;\n" - "unused(&h0);\n\n" + "QVariantHash h0;\n\n" "QVariantHash h1;\n" "h1[\"one\"] = \"vone\";\n" - "unused(&h1);\n\n" - "QVariant v = h1;\n" - "unused( &v);\n") + "QVariant v = h1;", + + "&v, &h0, &h1") + CoreProfile() @@ -4032,35 +4112,31 @@ void tst_Dumpers::dumper_data() "QVector v1(10000);\n" "for (int i = 0; i != v1.size(); ++i)\n" " v1[i] = i * i;\n\n" - "unused(&v1);\n\n" "QVector v2;\n" "v2.append(1);\n" "v2.append(2);\n" - "unused(&v2);\n\n" "typedef QVector FooVector;\n" "FooVector v3;\n" "v3.append(1);\n" "v3.append(2);\n" - "unused(&v3);\n\n" "QVector v4;\n" "v4.append(new Foo(1));\n" "v4.append(0);\n" "v4.append(new Foo(5));\n" - "unused(&v4);\n\n" "QVector v5;\n" "v5.append(true);\n" "v5.append(false);\n" - "unused(&v5);\n\n" "QVector > v6;\n" "v6.append(QList() << 1);\n" "v6.append(QList() << 2 << 3);\n" - "QVector > *pv = &v6;\n" - "unused(&v6, &pv);\n\n") + "QVector > *pv = &v6;\n", + + "&v1, &v2, &v3, &v4, &v5, &v6, &pv") + CoreProfile() @@ -4106,44 +4182,40 @@ void tst_Dumpers::dumper_data() + Check("v6.1.0", "[0]", "2", "int") + Check("v6.1.1", "[1]", "3", "int"); + QTest::newRow("QVarLengthArray") << Data("#include \n" + fooData, "QVarLengthArray v1(10000);\n" "for (int i = 0; i != v1.size(); ++i)\n" " v1[i] = i * i;\n\n" - "unused(&v1);\n\n" "QVarLengthArray v2;\n" "v2.append(1);\n" - "v2.append(2);\n" - "unused(&v2);\n\n" + "v2.append(2);\n\n" "typedef QVarLengthArray FooVector;\n" "FooVector v3;\n" "v3.append(1);\n" - "v3.append(2);\n" - "unused(&v3);\n\n" + "v3.append(2);\n\n" "QVarLengthArray v4;\n" "v4.append(new Foo(1));\n" "v4.append(0);\n" - "v4.append(new Foo(5));\n" - "unused(&v4);\n\n" + "v4.append(new Foo(5));\n\n" "QVarLengthArray v5;\n" "v5.append(true);\n" - "v5.append(false);\n" - "unused(&v5);\n\n" + "v5.append(false);\n\n" "QVarLengthArray > v6;\n" "v6.append(QList() << 1);\n" "v6.append(QList() << 2 << 3);\n" - "QVarLengthArray > *pv = &v6;\n" - "unused(&v6, &pv);\n\n") + "QVarLengthArray > *pv = &v6;", + + "&v1, &v2, &v3, &v4, &v5, &v6, &pv") + CoreProfile() - + BigArrayProfile() + Check("v1", "<10000 items>", "@QVarLengthArray") @@ -4192,7 +4264,8 @@ void tst_Dumpers::dumper_data() "QXmlAttributes atts;\n" "atts.append(\"name1\", \"uri1\", \"localPart1\", \"value1\");\n" "atts.append(\"name2\", \"uri2\", \"localPart2\", \"value2\");\n" - "atts.append(\"name3\", \"uri3\", \"localPart3\", \"value3\");\n") + "atts.append(\"name3\", \"uri3\", \"localPart3\", \"value3\");", + "&atts") + CoreProfile() + Profile("QT += xml\n") @@ -4218,9 +4291,11 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdArray") << Data("#include \n" "#include \n", + "std::array a = { { 1, 2, 3, 4} };\n" - "std::array b = { { \"1\", \"2\", \"3\", \"4\"} };\n" - "unused(&a, &b);\n") + "std::array b = { { \"1\", \"2\", \"3\", \"4\"} };", + + "&a, &b") + CoreProfile() + Cxx11Profile() @@ -4234,8 +4309,11 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdComplex") << Data("#include \n", - "std::complex c(1, 2);\n" - "unused(&c);\n") + + "std::complex c(1, 2);", + + "&c") + + Check("c", "(1.0, 2.0)", "std::complex") + Check("c.real", FloatValue("1.0"), "double") + Check("c.imag", FloatValue("2.0"), "double"); @@ -4243,10 +4321,12 @@ void tst_Dumpers::dumper_data() QTest::newRow("CComplex") << Data("#include \n", + "// Doesn't work when compiled as C++.\n" "double complex a = 0;\n" - "double _Complex b = 0;\n" - "unused(&a, &b);\n") + "double _Complex b = 0;\n", + + "&a, &b") + ForceC() + GdbVersion(70500) @@ -4257,14 +4337,19 @@ void tst_Dumpers::dumper_data() + Check("a", "0 + 0i", "_Complex double") % LldbEngine + Check("b", "0 + 0i", "_Complex double") % LldbEngine; + QTest::newRow("StdFunction") << Data("#include \n" "void bar(int) {}", "std::function x;\n" "std::function y = bar;\n" - "std::function z = [](int) {};\n") + "std::function z = [](int) {};", + + "&x, &y, &z") + + GdbEngine + + Check("x", "(null)", "std::function") + Check("y", ValuePattern(".* "), "std::function"); @@ -4284,7 +4369,9 @@ void tst_Dumpers::dumper_data() "deque2.push_back(new int(2));\n" "deque2.push_back(new int(3));\n" "deque2.pop_back();\n" - "deque2.pop_front();\n") + "deque2.pop_front();", + + "&deque2") + Check("deque0", "<0 items>", "std::deque") @@ -4300,16 +4387,17 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdDequeQt") << Data("#include \n" + fooData, - "std::deque deque0;\n" - "unused(&deque0);\n\n" + "std::deque deque0;\n\n" "std::deque deque1;\n" "deque1.push_back(1);\n" - "deque1.push_front(2);\n" + "deque1.push_front(2);\n\n" "std::deque deque2;\n" "deque2.push_back(new Foo(1));\n" - "deque2.push_back(new Foo(2));\n") + "deque2.push_back(new Foo(2));", + + "&deque0, &deque1, &deque2") + CoreProfile() @@ -4336,6 +4424,7 @@ void tst_Dumpers::dumper_data() "};\n" "}\n\n" "using namespace __gnu_cxx;\n\n", + "hash_set h;\n" "h.insert(1);\n" "h.insert(194);\n" @@ -4345,7 +4434,9 @@ void tst_Dumpers::dumper_data() "h2.insert(\"1\");\n" "h2.insert(\"194\");\n" "h2.insert(\"2\");\n" - "h2.insert(\"3\");\n") + "h2.insert(\"3\");\n", + + "&h, &h2") + GdbEngine @@ -4370,7 +4461,6 @@ void tst_Dumpers::dumper_data() "struct Derived : public std::list, Base {};\n", "std::list l0;\n" - "unused(&l0);\n\n" "std::list l1;\n" "for (int i = 0; i < 10000; ++i)\n" @@ -4379,18 +4469,17 @@ void tst_Dumpers::dumper_data() "std::list l2;\n" "l2.push_back(true);\n" "l2.push_back(false);\n" - "unused(&l2);\n\n" "std::list l3;\n" "l3.push_back(new int(1));\n" "l3.push_back(0);\n" "l3.push_back(new int(2));\n" - "unused(&l3);\n\n" "Derived l4;\n" "l4.push_back(1);\n" - "l4.push_back(2);\n" - "unused(&l4);\n\n") + "l4.push_back(2);\n", + + "&l0, &l1, &l2, &l3, &l4") + BigArrayProfile() @@ -4420,14 +4509,14 @@ void tst_Dumpers::dumper_data() "std::list l1;\n" "l1.push_back(15);\n" - "l1.push_back(16);\n" - "unused(&l1);\n\n" + "l1.push_back(16);\n\n" "std::list l2;\n" "l2.push_back(new Foo(1));\n" "l2.push_back(0);\n" - "l2.push_back(new Foo(2));\n" - "unused(&l2);\n") + "l2.push_back(new Foo(2));", + + "&l1, &l2") + CoreProfile() + Check("l1", "<2 items>", "std::list") @@ -4450,12 +4539,11 @@ void tst_Dumpers::dumper_data() "std::map map1;\n" "map1[11] = 1;\n" - "map1[22] = 2;\n" - "unused(&map1);\n\n" + "map1[22] = 2;\n\n" "std::map map2;\n" "map2[11] = 11.0;\n" - "map2[22] = 22.0;\n" + "map2[22] = 22.0;\n\n" "typedef std::map Map;\n" "Map map3;\n" @@ -4470,21 +4558,22 @@ void tst_Dumpers::dumper_data() "Map::iterator it3 = it2; ++it3;\n" "Map::iterator it4 = it3; ++it4;\n" "Map::iterator it5 = it4; ++it5;\n" - "Map::iterator it6 = it5; ++it6;\n" - "unused(&it6);\n" + "Map::iterator it6 = it5; ++it6;\n\n" "std::multimap map4;\n" "map4.insert(std::pair(11, 11.0));\n" "map4.insert(std::pair(22, 22.0));\n" "map4.insert(std::pair(22, 23.0));\n" "map4.insert(std::pair(22, 24.0));\n" - "map4.insert(std::pair(22, 25.0));\n" + "map4.insert(std::pair(22, 25.0));\n\n" "std::map map5;\n" - "map5[12] = 42;\n" + "map5[12] = 42;\n\n" "std::map map6;\n" - "map6[12] = \"42\";\n") + "map6[12] = \"42\";", + + "&map1, &map2, &map3, &map4, &map5, &map5, &it1, &it2, &it3, &it4, &it5, &it6") + Check("map1", "<2 items>", "std::map") + Check("map1.0", "[0] 11", "1", "") @@ -4526,40 +4615,35 @@ void tst_Dumpers::dumper_data() "map1[\"22.0\"] = Foo(22);\n" "map1[\"33.0\"] = Foo(33);\n" "map1[\"44.0\"] = Foo(44);\n" - "unused(&map1);\n\n" "std::map map2;\n" "map2[\"22.0\"] = Foo(22);\n" "map2[\"33.0\"] = Foo(33);\n" - "unused(&map2);\n\n" "std::map map3;\n" "map3[11] = QStringList() << \"11\";\n" "map3[22] = QStringList() << \"22\";\n" - "unused(&map3);\n\n" "typedef std::map T;\n" "T map4;\n" "map4[11] = QStringList() << \"11\";\n" "map4[22] = QStringList() << \"22\";\n" - "unused(&map4);\n\n" "std::map map5;\n" "map5[\"11.0\"] = 11.0;\n" "map5[\"22.0\"] = 22.0;\n" - "unused(&map5);\n\n" "std::map map6;\n" "map6[11] = \"11.0\";\n" "map6[22] = \"22.0\";\n" - "unused(&map6);\n\n" "QObject ob;\n" "std::map > map7;\n" "map7[\"Hallo\"] = QPointer(&ob);\n" "map7[\"Welt\"] = QPointer(&ob);\n" - "map7[\".\"] = QPointer(&ob);\n" - "unused(&map7);\n") + "map7[\".\"] = QPointer(&ob);\n", + + "&map1, &map2, &map3, &map4, &map5, &map6") + CoreProfile() @@ -4623,10 +4707,13 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdUniquePtr") << Data("#include \n" "#include \n" + fooData, - "std::unique_ptr p0; unused(&p0);\n\n" - "std::unique_ptr p1(new int(32)); unused(&p1);\n\n" - "std::unique_ptr p2(new Foo); unused(&p2);\n\n" - "std::unique_ptr p3(new std::string(\"ABC\")); unused(&p3);\n\n") + + "std::unique_ptr p0;\n\n" + "std::unique_ptr p1(new int(32));\n\n" + "std::unique_ptr p2(new Foo);\n\n" + "std::unique_ptr p3(new std::string(\"ABC\"));", + + "&p0, &p1, &p2, &p3") + CoreProfile() + Cxx11Profile() @@ -4640,21 +4727,28 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdOnce") << Data("#include \n", - "std::once_flag x; unused(&x);\n") + + "std::once_flag x;", + "&x") + + Cxx11Profile() + + Check("x", "0", "std::once_flag"); QTest::newRow("StdSharedPtr") << Data("#include \n" "#include \n" + fooData, - "std::shared_ptr pi(new int(32)); unused(&pi);\n" - "std::shared_ptr pf(new Foo); unused(&pf);\n" - "std::shared_ptr ps(new std::string(\"ABC\")); " - "unused(&ps);\n" - "std::weak_ptr wi = pi; unused(&wi);\n" - "std::weak_ptr wf = pf; unused(&wf);\n" - "std::weak_ptr ws = ps; unused(&ws);\n") + + "std::shared_ptr pi(new int(32));\n" + "std::shared_ptr pf(new Foo);\n" + "std::shared_ptr ps(new std::string(\"ABC\"));\n\n" + + "std::weak_ptr wi = pi;\n" + "std::weak_ptr wf = pf;\n" + "std::weak_ptr ws = ps;", + + "&pi, &pf, &ps, &wi, &wf, &ws") + CoreProfile() + Cxx11Profile() @@ -4668,6 +4762,7 @@ void tst_Dumpers::dumper_data() + Check("ws", "\"ABC\"", "std::weak_ptr") + Check("ps", "\"ABC\"", "std::shared_ptr"); + QTest::newRow("StdSharedPtr2") << Data("#include \n" "struct A {\n" @@ -4677,9 +4772,14 @@ void tst_Dumpers::dumper_data() " int *m_2 = (int *)2;\n" " int x = 3;\n" "};\n", + "std::shared_ptr a(new A);\n" - "A *inner = a.get(); unused(inner);\n") + "A *inner = a.get();", + + "&inner, &a") + + Cxx11Profile() + + Check("inner.m_0", "0x0", "int *") + Check("inner.m_1", "0x1", "int *") + Check("inner.m_2", "0x2", "int *") @@ -4689,14 +4789,13 @@ void tst_Dumpers::dumper_data() + Check("a.m_2", "0x2", "int *") + Check("a.x", "3", "int"); + QTest::newRow("StdSet") << Data("#include \n", - "std::set s0;\n" - "unused(&s0);\n\n" + "std::set s0;\n\n" - "std::set s1{11, 22, 33, 44, 55, 66, 77, 88};\n" - "unused(&s1);\n\n" + "std::set s1{11, 22, 33, 44, 55, 66, 77, 88};\n\n" "typedef std::set Set;\n" "Set s2;\n" @@ -4705,8 +4804,7 @@ void tst_Dumpers::dumper_data() "s2.insert(33.0);\n" "Set::iterator it1 = s2.begin();\n" "Set::iterator it2 = it1; ++it2;\n" - "Set::iterator it3 = it2; ++it3;\n" - "unused(&it3);\n\n" + "Set::iterator it3 = it2; ++it3;\n\n" "std::multiset s3;\n" "s3.insert(1);\n" @@ -4714,7 +4812,9 @@ void tst_Dumpers::dumper_data() "s3.insert(2);\n" "s3.insert(3);\n" "s3.insert(3);\n" - "s3.insert(3);\n") + "s3.insert(3);", + + "&s0, &s1, &s2, &s2, &it1, &it2, &it3") + Cxx11Profile() + Check("s0", "<0 items>", "std::set") @@ -4745,11 +4845,12 @@ void tst_Dumpers::dumper_data() "QObject ob;\n" "std::set > set2;\n" "QPointer ptr(&ob);\n" - "set2.insert(ptr);\n" + "set2.insert(ptr);", - "unused(&ptr, &ob, &set1, &set2);\n") + "&ptr, &ob, &set1, &set2") + CoreProfile() + + Check("set1", "<1 items>", "std::set<@QString>") + Check("set1.0", "[0]", "\"22.0\"", "@QString") @@ -4768,8 +4869,9 @@ void tst_Dumpers::dumper_data() "std::stack s2, s3;\n" "s3.push(1);\n" - "s3.push(2);\n" - "unused(&s0, &s1, &s2, &s3);\n") + "s3.push(2);", + + "&s0, &s1, &s2, &s3") + Check("s0", "<0 items>", "std::stack") @@ -4787,14 +4889,18 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdStackQt") << Data("#include \n" + fooData, + "std::stack s0, s1;\n" "std::stack s2, s3;\n" "s1.push(new Foo(1));\n" "s1.push(new Foo(2));\n" "s3.push(1);\n" - "s3.push(2);\n" - "unused(&s0, &s1, &s2, &s3);\n") + "s3.push(2);", + + "&s0, &s1, &s2, &s3") + + CoreProfile() + + Check("s0", "<0 items>", "std::stack") + Check("s1", "<2 items>", "std::stack") + Check("s1.0", "[0]", "", "Foo") @@ -4810,11 +4916,15 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdBasicString") + << Data("#include \n" "template\n" "class myallocator : public std::allocator {};\n", - "std::basic_string, myallocator> str(\"hello\");\n" - "unused(&str);\n") + + "std::basic_string, myallocator> str(\"hello\");", + + "&str") + + Check("str", "\"hello\"", "std::basic_string, myallocator >") + Check("str.0", "[0]", "104", "char") // 104: ASCII 'h' + Check("str.1", "[1]", "101", "char"); // 101: ASCII 'e' @@ -4822,6 +4932,7 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdString") << Data("#include \n", + "std::string str0, str;\n" "std::wstring wstr0, wstr;\n" "str += \"b\";\n" @@ -4834,8 +4945,10 @@ void tst_Dumpers::dumper_data() "str += \"e\";\n" "wstr += wchar_t('e');\n" "wstr += wchar_t('e');\n" - "str += \"e\";\n" - "unused(&str0, &str, &wstr0, &wstr);\n") + "str += \"e\";\n", + + "&str0, &str, &wstr0, &wstr") + + Check("str0", "\"\"", "std::string") + Check("wstr0", "\"\"", "std::wstring") + Check("str", "\"bdebdee\"", "std::string") @@ -4846,15 +4959,19 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "#include \n", + "std::string str = \"foo\";\n" "std::vector v;\n" "QList l0, l;\n" "v.push_back(str);\n" "v.push_back(str);\n" "l.push_back(str);\n" - "l.push_back(str);\n" - "unused(&v, &l);\n") + "l.push_back(str);\n", + + "&v, &l") + + CoreProfile() + + Check("l0", "<0 items>", "@QList") + Check("l", "<2 items>", "@QList") + Check("str", "\"foo\"", "std::string") @@ -4866,34 +4983,25 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n", - "std::valarray v0, v1 = { 1, 0, 2 };\n" - "unused(&v0, &v1);\n\n" + "std::valarray v0, v1 = { 1, 0, 2 };\n\n" - "std::valarray v2, v3 = { new int(1), 0, new int(2) };\n" - "unused(&v2, &v3);\n\n" + "std::valarray v2, v3 = { new int(1), 0, new int(2) };\n\n" - "std::valarray v4 = { 1, 2, 3, 4 };\n" - "unused(&v4);\n\n" + "std::valarray v4 = { 1, 2, 3, 4 };\n\n" "std::list list;\n" "std::list list1 = { 45 };\n" "std::valarray *> v5 = {\n" " new std::list(list), 0,\n" " new std::list(list1), 0\n" - "};\n" - "unused(&v5);\n\n" + "};\n\n" - "std::valarray b0;\n" - "unused(&b0);\n\n" + "std::valarray b0;\n\n" + "std::valarray b1 = { true, false, false, true, false };\n\n" + "std::valarray b2(true, 65);\n\n" + "std::valarray b3(300);\n", - "std::valarray b1 = { true, false, false, true, false };\n" - "unused(&b1);\n\n" - - "std::valarray b2(true, 65);\n" - "unused(&b2);\n\n" - - "std::valarray b3(300);\n" - "unused(&b3);\n") + "&v0, &v1, &v2, &v3, &v4, &v5, &b0, &b1, &b2, &b3") + Cxx11Profile() @@ -4948,17 +5056,16 @@ void tst_Dumpers::dumper_data() "std::vector v0, v1;\n" "v1.push_back(1);\n" "v1.push_back(0);\n" - "v1.push_back(2);\n" - "unused(&v0, &v1);\n\n" + "v1.push_back(2);\n\n" - "std::vector v2; unused(&v2);\n" + "std::vector v2;\n\n" - "std::vector v3; unused(&v3);\n\n" + "std::vector v3;\n\n" "v3.push_back(new int(1));\n" "v3.push_back(0);\n" "v3.push_back(new int(2));\n\n" - "std::vector v4; unused(&v4);\n" + "std::vector v4;\n" "v4.push_back(1);\n" "v4.push_back(2);\n" "v4.push_back(3);\n" @@ -4970,30 +5077,26 @@ void tst_Dumpers::dumper_data() "v5.push_back(0);\n" "list.push_back(45);\n" "v5.push_back(new std::list(list));\n" - "v5.push_back(0);\n" - "unused(&v5);\n\n" + "v5.push_back(0);\n\n" - "std::vector b0;\n" - "unused(&b0);\n\n" + "std::vector b0;\n\n" "std::vector b1;\n" "b1.push_back(true);\n" "b1.push_back(false);\n" "b1.push_back(false);\n" "b1.push_back(true);\n" - "b1.push_back(false);\n" - "unused(&b1);\n\n" + "b1.push_back(false);\n\n" - "std::vector b2(65, true);\n" - "unused(&b2);\n\n" + "std::vector b2(65, true);\n\n" - "std::vector b3(300);\n" - "unused(&b3);\n" + "std::vector b3(300);\n\n" "std::vector> b4;\n" "b4.push_back(true);\n" - "b4.push_back(false);\n" - "unused(&b4);\n") + "b4.push_back(false);\n", + + "&v0, &v1, &v2, &v3, &v4, &v5, &b0, &b1, &b2, &b3, &b4") + Check("v0", "<0 items>", "std::vector") + Check("v1", "<3 items>", "std::vector") @@ -5039,6 +5142,7 @@ void tst_Dumpers::dumper_data() + Check("b4.0", "[0]", "1", "bool") + Check("b4.1", "[1]", "0", "bool"); + QTest::newRow("StdVectorQt") << Data("#include \n" + fooData, @@ -5051,8 +5155,9 @@ void tst_Dumpers::dumper_data() "v2.push_back(1);\n" "v2.push_back(2);\n" "v2.push_back(3);\n" - "v2.push_back(4);\n" - "unused(&v1, &v2);\n") + "v2.push_back(4);", + + "&v1, &v2") + CoreProfile() + Check("v1", "<3 items>", "std::vector") @@ -5074,18 +5179,17 @@ void tst_Dumpers::dumper_data() "std::unordered_map map1;\n" "map1[11] = 1;\n" - "map1[22] = 2;\n" - "unused(&map1);\n\n" + "map1[22] = 2;\n\n" "std::unordered_map map2;\n" "map2[\"11.0\"] = 11.0;\n" - "map2[\"22.0\"] = 22.0;\n" - "unused(&map2);\n" + "map2[\"22.0\"] = 22.0;\n\n" "std::unordered_multimap map3;\n" "map3.insert({1, \"Foo\"});\n" - "map3.insert({1, \"Bar\"});\n" - "unused(&map3);\n" ) + "map3.insert({1, \"Bar\"});", + + "&map1, &map2, &map3") + Cxx11Profile() @@ -5124,12 +5228,12 @@ void tst_Dumpers::dumper_data() "set1.insert(11);\n" "set1.insert(22);\n" "set1.insert(33);\n" - "unused(&set1);\n" "std::unordered_multiset set2;\n" "set2.insert(42);\n" - "set2.insert(42);\n" - "unused(&set2);\n") + "set2.insert(42);", + + "&set1, &set2") + Cxx11Profile() @@ -5151,13 +5255,16 @@ void tst_Dumpers::dumper_data() + Check("set2.0", "[0]", "42", "int") + Check("set2.1", "[1]", "42", "int"); + QTest::newRow("StdInitializerList") << Data("#include \n", + "auto initb = {true, false, false, true};\n" "auto initi = {1, 2, 3};\n" "auto inits = {\"1\", \"2\", \"3\"};\n" - "std::initializer_list empty;\n" - "unused(&initb, &initi, &inits, &empty);\n") + "std::initializer_list empty;", + + "&initb, &initi, &inits, &empty") + Cxx11Profile() @@ -5327,7 +5434,8 @@ void tst_Dumpers::dumper_data() " struct { int i; int b; };\n" " struct { float f; };\n" " double d;\n" - " } a = { { 42, 43 } };\n (void)a;") + " } a = { { 42, 43 } };", + "&a") + Check("a.d", FloatValue("9.1245819032257467e-313"), "double") @@ -5341,14 +5449,17 @@ void tst_Dumpers::dumper_data() QTest::newRow("Chars") << Data("#include \n", + "char c = -12;\n" "signed char sc = -12;\n" "unsigned char uc = -12;\n" "qint8 qs = -12;\n" - "quint8 qu = -12;\n" - "unused(&c, &sc, &uc, &qs, &qu);\n") + "quint8 qu = -12;", + + "&c, &sc, &uc, &qs, &qu") + CoreProfile() + + Check("c", "-12", "char") // on all our platforms char is signed. + Check("sc", "-12", TypeDef("char", "signed char")) + Check("uc", "244", "unsigned char") @@ -5362,12 +5473,14 @@ void tst_Dumpers::dumper_data() "typedef char CHAR;\n" "typedef wchar_t WCHAR;\n" "#endif\n", + "char s[] = \"aöa\";\n" "char t[] = \"aöax\";\n" "wchar_t w[] = L\"aöa\";\n" "CHAR ch[] = \"aöa\";\n" - "WCHAR wch[] = L\"aöa\";\n" - "unused(&s, &t, &w, &ch, &wch);\n") + "WCHAR wch[] = L\"aöa\";", + + "&s, &t, &w, &ch, &wch") + CheckType("s", "char [5]") % NoCdbEngine + CheckType("s", "char [4]") % CdbEngine @@ -5385,12 +5498,14 @@ void tst_Dumpers::dumper_data() QTest::newRow("CharPointers") << Data("", + "const char *s = \"aöa\";\n" "const char *t = \"a\\xc3\\xb6\";\n" "unsigned char uu[] = { 'a', 153 /* ö Latin1 */, 'a' };\n" "const unsigned char *u = uu;\n" - "const wchar_t *w = L\"aöa\";\n" - "unused(&s, &t, &uu, &u, &w);\n") + "const wchar_t *w = L\"aöa\";", + + "&s, &t, &uu, &u, &w") + CheckType("u", "unsigned char *") + CheckType("uu", "unsigned char [3]") @@ -5405,12 +5520,16 @@ void tst_Dumpers::dumper_data() QTest::newRow("GccExtensions") << Data("", + "char v[8] = { 1, 2 };\n" "char w __attribute__ ((vector_size (8))) = { 1, 2 };\n" "int y[2] = { 1, 2 };\n" - "int z __attribute__ ((vector_size (8))) = { 1, 2 };\n" - "unused(&v, &w, &y, &z);\n") + "int z __attribute__ ((vector_size (8))) = { 1, 2 };", + + "&v, &w, &y, &z") + + NoCdbEngine + + Check("v.0", "[0]", "1", "char") + Check("v.1", "[1]", "2", "char") + Check("w.0", "[0]", "1", "char") @@ -5425,6 +5544,7 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "#include \n", + "quint64 u64 = ULLONG_MAX;\n" "qint64 s64 = LLONG_MAX;\n" "quint32 u32 = UINT_MAX;\n" @@ -5433,8 +5553,10 @@ void tst_Dumpers::dumper_data() "qint64 s64s = LLONG_MIN;\n" "quint32 u32s = 0;\n" "qint32 s32s = INT_MIN;\n" - "QString dummy; // needed to get namespace\n" - "unused(&u64, &s64, &u32, &s32, &u64s, &s64s, &u32s, &s32s, &dummy);\n") + "QString dummy; // needed to get namespace", + + "&u64, &s64, &u32, &s32, &u64s, &s64s, &u32s, &s32s, &dummy") + + CoreProfile() + Check("u64", "18446744073709551615", TypeDef("unsigned int64", "@quint64")) + Check("s64", "9223372036854775807", TypeDef("int64", "@qint64")) @@ -5448,15 +5570,19 @@ void tst_Dumpers::dumper_data() QTest::newRow("Int128") << Data("#include \n", + "using typedef_s128 = __int128_t;\n" "using typedef_u128 = __uint128_t;\n" "__int128_t s128 = 12;\n" "__uint128_t u128 = 12;\n" "typedef_s128 ts128 = 12;\n" - "typedef_u128 tu128 = 12;\n" - "unused(&u128, &s128, &tu128, &ts128);\n") + "typedef_u128 tu128 = 12;", + + "&u128, &s128, &tu128, &ts128") + // Sic! The expected type is what gcc 8.2.0 records. + GdbEngine + + Check("s128", "12", "__int128") + Check("u128", "12", "__int128 unsigned") + Check("ts128", "12", "typedef_s128") @@ -5465,10 +5591,15 @@ void tst_Dumpers::dumper_data() QTest::newRow("Float") << Data("#include \n", - "qfloat16 f1 = 45.3f; unused(&f1);\n" - "qfloat16 f2 = 45.1f; unused(&f2);\n") + + "qfloat16 f1 = 45.3f;\n" + "qfloat16 f2 = 45.1f;", + + "&f1, &f2") + + CoreProfile() + QtVersion(0x50900) + // Using numpy: // + Check("f1", "45.281", "@qfloat16") // + Check("f2", "45.094", "@qfloat16"); @@ -5477,12 +5608,15 @@ void tst_Dumpers::dumper_data() QTest::newRow("Enum") - << Data("\n" - "enum Foo { a = -1000, b, c = 1, d };\n", - "Foo fa = a; unused(&fa);\n" - "Foo fb = b; unused(&fb);\n" - "Foo fc = c; unused(&fc);\n" - "Foo fd = d; unused(&fd);\n") + << Data("enum Foo { a = -1000, b, c = 1, d };\n", + + "Foo fa = a;\n" + "Foo fb = b;\n" + "Foo fc = c;\n" + "Foo fd = d;", + + "&fa, &fb, &fc, &fd") + + Check("fa", "a (-1000)", "Foo") + Check("fb", "b (-999)", "Foo") + Check("fc", "c (1)", "Foo") @@ -5490,13 +5624,17 @@ void tst_Dumpers::dumper_data() QTest::newRow("EnumFlags") - << Data("\n" - "enum Flags { one = 1, two = 2, four = 4 };\n", - "Flags fone = one; unused(&fone);\n" - "Flags fthree = (Flags)(one|two); unused(&fthree);\n" - "Flags fmixed = (Flags)(two|8); unused(&fmixed);\n" - "Flags fbad = (Flags)(24); unused(&fbad);\n") + << Data("enum Flags { one = 1, two = 2, four = 4 };\n", + + "Flags fone = one;\n" + "Flags fthree = (Flags)(one|two);\n" + "Flags fmixed = (Flags)(two|8);\n" + "Flags fbad = (Flags)(24);", + + "&fone, &fthree, &fmixed, &fbad") + + NoCdbEngine + + Check("fone", "one (1)", "Flags") + Check("fthree", "(one | two) (3)", "Flags") + Check("fmixed", "(two | unknown: 8) (10)", "Flags") @@ -5512,20 +5650,31 @@ void tst_Dumpers::dumper_data() " Enum2 e2 = Enum2(c2 | b2);\n" " Enum3 e3 = Enum3(c3 | b3);\n" "};\n", - "E e;\n") + + "E e;", + + "&e") + + NoCdbEngine + + Check("e.e1", "(E::b1 | E::c1) (3)", "E::Enum1") + Check("e.e2", "(E::b2 | E::c2) (3)", "E::Enum2") + Check("e.e3", "(E::b3 | E::c3) (3)", "E::Enum3"); + QTest::newRow("QSizePolicy") << Data("#include \n", + "QSizePolicy qsp1;\n" "qsp1.setHorizontalStretch(6);\n" "qsp1.setVerticalStretch(7);\n" - "QSizePolicy qsp2(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);\n") + "QSizePolicy qsp2(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);", + + "&qsp1, &qsp2") + + GuiProfile() + NoCdbEngine + + Check("qsp1.horStretch", "6", "int") + Check("qsp1.verStretch", "7", "int") + Check("qsp2.horPolicy", "QSizePolicy::Preferred (GrowFlag|ShrinkFlag) (5)", "@QSizePolicy::Policy") @@ -5534,19 +5683,20 @@ void tst_Dumpers::dumper_data() QTest::newRow("Array") << Data("", + "double a1[3][4];\n" "for (int i = 0; i != 3; ++i)\n" " for (int j = 0; j != 3; ++j)\n" - " a1[i][j] = i + 10 * j;\n" - "unused(&a1);\n\n" + " a1[i][j] = i + 10 * j;\n\n" "char a2[20] = { 0 };\n" "a2[0] = 'a';\n" "a2[1] = 'b';\n" "a2[2] = 'c';\n" "a2[3] = 'd';\n" - "a2[4] = 0;\n" - "unused(&a2);\n") + "a2[4] = 0;", + + "&a1, &a2") + Check("a1", Pointer(), "double[3][4]") + Check("a1.0", "[0]", Pointer(), "double[4]") @@ -5561,8 +5711,11 @@ void tst_Dumpers::dumper_data() QTest::newRow("Array10Format") << Data("", + "int arr[4] = { 1, 2, 3, 4};\n" - "int *nums = new int[4] { 1, 2, 3, 4};\n") + "int *nums = new int[4] { 1, 2, 3, 4};", + + "&arr, &nums") + NoLldbEngine // FIXME: DumperOptions not handled yet. + DumperOptions("'formats':{'local.nums':12}") // Array10Format @@ -5589,7 +5742,9 @@ void tst_Dumpers::dumper_data() "Foo a3[10];\n" "for (int i = 0; i < 5; ++i)\n" - " a3[i].a = i;\n") + " a3[i].a = i;\n", + + "&a1, &a2, &a3") + CoreProfile() + CheckType("a1", "@QString [20]") @@ -5611,6 +5766,7 @@ void tst_Dumpers::dumper_data() QTest::newRow("Bitfields") << Data("", + "enum E { V1, V2 };" "struct S\n" "{\n" @@ -5626,8 +5782,9 @@ void tst_Dumpers::dumper_data() " float f;\n" " double d;\n" " int i;\n" - "} s;\n" - "unused(&s);\n") + "} s;", + + "&s") + Check("s", "", "S") % NoCdbEngine + Check("s.b", "0", "bool") @@ -5658,11 +5815,14 @@ void tst_Dumpers::dumper_data() " double min;\n" " double max;\n" "};\n", + "// In order to use this, switch on the 'qDump__Function' in dumper.py\n" "Function func(\"x\", \"sin(x)\", 0, 1);\n" "func.max = 10;\n" "func.f = \"cos(x)\";\n" - "func.max = 7;\n") + "func.max = 7;\n", + + "&func") + CoreProfile() @@ -5702,11 +5862,13 @@ void tst_Dumpers::dumper_data() "}\n" "typedef quint32 myType1;\n" "typedef unsigned int myType2;\n", + "myType1 t1 = 0;\n" "myType2 t2 = 0;\n" "ns::vl j = 1000;\n" - "ns::verylong k = 1000;\n" - "unused(&t1, &t2, &j, &k);\n") + "ns::verylong k = 1000;", + + "&t1, &t2, &j, &k") + CoreProfile() + BigArrayProfile() @@ -5721,12 +5883,15 @@ void tst_Dumpers::dumper_data() QTest::newRow("Typedef2") << Data("#include \n" "template using TVector = std::vector;\n", - "std::vector b1(10); unused(&b1);\n" - "std::vector b2(10); unused(&b2);\n" - "TVector b3(10); unused(&b3);\n" - "TVector b4(10); unused(&b4);\n" - "TVector b5(10); unused(&b5);\n" - "TVector b6(10); unused(&b6);\n") + + "std::vector b1(10);\n" + "std::vector b2(10);\n" + "TVector b3(10);\n" + "TVector b4(10);\n" + "TVector b5(10);\n" + "TVector b6(10);", + + "&b1, &b2, &b3, &b4, &b5, &b6") + NoCdbEngine @@ -5745,7 +5910,11 @@ void tst_Dumpers::dumper_data() QTest::newRow("Typedef3") << Data("typedef enum { Value } Unnamed;\n" "struct Foo { Unnamed u = Value; };\n", - "Foo foo;") + + "Foo foo;", + + "&foo") + + Cxx11Profile() + Check("foo.u", "Value (0)", "Unnamed"); @@ -5753,11 +5922,10 @@ void tst_Dumpers::dumper_data() QTest::newRow("Struct") << Data(fooData, - "Foo f(3);\n" - "unused(&f);\n\n" + "Foo f(3);\n\n" + "Foo *p = new Foo();", - "Foo *p = new Foo();\n" - "unused(&p);\n") + "&f, &p") + CoreProfile() + Check("f", "", "Foo") @@ -5773,19 +5941,24 @@ void tst_Dumpers::dumper_data() " Foo() : x(143) {}\n" " int foo() {\n" " BREAK;\n" + " unused(&x);\n" " return x;\n" " }\n\n" " int x;\n" "};\n", + "Foo f;\n" - "f.foo();\n") + "f.foo();", + + "&f, &f.x") + Check("this", "", "Foo") + Check("this.x", "143", "int"); QTest::newRow("Union") - << Data("union U { int a; int b; };", "U u;\n" - "unused(&u);\n") + << Data("union U { int a; int b; };", + "U u;", + "&u") + Check("u", "", "U") + CheckType("u.a", "int") + CheckType("u.b", "int"); @@ -5813,10 +5986,13 @@ void tst_Dumpers::dumper_data() << Data("typedef void *VoidPtr;\n" "typedef const void *CVoidPtr;\n" "struct A {};\n", + "A a;\n" "VoidPtr p = &a;\n" - "CVoidPtr cp = &a;\n" - "unused(&a, &p, &cp);\n") + "CVoidPtr cp = &a;", + + "&a, &p, &cp") + + Check("a", "", "A") + Check("cp", Pointer(), TypeDef("void*", "CVoidPtr")) + Check("p", Pointer(), TypeDef("void*", "VoidPtr")); @@ -5834,31 +6010,28 @@ void tst_Dumpers::dumper_data() "const int &b1 = a1;\n" "typedef int &Ref1;\n" "const int c1 = 44;\n" - "const Ref1 d1 = a1;\n" - "unused(&a1, &b1, &c1, &d1);\n\n" + "const Ref1 d1 = a1;\n\n" "string a2 = \"hello\";\n" "const string &b2 = fooxx();\n" "typedef string &Ref2;\n" "const string c2= \"world\";\n" - "const Ref2 d2 = a2;\n" - "unused(&a2, &b2, &c2, &d2);\n\n" + "const Ref2 d2 = a2;\n\n" "QString a3 = QLatin1String(\"hello\");\n" "const QString &b3 = a3;\n" "typedef QString &Ref3;\n" - "const Ref3 d3 = const_cast(a3);\n" - "unused(&a3, &b3, &d3);\n\n" + "const Ref3 d3 = const_cast(a3);\n\n" "Foo a4(12);\n" "const Foo &b4 = a4;\n" "typedef Foo &Ref4;\n" - "const Ref4 d4 = const_cast(a4);\n" - "unused(&a4, &b4, &d4);\n" + "const Ref4 d4 = const_cast(a4);\n\n" "int *q = 0;\n" - "int &qq = *q;\n" - "unused(&qq, &q);\n") + "int &qq = *q;", + + "&a1, &b1, &c1, &d1, &a2, &b2, &c2, &d2, &a3, &b3, &d3, &a4, &b4, &d4, &qq, &q") + CoreProfile() + NoCdbEngine // The Cdb has no information about references @@ -5886,14 +6059,19 @@ void tst_Dumpers::dumper_data() + Check("qq", "", "int &"); + QTest::newRow("DynamicReference") << Data("struct BaseClass { virtual ~BaseClass() {} };\n" "struct DerivedClass : BaseClass {};\n", + "DerivedClass d;\n" "BaseClass *b1 = &d;\n" - "BaseClass &b2 = d;\n" - "unused(&d, &b1, &b2);\n") + "BaseClass &b2 = d;\n", + + "&d, &b1, &b2") + + NoCdbEngine // The Cdb has no information about references + + CheckType("b1", "DerivedClass") // autoderef + CheckType("b2", "DerivedClass &"); @@ -5918,16 +6096,21 @@ void tst_Dumpers::dumper_data() QTest::newRow("LongEvaluation2") << Data("", - "const int N = 10000;\n" + + "const int N = 1000;\n" "int bigv[N];\n" "for (int i = 0; i < N; ++i)\n" - " bigv[i] = i;\n" - "unused(&bigv[10]);\n") + " bigv[i] = i;\n", + + "&N, &bigv[10]") + + BigArrayProfile() - + Check("N", "10000", "int") - + CheckType("bigv", "int [10000]") + + + Check("N", "1000", "int") + + CheckType("bigv", "int [1000]") + Check("bigv.0", "[0]", "0", "int") - + Check("bigv.9999", "[9999]", "9999", "int"); + + Check("bigv.999", "[999]", "999", "int"); + // QTest::newRow("Fork") // << Data( @@ -5952,12 +6135,12 @@ void tst_Dumpers::dumper_data() "Class x;\n" "func_t f = &Class::testFunctionPointerHelper;\n" - "int a1 = (x.*f)(43);\n" - "unused(&a1);\n" + "int a1 = (x.*f)(43);\n\n" "member_t m = &Class::a;\n" - "int a2 = x.*m;\n" - "unused(&a2);\n") + "int a2 = x.*m;", + + "&x, &f, &m, &a1, &a2") + CheckType("f", TypeDef("", "func_t")) + CheckType("m", TypeDef("int*", "member_t")); @@ -5970,9 +6153,14 @@ void tst_Dumpers::dumper_data() " int dummy = 2;\n" " unused(&f, &dummy);\n" "}\n", + "Foo f(12);\n" - "testPassByReference(f);\n") + "testPassByReference(f);", + + "&f") + + CoreProfile() + + NoCdbEngine // The Cdb has no information about references + CheckType("f", "Foo &") + Check("f.a", "12", "int"); @@ -5981,13 +6169,17 @@ void tst_Dumpers::dumper_data() QTest::newRow("BigInt") << Data("#include \n" "#include \n", + "qint64 a = Q_INT64_C(0xF020304050607080);\n" "quint64 b = Q_UINT64_C(0xF020304050607080);\n" "quint64 c = std::numeric_limits::max() - quint64(1);\n" "qint64 d = c;\n" - "QString dummy;\n" - "unused(&a, &b, &c, &d, &dummy);\n") + "QString dummy;\n", + + "&a, &b, &c, &d, &dummy") + + CoreProfile() + + Check("a", "-1143861252567568256", TypeDef("int64", "@qint64")) + Check("b", "17302882821141983360", TypeDef("unsigned int64", "@quint64")) + Check("c", "18446744073709551614", TypeDef("unsigned int64", "@quint64")) @@ -5995,7 +6187,8 @@ void tst_Dumpers::dumper_data() QTest::newRow("Hidden") - << Data("#include \n", + << Data("#include ", + "int n = 1;\n" "{\n" " QString n = \"2\";\n" @@ -6005,9 +6198,12 @@ void tst_Dumpers::dumper_data() " unused(&n);\n" " }\n" " unused(&n);\n" - "}\n" - "unused(&n);\n") + "}\n", + + "&n") + + CoreProfile() + + Check("n", FloatValue("3.5"), "double") + Check("n@1", "\"2\"", "@QString") + Check("n@2", "1", "int"); @@ -6018,26 +6214,34 @@ void tst_Dumpers::dumper_data() "struct X { X() : a(2), b(3) {} int a, b; };\n" "X testRValueReferenceHelper1() { return X(); }\n" "X testRValueReferenceHelper2(X &&x) { return x; }\n", + "X &&x1 = testRValueReferenceHelper1();\n" "X &&x2 = testRValueReferenceHelper2(std::move(x1));\n" "X &&x3 = testRValueReferenceHelper2(testRValueReferenceHelper1());\n" "X y1 = testRValueReferenceHelper1();\n" "X y2 = testRValueReferenceHelper2(std::move(y1));\n" - "X y3 = testRValueReferenceHelper2(testRValueReferenceHelper1());\n" - "unused(&x1, &x2, &x3, &y1, &y2, &y3);\n") + "X y3 = testRValueReferenceHelper2(testRValueReferenceHelper1());", + + "&x1, &x2, &x3, &y1, &y2, &y3") + + Cxx11Profile() + + Check("y1", "", "X") + Check("y2", "", "X") + Check("y3", "", "X"); + QTest::newRow("RValueReference2") << Data(rvalueData) + + DwarfProfile(2) - + NoCdbEngine // The Cdb has no information about references + + NoCdbEngine // Cdb has no information about references. + + Check("x1", "", "X &") + Check("x2", "", "X &") + Check("x3", "", "X &"); + // GCC emits rvalue references with DWARF-4, i.e. after 4.7.4. // GDB doesn't understand them, // https://sourceware.org/bugzilla/show_bug.cgi?id=14441 @@ -6046,27 +6250,37 @@ void tst_Dumpers::dumper_data() QTest::newRow("RValueReference4") << Data(rvalueData) + + DwarfProfile(4) + LldbEngine + + Check("x1", "", "X &") + Check("x2", "", "X &") + Check("x3", "", "X &"); + QTest::newRow("RValueReference") << Data("struct S { int a = 32; };", - "auto foo = [](int && i, S && s) { BREAK; return i + s.a; };\n" - "foo(int(1), S());\n") + + "auto foo = [](int && i, S && s) { BREAK; unused(&i, &s.a); return i + s.a; };\n" + "foo(1, S());", + + "&foo") + + Cxx11Profile() + GdbVersion(80200) + + Check("i", "1", "int &&") % NoCdbEngine + Check("i", "1", "int") % CdbEngine + CheckType("s", "S &&") % NoCdbEngine + CheckType("s", "S") % CdbEngine + Check("s.a", "32", "int"); + QTest::newRow("SSE") << Data("#include \n" "#include \n", + "float a[4];\n" "float b[4];\n" "int i;\n" @@ -6076,9 +6290,12 @@ void tst_Dumpers::dumper_data() "}\n" "__m128 sseA, sseB;\n" "sseA = _mm_loadu_ps(a);\n" - "sseB = _mm_loadu_ps(b);\n" - "unused(&i, &sseA, &sseB);\n") + "sseB = _mm_loadu_ps(b);", + + "&i, &sseA, &sseB") + + Profile("QMAKE_CXXFLAGS += -msse2") + + CheckType("sseA", "__m128") + Check("sseA.2", "[2]", FloatValue("4"), "float") + CheckType("sseB", "__m128"); @@ -6089,13 +6306,13 @@ void tst_Dumpers::dumper_data() "#include \n", "boost::optional i0, i1;\n" - "i1 = 1;\n" - "unused(&i0, &i1);\n\n" + "i1 = 1;\n\n" "boost::optional sl0, sl;\n" "sl = (QStringList() << \"xxx\" << \"yyy\");\n" - "sl.get().append(\"zzz\");\n" - "unused(&sl);\n") + "sl.get().append(\"zzz\");", + + "&i0, &i1, &sl") + CoreProfile() + BoostProfile() @@ -6109,11 +6326,13 @@ void tst_Dumpers::dumper_data() QTest::newRow("BoostSharedPtr") << Data("#include \n" "#include \n", + "boost::shared_ptr s;\n" "boost::shared_ptr i(new int(43));\n" "boost::shared_ptr j = i;\n" - "boost::shared_ptr sl(new QStringList(QStringList() << \"HUH!\"));\n" - "unused(&s, &i, &j, &sl);\n") + "boost::shared_ptr sl(new QStringList(QStringList() << \"HUH!\"));", + + "&s, &i, &j, &sl") + CoreProfile() + BoostProfile() @@ -6128,6 +6347,7 @@ void tst_Dumpers::dumper_data() QTest::newRow("BoostGregorianDate") << Data("#include \n" "#include \n", + "using namespace boost;\n" "using namespace gregorian;\n" "date d(2005, Nov, 29);\n" @@ -6139,9 +6359,12 @@ void tst_Dumpers::dumper_data() "// Also end of the month (expected in boost)\n" "date d4 = d += months(1);\n" "// Not where we started (expected in boost)\n" - "date d5 = d -= months(4);\n" - "unused(&d1, &d2, &d3, &d4, &d5);\n") + "date d5 = d -= months(4);", + + "&d, &d0, &d1, &d2, &d3, &d4, &d5") + + BoostProfile() + + Check("d0", "Tue Nov 29 2005", "boost::gregorian::date") + Check("d1", "Thu Dec 29 2005", "boost::gregorian::date") + Check("d2", "Sun Jan 29 2006", "boost::gregorian::date") @@ -6154,13 +6377,17 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "#include \n", + "using namespace boost;\n" "using namespace posix_time;\n" "time_duration d1(1, 0, 0);\n" "time_duration d2(0, 1, 0);\n" - "time_duration d3(0, 0, 1);\n" - "unused(&d1, &d2, &d3);\n") + "time_duration d3(0, 0, 1);", + + "&d1, &d2, &d3") + + BoostProfile() + + Check("d1", "01:00:00", "boost::posix_time::time_duration") + Check("d2", "00:01:00", "boost::posix_time::time_duration") + Check("d3", "00:00:01", "boost::posix_time::time_duration"); @@ -6168,14 +6395,18 @@ void tst_Dumpers::dumper_data() QTest::newRow("BoostBimap") << Data("#include \n", + "typedef boost::bimap B;\n" "B b;\n" "b.left.insert(B::left_value_type(1, 2));\n" "B::left_const_iterator it = b.left.begin();\n" "int l = it->first;\n" - "int r = it->second;\n" - "unused(&l, &r);\n") + "int r = it->second;\n", + + "&l, &r") + + BoostProfile() + + Check("b", "<1 items>", TypeDef("boost::bimaps::bimap", "B")); @@ -6187,11 +6418,15 @@ void tst_Dumpers::dumper_data() "using namespace boost;\n" "using namespace gregorian;\n" "using namespace posix_time;\n", + "ptime p1(date(2002, 1, 10), time_duration(1, 0, 0));\n" "ptime p2(date(2002, 1, 10), time_duration(0, 0, 0));\n" - "ptime p3(date(1970, 1, 1), time_duration(0, 0, 0));\n" - "unused(&p1, &p2, &p3);\n") + "ptime p3(date(1970, 1, 1), time_duration(0, 0, 0));", + + "&p1, &p2, &p3") + + BoostProfile() + + Check("p1", "Thu Jan 10 01:00:00 2002", "boost::posix_time::ptime") + Check("p2", "Thu Jan 10 00:00:00 2002", "boost::posix_time::ptime") + Check("p3", "Thu Jan 1 00:00:00 1970", "boost::posix_time::ptime"); @@ -6225,7 +6460,9 @@ void tst_Dumpers::dumper_data() "boost::unordered_set s2;\n" "s2.insert(\"abc\");\n" - "s2.insert(\"def\");\n") + "s2.insert(\"def\");", + + "&s1, &s2") + BoostProfile() @@ -6252,7 +6489,9 @@ void tst_Dumpers::dumper_data() "boost::variant id2 = double(2);\n" "boost::variant is1 = int(1);\n" - "boost::variant is2 = std::string(\"sss\");\n") + "boost::variant is2 = std::string(\"sss\");", + + "&ch1, &ch2, &if1, &if2, &id1, &id2, &is1, &is2") + BoostProfile() @@ -6272,27 +6511,31 @@ void tst_Dumpers::dumper_data() QTest::newRow("Eigen") << Data("#ifdef HAS_EIGEN\n" - "#include \n" - "#endif\n", - "#ifdef HAS_EIGEN\n" - "using namespace Eigen;\n" - "Vector3d zero = Vector3d::Zero();\n" - "Matrix3d constant = Matrix3d::Constant(5);\n" + "#include \n" + "#endif\n", - "MatrixXd dynamicMatrix(5, 2);\n" - "dynamicMatrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;\n" + "#ifdef HAS_EIGEN\n" + "using namespace Eigen;\n" + "Vector3d zero = Vector3d::Zero();\n" + "Matrix3d constant = Matrix3d::Constant(5);\n" - "Matrix colMajorMatrix;\n" - "colMajorMatrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;\n" + "MatrixXd dynamicMatrix(5, 2);\n" + "dynamicMatrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;\n" - "Matrix rowMajorMatrix;\n" - "rowMajorMatrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;\n" + "Matrix colMajorMatrix;\n" + "colMajorMatrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;\n" - "VectorXd vector(3);\n" - "vector << 1, 2, 3;\n" - "#else\n" - "skipall = true;\n" - "#endif\n") + "Matrix rowMajorMatrix;\n" + "rowMajorMatrix << 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;\n" + + "VectorXd vector(3);\n" + "vector << 1, 2, 3;\n" + "#else\n" + "int zero, dynamicMatrix, constant, colMajorMatrix, rowMajorMatrix, vector;\n" + "skipall = true;\n" + "#endif\n", + + "&zero, &dynamicMatrix, &constant, &colMajorMatrix, &rowMajorMatrix, &vector") + EigenProfile() @@ -6323,9 +6566,13 @@ void tst_Dumpers::dumper_data() // https://bugreports.qt.io/browse/QTCREATORBUG-3611 QTest::newRow("Bug3611") << Data("", + "typedef unsigned char byte;\n" "byte f = '2';\n" - "int *x = (int*)&f;\n") + "int *x = (int*)&f;", + + "&f, &x") + + Check("f", "50", TypeDef("unsigned char", "byte")); @@ -6336,6 +6583,7 @@ void tst_Dumpers::dumper_data() " int id;\n" " double dvalue;\n" "};", + "QMap map;\n" "CustomStruct cs1;\n" "cs1.id = 1;\n" @@ -6344,8 +6592,12 @@ void tst_Dumpers::dumper_data() "cs2.id = -1;\n" "map.insert(cs1.id, cs1);\n" "map.insert(cs2.id, cs2);\n" - "QMap::iterator it = map.begin();\n") + "QMap::iterator it = map.begin();", + + "&map, &cs1, &cs2, &it") + + CoreProfile() + + Check("map", "<2 items>", "@QMap") + Check("map.0.key", "-1", "int") + CheckType("map.0.value", "CustomStruct") @@ -6391,9 +6643,14 @@ void tst_Dumpers::dumper_data() " BREAK;\n" " unused(&url);\n" "}\n", - " QUrl url(QString(\"http://127.0.0.1/\"));\n" - " helper(url, qtversion);\n") + + " QUrl url(QString(\"http://127.0.0.1/\"));\n" + " helper(url, qtversion);", + + "&url") + + NetworkProfile() + + Check("raw", "<0 items>", "@QList<@QByteArray>") + CheckType("request", "@QNetworkRequest") + Check("url", "\"http://127.0.0.1/\"", "@QUrl &") % NoCdbEngine @@ -6406,14 +6663,17 @@ void tst_Dumpers::dumper_data() "struct S2 : S1 { };\n" "typedef struct S3 { int m1; int m2; } S3;\n" "struct S4 : S3 { };\n", + "S2 s2;\n" "s2.m1 = 5;\n" "S4 s4;\n" "s4.m1 = 5;\n" "S1 a1[10];\n" "typedef S1 Array[10];\n" - "Array a2;\n" - "unused(&s2, &s4, &a1, &a2);\n") + "Array a2;", + + "&s2, &s4, &a1, &a2") + + CheckType("a1", "S1 [10]") + CheckType("a2", TypeDef("S1 [10]", "Array")) + CheckType("s2", "S2") @@ -6429,9 +6689,13 @@ void tst_Dumpers::dumper_data() // https://bugreports.qt.io/browse/QTCREATORBUG-6465 QTest::newRow("Bug6465") << Data("", + "typedef char Foo[20];\n" "Foo foo = \"foo\";\n" - "char bar[20] = \"baz\";\n") + "char bar[20] = \"baz\";", + + "&foo, &bar") + + CheckType("bar", "char[20]"); @@ -6446,7 +6710,9 @@ void tst_Dumpers::dumper_data() "};\n", "MyFile file(\"/tmp/tt\");\n" - "file.setObjectName(\"A file\");\n") + "file.setObjectName(\"A file\");", + + "&file") + CoreProfile() + QtVersion(0x50000) @@ -6519,8 +6785,10 @@ void tst_Dumpers::dumper_data() " int b;\n" "};\n", "Derived d;\n" - "Base *b = &d;\n" - "unused(&d, &b);\n") + "Base *b = &d;\n", + + "&d, &b") + + Check("b.@1.a", "a", "21", "int") + Check("b.b", "b", "42", "int"); @@ -6550,9 +6818,10 @@ void tst_Dumpers::dumper_data() "Derived d;\n" "Container c(&d); // c.b2 has wrong address\n" - "unused(&c);\n" - "Base2 *b2 = &d; // This has the right address\n" - "unused(&b2);\n") + "Base2 *b2 = &d; // This has the right address\n", + + "&d, &b2, &c") + + Check("c.b2.@1.foo", "42", "int") + Check("c.b2.@2.bar", "43", "int") + Check("c.b2.baz", "84", "int") @@ -6585,11 +6854,16 @@ void tst_Dumpers::dumper_data() " BREAK;\n" " unused(obj);\n" "}\n", + "Circle *circle = new Circle(1.5, -2.5, 3.0);\n" "Object *obj = circle;\n" "helper(circle);\n" - "helper(obj);\n") + "helper(obj);", + + "&obj, &circle") + + NoCdbEngine + + CheckType("obj", "Circle"); @@ -6601,6 +6875,7 @@ void tst_Dumpers::dumper_data() "#include \n" "using namespace std;\n" "typedef map > map_t;\n", + "map_t m;\n" "m[\"one\"].push_back(\"a\");\n" "m[\"one\"].push_back(\"b\");\n" @@ -6608,7 +6883,10 @@ void tst_Dumpers::dumper_data() "m[\"two\"].push_back(\"1\");\n" "m[\"two\"].push_back(\"2\");\n" "m[\"two\"].push_back(\"3\");\n" - "map_t::const_iterator it = m.begin();\n") + "map_t::const_iterator it = m.begin();", + + "&m, &it") + + Check("m", "<2 items>", TypeDef("std::map>","map_t")) + Check("m.0.first", "\"one\"", "std::string") + Check("m.0.second", "<3 items>", "std::list") @@ -6629,6 +6907,7 @@ void tst_Dumpers::dumper_data() + CheckSet({{"it.second", "<3 items>", "std::list"}, {"it.0.second", "<3 items>", "std::list"}}); + QTest::newRow("Varargs") << Data("#include \n" "void test(const char *format, ...)\n" @@ -6639,9 +6918,13 @@ void tst_Dumpers::dumper_data() " double f = va_arg(arg, double);\n" " va_end(arg);\n" " BREAK;\n" - " unused(&i, &f);\n" + " unused(&i, &f, &arg);\n" "}\n", - "test(\"abc\", 1, 2.0);\n") + + "test(\"abc\", 1, 2.0);", + + "") + + Check("format", "\"abc\"", "char *") + Check("i", "1", "int") + Check("f", FloatValue("2"), "double"); @@ -6670,22 +6953,28 @@ void tst_Dumpers::dumper_data() "struct C : virtual A { int c = 3; double cc = 3; };\n" "struct D : virtual B, virtual C { int d = 4; };\n"; + QTest::newRow("Inheritance") << Data(inheritanceData, + "Combined c;\n" "c.S1::a = 42;\n" "c.S2::a = 43;\n" "c.S1::v = 44;\n" - "c.S2::v = 45;\n" - "unused(&c.S2::v);\n" + "c.S2::v = 45;\n\n" + "TT tt;\n" "tt.T1::v = 44;\n" "tt.T2::v = 45;\n" - "unused(&tt.T2::v);\n" - "D dd; unused(&dd);\n" - "D *dp = new D; unused(&dp);\n" - "D &dr = dd; unused(&dr);\n") + "D dd;\n\n" + + "D *dp = new D;\n" + "D &dr = dd;", + + "&c.S2::v, &tt.T2::v, &dp, &dr") + + Cxx11Profile() + + Check("c.c", "1", "int") + CheckSet({{"c.@1.@2.a", "42", "int"}, // LLDB vs GDB vs .. {"c.@1.@1.a", "42", "int"}}) @@ -6723,7 +7012,7 @@ void tst_Dumpers::dumper_data() QTest::newRow("Gdb13393") << Data( - "struct Base {\n" + "\nstruct Base {\n" " Base() : a(1) {}\n" " virtual ~Base() {} // Enforce type to have RTTI\n" " int a;\n" @@ -6738,11 +7027,11 @@ void tst_Dumpers::dumper_data() " const Base *ptrConst;\n" " Base &ref;\n" " const Base &refConst;\n" - " S(Derived &d)\n" - " : ptr(&d), ptrConst(&d), ref(d), refConst(d)\n" - " {}\n" - " };\n" - , + " S(Derived &d)\n" + " : ptr(&d), ptrConst(&d), ref(d), refConst(d)\n" + " {}\n" + "};\n", + "Derived d;\n" "S s(d);\n" "Base *ptr = &d;\n" @@ -6754,8 +7043,9 @@ void tst_Dumpers::dumper_data() "boost::shared_ptr sharedPtr(new Derived());\n" "#else\n" "int sharedPtr = 1;\n" - "#endif\n" - "unused(&ptrConst, &ref, &refConst, &ptrToPtr, &sharedPtr, &s);\n") + "#endif\n", + + "&d, &s, &ptrConst, &ref, &refConst, &ptrToPtr, &sharedPtr") + GdbEngine + GdbVersion(70500) @@ -6793,11 +7083,14 @@ void tst_Dumpers::dumper_data() // http://sourceware.org/ml/gdb-patches/2011-12/msg00420.html QTest::newRow("Gdb10586") << Data("", + "struct Test {\n" " struct { int a; float b; };\n" " struct { int c; float d; };\n" - "} v = {{1, 2}, {3, 4}};\n" - "unused(&v);\n") + "} v = {{1, 2}, {3, 4}};\n", + + "&v") + + Check("v", "", "Test") % NoCdbEngine + Check("v", "", TypePattern("main::.*::Test")) % CdbEngine //+ Check("v.a", "1", "int") % GdbVersion(0, 70699) @@ -6808,10 +7101,12 @@ void tst_Dumpers::dumper_data() QTest::newRow("Gdb10586eclipse") << Data("", + "struct { int x; struct { int a; }; struct { int b; }; } " " v = {1, {2}, {3}};\n" - "struct S { int x, y; } n = {10, 20};\n" - "unused(&v, &n);\n") + "struct S { int x, y; } n = {10, 20};\n", + + "&v, &n") + Check("v", "", "{...}") % GdbEngine + Check("v", "", TypePattern(".*anonymous .*")) % LldbEngine @@ -6833,13 +7128,16 @@ void tst_Dumpers::dumper_data() QTest::newRow("StdInt") << Data("#include \n", + "uint8_t u8 = 64;\n" "int8_t s8 = 65;\n" "uint16_t u16 = 66;\n" "int16_t s16 = 67;\n" "uint32_t u32 = 68;\n" - "int32_t s32 = 69;\n" - "unused(&u8, &s8, &u16, &s16, &u32, &s32);\n") + "int32_t s32 = 69;\n", + + "&u8, &s8, &u16, &s16, &u32, &s32") + + Check("u8", "64", TypeDef("unsigned char", "uint8_t")) + Check("s8", "65", TypeDef("char", "int8_t")) + Check("u16", "66", TypeDef("unsigned short", "uint16_t")) @@ -6847,10 +7145,12 @@ void tst_Dumpers::dumper_data() + Check("u32", "68", TypeDef("unsigned int", "uint32_t")) + Check("s32", "69", TypeDef("int", "int32_t")); + QTest::newRow("QPolygon") << Data("#include \n" "#include \n" "#include \n", + "QApplication app(argc, argv);\n" "QGraphicsScene sc;\n" "QPolygonF pol;\n" @@ -6859,12 +7159,16 @@ void tst_Dumpers::dumper_data() "pol.append(QPointF(3, 3));\n" "pol.append(QPointF(2, 4));\n" "pol.append(QPointF(1, 4));\n" - "QGraphicsPolygonItem *p = sc.addPolygon(pol);\n" - "unused(&app, &p);\n") + "QGraphicsPolygonItem *p = sc.addPolygon(pol);", + + "&app, &p") + + GuiProfile() + + Check("pol", "<5 items>", "@QPolygonF") + Check("p", "<5 items>", "@QGraphicsPolygonItem"); + QTest::newRow("QJson") << Data("#include \n" "#if QT_VERSION >= 0x050000\n" @@ -6873,6 +7177,7 @@ void tst_Dumpers::dumper_data() "#include \n" "#include \n" "#endif\n", + "#if QT_VERSION >= 0x050000\n" "QJsonObject ob = QJsonObject::fromVariantMap({\n" " {\"a\", 1},\n" @@ -6905,14 +7210,17 @@ void tst_Dumpers::dumper_data() " c.append(QJsonValue(-qint64(1u << i) + 1));\n" " c.append(QJsonValue(-qint64(1u << i)));\n" " c.append(QJsonValue(-qint64(1u << i) - 1));\n" - "}\n" - "\n" + "}" "unused(&ob,&b,&a);\n" - "#endif\n") + "#endif\n", + + "") + + Cxx11Profile() + CoreProfile() + QtVersion(0x50000) + MsvcVersion(1900) + + Check("a", "<6 items>", "@QJsonArray") + Check("a.0", "[0]", "1", "QJsonValue (Number)") + Check("a.1", "[1]", "\"asd\"", "QJsonValue (String)") @@ -6953,11 +7261,13 @@ void tst_Dumpers::dumper_data() + Check("ob.3", "\"d\"", "<1 items>", "QJsonValue (Object)") + Check("ob.4", "\"s\"", "\"ssss\"", "QJsonValue (String)"); - QTest::newRow("QV4") + + QTest::newRow("Q&qstring_literal_temp,V4") << Data("#include \n" "#include \n" "#include \n" "#include \n", + "QCoreApplication app(argc, argv);\n" "QJSEngine eng;\n\n" "//QV4::Value q0; unused(&q0); // Uninitialized data.\n\n" @@ -6965,29 +7275,33 @@ void tst_Dumpers::dumper_data() "//q1.setInt_32(1);\n\n" "QV4::Value q2; unused(&q2);\n" "q2.setDouble(2.5);\n\n" - "QJSValue v10; unused(&v10);\n" - "QJSValue v11 = QJSValue(true); unused(&v11);\n" - "QJSValue v12 = QJSValue(1); unused(&v12);\n" - "QJSValue v13 = QJSValue(2.5); unused(&v13);\n" - "QJSValue v14 = QJSValue(QLatin1String(\"latin1\")); unused(&v14);\n" - "QJSValue v15 = QJSValue(QString(\"utf16\")); unused(&v15);\n" - "QJSValue v16 = QJSValue(bool(true)); unused(&v16);\n" - "QJSValue v17 = eng.newArray(100); unused(&v17);\n" - "QJSValue v18 = eng.newObject(); unused(&v18);\n\n" + "QJSValue v10;\n" + "QJSValue v11 = QJSValue(true);\n" + "QJSValue v12 = QJSValue(1);\n" + "QJSValue v13 = QJSValue(2.5);\n" + "QJSValue v14 = QJSValue(QLatin1String(\"latin1\"));\n" + "QJSValue v15 = QJSValue(QString(\"utf16\"));\n" + "QJSValue v16 = QJSValue(bool(true));\n" + "QJSValue v17 = eng.newArray(100);\n" + "QJSValue v18 = eng.newObject();\n\n" "v18.setProperty(\"PropA\", 1);\n" "v18.setProperty(\"PropB\", 2.5);\n" "v18.setProperty(\"PropC\", v10);\n\n" - "QV4::Value s11, *p11 = QJSValuePrivate::valueForData(&v11, &s11); unused(&p11);\n" - "QV4::Value s12, *p12 = QJSValuePrivate::valueForData(&v12, &s12); unused(&p12);\n" - "QV4::Value s13, *p13 = QJSValuePrivate::valueForData(&v13, &s13); unused(&p13);\n" - "QV4::Value s14, *p14 = QJSValuePrivate::valueForData(&v14, &s14); unused(&p14);\n" - "QV4::Value s15, *p15 = QJSValuePrivate::valueForData(&v15, &s15); unused(&p15);\n" - "QV4::Value s16, *p16 = QJSValuePrivate::valueForData(&v16, &s16); unused(&p16);\n" - "QV4::Value s17, *p17 = QJSValuePrivate::valueForData(&v17, &s17); unused(&p17);\n" - "QV4::Value s18, *p18 = QJSValuePrivate::valueForData(&v18, &s18); unused(&p18);\n" - ) + "QV4::Value s11, *p11 = QJSValuePrivate::valueForData(&v11, &s11);\n" + "QV4::Value s12, *p12 = QJSValuePrivate::valueForData(&v12, &s12);\n" + "QV4::Value s13, *p13 = QJSValuePrivate::valueForData(&v13, &s13);\n" + "QV4::Value s14, *p14 = QJSValuePrivate::valueForData(&v14, &s14);\n" + "QV4::Value s15, *p15 = QJSValuePrivate::valueForData(&v15, &s15);\n" + "QV4::Value s16, *p16 = QJSValuePrivate::valueForData(&v16, &s16);\n" + "QV4::Value s17, *p17 = QJSValuePrivate::valueForData(&v17, &s17);\n" + "QV4::Value s18, *p18 = QJSValuePrivate::valueForData(&v18, &s18);\n", + + "&v10, &v11, &v12, &v13, &v14, &v15, &v16, &v17, &v18, " + "&p11, &p12, &p13, &p14, &p15, &p16, &p17, &p18") + + QmlPrivateProfile() + QtVersion(0x50000) + + Check("q2", FloatValue("2.5"), "@QV4::Value (double)") //+ Check("v10", "(null)", "@QJSValue (null)") # Works in GUI. Why? + Check("v11", "true", "@QJSValue (bool)") @@ -7001,22 +7315,33 @@ void tst_Dumpers::dumper_data() QTest::newRow("QStandardItem") << Data("#include ", + "QStandardItemModel m;\n" "QStandardItem *root = m.invisibleRootItem();\n" "for (int i = 0; i < 4; ++i) {\n" " QStandardItem *item = new QStandardItem(QString(\"item %1\").arg(i));\n" " item->setData(123);\n" " root->appendRow(item);\n" - "}\n") + "}", + + "&root, &m") + + GuiProfile() + + Check("root.[children].0.[values].0.role", "Qt::DisplayRole (0)", "@Qt::ItemDataRole") + Check("root.[children].0.[values].0.value", "\"item 0\"", "@QVariant (QString)"); QTest::newRow("Internal1") + << Data("struct QtcDumperTest_FieldAccessByIndex { int d[3] = { 10, 11, 12 }; };\n", - "QtcDumperTest_FieldAccessByIndex d; unused(&d);\n") + + "QtcDumperTest_FieldAccessByIndex d;", + + "&d") + + MsvcVersion(1900) + + Check("d", "12", "QtcDumperTest_FieldAccessByIndex"); @@ -7025,8 +7350,12 @@ void tst_Dumpers::dumper_data() "struct Foo { int bar = 15; E e = V1; };\n" "struct QtcDumperTest_PointerArray {\n" " Foo *foos = new Foo[10];\n" - "};\n\n", - "QtcDumperTest_PointerArray tc; unused(&tc);\n") + "};", + + "QtcDumperTest_PointerArray tc;", + + "&tc") + + Check("tc.0.bar", "15", "int") + Check("tc.0.e", "V1 (0)", "E") + Check("tc.1.bar", "15", "int") @@ -7059,8 +7388,12 @@ void tst_Dumpers::dumper_data() "\n" " Storage> storage_;\n" "};\n", + "int v[4] = { 1, 2, 4, 8 }; \n" - "Span s(v, 4); unused(&s); \n") + "Span s(v, 4);", + + "&s") + + Check("s.storage_.@1.size_", "4", "int"); @@ -7101,11 +7434,16 @@ void tst_Dumpers::dumper_data() "{\n" " int baz = 84;\n" "};\n\n", - "Derived d1, d2; unused(&d1, &d2);\n" - "QtcDumperTest_List list; unused(&list);\n" + + "Derived d1, d2;\n" + "QtcDumperTest_List list;\n" "list.insert(&d1);\n" - "list.insert(&d2);\n") + "list.insert(&d2);", + + "&d1, &d2, &list") + + Cxx11Profile() + + Check("d1.@1.foo", "42", "int") + Check("d1.baz", "84", "int") + Check("d2.@1.foo", "42", "int") @@ -7113,6 +7451,7 @@ void tst_Dumpers::dumper_data() //+ Check("list.1.baz", "15", "int") ; + QTest::newRow("BufArray") << Data("#include \n" "static int c = 0;\n" @@ -7129,8 +7468,13 @@ void tst_Dumpers::dumper_data() " }\n" " ~QtcDumperTest_BufArray() { delete[] buffer; }\n" "};\n\n", - "QtcDumperTest_BufArray arr; unused(&arr);\n") + + "QtcDumperTest_BufArray arr;", + + "&arr") + + Cxx11Profile() + + Check("arr.0.bar", "0", "int") + Check("arr.0.baz", "1", "int") + Check("arr.1.bar", "2", "int") @@ -7152,32 +7496,46 @@ void tst_Dumpers::dumper_data() " strcpy(first, \"first\");\n" " }\n" " ~QtcDumperTest_String() { delete[] first; }\n" - "};\n\n", - "QtcDumperTest_String str; unused(&str);\n") + "};", + + "QtcDumperTest_String str;", + + "&str") + + Cxx11Profile() + + Check("str", "first, second, third", "QtcDumperTest_String"); QTest::newRow("UndefinedStaticMembers") << Data("struct Foo { int a = 15; static int b; }; \n", - "Foo f; unused(&f);\n") + + "Foo f;", + + "&f") + + Check("f.a", "15", "int") + Check("f.b", "", "") % NoCdbEngine + Check("f.b", "", "") % CdbEngine; + QTest::newRow("LongDouble") << Data("", "long double a = 1;\n" "long double b = -2;\n" "long double c = 0;\n" - "long double d = 0.5;\n") + "long double d = 0.5;", + + "&a, &b, &c, &d") + + Check("a", FloatValue("1"), TypeDef("double", "long double")) + Check("b", FloatValue("-2"), TypeDef("double", "long double")) + Check("c", FloatValue("0"), TypeDef("double", "long double")) + Check("d", FloatValue("0.5"), TypeDef("double", "long double")); + QTest::newRow("WatchList") - << Data("", "") + << Data("", "", "") + Watcher("watch.1", "42;43") + Check("watch.1", "42;43", "<2 items>", "") + Check("watch.1.0", "42", "42", "int") @@ -7189,11 +7547,16 @@ void tst_Dumpers::dumper_data() // We don't seem to have such in the public interface. << Data("#include \n" "#include \n", - "QLocaleData d; unused(&d);\n" - "QFlagPointer p; unused(&p);\n") + + "QLocaleData d;\n" + "QFlagPointer p;", + + "&d, &p") + + CorePrivateProfile() + QmlPrivateProfile() + QtVersion(0x50800) + + Check("d.Log10_2_100000", "30103", "int") + Check("p.FlagBit", "", "") % NoCdbEngine + Check("p.FlagBit", "", "", "") % CdbEngine; @@ -7204,6 +7567,7 @@ void tst_Dumpers::dumper_data() << Data("#include \n" "#include \n" "#import \n", + "std::string stdString = \"A std::string\"; (void)stdString;\n\n" "std::string &stdStringReference = stdString; (void)stdStringReference;\n\n" "CFStringRef cfStringRef = CFSTR(\"A cfstringref\"); (void)cfStringRef;\n\n" @@ -7216,8 +7580,12 @@ void tst_Dumpers::dumper_data() "CFStringRef& cfStringRefReference = cfStringRef; (void)cfStringRefReference;\n" "NSString *&aNSStringReference = aNSString; (void)aNSStringReference;\n" "NSURL *&nsUrlReference = nsUrl; (void)nsUrlReference;\n" - "CFURLRef &urlReference = url; (void)urlReference;\n") + "CFURLRef &urlReference = url; (void)urlReference;\n", + + "") + + CoreFoundationProfile() + + Check("stdString", "\"A std::string\"", "std::string") + Check("stdStringReference", "\"A std::string\"", "std::string &") + Check("cfStringRef", "\"A cfstringref\"", "CFStringRef") @@ -7233,19 +7601,26 @@ void tst_Dumpers::dumper_data() ; #endif + QTest::newRow("ArrayOfFunctionPointers") << Data("typedef int (*FP)(int *); \n" "int func(int *param) { unused(param); return 0; } \n", - "FP fps[5]; fps[0] = func; fps[0](0); unused(&fps);\n") + + "FP fps[5]; fps[0] = func; fps[0](0);", + + "&fps") + + RequiredMessage("Searching for type int (*)(int *) across all target " "modules, this could be very slow") + LldbEngine; + QTest::newRow("Sql") << Data("#include \n" "#include \n" "#include \n" "#include \n", + "QSqlDatabase db = QSqlDatabase::addDatabase(\"QSQLITE\");\n" "db.setDatabaseName(\":memory:\");\n" "Q_ASSERT(db.open());\n" @@ -7259,9 +7634,12 @@ void tst_Dumpers::dumper_data() "QSqlRecord rec = query.record();\n" "QSqlField f1 = rec.field(0);\n" "QSqlField f2 = rec.field(1);\n" - "QSqlField f3 = rec.field(2);\n" - "unused(&f1, &f2, &f3);\n") + "QSqlField f3 = rec.field(2);", + + "&f1, &f2, &f3") + + SqlProfile() + + Check("f1", "1", "@QSqlField (qlonglong)") + Check("f2", "\"qt-logo.png\"", "@QSqlField (QString)") + Check("f3", "(invalid)", "@QSqlField (invalid)"); From da25ac632263d16b1ebb9cd3fee195f0dbb8d72d Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Mon, 18 Nov 2019 15:24:52 +0100 Subject: [PATCH 48/59] CMakeProjectManager: Add ability to specify path to ninja Task-number: QTBUG-79885 Change-Id: If0c5efc534e2fc6f0041b9407e2ae24ed671ac8a Reviewed-by: Eike Ziller --- src/plugins/cmakeprojectmanager/builddirparameters.cpp | 6 ++++++ .../cmakeprojectmanager/cmakespecificsettings.cpp | 8 ++++++-- .../cmakeprojectmanager/cmakespecificsettings.h | 10 +++++++--- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/builddirparameters.cpp b/src/plugins/cmakeprojectmanager/builddirparameters.cpp index 160b50bef1a..7150d8645c3 100644 --- a/src/plugins/cmakeprojectmanager/builddirparameters.cpp +++ b/src/plugins/cmakeprojectmanager/builddirparameters.cpp @@ -27,6 +27,8 @@ #include "cmakebuildconfiguration.h" #include "cmakekitinformation.h" +#include "cmakeprojectplugin.h" +#include "cmakespecificsettings.h" #include "cmaketoolmanager.h" #include @@ -61,6 +63,10 @@ BuildDirParameters::BuildDirParameters(CMakeBuildConfiguration *bc) if (Utils::HostOsInfo::isAnyUnixHost()) environment.set("ICECC", "no"); + CMakeSpecificSettings *settings = CMakeProjectPlugin::projectTypeSpecificSettings(); + if (!settings->ninjaPath().isEmpty()) + environment.appendOrSetPath(settings->ninjaPath().toString()); + cmakeToolId = CMakeKitAspect::cmakeToolId(k); auto tc = ToolChainKitAspect::toolChain(k, Constants::CXX_LANGUAGE_ID); diff --git a/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp b/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp index 53f69dac90b..49761545661 100644 --- a/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp +++ b/src/plugins/cmakeprojectmanager/cmakespecificsettings.cpp @@ -31,20 +31,24 @@ namespace Internal { namespace { static const char SETTINGS_KEY[] = "CMakeSpecificSettings"; static const char AFTER_ADD_FILE_ACTION_KEY[] = "ProjectPopupSetting"; +static const char NINJA_PATH[] = "NinjaPath"; } void CMakeSpecificSettings::fromSettings(QSettings *settings) { const QString rootKey = QString(SETTINGS_KEY) + '/'; - afterAddFileToProjectSetting = static_cast( + m_afterAddFileToProjectSetting = static_cast( settings->value(rootKey + AFTER_ADD_FILE_ACTION_KEY, static_cast(AfterAddFileAction::ASK_USER)).toInt()); + + m_ninjaPath = Utils::FilePath::fromUserInput( + settings->value(rootKey + NINJA_PATH, QString()).toString()); } void CMakeSpecificSettings::toSettings(QSettings *settings) const { settings->beginGroup(QString(SETTINGS_KEY)); - settings->setValue(QString(AFTER_ADD_FILE_ACTION_KEY), static_cast(afterAddFileToProjectSetting)); + settings->setValue(QString(AFTER_ADD_FILE_ACTION_KEY), static_cast(m_afterAddFileToProjectSetting)); settings->endGroup(); } } diff --git a/src/plugins/cmakeprojectmanager/cmakespecificsettings.h b/src/plugins/cmakeprojectmanager/cmakespecificsettings.h index fe4d222593a..ca94bc2c73b 100644 --- a/src/plugins/cmakeprojectmanager/cmakespecificsettings.h +++ b/src/plugins/cmakeprojectmanager/cmakespecificsettings.h @@ -24,6 +24,7 @@ ****************************************************************************/ #pragma once +#include #include namespace CMakeProjectManager { @@ -42,11 +43,14 @@ public: void fromSettings(QSettings *settings); void toSettings(QSettings *settings) const; - void setAfterAddFileSetting(AfterAddFileAction settings) { afterAddFileToProjectSetting = settings; } - AfterAddFileAction afterAddFileSetting() const { return afterAddFileToProjectSetting; } + void setAfterAddFileSetting(AfterAddFileAction settings) { m_afterAddFileToProjectSetting = settings; } + AfterAddFileAction afterAddFileSetting() const { return m_afterAddFileToProjectSetting; } + + Utils::FilePath ninjaPath() const { return m_ninjaPath; } private: - AfterAddFileAction afterAddFileToProjectSetting; + AfterAddFileAction m_afterAddFileToProjectSetting; + Utils::FilePath m_ninjaPath; }; } From 5c64d59d8a315e91a3452a138fa9644efc45387d Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 18 Nov 2019 12:41:48 +0100 Subject: [PATCH 49/59] Debugger: Fix copying stack content to clipboard Change-Id: I41240e15235a4906439a514fcf56fa1f7ddc8a80 Fixes: QTCREATORBUG-23199 Reviewed-by: Christian Stenger --- src/plugins/debugger/stackhandler.cpp | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/src/plugins/debugger/stackhandler.cpp b/src/plugins/debugger/stackhandler.cpp index 65c6f092643..ea26e929995 100644 --- a/src/plugins/debugger/stackhandler.cpp +++ b/src/plugins/debugger/stackhandler.cpp @@ -457,33 +457,31 @@ bool StackHandler::contextMenuEvent(const ItemViewEvent &ev) void StackHandler::copyContentsToClipboard() { - QString str; - int n = rowCount(); - int m = columnCount(QModelIndex()); + const int m = columnCount(QModelIndex()); QVector largestColumnWidths(m, 0); // First, find the widths of the largest columns, // so that we can print them out nicely aligned. - for (int i = 0; i != n; ++i) { + forItemsAtLevel<2>([m, &largestColumnWidths](StackFrameItem *item) { for (int j = 0; j < m; ++j) { - const QModelIndex idx = index(i, j); - const int columnWidth = data(idx, Qt::DisplayRole).toString().size(); + const int columnWidth = item->data(j, Qt::DisplayRole).toString().size(); if (columnWidth > largestColumnWidths.at(j)) largestColumnWidths[j] = columnWidth; } - } + }); - for (int i = 0; i != n; ++i) { + QString str; + forItemsAtLevel<2>([m, largestColumnWidths, &str](StackFrameItem *item) { for (int j = 0; j != m; ++j) { - QModelIndex idx = index(i, j); - const QString columnEntry = data(idx, Qt::DisplayRole).toString(); + const QString columnEntry = item->data(j, Qt::DisplayRole).toString(); str += columnEntry; const int difference = largestColumnWidths.at(j) - columnEntry.size(); // Add one extra space between columns. - str += QString().fill(' ', difference > 0 ? difference + 1 : 1); + str += QString(qMax(difference, 0) + 1, QChar(' ')); } str += '\n'; - } + }); + QClipboard *clipboard = QApplication::clipboard(); clipboard->setText(str, QClipboard::Selection); clipboard->setText(str, QClipboard::Clipboard); From 4a17ac77602136abdfaf04b5fc02f5fa8f034a43 Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Mon, 18 Nov 2019 16:34:01 +0100 Subject: [PATCH 50/59] Squish: Update tst_rename_file Change-Id: I1b7e8ef7c112e01ed2403c348234a482b050cf49 Reviewed-by: Christian Stenger --- tests/system/suite_general/tst_rename_file/test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/system/suite_general/tst_rename_file/test.py b/tests/system/suite_general/tst_rename_file/test.py index cb5d434fe15..f2ac949549a 100644 --- a/tests/system/suite_general/tst_rename_file/test.py +++ b/tests/system/suite_general/tst_rename_file/test.py @@ -110,6 +110,10 @@ def renameFile(projectDir, proFile, branch, oldname, newname): "Only the filename without the extension is selected?") replaceEditorContent(replaceEdit, newname) type(replaceEdit, "") + if oldname == "adding.qrc": + clickButton(waitForObject("{text='No' type='QPushButton' unnamed='1' visible='1' " + "window={type='QMessageBox' unnamed='1' visible='1' " + " windowTitle='Rename More Files?'}}")) test.verify(waitFor("os.path.exists(newFilePath)", 1000), "Verify that file with new name exists: %s" % newFilePath) test.compare(readFile(newFilePath), oldFileText, From cd4fe0770885bec3bed3929b8d8950879d7b57f2 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 20 Nov 2019 13:30:33 +0100 Subject: [PATCH 51/59] Android: Use numerical options for remote chmod call in uploadGdbServer androiddeplyqt does not deploy gdbserver anymore, since Qt 5.14. Therefore the gdbverver deployment of Qt Creator is triggered for all devices, some of which do not support the symbolic chmod parameters (e.g. +x). Change-Id: I66e9fabeb0da4a1a3693c655a085d81c15f9d263 Reviewed-by: BogDan Vatra --- src/plugins/android/androidrunnerworker.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index 197c2fa0c18..9de3d680837 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -288,8 +288,8 @@ bool AndroidRunnerWorker::uploadGdbServer() qCDebug(androidRunWorkerLog) << "Gdbserver copy from temp directory failed"; return false; } - QTC_ASSERT(runAdb({"shell", "run-as", m_packageName, "chmod", "+x", "./gdbserver"}), - qCDebug(androidRunWorkerLog) << "Gdbserver chmod +x failed."); + QTC_ASSERT(runAdb({"shell", "run-as", m_packageName, "chmod", "777", "./gdbserver"}), + qCDebug(androidRunWorkerLog) << "Gdbserver chmod 777 failed."); return true; } From b738a9d02d57dd7433f3933aa4f330121dbd2808 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Wed, 20 Nov 2019 13:32:10 +0100 Subject: [PATCH 52/59] McuSupport: Reduce omnipotence of McuTarget's constructor ... add some setters for optional properties. Change-Id: I4e1814c36f8294af86bf30d8538f450bc7f70b2b Reviewed-by: hjk --- src/plugins/mcusupport/mcusupportoptions.cpp | 85 ++++++++++---------- src/plugins/mcusupport/mcusupportoptions.h | 13 +-- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index ed678c575cb..d45bafc6665 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -202,36 +202,48 @@ void McuPackage::updateStatus() } McuTarget::McuTarget(const QString &vendor, const QString &model, - const QString &toolChainFileName, const QString &qulPlatform, const QVector &packages) : m_vendor(vendor) , m_model(model) - , m_toolChainFile(toolChainFileName) - , m_qulPlatform(qulPlatform) , m_packages(packages) { } +QString McuTarget::vendor() const +{ + return m_vendor; +} + QString McuTarget::model() const { return m_model; } +QVector McuTarget::packages() const +{ + return m_packages; +} + +void McuTarget::setToolChainFile(const QString &toolChainFile) +{ + m_toolChainFile = toolChainFile; +} + QString McuTarget::toolChainFile() const { return m_toolChainFile; } +void McuTarget::setQulPlatform(const QString &qulPlatform) +{ + m_qulPlatform = qulPlatform; +} + QString McuTarget::qulPlatform() const { return m_qulPlatform; } -QVector McuTarget::packages() const -{ - return m_packages; -} - bool McuTarget::isValid() const { return !Utils::anyOf(packages(), [](McuPackage *package) { @@ -239,11 +251,6 @@ bool McuTarget::isValid() const }); } -QString McuTarget::vendor() const -{ - return m_vendor; -} - static McuPackage *createQtForMCUsPackage() { auto result = new McuPackage( @@ -377,38 +384,30 @@ McuSupportOptions::McuSupportOptions(QObject *parent) const QString vendorNxp = "NXP"; const QString vendorQt = "Qt"; - mcuTargets.append(new McuTarget(vendorStm, - "stm32f7508", - "CMake/stm32f7508-discovery.cmake", - "", - stmEvalPackages)); - mcuTargets.append(new McuTarget(vendorStm, - "stm32f769i", - "CMake/stm32f769i-discovery.cmake", - "", - stmEvalPackages)); - mcuTargets.append(new McuTarget(vendorStm, - "Engineering", - "CMake/", - "", - stmEngPackages)); + // STM + auto mcuTarget = new McuTarget(vendorStm, "stm32f7508", stmEvalPackages); + mcuTarget->setToolChainFile("CMake/stm32f7508-discovery.cmake"); + mcuTargets.append(mcuTarget); - mcuTargets.append(new McuTarget(vendorNxp, - "evkbimxrt1050", - "CMake/evkbimxrt1050-toolchain.cmake", - "", - nxpEvalPackages)); - mcuTargets.append(new McuTarget(vendorNxp, - "Engineering", - "CMake/", - "", - nxpEngPackages)); + mcuTarget = new McuTarget(vendorStm, "stm32f769i", stmEvalPackages); + mcuTarget->setToolChainFile("CMake/stm32f769i-discovery.cmake"); + mcuTargets.append(mcuTarget); - mcuTargets.append(new McuTarget(vendorQt, - "Desktop", - "", - "Qt", - desktopPackages)); + mcuTarget = new McuTarget(vendorStm, "Engineering", stmEngPackages); + mcuTargets.append(mcuTarget); + + // NXP + mcuTarget = new McuTarget(vendorNxp, "evkbimxrt1050", nxpEvalPackages); + mcuTarget->setToolChainFile("CMake/evkbimxrt1050-toolchain.cmake"); + mcuTargets.append(mcuTarget); + + mcuTarget = new McuTarget(vendorNxp, "Engineering", nxpEngPackages); + mcuTargets.append(mcuTarget); + + // Desktop + mcuTarget = new McuTarget(vendorQt, "Desktop", desktopPackages); + mcuTarget->setQulPlatform("Qt"); + mcuTargets.append(mcuTarget); for (auto package : packages) connect(package, &McuPackage::changed, [this](){ diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index e85498e79d0..8a642601800 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -101,22 +101,23 @@ class McuTarget : public QObject Q_OBJECT public: - McuTarget(const QString &vendor, const QString &model, const QString &toolChainFile, - const QString &qulPlatform, const QVector &packages); + McuTarget(const QString &vendor, const QString &model, const QVector &packages); QString vendor() const; QString model() const; - QString toolChainFile() const; - QString qulPlatform() const; QVector packages() const; + void setToolChainFile(const QString &toolChainFile); + QString toolChainFile() const; + void setQulPlatform(const QString &qulPlatform); + QString qulPlatform() const; bool isValid() const; private: const QString m_vendor; const QString m_model; - const QString m_toolChainFile; - const QString m_qulPlatform; const QVector m_packages; + QString m_toolChainFile; + QString m_qulPlatform; }; class McuSupportOptions : public QObject From f8f6f53960e774f48ca29ea82191c9e08130817b Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 21 Nov 2019 01:22:28 +0100 Subject: [PATCH 53/59] McuSupport: Add optional color depth (bpp) property to McuTarget ...include that in kit names and add it as "QUL_COLOR_DEPTH" CMake parameter. Change-Id: I14ba7ce465c54d525683be2660d2e24b6ecfed6c Reviewed-by: hjk --- src/plugins/mcusupport/mcusupportoptions.cpp | 31 ++++++++++++++++---- src/plugins/mcusupport/mcusupportoptions.h | 3 ++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index d45bafc6665..10147d2ac3f 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -251,6 +251,16 @@ bool McuTarget::isValid() const }); } +int McuTarget::colorDepth() const +{ + return m_colorDepth; +} + +void McuTarget::setColorDepth(int colorDepth) +{ + m_colorDepth = colorDepth; +} + static McuPackage *createQtForMCUsPackage() { auto result = new McuPackage( @@ -387,6 +397,12 @@ McuSupportOptions::McuSupportOptions(QObject *parent) // STM auto mcuTarget = new McuTarget(vendorStm, "stm32f7508", stmEvalPackages); mcuTarget->setToolChainFile("CMake/stm32f7508-discovery.cmake"); + mcuTarget->setColorDepth(32); + mcuTargets.append(mcuTarget); + + mcuTarget = new McuTarget(vendorStm, "stm32f7508", stmEvalPackages); + mcuTarget->setToolChainFile("CMake/stm32f7508-discovery.cmake"); + mcuTarget->setColorDepth(16); mcuTargets.append(mcuTarget); mcuTarget = new McuTarget(vendorStm, "stm32f769i", stmEvalPackages); @@ -407,6 +423,7 @@ McuSupportOptions::McuSupportOptions(QObject *parent) // Desktop mcuTarget = new McuTarget(vendorQt, "Desktop", desktopPackages); mcuTarget->setQulPlatform("Qt"); + mcuTarget->setColorDepth(32); mcuTargets.append(mcuTarget); for (auto package : packages) @@ -552,11 +569,11 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg if (!mcuTarget->qulPlatform().isEmpty()) config.append(CMakeConfigItem("QUL_PLATFORM", mcuTarget->qulPlatform().toUtf8())); - if (mcuTargetIsDesktop(mcuTarget)) { + if (mcuTargetIsDesktop(mcuTarget)) config.append(CMakeConfigItem("CMAKE_PREFIX_PATH", "%{Qt:QT_INSTALL_PREFIX}")); - // TODO: Hack! Implement color depth variants of all targets - config.append(CMakeConfigItem("QUL_COLOR_DEPTH", "32")); - } + if (mcuTarget->colorDepth() >= 0) + config.append(CMakeConfigItem("QUL_COLOR_DEPTH", + QString::number(mcuTarget->colorDepth()).toLatin1())); CMakeConfigurationKitAspect::setConfiguration(k, config); if (Utils::HostOsInfo::isWindowsHost()) CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM"); @@ -565,7 +582,11 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const McuTarget* mcuTarg QString McuSupportOptions::kitName(const McuTarget *mcuTarget) const { // TODO: get version from qulSdkPackage and insert into name - return QString::fromLatin1("Qt for MCUs - %1 %2").arg(mcuTarget->vendor(), mcuTarget->model()); + const QString colorDepth = mcuTarget->colorDepth() > 0 + ? QString::fromLatin1(" %1bpp").arg(mcuTarget->colorDepth()) + : ""; + return QString::fromLatin1("Qt for MCUs - %1 %2%3") + .arg(mcuTarget->vendor(), mcuTarget->model(), colorDepth); } QList McuSupportOptions::existingKits(const McuTarget *mcuTargt) diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 8a642601800..f8cba931997 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -110,6 +110,8 @@ public: QString toolChainFile() const; void setQulPlatform(const QString &qulPlatform); QString qulPlatform() const; + void setColorDepth(int colorDepth); + int colorDepth() const; bool isValid() const; private: @@ -118,6 +120,7 @@ private: const QVector m_packages; QString m_toolChainFile; QString m_qulPlatform; + int m_colorDepth = -1; }; class McuSupportOptions : public QObject From fac8a4179a8e6c75ebd7798e18db8c8327764f03 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 21 Nov 2019 12:06:34 +0100 Subject: [PATCH 54/59] CMake: Build fix for qlitehtml when submodule was used Change-Id: If82d46a761b9c59a2d945d723df575e66bd9c5a8 Reviewed-by: David Schulz --- src/plugins/help/qlitehtml/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/help/qlitehtml/CMakeLists.txt b/src/plugins/help/qlitehtml/CMakeLists.txt index 357e60cf2ce..6dde535396a 100644 --- a/src/plugins/help/qlitehtml/CMakeLists.txt +++ b/src/plugins/help/qlitehtml/CMakeLists.txt @@ -5,7 +5,7 @@ project(QLiteHtml) if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/litehtml/CMakeLists.txt) set(ORIG_FPIC ${CMAKE_POSITION_INDEPENDENT_CODE}) if (WIN32) - set(LITEHTML_UTF8 ON) + set(LITEHTML_UTF8 ON CACHE BOOL "") endif() set(CMAKE_POSITION_INDEPENDENT_CODE ON) add_subdirectory(litehtml) From 35321d82e4d7961e382e60b6ee1d721647c6c73b Mon Sep 17 00:00:00 2001 From: Sergey Belyashov Date: Fri, 8 Nov 2019 12:23:54 +0300 Subject: [PATCH 55/59] Update Russian translation Change-Id: Idb0d3ab7aaf49cb050e246ec8324ab2c1add8057 Reviewed-by: Anton Kudryavtsev Reviewed-by: Oswald Buddenhagen --- share/qtcreator/translations/qtcreator_ru.ts | 3463 +++++++++++++----- 1 file changed, 2448 insertions(+), 1015 deletions(-) diff --git a/share/qtcreator/translations/qtcreator_ru.ts b/share/qtcreator/translations/qtcreator_ru.ts index 16a28c2f650..538f8be8cef 100644 --- a/share/qtcreator/translations/qtcreator_ru.ts +++ b/share/qtcreator/translations/qtcreator_ru.ts @@ -283,12 +283,6 @@ The minimum API level required by the kit is %1. Starting Android virtual device failed. Сбой запуска виртуального устройства Android. - - Cleaning Qt libraries on device failed. -%1 - Не удалось очистить библиотеки Qt на устройстве. -%1 - Android package installation failed. %1 @@ -566,6 +560,10 @@ The files in the Android package source directory are copied to the build direct Uses the external Ministro application to download and maintain Qt libraries. Использовать внешнее приложение Ministro для загрузки и обслуживания библиотек Qt. + + Build .aab (Android App Bundle) + Собирать .aab (Android App Bundle) + Libraries (*.so) Библиотеки (*.so) @@ -619,7 +617,7 @@ The files in the Android package source directory are copied to the build direct Deploy to Android device AndroidDeployQtStep default display name - Установка на устройство Android + Развёртывание на устройство Android No Android arch set by the .pro file. @@ -631,11 +629,11 @@ The files in the Android package source directory are copied to the build direct Deploy to Android device or emulator - Установить на устройство или эмулятор Android + Развернуть на устройство или эмулятор Android Deploying to %1 - Установка на %1 + Развёртывание на %1 Cannot find the androiddeployqt tool. @@ -663,11 +661,7 @@ The files in the Android package source directory are copied to the build direct Package deploy: Failed to pull "%1" to "%2". - Установка пакета: Не удалось получить «%1» в «%2». - - - Package deploy: Running command "%1 %2". - Установка пакета: Выполнение команды «%1 %2». + Развёртывание пакета: не удалось получить «%1» в «%2». Install failed @@ -681,10 +675,6 @@ The files in the Android package source directory are copied to the build direct Reset Default Devices Сбросить устройства по умолчанию - - Clean Temporary Libraries Directory on Device - Очистить временный каталог на устройстве - Install Ministro from APK Установить Ministro из APK @@ -699,7 +689,7 @@ The files in the Android package source directory are copied to the build direct Initializing deployment to Android device/simulator - Инициализация установки на устройство/эмулятор Android + Инициализация развёртывания на устройство/эмулятор Android Starting: "%1" @@ -709,7 +699,7 @@ The files in the Android package source directory are copied to the build direct Deployment failed with the following errors: - Не удалось установить из-за следующих ошибок: + Не удалось развернуть из-за следующих ошибок: @@ -725,6 +715,10 @@ Do you want to uninstall the existing package? Pulling files necessary for debugging. Загрузка файлов, необходимых для отладки. + + Package deploy: Running command "%1". + Развёртывание пакета: выполняется команда «%1». + Android::Internal::AndroidDevice @@ -787,6 +781,10 @@ Do you want to uninstall the existing package? <p>The adb tool in the Android SDK lists all connected devices if run via &quot;adb devices&quot;.</p> <p>Утилита adb в Android SDK выводит список всех подключённых устройств запущенных через «устройства adb».</p> + + Always use this device for this project + Всегда использовать это устройство для этого проекта + No Device Found Устройства не обнаружены @@ -805,7 +803,7 @@ Do you want to uninstall the existing package? This can be later reset in deployment settings in the Projects mode. - Можно в любой момент выключить в настройках установки в режиме Проекты. + Можно в любой момент выключить в настройках развёртывания в режиме Проекты. Always use this device for architecture %1 for this project @@ -873,41 +871,6 @@ Do you want to uninstall the existing package? Android: неизвестная ошибка 0x%1 - - Android::Internal::AndroidGdbServerKitAspect - - Android GDB server - Сервер GDB для Android - - - The GDB server to use for this kit. - Сервер GDB для этого комплекта. - - - GDB server - Сервер GDB - - - Manage... - Управление... - - - Auto-detect - Обнаружить - - - Edit... - Изменить... - - - &Binary: - &Программа: - - - GDB Server for "%1" - Сервер GDB для «%1» - - Android::Internal::AndroidManifestEditor @@ -1089,8 +1052,16 @@ Do you want to uninstall the existing package? Android::Internal::AndroidQtVersion - Failed to detect the ABIs used by the Qt version. - Не удалось определить ABI, используемые профилем Qt. + NDK is not configured in Devices > Android. + NDK не настроен в Устройства > Android. + + + SDK is not configured in Devices > Android. + SDK не настроен в Устройства > Android. + + + Failed to detect the ABIs used by the Qt version. Check the settings in Devices > Android for errors. + Не удалось обнаружить ABI, используемые профилем Qt. Проверьте настройки в Устройства > Android. Android @@ -1420,6 +1391,10 @@ Cancelling pending operations... Android SDK path exists. Путь к Android SDK существует. + + Android SDK path writable. + Каталог с Android SDK доступен для записи. + SDK tools installed. Инструменты SDK установлены. @@ -1428,6 +1403,10 @@ Cancelling pending operations... Platform tools installed. Инструменты платформы установлены. + + SDK manager runs (requires exactly Java 1.8). + Управление SDK работает (требуется Java только версии 1.8). + Build tools installed. Инструменты сборки установлены. @@ -1853,6 +1832,21 @@ Install an SDK of at least API version %1. Autotest::Internal::AutotestPlugin + + &Run Test Under Cursor + &Запустить тест под курсором + + + &Debug Test Under Cursor + &Отладить тест под курсором + + + + Autotest::Internal::AutotestPluginPrivate + + Testing + Тестирование + &Tests &Тесты @@ -1865,14 +1859,14 @@ Install an SDK of at least API version %1. Run All Tests Запуск всех тестов - - Alt+Shift+T,Alt+A - Alt+Shift+T,Alt+A - Ctrl+Meta+T, Ctrl+Meta+A Ctrl+Meta+T, Ctrl+Meta+A + + Alt+Shift+T,Alt+A + Alt+Shift+T,Alt+A + &Run Selected Tests &Запустить выбранные @@ -1881,14 +1875,14 @@ Install an SDK of at least API version %1. Run Selected Tests Запуск выбранных тестов - - Alt+Shift+T,Alt+R - Alt+Shift+T,Alt+R - Ctrl+Meta+T, Ctrl+Meta+R Ctrl+Meta+T, Ctrl+Meta+R + + Alt+Shift+T,Alt+R + Alt+Shift+T,Alt+R + Run Tests for Current &File Запустить тесты для текущего &файла @@ -1897,33 +1891,25 @@ Install an SDK of at least API version %1. Run Tests for Current File Запуск тестов для текущего файла - - Alt+Shift+T,Alt+F - Alt+Shift+T,Alt+F - Ctrl+Meta+T, Ctrl+Meta+F Ctrl+Meta+T, Ctrl+Meta+F + + Alt+Shift+T,Alt+F + Alt+Shift+T,Alt+F + Re&scan Tests &Пересканировать - - Alt+Shift+T,Alt+S - Alt+Shift+T,Alt+S - Ctrl+Meta+T, Ctrl+Meta+S Ctrl+Meta+T, Ctrl+Meta+S - &Run Test Under Cursor - &Запустить тест под курсором - - - &Debug Test Under Cursor - &Отладить тест под курсором + Alt+Shift+T,Alt+S + Alt+Shift+T,Alt+S Selected test was not found (%1). @@ -2105,6 +2091,37 @@ See Google Test documentation for further information on GTest filters. Информацию о GTest фильтрах смотрите в документации Google Test. + + Autotest::Internal::ProjectTestSettingsWidget + + Global + Общие + + + Custom + Особые + + + Active frameworks: + Активная среда: + + + Automatically run tests after build + Автозапуск тестов после сборки + + + None + Нет + + + All + Всех + + + Selected + Выбранных + + Autotest::Internal::QtTestOutputReader @@ -2268,10 +2285,6 @@ Warning: Plain text misses some information, such as duration. Autotest::Internal::TestCodeParser - - AutoTest Plugin WARNING: No files left after filtering test scan folders. Check test filter settings. - Модуль AutoTest: ПРЕДУПРЕЖДЕНИЕ: Ни один файл не отфильтровался при сканирование папок для тестов. Проверьте настройки фильтра тестов. - Scanning for Tests Поиск тестов @@ -2293,7 +2306,7 @@ Warning: Plain text misses some information, such as duration. Run Without Deployment - Запустить без установки + Запустить без развёртывания Debug This Test @@ -2301,7 +2314,7 @@ Warning: Plain text misses some information, such as duration. Debug Without Deployment - Отладить без установки + Отладить без развёртывания Select All @@ -2347,13 +2360,6 @@ Warning: Plain text misses some information, such as duration. Тесты - - Autotest::Internal::TestOutputReader - - Test executable crashed. - Сбой программы тестирования. - - Autotest::Internal::TestResultsPane @@ -2735,6 +2741,26 @@ Warning: this is an experimental feature and might lead to failing to execute th Only for unsuccessful test runs Только в случае неуспешных результатов + + Automatically run + Автозапуск тестов + + + Runs chosen tests automatically if a build succeeded. + Автоматически запускать выбранные тесты после успешной сборки. + + + None + Нет + + + All + Всех + + + Selected + Выбранных + Autotest::Internal::TestSettingsWidget @@ -2755,6 +2781,13 @@ Warning: this is an experimental feature and might lead to failing to execute th Включение/отключение объединения тестов по каталогам. + + Autotest::TestOutputReader + + Test executable crashed. + Сбой программы тестирования. + + AutotoolsProjectManager::Internal::AutogenStep @@ -2925,6 +2958,10 @@ Warning: this is an experimental feature and might lead to failing to execute th Bare Metal Голое железо + + Bare Metal Device + Устройство на голом железе + BareMetal::Internal::BareMetalDeviceConfigurationWidget @@ -2932,6 +2969,18 @@ Warning: this is an experimental feature and might lead to failing to execute th GDB server provider: Тип сервера GDB: + + Peripheral description files (*.svd) + Файлы описания устройств (*.svd) + + + Select Peripheral Description File + Выбор файла описания внешнего устройства + + + Peripheral description file: + Файл описания устройства: + BareMetal::Internal::BareMetalDeviceConfigurationWizard @@ -2954,16 +3003,12 @@ Warning: this is an experimental feature and might lead to failing to execute th GDB server provider: Тип сервера GDB: - - Bare Metal Device - Голое устройство - BareMetal::Internal::BareMetalDeviceFactory Bare Metal Device - Голое устройство + Устройство на голом железе @@ -3266,6 +3311,13 @@ Warning: this is an experimental feature and might lead to failing to execute th Утилита ST-LINK + + BareMetalDeployConfiguration + + Deploy to BareMetal Device + Развёртывание на устройство на голом железе + + BaseFileWizard @@ -4584,6 +4636,13 @@ For example, "Revision: 15" will leave the branch at revision 15.шаблонный + + Boot2Qt + + Boot2Qt: %1 + Boot2Qt: %1 + + BorderImageSpecifics @@ -4760,6 +4819,13 @@ For example, "Revision: 15" will leave the branch at revision 15.Конфигурация сборки сейчас отключена. + + CMakeProjectManager::CMakeBuildSystem + + Scan "%1" project tree + Сканирование дерева проекта «%1» + + CMakeProjectManager::CMakeConfigItem @@ -4767,6 +4833,135 @@ For example, "Revision: 15" will leave the branch at revision 15.Не удалось открыть %1 для чтения. + + CMakeProjectManager::CMakeConfigurationKitAspect + + CMake Configuration + Конфигурация CMake + + + Default configuration passed to CMake when setting up a project. + Конфигурация по умолчанию, передаваемая CMake при настройке проекта. + + + CMake configuration has no path to qmake binary set, even though the kit has a valid Qt version. + В конфигурации CMake не указан путь к qmake, даже при заданном профиле Qt комплекта. + + + CMake configuration has a path to a qmake binary set, even though the kit has no valid Qt version. + В конфигурации CMake указан путь к qmake, при незаданном верном профиле Qt комплекта. + + + CMake configuration has a path to a qmake binary set that does not match the qmake binary path configured in the Qt version. + В конфигурации CMake указан путь к qmake, но он не совпадает с заданным в профиле Qt комплекта. + + + CMake configuration has no CMAKE_PREFIX_PATH set that points to the kit Qt version. + В конфигурации CMake не задан параметр CMAKE_PREFIX_PATH, указывающий на профиль Qt комплекта. + + + CMake configuration has no path to a C compiler set, even though the kit has a valid tool chain. + В концигурации CMake не задан путь к компилятору C, но в комплекте указан корректный иструментарий. + + + CMake configuration has a path to a C compiler set, even though the kit has no valid tool chain. + В концигурации CMake задан путь к компилятору C, но в комплекте не указан корректный иструментарий. + + + CMake configuration has a path to a C compiler set that does not match the compiler path configured in the tool chain of the kit. + В конфигурации CMake указан путь к компилятору С, но он не совпадает с заданным в инструментарии комплекта. + + + CMake configuration has no path to a C++ compiler set, even though the kit has a valid tool chain. + В конфигурации CMake не указан путь к компилятору С++, при заданном верном инструментарии комплекта. + + + CMake configuration has a path to a C++ compiler set, even though the kit has no valid tool chain. + В конфигурации CMake указан путь к компилятору С++, при незаданном верном инструментарии комплекта. + + + CMake configuration has a path to a C++ compiler set that does not match the compiler path configured in the tool chain of the kit. + В конфигурации CMake указан путь к компилятору С++, но он не совпадает с заданным в инструментарии комплекта. + + + + CMakeProjectManager::CMakeGeneratorKitAspect + + CMake generator + Генератор CMake + + + CMake generator defines how a project is built when using CMake.<br>This setting is ignored when using other build systems. + Генератор CMake определяет, как проект будет собираться при использовании CMake.<br>Он игнорируется при использовании других систем сборки. + + + CMake Tool is unconfigured, CMake generator will be ignored. + Программа CMake не настроена, генератор CMake игнорируется. + + + CMake Tool does not support the configured generator. + Программа CMake не поддерживает выбранный генератор. + + + Platform is not supported by the selected CMake generator. + Платформа не поддерживается выбранным генератором CMake. + + + Toolset is not supported by the selected CMake generator. + Инструментарий не поддерживается выбранным генератором CMake. + + + The selected CMake binary has no server-mode and the CMake generator does not generate a CodeBlocks file. %1 will not be able to parse CMake projects. + Выбранная программа CMake не имеет серверного режима, а генератор CMake не создаёт файлы CodeBlocks. %1 не имеет возможности разбирать проекты CMake. + + + <Use Default Generator> + <Генератор по умолчанию> + + + Generator: %1<br>Extra generator: %2 + Генератор: %1<br>Дополнительный генератор: %2 + + + Platform: %1 + Платформа: %1 + + + Toolset: %1 + Инструментарий: %1 + + + CMake Generator + Генератор CMake + + + + CMakeProjectManager::CMakeKitAspect + + CMake Tool + Программа CMake + + + The CMake Tool to use when building a project with CMake.<br>This setting is ignored when using other build systems. + Программа CMake используется для сборки проектов на базе CMake.<br>Эта настройка игнорируется при использовании других систем сборки. + + + CMake version %1 is unsupported. Please update to version 3.0 or later. + CMake версии %1 не поддерживается. Обновите до версии 3.0 или более поздней. + + + CMake + CMake + + + Unconfigured + Не настроено + + + Path to the cmake executable + Путь к программе cmake + + CMakeProjectManager::CMakeProject @@ -4777,13 +4972,21 @@ For example, "Revision: 15" will leave the branch at revision 15.No compilers set in kit. У комплекта не заданы компиляторы. - - Scan "%1" project tree - Сканирование дерева проекта «%1» - CMakeProjectManager::CMakeSettingsPage + + Version: %1<br>Supports fileApi: %2<br>Supports server-mode: %3 + Версия: %1<br>Поддерживается fileApi: %2<br>Поддерживается серверный режим: %3 + + + yes + да + + + no + нет + (Default) (По умолчанию) @@ -4831,10 +5034,6 @@ For example, "Revision: 15" will leave the branch at revision 15. CMakeProjectManager::CMakeToolManager - - CMake at %1 - CMake в %1 - System CMake at %1 Системная CMake в %1 @@ -4878,6 +5077,88 @@ For example, "Revision: 15" will leave the branch at revision 15.Выберите каталог для %1 + + CMakeProjectManager::Internal + + Failed to set up CMake file API support. Qt Creator can not extract project information. + Не удалось настроить поддержку API файла CMake. Qt Creator не может извлечь информацию о проекте. + + + Invalid reply file created by CMake. + CMake создал неверный файл-ответ. + + + Invalid cache file generated by CMake. + CMake создал неверный файл кэша. + + + Invalid cmakeFiles file generated by CMake. + CMake создал неверный файл cmakeFiles. + + + Invalid codemodel file generated by CMake: No directories. + CMake создал неверный файл codemodel: нет каталогов. + + + Invalid codemodel file generated by CMake: Empty directory object. + CMake создал неверный файл codemodel: пустой объект каталога. + + + Invalid codemodel file generated by CMake: No projects. + CMake создал неверный файл codemodel: нет проектов. + + + Invalid codemodel file generated by CMake: Empty project object. + CMake создал неверный файл codemodel: пустой объект проекта. + + + Invalid codemodel file generated by CMake: Broken project data. + CMake создал неверный файл codemodel: повреждены данные проекта. + + + Invalid codemodel file generated by CMake: No targets. + CMake создал неверный файл codemodel: нет целей. + + + Invalid codemodel file generated by CMake: Empty target object. + CMake создал неверный файл codemodel: пустой объект цели. + + + Invalid codemodel file generated by CMake: Broken target data. + CMake создал неверный файл codemodel: повреждены данные цели. + + + Invalid codemodel file generated by CMake: No configurations. + CMake создал неверный файл codemodel: нет конфигураций. + + + Invalid codemodel file generated by CMake: Empty configuration object. + CMake создал неверный файл codemodel: пустой объект конфигурации. + + + Invalid codemodel file generated by CMake: Broken indexes in directories, projects, or targets. + CMake создал неверный файл codemodel: повреждены индексы в каталогах, проектах или целях. + + + Invalid codemodel file generated by CMake. + CMake создал неверный файл codemodel. + + + Invalid target file: Information is missing. + Неверный файл цели: отсутствует информация. + + + Invalid target file generated by CMake: Broken indexes in target details. + CMake создал неверный цели файл: повреждены индексы в деталях цели. + + + + CMakeProjectManager::Internal::BuildCMakeTargetLocatorFilter + + Build CMake target + Собрать цель CMake + + CMakeProjectManager::Internal::BuildDirManager @@ -4892,6 +5173,10 @@ For example, "Revision: 15" will leave the branch at revision 15.The kit needs to define a CMake tool to parse this project. В комплекте должна быть задана программа CMake для разбора этого проекта. + + CMakeLists.txt in source directory + CMakeLists.txt в каталоге исходников + CMakeCache.txt file not found. Не удалось найти файл CMakeCache.txt. @@ -5122,54 +5407,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Enter one variable per line with the variable name separated from the variable value by "=".<br>You may provide a type hint by adding ":TYPE" before the "=". Задавайте значения переменных по одной в строке, отделяя значение от имени символом "=".<br>Можно указывать тип, добавляя «:ТИП» перед "=".<br>Например: CMAKE_BUILD_TYPE:STRING=DebWithRelInfo. - - CMake Configuration - Конфигурация CMake - - - Default configuration passed to CMake when setting up a project. - Конфигурация по умолчанию, передаваемая CMake при настройке проекта. - - - CMake configuration has no path to qmake binary set, even though the kit has a valid Qt version. - В конфигурации CMake не указан путь к qmake, даже при заданном профиле Qt комплекта. - - - CMake configuration has a path to a qmake binary set, even though the kit has no valid Qt version. - В конфигурации CMake указан путь к qmake, при незаданном верном профиле Qt комплекта. - - - CMake configuration has a path to a qmake binary set that does not match the qmake binary path configured in the Qt version. - В конфигурации CMake указан путь к qmake, но он не совпадает с заданным в профиле Qt комплекта. - - - CMake configuration has no CMAKE_PREFIX_PATH set that points to the kit Qt version. - В конфигурации CMake не задан параметр CMAKE_PREFIX_PATH, указывающий на профиль Qt комплекта. - - - CMake configuration has no path to a C compiler set, even though the kit has a valid tool chain. - В концигурации CMake не задан путь к компилятору C, но в комплекте указан корректный иструментарий. - - - CMake configuration has a path to a C compiler set, even though the kit has no valid tool chain. - В концигурации CMake задан путь к компилятору C, но в комплекте не указан корректный иструментарий. - - - CMake configuration has a path to a C compiler set that does not match the compiler path configured in the tool chain of the kit. - В конфигурации CMake указан путь к компилятору С, но он не совпадает с заданным в инструментарии комплекта. - - - CMake configuration has no path to a C++ compiler set, even though the kit has a valid tool chain. - В конфигурации CMake не указан путь к компилятору С++, при заданном верном инструментарии комплекта. - - - CMake configuration has a path to a C++ compiler set, even though the kit has no valid tool chain. - В конфигурации CMake указан путь к компилятору С++, при незаданном верном инструментарии комплекта. - - - CMake configuration has a path to a C++ compiler set that does not match the compiler path configured in the tool chain of the kit. - В конфигурации CMake указан путь к компилятору С++, но он не совпадает с заданным в инструментарии комплекта. - CMakeProjectManager::Internal::CMakeEditorFactory @@ -5212,50 +5449,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Toolset: Инструментарий: - - CMake generator - Генератор CMake - - - CMake generator defines how a project is built when using CMake.<br>This setting is ignored when using other build systems. - Генератор CMake определяет, как проект будет собираться при использовании CMake.<br>Он игнорируется при использовании других систем сборки. - - - CMake Tool is unconfigured, CMake generator will be ignored. - Программа CMake не настроена, генератор CMake игнорируется. - - - CMake Tool does not support the configured generator. - Программа CMake не поддерживает выбранный генератор. - - - Platform is not supported by the selected CMake generator. - Платформа не поддерживается выбранным генератором CMake. - - - Toolset is not supported by the selected CMake generator. - Инструментарий не поддерживается выбранным генератором CMake. - - - The selected CMake binary has no server-mode and the CMake generator does not generate a CodeBlocks file. %1 will not be able to parse CMake projects. - Выбранная программа CMake не имеет серверного режима, а генератор CMake не создаёт файлы CodeBlocks. %1 не имеет возможности разбирать проекты CMake. - - - <Use Default Generator> - <Генератор по умолчанию> - - - Generator: %1<br>Extra generator: %2 - Генератор: %1<br>Дополнительный генератор: %2 - - - Platform: %1 - Платформа: %1 - - - Toolset: %1 - Инструментарий: %1 - CMakeProjectManager::Internal::CMakeKitAspect @@ -5263,37 +5456,6 @@ For example, "Revision: 15" will leave the branch at revision 15.<No CMake Tool available> <Программа CMake недоступна> - - CMake Tool - Программа CMake - - - The CMake Tool to use when building a project with CMake.<br>This setting is ignored when using other build systems. - Программа CMake используется для сборки проектов на базе CMake.<br>Эта настройка игнорируется при использовании других систем сборки. - - - CMake version %1 is unsupported. Please update to version 3.0 or later. - CMake версии %1 не поддерживается. Обновите до версии 3.0 или более поздней. - - - CMake - CMake - - - Unconfigured - Не настроено - - - Path to the cmake executable - Путь к программе cmake - - - - CMakeProjectManager::Internal::CMakeLocatorFilter - - Build CMake target - Собрать цель CMake - CMakeProjectManager::Internal::CMakeManager @@ -5330,6 +5492,29 @@ For example, "Revision: 15" will leave the branch at revision 15.Операция «Собрать файл» не поддерживается генератором «%1» + + CMakeProjectManager::Internal::CMakeProcess + + Running %1 in %2. + Работа %1 на %2. + + + Configuring "%1" + Настройка «%1» + + + CMake process was canceled by the user. + Процесс CMake был прерван пользователем. + + + CMake process crashed. + Процесс CMake завершился крахом. + + + CMake process exited with exit code %1. + Процесс CMake завершился с кодом %1. + + CMakeProjectManager::Internal::CMakeProjectPlugin @@ -5346,13 +5531,6 @@ For example, "Revision: 15" will leave the branch at revision 15.Собрать «%1» - - CMakeProjectManager::Internal::CMakeRunConfiguration - - The project no longer builds the target associated with this run configuration. - Проект больше не собирает цель, ассоциированную с ним в конфигурации запуска. - - CMakeProjectManager::Internal::CMakeSettingsPage @@ -5421,6 +5599,39 @@ For example, "Revision: 15" will leave the branch at revision 15.Новый CMake + + CMakeProjectManager::Internal::CMakeToolTreeItem + + CMake executable path does not exist. + Не найден путь к программе CMake. + + + CMake executable path is not a file. + Путь к программе CMake не является файлом. + + + CMake executable path is not executable. + Путь к программе CMake не исполняемый. + + + + CMakeProjectManager::Internal::FileApi + + <Build Directory> + <Каталог сборки> + + + <Other Locations> + <Другие места> + + + + CMakeProjectManager::Internal::OpenCMakeTargetLocatorFilter + + Open CMake target + Открыть цель CMake + + CMakeProjectManager::Internal::ServerMode @@ -5573,22 +5784,6 @@ For example, "Revision: 15" will leave the branch at revision 15.The build directory is not for %1 but for %2 Каталог сборки не для %1, а для %2 - - Running "%1 %2" in %3. - Выполнение "%1 %2" в %3. - - - Configuring "%1" - Настройка «%1» - - - *** cmake process crashed. - *** процесс cmake аварийно завершился. - - - *** cmake process exited with exit code %1. - *** процесс cmake завершился с кодом %1. - CMakeTargetNode @@ -5812,18 +6007,6 @@ However, using the relaxed and extended rules means also that no highlighting/co ClangDiagnosticConfigsModel - - Clang-only checks for questionable constructs - Проверки Clang для сомнительных конструкций - - - Clang-only pedantic checks - Педантичные проверки Clang - - - Clang-only checks for almost everything - Проверки Clang для всего - Clang-Tidy thorough checks Тщательные проверки Clang-Tidy @@ -5840,6 +6023,10 @@ However, using the relaxed and extended rules means also that no highlighting/co Clang-Tidy and Clazy preselected checks Выбранные проверки Clang-Tidy и Clazy + + Checks for questionable constructs + Проверки на сомнительные конструкции + Build-system warnings Предупреждения системы сборки @@ -5848,6 +6035,14 @@ However, using the relaxed and extended rules means also that no highlighting/co %1 [built-in] %1 [встроенный] + + Pedantic checks + Педантичные проверки + + + Checks for almost everything + Проверки всего + ClangDiagnosticWidget @@ -5913,6 +6108,55 @@ However, using the relaxed and extended rules means also that no highlighting/co %1 байт(ов) + + ClangIndexingProjectSettingsWidget + + Form + + + + Reindex + Переиндексировать + + + + ClangPchManager::ClangIndexingProjectSettingsWidget + + Clang Indexing + Индексация Clang + + + + ClangPchManager::PreprocessorMacroWidget + + Macro already exists. + Сценарий уже существует. + + + Ed&it + &Изменить + + + &Add + &Добавить + + + &Reset + &Вернуть + + + &Unset + &Сбросить + + + Unset <a href="%1"><b>%1</b></a> + Сброшено значение <a href="%1"><b>%1</b></a> + + + Set <a href="%1"><b>%1</b></a> to <b>%2</b> + Присвоено <a href="%1"><b>%1</b></a> значение <b>%2</b> + + ClangPchProgressManager @@ -5957,10 +6201,6 @@ However, using the relaxed and extended rules means also that no highlighting/co Description: Описание: - - Context: - Контекст: - Location: Размещение: @@ -5976,24 +6216,40 @@ However, using the relaxed and extended rules means also that no highlighting/co Message: Сообщение: - - Extended message: - Подробное сообщение: - Location: Размещение: - ClangTools::Internal::ClangTidyClazyRunner + ClangTools::Internal::ClangTidyRunner - Clang-Tidy and Clazy - Clang-Tidy и Clazy + Clang-Tidy + Clang-Tidy - ClangTools::Internal::ClangTidyClazyTool + ClangTools::Internal::ClangTool + + In general, the project should be built before starting the analysis to ensure that the code to analyze is valid.<br/><br/>Building the project might also run code generators that update the source files as necessary. + Проект должен быть собран перед анализом, чтобы убедиться, что анализируемый код верен.<br/><br/>Сборка проекта так же может запускать кодогенераторы, которые обновляют при необходимости исходники. + + + Info About Build the Project Before Analysis + Информация о сборке проекта перед анализом + + + Analyze Project... + Проанализировать проект... + + + Analyze Current File + Проанализировать текущий файл + + + Clang-Tidy and Clazy Diagnostics + Проблемы по Clang-Tidy и Clazy + Go to previous diagnostic. Перейти к предыдущей проблеме. @@ -6003,20 +6259,8 @@ However, using the relaxed and extended rules means also that no highlighting/co Перейти к следующей проблеме. - Apply Fixits - Исправить - - - Clang-Tidy and Clazy - Clang-Tidy и Clazy - - - Clang-Tidy and Clazy... - Clang-Tidy и Clazy... - - - Clang-Tidy and Clazy Diagnostics - Проблемы по Clang-Tidy и Clazy + Load Diagnostics from YAML Files exported with "-export-fixes". + Загрузить проблемы из файлов YAML, созданных с помощью «-export-fixes». Clear @@ -6034,25 +6278,57 @@ However, using the relaxed and extended rules means also that no highlighting/co Filter Diagnostics Фильтр проблем + + Apply Fixits + Применить исправления + Clang-Tidy and Clazy use a customized Clang executable from the Clang project to search for diagnostics. Clang-Tidy и Clazy используют модифицированную программу Clang из проекта Clang для поиска проблем. + + Clang-Tidy and Clazy... + Clang-Tidy и Clazy... + + + Clang-Tidy and Clazy + Clang-Tidy и Clazy + Clang-Tidy and Clazy tool stopped by user. Утилиты Clang-Tidy и Clazy остановлены пользователем. + + Select YAML Files with Diagnostics + Выбор файлов YAML с проблемами + + + YAML Files (*.yml *.yaml);;All Files (*) + Файлы YAML (*.yml *.yaml);;Все файлы (*) + + + Error Loading Diagnostics + Ошибка загрузки проблем + + + All Files + Все файлы + + + Opened Files + Открытые файлы + + + Edited Files + Изменённые файлы + Clang-Tidy and Clazy are still running. Clang-Tidy и Clazy ещё работают. - Start Clang-Tidy and Clazy. - Запуск Clang-Tidy и Clazy. - - - This is not a C++ project. - Это не проект на языке C++. + This is not a C/C++ project. + Это не проект на C/C++. Running - %n diagnostics @@ -6080,18 +6356,7 @@ However, using the relaxed and extended rules means also that no highlighting/co - ClangTools::Internal::ClangTool - - In general, the project should be built before starting the analysis to ensure that the code to analyze is valid.<br/><br/>Building the project might also run code generators that update the source files as necessary. - Проект должен быть собран перед анализом, чтобы убедиться, что анализируемый код верен.<br/><br/>Сборка проекта так же может запускать кодогенераторы, которые обновляют при необходимости исходники. - - - Info About Build the Project Before Analysis - Информация о сборке проекта перед анализом - - - - ClangTools::Internal::ClangToolRunControl + ClangTools::Internal::ClangToolRunWorker Release Выпуск @@ -6108,21 +6373,33 @@ However, using the relaxed and extended rules means also that no highlighting/co Do you want to continue and run the tool in %1 mode? Продолжить запуск в режиме %1? - - %1: Can't find clang executable, stop. - %1: не удалось найти программу clang, остановлено. - The project configuration changed since the start of the %1. Please re-run with current configuration. Настройки проекта изменились с момента запуска %1. Перезапустите с текущей конфигурацией. - Running %1 on %2 - Запуск %1 на %2 + Running %1 on %2 with configuration "%3". + Выполнение %1 на %2 в конфигурации «%3». - %1: Failed to create temporary dir, stop. - %1: не удалось создать временный каталог, остановлено. + %1: Failed to create temporary directory. Stopped. + %1: не удалось создать временный каталог. Остановлено. + + + Analyzing + Анализ + + + %1: Invalid executable "%2". Stopped. + %1: неверная программа «%2». Остановлено. + + + Analyzing "%1" [%2]. + Анализ «%1» [%2]. + + + Failed to analyze "%1": %2 + Не удалось проанализировать «%1»: %2 %1 finished: Processed %2 files successfully, %3 failed. @@ -6136,18 +6413,6 @@ However, using the relaxed and extended rules means also that no highlighting/co %1: You might need to build the project to generate or update source files. To build automatically, enable "Build the project before starting analysis". %1: возможно требуется пересобрать проект для создания или обновления исходных файлов. Включите «Собирать проект перед запуском анализа», чтобы он собирался автоматически. - - Analyzing - Анализ - - - Analyzing "%1". - Анализ «%1». - - - Failed to analyze "%1": %2 - Не удалось проанализировать «%1»: %2 - ClangTools::Internal::ClangToolRunner @@ -6174,24 +6439,6 @@ Output: %3 - - ClangTools::Internal::ClangToolsBasicSettings - - Build the project before analysis - Собирать проект перед анализом - - - - ClangTools::Internal::ClangToolsConfigWidget - - General - Основное - - - Simultaneous processes: - Одновременных процессов: - - ClangTools::Internal::ClangToolsDiagnosticModel @@ -6237,6 +6484,20 @@ Output: Инструменты Clang + + ClangTools::Internal::ClazyPluginRunner + + Clazy + Clazy + + + + ClangTools::Internal::ClazyStandaloneRunner + + Clazy + Clazy + + ClangTools::Internal::DiagnosticView @@ -6246,10 +6507,6 @@ Output: ClangTools::Internal::ProjectSettingsWidget - - Suppressed diagnostics: - Игнорированные проблемы: - Remove Selected Удалить выбранное @@ -6258,25 +6515,52 @@ Output: Remove All Удалить всё + + Use Global Settings + Используются глобальные настройки + + + Use Customized Settings + Используются особые настройки + + + Restore Global Settings + Восстановить настройки + + + <a href="target">Show Global Settings</a> + <a href="target">Показать глобальные</a> + + + <a href="target">Go to Analyzer</a> + <a href="target">Перейти к анализу</a> + + + Suppressed diagnostics + Игнорируемые проблемы + + + + ClangTools::Internal::RunSettingsWidget + + Form + + + + Run Options + Параметры запуска + + + Build the project before analysis + Собирать проект перед анализом + + + Parallel jobs: + Распараллелить на: + ClangTools::Internal::SelectableFilesDialog - - Analyzer Configuration - Конфигурация анализатора - - - General - Основное - - - Global Settings - Глобальные настройки - - - Custom Settings - Особые настройки - Files to Analyze Анализируемые файлы @@ -6290,24 +6574,39 @@ Output: Анализировать + + ClangTools::Internal::SettingsWidget + + Executables + Программы + + + Clang-Tidy: + Clang-Tidy: + + + Clazy-Standalone: + Clazy-Standalone: + + + Clang-Tidy Executable + Программа Clang-Tidy + + + Clazy Executable + Программа Clazy + + ClangTools::Internal::SuppressedDiagnosticsModel File Файл - - Context - Контекст - Diagnostic Проблема - - Function "%1" - Функция «%1» - ClangUtils @@ -8046,6 +8345,30 @@ Continue? Create Folder Создать каталог + + Settings File Error + Ошибка файла настроек + + + The settings file "%1" is not writable. +You will not be able to store any %2 settings. + Файл настроек «%1» защищён от записи. +Нет возможности сохранить настройки %2. + + + The file is not readable. + Файл не читается. + + + The file is invalid. + Неверный файл. + + + Error reading settings file "%1": %2 +You will likely experience further problems using this instance of %3. + При чтении файла настроек «%1» возникла ошибка: %2 +Возможны проблемы при дальнейшем использованнии %3 без перезапуска. + Core::Internal::CurrentDocumentFind @@ -8630,8 +8953,8 @@ Do you want to kill it? Не удалось найти программу для «%1» (полностью «%2») - Starting external tool "%1" %2 - Запускается внешняя утилита «%1» %2 + Starting external tool "%1" + Запускается внешняя утилита «%1» "%1" finished @@ -8655,6 +8978,22 @@ Do you want to kill it? Create and Open "%1" Создать и открыть «%1» + + Create File + Создание файла + + + Create "%1"? + Создать «%1»? + + + Always create + Создавать всегда + + + Create + Создать + Core::Internal::FileSystemFilterOptions @@ -8833,6 +9172,10 @@ Do you want to kill it? <System Language> <Системный> + + Show keyboard shortcuts in context menus (default: %1) + Показывать сочетания клавиш в контекстном меню (по умолчанию: %1) + Restart Required Требуется перезапуск @@ -8887,11 +9230,6 @@ Do you want to kill it? Enable high DPI scaling Масштабировать при большом DPI - - High DPI scaling: - На форме полный перевод выглядит коряво - Высокий DPI: - Core::Internal::JavaScriptFilter @@ -10038,6 +10376,10 @@ Do you want to kill it? Command line arguments used for "Run in terminal". Параметры командной строки для «Запустить в терминале». + + Maximum number of entries in "Recent Files": + Максимальное число записей в меню «Недавние файлы»: + Core::Internal::ThemeChooser @@ -10299,11 +10641,11 @@ Do you want to check them out now? Insert Unexpanded Value - Вставить неразворачиваемое значение + Вставить неразвёрнутое значение Insert Expanded Value - Вставить разворачиваемое значение + Вставить развёрнутое значение Select a variable to insert. @@ -10713,8 +11055,8 @@ to version control (%2) Свернуть - <b>Warning</b>: This file is not part of any project. The code model might have issues to parse this file properly. - <b>Внимание!</b> Этот файл не является частью какого-либо проекта. Модель кода может не разобрать его корректно. + <b>Warning</b>: This file is not part of any project. The code model might have issues parsing this file properly. + <b>Внимание!</b> Этот файл не является частью какого-либо проекта. У модели кода могут возникнуть сложности при его разборе. <b>Warning</b>: The code model could not parse an included file, which might lead to incorrect code completion and highlighting, for example. @@ -11084,10 +11426,6 @@ to version control (%2) Clang Code Model Модель кода Clang - - The selected configuration has potentially expensive Clang-Tidy or Clazy checks enabled.<br/>Consider to run these in a separate <a href="target">Clang-Tidy and Clazy analyzer</a> run. - Выбранная конфигурация включает потенциально тяжёлые проверки Clang-Tidy или Clazy.<br/>Возможно, их стоит выделить в отдельный запуск <a href="target">анализатора Clang-Tidy и Clazy</a>. - CppTools::Internal::CppCodeStyleSettingsPage @@ -11849,6 +12187,156 @@ Flags: %3 Шаблоны игнорируемых файлов: + + CtfVisualizer::Internal::CtfStatisticsModel + + Title + Заголовок + + + Count + Число + + + Total Time + Общее время + + + Minimum Time + Минимальное время + + + Average Time + Среднее время + + + Maximum Time + Максимальное время + + + + CtfVisualizer::Internal::CtfTimelineModel + + Stack Level %1 + Уровень %1 стека + + + Start + Начало + + + Wall Duration + Продолжительность + + + Unfinished + Незавершено + + + true + true + + + > Thread %1 + > Поток %1 + + + Categories + Категории + + + Arguments + Параметры + + + Instant + Момент + + + Scope + Область + + + global + глобальная + + + process + процесс + + + thread + поток + + + Return Arguments + Возвращаемые аргументы + + + + CtfVisualizer::Internal::CtfTraceManager + + CTF Visualizer + Визуализатор CTF + + + Cannot read the CTF file. + Не удалось прочитать файл CTF. + + + The trace contains threads with stack depth > 512. +Do you want to display them anyway? + Трассировка содержит потоки с глубиной стека > 512. +Всё равно отобразить? + + + + CtfVisualizer::Internal::CtfVisualizerTool + + Chrome Trace Format Viewer + Просмотрщик Chrome Trace Format + + + Load JSON File + Загрузить файл JSON + + + Timeline + Временная шкала + + + Reset Zoom + Сбросить приближение + + + Statistics + Статистика + + + Load Chrome Trace Format File + Загрузить файл Chrome Trace Format + + + JSON File (*.json) + Файл JSON (*.json) + + + CTF Visualizer + Визуализатор CTF + + + The file does not contain any trace data. + Файл не содержит данных трассировки. + + + Loading CTF File + Загрузка файла CTF + + + Chrome Trace Format Visualizer + Визуализатор Chrome Trace Format + + CustomExecutableDialog @@ -12475,6 +12963,26 @@ Flags: %3 Debugger settings Настройки отладчика + + Enable C++ + Включить C++ + + + Enable QML + Включить QML + + + <a href="qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html">What are the prerequisites?</a> + <a href="qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html">Зачем нужно?</a> + + + Enable Debugging of Subprocesses + Допускать отладку дочерних процессов + + + Additional startup commands: + Дополнительные команды запуска: + Debugger::DebuggerRunTool @@ -12797,6 +13305,10 @@ Flags: %3 &Thread specification: &Спецификация потока: + + Propagate Change to Preset Breakpoint + Распространять изменения на предустановленные точки останова + &Condition: &Условие: @@ -13684,6 +14196,46 @@ If you build %2 from sources and want to use a CDB executable with another bitne Select a valid expression to evaluate. Выберите корректное выражение для вычисления. + + Symbol + Символ + + + Address + Адрес + + + Code + Код + + + Section + Секция + + + Name + Имя + + + Symbols in "%1" + Символы в «%1» + + + From + От + + + To + Кому + + + Flags + Флаги + + + Sections in "%1" + Секции в «%1» + The inferior is in the Portable Executable format. Selecting %1 as debugger would improve the debugging experience for this binary format. @@ -13845,6 +14397,10 @@ Setting breakpoints by file name and line number may fail. Reg&isters &Регистры + + Peripheral Reg&isters + Регистры пери&ферии + &Stack &Стек @@ -13935,51 +14491,6 @@ Setting breakpoints by file name and line number may fail. Process %1 Процесс %1 - - Symbol - Символ - - - Address - Адрес - - - Code - Код - - - Section - Секция - - - Name - Имя - - - Symbols in "%1" - Символы в «%1» - - - From - От - - - To - Кому - - - Flags - Флаги - - - Sections in "%1" - Секции в «%1» - - - Debugger - Category under which Analyzer tasks are listed in Issues view - Отладчик - Cannot start %1 without a project. Please open the project and try again. Невозможно запустить %1 без проекта. Откройте проект и попробуйте снова. @@ -14260,6 +14771,7 @@ Affected are breakpoints %1 Debugger + Category under which Analyzer tasks are listed in Issues view Отладчик @@ -15595,6 +16107,65 @@ You may be asked to share the contents of this log when reporting bugs related t У процесса Pdb возникла неопознанная ошибка. + + Debugger::Internal::PeripheralRegisterHandler + + RO + RO + + + WO + WO + + + RW + RW + + + N/A + Н/Д + + + [%1..%2] + [%1..%2] + + + Name + Имя + + + Value + Значение + + + Access + Доступ + + + View Groups + Просмотр групп + + + Format + Формат + + + Hexadecimal + Шестнадцатеричный + + + Decimal + Десятичный + + + Octal + Восьмеричный + + + Binary + Двоичный + + Debugger::Internal::QmlEngine @@ -15616,8 +16187,8 @@ Do you want to retry? Не удалось подключиться к внутрипроцессному отладчику QML. %1 - Starting %1 %2 - Запускается %1 %2 + Starting %1 + Запускается %1 Waiting for JavaScript engine to interrupt on next statement. @@ -15754,29 +16325,6 @@ Do you want to retry? Изменение битов %1...%2 регистра %3 - - Debugger::Internal::RunConfigWidget - - Enable C++ - Включить C++ - - - Enable QML - Включить QML - - - Debug port: - Порт отладки: - - - <a href="qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html">What are the prerequisites?</a> - <a href="qthelp://org.qt-project.qtcreator/doc/creator-debugging-qml.html">Зачем нужно?</a> - - - Enable Debugging of Subprocesses - Допускать отладку дочерних процессов - - Debugger::Internal::SelectRemoteFileDialog @@ -17638,10 +18186,6 @@ Rebuilding the project might help. Insert Keyframe Вставить ключевой кадр - - Binding Editor - Редактор привязок - ExtensionSystem::Internal::PluginDetailsView @@ -18456,10 +19000,6 @@ will also disable the following plugins: No data available Нет данных - - Visualize %1 - Отобразить %1 - FlickableSection @@ -18805,6 +19345,21 @@ See also Google Test settings. типизированный + + GenerateResource + + Generate Resource File + Создать файл ресурсов + + + Save Project As Resource + Сохранить проект как ресурс + + + QML Resource File (*.qmlrc) + Файл ресурсов QML (*.qmlrc) + + GenericProjectManager::Internal::FilesSelectionWizardPage @@ -18837,6 +19392,14 @@ See also Google Test settings. Edit Files... Изменить файлы... + + Remove Directory + Внешний каталог + + + Project files list update failed. + Не удалось обновить список файлов проекта. + GenericProjectManager::Internal::GenericProjectWizard @@ -19629,6 +20192,10 @@ Would you like to terminate it? Select a Git Commit Выбор фиксации Git + + &Archive... + &Сжать... + Git::Internal::CommitData @@ -19638,7 +20205,7 @@ Would you like to terminate it? staged + - подготовлен + + подготовлен + modified @@ -20036,6 +20603,26 @@ Commit now? Cannot retrieve last commit data of repository "%1". Не удалось получить данные последней фиксации хранилища «%1». + + Tarball (*.tar.gz) + Тарбол (*.tar.gz) + + + Zip archive (*.zip) + Архив Zip (*.zip) + + + Generate %1 archive + Создание архива %1 + + + Overwrite? + Перезаписать? + + + An item named "%1" already exists at this location. Do you want to overwrite it? + Элемент с названием «%1» уже существует в указанном месте. Желаете его перезаписать? + Reset Сброс @@ -20217,6 +20804,14 @@ Commit now? Show textual graph log. Показать граф журнала в ASCII графике. + + Follow + Следовать + + + Show log also for previous names of the file. + Показывать историю до переименования файла. + Reload Перезагрузить @@ -20588,6 +21183,10 @@ Commit now? Checkout... Перейти... + + Archive... + Сжать... + Rebase... Перебазировать... @@ -21564,6 +22163,15 @@ Add, modify, and remove document filters, which determine the documentation set General Основное + + Change takes effect after reloading help pages. + Изменения вступят в силу после перезагрузки страниц справки. + + + Default (%1) + Default viewer backend + По умолчанию (%1) + Import Bookmarks Импорт закладок @@ -21684,6 +22292,10 @@ Add, modify, and remove document filters, which determine the documentation set Enable scroll wheel zooming Масштабирование колесом прокрутки + + Viewer backend: + Просмотрщик: + Help::Internal::HelpIndexFilter @@ -21771,6 +22383,10 @@ Add, modify, and remove document filters, which determine the documentation set Help::Internal::HelpWidget + + (Untitled) + (Без имени) + Open in Help Mode Открыть в режиме справки @@ -21799,6 +22415,10 @@ Add, modify, and remove document filters, which determine the documentation set Ctrl+M Ctrl+M + + Open Online Documentation... + Открыть онлайн документацию... + Increase Font Size Увеличить шрифт @@ -21811,6 +22431,10 @@ Add, modify, and remove document filters, which determine the documentation set Reset Font Size Восстановить размер шрифта + + Open in Edit Mode + Открыть в режиме редактирования + Open in New Page Открыть на новой странице @@ -21819,6 +22443,10 @@ Add, modify, and remove document filters, which determine the documentation set Open in Window Отрыть в окне + + Reload + Перезагрузить + Meta+Shift+C Meta+Shift+C @@ -21899,6 +22527,36 @@ Add, modify, and remove document filters, which determine the documentation set Открыть ссылку в новой странице + + Help::Internal::LiteHtmlHelpViewer + + Copy Link + Скопировать ссылку + + + Copy + Копировать + + + + Help::Internal::LocalHelpManager + + QtWebEngine + QtWebEngine + + + litehtml + litehtml + + + WebKit + WebKit + + + QTextBrowser + QTextBrowser + + Help::Internal::OpenPagesManager @@ -21906,13 +22564,6 @@ Add, modify, and remove document filters, which determine the documentation set Скопировать полный путь в буфер обмена - - Help::Internal::OpenPagesModel - - (Untitled) - (Без имени) - - Help::Internal::OpenPagesWidget @@ -22009,10 +22660,6 @@ Add, modify, and remove document filters, which determine the documentation set Copy Копировать - - Reload - Перезагрузить - Help::Internal::XbelReader @@ -22218,8 +22865,7 @@ Add, modify, and remove document filters, which determine the documentation set HoverHandler Got unsupported markup hover content: - Идей перевода нет. Все равно это то, что идет в лог. - + Получен неподдерживаемый форматированный текст под курсором: @@ -22612,6 +23258,11 @@ Ids must begin with a lowercase letter. Extra arguments: Доп. параметры: + + iOS build + iOS BuildStep display name. + Сборка iOS + xcodebuild xcodebuild @@ -22621,14 +23272,6 @@ Ids must begin with a lowercase letter. По умолчанию - - Ios::Internal::IosBuildStepConfigWidget - - iOS build - iOS BuildStep display name. - Сборка iOS - - Ios::Internal::IosConfigurations @@ -22687,7 +23330,7 @@ Ids must begin with a lowercase letter. Deploy to iOS device or emulator - Установка на устройство или эмулятор iOS + Развёртывание на устройство или эмулятор iOS @@ -23187,6 +23830,102 @@ Error: %5 Layout Компоновка + + Align + Выравнивание + + + Align objects + Выравнивание объектов + + + Align objects to left edge + Выравнивание объектов по левому краю + + + Align objects horizontal center + Горизонтальное выравнивание объектов по центру + + + Align objects to right edge + Выравнивание объектов по правому краю + + + Align objects to top edge + Выравнивание объектов по верхнему краю + + + Align objects vertical center + Вертикальное выравнивание объектов по центру + + + Align objects to bottom edge + Выравнивание объектов по нижнему краю + + + Distribute objects + Распределение объектов + + + Distribute objects left edge + Распределение объектов по левому краю + + + Distribute objects horizontal center + Горизонтальное распределение объектов по центру + + + Distribute objects right edge + Распределение объектов по правому краю + + + Distribute objects top edge + Распределение объектов по верхнему краю + + + Distribute objects vertical center + Вертикальное распределение объектов по центру + + + Distribute objects bottom edge + Распределение объектов по нижнему краю + + + Distribute spacing + Распределение пространства + + + Distribute spacing horizontal + Горизонтальное распределение пространства + + + Distribute spacing vertical + Вертикальное распределение пространства + + + Align to + Выровнять по + + + Key object + Ключевой объект + + + Warning + Предупреждение + + + - The selection contains the root item. + - Выбор содержит корневой элемент. + + + - The selection contains a non visual item. + - Выбор содержит неотображаемый элемент. + + + - An item in the selection uses anchors. + - Выбранный элемент использует привязки. + Advanced Дополнительно @@ -23249,6 +23988,13 @@ Error: %5 KEIL %1 (%2, %3) + + Language + + None + Отсутствует + + LanguageClient @@ -23508,10 +24254,6 @@ Error: %5 Maximum size of an item in a layout. Максимальный размер в компоновщике. - - Margins - Внешние отступы - Row span Межстрочный интервал @@ -23664,6 +24406,10 @@ Error: %5 File "%1" does not exist or is not readable. Файл «%1» не существует или не читается. + + Error: Failed to parse YAML file "%1": %2. + Ошибка: Не удалось разобрать файл YAML «%1»: %2. + Macros @@ -24072,6 +24818,101 @@ Error: %5 Отступы вокруг элемента. + + McuSupport::Internal::FlashAndRunConfiguration + + Effective flash and run call: + Команда прошивки и запуска: + + + Flash and run + Прошивка и запуск + + + + McuSupport::Internal::McuSupportDevice + + MCU Device + Микроконтроллер + + + + McuSupport::Internal::McuSupportDeviceFactory + + MCU Device + Микроконтроллер + + + + McuSupport::Internal::McuSupportOptionsPage + + Target: + Цель: + + + Packages + Пакеты + + + No kits can currently be generated. Select a target and provide the package paths. Afterwards, press Apply to generate a kit for your board. + Невозможно сейчас создать комплект. Выберите цель и укажите пути к пакету. Затем создайте комплект для вашей платы нажав Применить. + + + Kits for the following targets can be generated: %1 Press Apply to generate a kit for your target. + Могут быть созданы комплекты для следующих целей: %1. Создайте комплект для вашей цели нажав Применить. + + + MCU + Микроконтроллер + + + + McuSupport::Internal::PackageOptions + + Download from "%1" + Загрузить по «%1» + + + Path is valid, "%1" was found. + Путь верен, «%1» найден. + + + Path exists, but does not contain "%1". + Путь существует, но не содержит «%1». + + + Path does not exist. + Путь не существует. + + + Qt MCU SDK + Qt SDK для микроконтроллеров + + + GNU Arm Embedded Toolchain + GNU Arm Embedded Toolchain + + + STM32Cube SDK + STM32Cube SDK + + + STM32CubeProgrammer + STM32CubeProgrammer + + + NXP i.MXRT SDK + NXP i.MXRT SDK + + + SEGGER JLink + SEGGER JLink + + + Arm GDB at %1 + Arm GDB в %1 + + Mercurial::Internal::AuthenticationDialog @@ -24853,6 +25694,10 @@ Error: %5 Nim Clean Step Этап очистки компилятора Nim + + Working directory: + Рабочий каталог: + Build directory "%1" does not exist. Каталог сборки «%1» отсутствует. @@ -24869,12 +25714,9 @@ Error: %5 Clean step completed successfully. Этап очистки завершился успешно. - - - Nim::NimCompilerCleanStepConfigWidget - Working directory: - Рабочий каталог: + Nim Compiler Clean Step + Этап очистки компилятора Nim @@ -24887,10 +25729,6 @@ Error: %5 Nim::NimProject - - Scanning for Nim files - Поиск файлов Nim - No Nim compiler set. Компилятор Nim не задан. @@ -24987,20 +25825,6 @@ Error: %5 Этап сборки Nim - - NimCompilerCleanStepFactory - - Nim Compiler Clean Step - Этап очистки компилятора Nim - - - - NimCompilerCleanStepWidget - - Nim clean step - Этап очистки Nim - - NimToolsSettingsPage @@ -25081,6 +25905,10 @@ Error: %5 SCXML Editor Редактор SCXML + + Qt Quick Designer + Дизайнер Qt Quick + PaddingSection @@ -26731,6 +27559,10 @@ Error: %5 Arguments Параметры + + Toggle multi-line mode + Переключение многострочного режима + Command line arguments: Параметры командной строки: @@ -26774,6 +27606,14 @@ Error: %5 Clean Environment Чистая среда + + The project is currently being parsed. + Проект ещё разбирается. + + + The project was not parsed successfully. + Не удалось разобрать проект. + ProjectExplorer::BuildEnvironmentWidget @@ -26868,6 +27708,11 @@ Error: %5 Display name of the clean build step list. Used as part of the labels in the project window. Очистка + + Deploy + Display name of the deploy build step list. Used as part of the labels in the project window. + Развёртывание + ProjectExplorer::BuildableHelperLibrary @@ -26938,14 +27783,6 @@ Error: %5 ProjectExplorer::CustomWizard - - URI: - URI: - - - The project name and the object class-name cannot be the same. - Название проекта и имя класса объекта не могут совпадать. - Creates a custom Qt Creator plugin. Создание особого подключаемого модуля для Qt Creator. @@ -26958,14 +27795,6 @@ Error: %5 URL: URL: - - Object class-name: - Имя класса объекта: - - - Qt Quick 2 Extension Plugin - Модуль, расширяющий Qt Quick 2 - Qt Creator Plugin Модуль Qt Creator @@ -27054,14 +27883,6 @@ Error: %5 Local user settings Локальные настройки пользователя - - Custom QML Extension Plugin Parameters - Параметры особого модуля расширяющего QML - - - Creates a C++ plugin to load extensions dynamically into applications using the QQmlEngine class. Requires Qt 5.0 or newer. - Создание C++ модуля для динамической загрузки расширений в приложение, использующее класс QQmlEngine. Требуется Qt версии 5.0 или выше. - ProjectExplorer::DebuggingHelperLibrary @@ -27086,11 +27907,6 @@ Error: %5 ProjectExplorer::DeployConfiguration - - Deploy - Display name of the deploy build step list. Used as part of the labels in the project window. - Развёртывание - Deploy locally Default DeployConfiguration display name @@ -27106,24 +27922,6 @@ Error: %5 Настройки развёртывания - - ProjectExplorer::DeploymentDataModel - - Local File Path - Путь к локальному файлу - - - Remote Directory - Внешний каталог - - - - ProjectExplorer::DeploymentDataView - - Files to deploy: - Файлы для развёртывания: - - ProjectExplorer::DesktopDevice @@ -27135,29 +27933,6 @@ Error: %5 Desktop - - ProjectExplorer::DesktopDeviceConfigurationWidget - - Machine type: - Тип машины: - - - TextLabel - - - - Free ports: - Свободные порты: - - - Physical Device - Физическое устройство - - - You will need at least one port for QML debugging. - Необходим как минимум один порт для отладки QML. - - ProjectExplorer::DesktopProcessSignalOperation @@ -27401,14 +28176,11 @@ Error: %5 - ProjectExplorer::EnvironmentValidator + ProjectExplorer::EnvironmentWidget Variable already exists. Переменная уже существует. - - - ProjectExplorer::EnvironmentWidget Ed&it &Изменить @@ -27425,6 +28197,10 @@ Error: %5 &Unset &Сбросить + + Disable + Отключить + Append Path... Добавить после пути... @@ -27453,6 +28229,10 @@ Error: %5 Set <a href="%1"><b>%1</b></a> to <b>%2</b> Присвоено <a href="%1"><b>%1</b></a> значение <b>%2</b> + + Set <a href="%1"><b>%1</b></a> to <b>%2</b> [disabled] + Присвоено <a href="%1"><b>%1</b></a> значение <b>%2</b> [отключено] + Use <b>%1</b> %1 is "System Environment" or some such. @@ -27467,6 +28247,10 @@ Error: %5 Choose Directory Выбор каталога + + Enable + Включить + ProjectExplorer::ExecutableAspect @@ -27620,17 +28404,29 @@ Excluding: %2 Объединять stderr и stdout - Open pane on output when running - Открывать вкладку вывода при запуске + Always + Всегда - Open pane on output when debugging - Открывать вкладку вывода при отладке + Never + Никогда + + + On first output only + Только при первом выводе Limit output to %1 characters Ограничить вывод %1 символами + + Open pane on output when running: + Открывать вкладку вывода при запуске: + + + Open pane on output when debugging: + Открывать вкладку вывода при отладке: + Application Output Вывод приложения @@ -27756,17 +28552,6 @@ Excluding: %2 Этапов сборки нет - - ProjectExplorer::Internal::BuildStepsPage - - Build Steps - Этапы сборки - - - Clean Steps - Этапы очистки - - ProjectExplorer::Internal::ClangClToolChainConfigWidget @@ -28057,6 +28842,21 @@ Excluding: %2 Сихронизировать у проектов текущий комплект и конфигурации сборки и развёртывания. + + ProjectExplorer::Internal::DeploymentDataView + + Local File Path + Путь к локальному файлу + + + Remote Directory + Внешний каталог + + + Files to deploy: + Развёртываемые файлы: + + ProjectExplorer::Internal::DesktopDeviceFactory @@ -28064,6 +28864,17 @@ Excluding: %2 Desktop + + ProjectExplorer::Internal::DesktopRunConfiguration + + Qt Run Configuration + Конфигурация выполнения Qt + + + The project no longer builds the target associated with this run configuration. + Проект больше не собирает цель, ассоциированную с ним в конфигурации запуска. + + ProjectExplorer::Internal::DeviceFactorySelectionDialog @@ -28219,6 +29030,17 @@ Excluding: %2 No kits are enabled for this project. Enable kits in the "Projects" mode. Для этого проекта не включены комплекты. Включите их в режиме «Проект». + + Rename More Files? + Это заголовок диалогового окна + Переименование файлов + + + Would you like to rename these files as well? + %1 + Переименовать ли ещё эти файлы? + %1 + Choose Drop Action Выбор реакции на перетаскивание @@ -28509,8 +29331,8 @@ What should Qt Creator do now? ProjectExplorer::Internal::LinuxIccToolChainFactory - Linux ICC - + ICC + ICC @@ -28535,6 +29357,14 @@ What should Qt Creator do now? Override MAKEFLAGS Переопределение MAKEFLAGS + + Disable in subdirectories: + Выключить по подкаталогах: + + + Runs this step only for a top-level build. + Запускать этот этап только для сборки верхнего уровня. + ProjectExplorer::Internal::MingwToolChainFactory @@ -28840,6 +29670,18 @@ What should Qt Creator do now? Deduced From Project Согласно проекту + + Abort on error when building all projects + Прерываться по ошибке при сборке всех проектов + + + Enable this if your system becomes unresponsive while building. + Включите, если при сборке ваша система перестаёт отвечать. + + + Start build processes with low priority + Запускать процессы сборки с низким приоритетом + ProjectExplorer::Internal::ProjectFileWizardExtension @@ -28986,21 +29828,21 @@ to project "%2". проект - New Project - Новый проект + Manage + Настроить - Open Project - Открыть проект + New + Создать + + + Open + Открыть Sessions Сессии - - Recent Projects - Недавние проекты - ProjectExplorer::Internal::ProjectWindow @@ -29331,6 +30173,10 @@ to project "%2". ProjectExplorer::Internal::TargetSetupWidget + + You cannot use this kit, because it does not fulfill the project's prerequisites. + Невозможно использовать этот комплект, так как он не соответствует требованиям проекта. + <b>Error:</b> Severity is Task::Error @@ -29876,6 +30722,14 @@ to project "%2". This wizard creates a simple unit test project. Этот мастер создаст проект простейшего юнит-теста. + + Googletest source directory (optional): + Каталог исходников Googletest (опционально): + + + Boost include directory (optional): + Каталог заголовков Boost (опционально): + Project Management Управление проектом @@ -29884,6 +30738,10 @@ to project "%2". Summary Итог + + Add Q_OBJECT + Добавить Q_OBJECT + Creates a C++ header and a source file for a new class that you can add to a C++ project. Создание заголовочного и исходного файлов C++ для нового класса, добавляемого в проект C++. @@ -30276,10 +31134,6 @@ Preselects a desktop Qt for building the application if available. Enable C++11 Разрешить C++11 - - Googletest repository: - Хранилище Googletest: - Project and Test Information Информация о проекте и тестах @@ -30386,10 +31240,6 @@ Use this only if you are prototyping. You cannot create a full application with Test suite name: Название набора тестов: - - Boost include dir (optional): - Каталог подключаемых файлов Boost (не обязательно): - %{JS: Cpp.classToFileName(value('Class'), Util.preferredSuffix('text/x-c++hdr'))} зачем это переводить?!? @@ -30411,6 +31261,14 @@ Use this only if you are prototyping. You cannot create a full application with "%{JS: Util.toNativeSeparators(value('TargetPath'))}" exists in the filesystem. "%{JS: Util.toNativeSeparators(value('TargetPath'))}" exists in the filesystem. + + Translation File + Файл переводов + + + Translation + Перевод + This wizard creates a C++ library project. Этот мастер создаст проект библиотеки С++. @@ -30499,6 +31357,38 @@ Use this only if you are prototyping. You cannot create a full application with C++ Library Библиотека C++ + + MyItem + MyItem + + + Object class-name: + Имя класса объекта: + + + com.mycompany.qmlcomponents + com.mycompany.qmlcomponents + + + URI: + URI: + + + Custom Parameters + Особые параметры + + + Creates a C++ plugin to load Qt Quick extensions dynamically into applications using the QQmlEngine class. + Создание C++ модуля для динамической загрузки расширений Qt Quick в приложение, использующее класс QQmlEngine. + + + Qt Quick 2 Extension Plugin + Модуль расширения Qt Quick 2 + + + Qt 5.14 + Qt 5.14 + Qt 5.13 Qt 5.13 @@ -30647,6 +31537,10 @@ Preselects a desktop Qt for building the application if available. Qt Quick Application - Swipe Приложение Qt Quick - Swipe + + Repository URL is not valid + Неверный URL хранилища + Use existing directory Использовать существующий каталог @@ -31434,6 +32328,10 @@ Please close all running instances of your application before starting a build.< Add Existing Files... Добавить существующие файлы... + + Duplicate File... + Дублировать файл... + Remove Project... Remove project from parent profile (Project explorer view); will not physically delete any files. @@ -31567,10 +32465,18 @@ Please close all running instances of your application before starting a build.< A build is still in progress. Сборка ещё выполняется. + + A run action is already scheduled for the active project. + Запуск уже запланирован для активного проекта. + Run %1 Запустить %1 + + %1 in %2 + %1 в %2 + New Subproject Title of dialog @@ -31610,18 +32516,10 @@ Please try again. _copy _копия - - _copy%1 - _копия%1 - Duplicating File Failed Не удалось дублировать файл - - Could not duplicate the file %1. - Не удалось дублировать файл %1. - Deleting File Failed Не удалось удалить файл @@ -31713,6 +32611,14 @@ Do you want to ignore them? Close All Projects and Editors Закрыть все документы и проекты + + Build for Run Configuration + Сборка для конфигурации запуска + + + Build for Run Configuration "%1" + Собрать для конфигурации запуска «%1» + Build Собрать @@ -31741,10 +32647,6 @@ Do you want to ignore them? Properties... Свойства... - - Duplicate File - Дублировать файл - Set "%1" as Active Project Сделать «%1» активным проектом @@ -31879,6 +32781,22 @@ Do you want to ignore them? Cannot run "%1". Не удалось запустить «%1». + + Choose File Name + Выбор имени файла + + + New file name: + Имя нового файла: + + + Failed to copy file "%1" to "%2": %3. + Не удалось скопировать файл «%1» в «%2»: %3. + + + Failed to add new file "%1" to the project. + Не удалось добавить в проект новый файл «%1». + Could not delete file %1. Не удалось удалить файл «%1». @@ -31940,8 +32858,8 @@ Do you want to ignore them? Рабочий каталог текущей активной конфигурации запуска - The Project is currently being parsed. - Проект сейчас разбирается. + The project is currently being parsed. + Проект ещё разбирается. The project could not be fully parsed. @@ -32244,12 +33162,8 @@ These files are preserved. ProjectExplorer::TargetSetupPage - <span style=" font-weight:600;">No valid kits found.</span> - <b>Отсутствуют подходящие комплекты.</b> - - - Please add a kit in the <a href="buildandrun">options</a> or via the maintenance tool of the SDK. - Добавьте комплект в <a href="buildandrun">настройках</a> или через инструмент обслуживания SDK. + <span style=" font-weight:600;">No suitable kits found.</span><br/>Add a kit in the <a href="buildandrun">options</a> or via the maintenance tool of the SDK. + <span style=" font-weight:600;">Отсутствуют подходящие комплекты.</span><br/>Добавьте комплект в <a href="buildandrun">настройках</a> или через инструмент обслуживания SDK. Select all kits @@ -32485,7 +33399,72 @@ App ID: %2 - PythonEditor::Internal::PythonProject + Python::Internal::InterpreterAspect + + Manage... + Управление... + + + Interpreter + Интерпретатор + + + + Python::Internal::PyLSConfigureAssistant + + Python Language Server (%1) + Сервер языка Python (%1) + + + Install and set up Python language server (PyLS) for %1 (%2). The language server provides Python specific completion and annotation. + Установка и настройка сервера языка Python (PyLS) для %1 (%2). Языковой сервер обеспечивает дополнение и аннотирование. + + + Install + Установить + + + Found a Python language server for %1 (%2). Set it up for this document? + Найден сервер языка Python для %1 (%2). Использовать его для текущего документа? + + + Setup + Задать + + + Enable Python language server for %1 (%2)? + Включить сервер языка Python для %1 (%2)? + + + Enable + Включить + + + + Python::Internal::PythonLSInstallHelper + + Running "%1 %2" to install Python language server + Выполнение «%1 %2» для установки сервера языка Python + + + The Python language server installation was canceled by %1. + Установка сервера языка Python была отменена %1. + + + user + пользователем + + + time out + по истечению времени + + + Installing the Python language server failed with exit code %1 + Не удалось установить сервер языка Python, код завершения %1 + + + + Python::Internal::PythonProject Unable to open "%1" for reading: %2 Не удалось открыть «%1» для чтения: %2 @@ -32500,18 +33479,49 @@ App ID: %2 - PythonEditor::Internal::PythonRunConfiguration - - Interpreter: - Интерпретатор: - + Python::Internal::PythonRunConfiguration Script: - Сценарии: + Сценарий: Run %1 - Запуск %1 + Выполнить %1 + + + + Python::Internal::PythonSettings + + Name: + Имя: + + + Executable + Программа + + + &Add + &Добавить + + + &Delete + &Удалить + + + &Make Default + &По умолчанию + + + Interpreters + Интерпретаторы + + + Python + Python + + + (Windowed) + (в окне) @@ -32591,9 +33601,20 @@ Copy the path to the source files to the clipboard? Updating syntax definition for '%1' to version %2... Обновление определений синтаксиса для «%1» до версии «%2»... + + + QQmlParser - Frame %1 - Кадр %1 + Syntax error + Синтаксическая ошибка + + + Unexpected token `%1' + Неожиданная лексема «%1» + + + Expected token `%1' + Ожидается лексема «%1» @@ -32758,6 +33779,13 @@ Copy the path to the source files to the clipboard? Внешний процесс аварийно завершился. + + QbsInstallStep + + <b>Qbs:</b> %1 + <b>Qbs:</b> %1 + + QbsProductNode @@ -32815,14 +33843,6 @@ Copy the path to the source files to the clipboard? Configuration name: Название конфигурации: - - Parsing the Qbs project. - Разбор проекта Qbs. - - - Parsing of Qbs project has failed. - Не удалось разобрать проект Qbs. - QbsProjectManager::Internal::QbsBuildConfigurationFactory @@ -33008,9 +34028,6 @@ Copy the path to the source files to the clipboard? Qbs Install Установка с Qbs - - - QbsProjectManager::Internal::QbsInstallStepConfigWidget Install root: Корень установки: @@ -33035,10 +34052,6 @@ Copy the path to the source files to the clipboard? Equivalent command line: Итоговая командная строка: - - <b>Qbs:</b> %1 - <b>Qbs:</b> %1 - QbsProjectManager::Internal::QbsKitAspect @@ -33183,6 +34196,241 @@ Copy the path to the source files to the clipboard? Файлы Qbs + + Qdb + + Flash wizard "%1" failed to start. + Не удалось запустить программатор «%1». + + + Flash wizard executable "%1" not found. + Исполняемый файл программатора «%1» не найден. + + + Flash Boot to Qt Device + Запрограммировать устройство Boot to Qt + + + + Qdb::Internal::DeviceDetector + + Device "%1" %2 + Устройство «%1» %2 + + + Qt Debug Bridge device %1 + Устройство моста отладки Qt %1 + + + Device detection error: %1 + Ошибка определения устройства: %1 + + + + Qdb::Internal::QdbDeployConfiguration + + Deploy to Boot2Qt target + Развёртывание на Boot2Qt + + + + Qdb::Internal::QdbDevice + + Starting command "%1" on device "%2". + Запуск команды «%1» на устройстве «%2». + + + Command failed on device "%1": %2 + Команда завершилась с ошибкой на устройстве «%1»: %2 + + + Command failed on device "%1". + Команда завершилась с ошибкой на устройстве «%1». + + + stdout was: "%1" + stdout был: «%1» + + + stderr was: "%1" + stderr был: «%1» + + + Commands on device "%1" finished successfully. + Команда на устройстве «%1» завершилась успешно. + + + Boot2Qt Device + Устройство Boot2Qt + + + Reboot Device + Перезагрузить устройство + + + Restore Default App + Восстановить приложения по умолчанию + + + WizardPage + + + + Device Settings + Настройки устройства + + + A short, free-text description + Короткое текстовое описание + + + Host name or IP address + Имя узла или IP адрес + + + Device name: + Имя устройства: + + + Device address: + Адрес устройства: + + + Boot2Qt Network Device Setup + Настройка сетевого устройства Boot2Qt + + + + Qdb::Internal::QdbDeviceTracker + + Shutting down device discovery due to unexpected response: %1 + Завершение определения устройств из-за неожиданного ответа: %1 + + + + Qdb::Internal::QdbLinuxDeviceFactory + + Boot2Qt Device + Устройство Boot2Qt + + + + Qdb::Internal::QdbMakeDefaultAppService + + Remote process failed: %1 + Ошибка внешнего процесса: %1 + + + Application set as the default one. + Приложение выбрано по умолчанию. + + + Reset the default application. + Сбросить приложение по умолчанию. + + + + Qdb::Internal::QdbMakeDefaultAppStep + + Set this application to start by default + Установите запуск этого приложения по умолчанию + + + Reset default application + Сбросить приложение по умолчанию + + + + Qdb::Internal::QdbMessageTracker + + Shutting down message reception due to unexpected response: %1 + Завершение приёма сообщения из-за неожиданного ответа: %1 + + + QDB message: %1 + Сообщение QDB: %1 + + + + Qdb::Internal::QdbRunConfiguration + + Full command line: + Полная командная строка: + + + Executable on device: + Программа на устройстве: + + + Remote path not set + Не задан внешний путь + + + Executable on host: + Программа на машине: + + + Run on Boot2Qt Device + Запуск на устройстве Boot2Qt + + + The remote executable must be set in order to run on a Boot2Qt device. + Для запуска на устройстве Boot2Qt внешнего приложения, его необходимо задать. + + + + Qdb::Internal::QdbStopApplicationService + + Could not check and possibly stop running application. + Не удалось проверить и, вероятно, остановить работающее приложение. + + + Checked that there is no running application. + Проверено, работающего приложения нет. + + + Stopped the running application. + Работающее приложение остановлено. + + + + Qdb::Internal::QdbStopApplicationStep + + Stop already running application + Остановка работающего приложения + + + + Qdb::Internal::QdbWatcher + + Unexpected QLocalSocket error: %1 + Неожиданная ошибка QLocalSocket: %1 + + + Could not connect to QDB host server even after trying to start it. + Не удалось подключиться к серверу QDB даже после попытки его запуска. + + + Invalid JSON response received from QDB server: %1 + Получен неверный ответ JSON от сервера QDB: %1 + + + Could not find QDB host server executable. You can set the location with environment variable %1. + Не удалось найти программу сервера QDB. Необходимо задать ее размещением в переменной среды %1. + + + QDB host server started. + Сервер QDB запущен. + + + Could not start QDB host server in %1 + Не удалось запустить сервер QDB в %1 + + + Starting QDB host server. + Запуска сервера QDB. + + QmakePriFile @@ -33442,13 +34690,6 @@ Please update your kit (%3) or choose a mkspec for qmake that matches your targe Невозможно создать серверный сокет: %1 - - QmakeProjectManager::Internal::DesktopQmakeRunConfiguration - - Qt Run Configuration - Конфигурация выполнения Qt - - QmakeProjectManager::Internal::DetailsPage @@ -33680,21 +34921,6 @@ Neither the path to the library nor the path to its includes is added to the .pr Тип - - QmakeProjectManager::Internal::ModulesPage - - Select Required Modules - Выбор необходимых модулей - - - Select the modules you want to include in your project. The recommended modules for this project are selected by default. - Выберите модули, которые хотите включить в проект. Рекомендуемые для этого проекта модули уже выбраны по умолчанию. - - - Modules - Модули - - QmakeProjectManager::Internal::PluginGenerator @@ -33726,7 +34952,7 @@ Neither the path to the library nor the path to its includes is added to the .pr Effective qmake call: - Параметры вызова qmake: + Команда запуска qmake: Use QML compiler: @@ -33736,6 +34962,10 @@ Neither the path to the library nor the path to its includes is added to the .pr Generate separate debug info: Отделять отладочную информацию: + + ABIs: + ABI: + QmakeProjectManager::Internal::QmakeKitAspect @@ -34079,10 +35309,6 @@ Neither the path to the library nor the path to its includes is added to the .pr The mkspec has changed. Изменился mkspec. - - Parsing the .pro file - Разбор файла .pro - QmakeProjectManager::QmakeBuildConfigurationFactory @@ -34304,6 +35530,17 @@ Neither the path to the library nor the path to its includes is added to the .pr Добавить вкладку: + + QmlDesigner::AlignDistribute + + Cannot distribute perfectly + Полное распределение невозможно + + + These objects cannot be distributed to equal pixel values. Do you want to distribute to the nearest possible values? + Невозможно распределить эти объекты с одинаковым пиксельным значением. Распределить с ближайшими возможными значениями? + + QmlDesigner::BackgroundAction @@ -34311,6 +35548,28 @@ Neither the path to the library nor the path to its includes is added to the .pr Задание цвета холста. + + QmlDesigner::BindingEditorDialog + + Binding Editor + Редактор привязок + + + + QmlDesigner::BindingEditorWidget + + Trigger Completion + Выполнить дополнение + + + Meta+Space + Meta+Space + + + Ctrl+Space + Ctrl+Space + + QmlDesigner::ColorTool @@ -34916,6 +36175,10 @@ Neither the path to the library nor the path to its includes is added to the .pr Должен быть какой-то стандартный термин Включить редактор по временной шкале + + Always open ui.qml files in Design mode + Всегда открывать файлы ui.qml в режиме дизайна + QmlDesigner::InvalidArgumentException @@ -34924,6 +36187,114 @@ Neither the path to the library nor the path to its includes is added to the .pr Не удалось создать элемент типа %1 + + QmlDesigner::ItemLibraryAssetImportDialog + + Asset Import + Импорт ресурсов + + + Import Options + Импорт настроек + + + Import + Импортировать + + + Select import options and press "Import" to import the following files: + Задайте настройки и нажмите «Импортировать», чтобы импортировать следующие файлы: + + + No options available for this type. + Для данного типа параметров нет. + + + %1 options + Настройки %1 + + + Cancel + Отмена + + + Close + Закрыть + + + Import interrupted. + Импорт прерван. + + + Import done. + Импорт завершён. + + + Canceling import. + Отмена импорта. + + + + QmlDesigner::ItemLibraryAssetImporter + + Could not create a temporary directory for import. + Не удалось создать временный каталог для импорта. + + + Updating data model. + Обновление модели данных. + + + Importing 3D assets requires building against Qt Quick 3D module. + Для импорта ресурсов 3D необходима сборка с модулем Qt Quick 3D. + + + Parsing files. + Разбор файлов. + + + Parsing 3D Model + Разбор трёхмерной модели + + + Skipped import of existing asset: "%1" + Пропущен импорт существующего ресурса «%1» + + + Could not access temporary asset directory: "%1" + Не удалось получить доступ к временному каталогу ресурсов: «%1» + + + Generating 3D assets for: "%1" + Создание трёхмерных ресурсов для: «%1» + + + Failed to import 3D asset with error: %1 + Не удалось импортировать трёхмерный ресурс: %1 + + + Failed to create qmldir file for asset: "%1" + Не удалось создать файл qmldir для ресурса: «%1» + + + Removing old overwritten assets. + Удаление старых ресурсов. + + + Copying asset files. + Копирование файлов ресурсов. + + + Overwrite Existing Asset? + Перезапись существующих ресурсов + + + Asset already exists. Overwrite? +"%1" + Ресурс уже существует. Перезаписать? +«%1» + + QmlDesigner::ItemLibraryResourceView @@ -34978,6 +36349,10 @@ Neither the path to the library nor the path to its includes is added to the .pr Add new resources to project. Добавление новых ресурсов в проект. + + 3D Assets + Ресурсы 3D + Add import %1 Добавить импорт %1 @@ -35124,6 +36499,21 @@ This is independent of the visibility property in QML. Отмена + + QmlDesigner::Option3DAction + + 2D + 2D + + + 2D/3D + 2D/3D + + + Enable/Disable 3D edit mode. + Включение/выключение редактирования в трёхмерном режиме. + + QmlDesigner::PathItem @@ -35269,8 +36659,12 @@ This is independent of the visibility property in QML. Значение - Change %1 - Изменение %1 + Frame + Рамка + + + Edit Keyframe + Изменить ключевой кадр @@ -35433,6 +36827,17 @@ This is independent of the visibility property in QML. StatesEditorWidget: не удалось создать %1. Скорее всего не установлен QtQuick.Controls 1. + + QmlDesigner::SubComponentManager + + My QML Components + Мои компоненты QML + + + My Quick3D Components + Мои компоненты Quick3D + + QmlDesigner::SwitchLanguageComboboxAction @@ -35623,8 +37028,8 @@ This is independent of the visibility property in QML. Изменить переходную кривую... - Edit Value for Keyframe... - Изменить значение для ключевого кадра... + Edit Keyframe... + Изменить ключевой кадр... Remove Property @@ -35703,6 +37108,10 @@ This is independent of the visibility property in QML. Timeline Settings Настройки временной шкалы + + Animation Curve Editor + Редактор анимационных кривых + To Start В начало @@ -35733,8 +37142,8 @@ This is independent of the visibility property in QML. Автоматический ключевой кадр - Curve Picker - Захват кривой + Easing Curve Editor + Редактор переходных кривых Curve Editor @@ -36034,8 +37443,12 @@ This is independent of the visibility property in QML. QmlDesignerTimeline - Frame %1 - Кадр %1 + Playhead frame %1 + Текущий кадр %1 + + + Keyframe %1 + Ключевой кадр %1 @@ -36750,12 +38163,16 @@ For more information, see the "Checking Code Syntax" documentation.Ожидается объектный литерал после запятой. - Expected object literal to contain only 'string: number' elements. - Ожидается, чтобы объектный литерал содержал только элементы «строка: число». + Expected expression after colon. + Требуется выражением после двоеточия. - Enum should not contain getter and setters, but only 'string: number' elements. - Перечисление не должно содержать ни геттеров, ни сеттеров, а только элементы «строка: число». + Expected strings as enum keys. + Требуются строки в качестве ключей перечисления. + + + Expected either array or object literal as enum definition. + В качестве определения перечисления требуется или массив, или объектный литерал. @@ -36846,17 +38263,6 @@ For more information, see the "Checking Code Syntax" documentation. - - QmlJSEditor::Internal::QmlJSEditorDocumentPrivate - - This file should only be edited in <b>Design</b> mode. - Этот файл можно редактировать только в режиме <b>дизайна</b>. - - - Switch Mode - Переключить режим - - QmlJSEditor::Internal::QmlJSEditorPlugin @@ -36901,29 +38307,6 @@ For more information, see the "Checking Code Syntax" documentation.Анализ QML - - QmlJSEditor::Internal::QmlJSEditorWidget - - Show Qt Quick ToolBar - Показать панель Qt Quick - - - Code Model Not Available - Модель кода недоступна - - - Code model not available. - Модель кода недоступна. - - - Code Model of %1 - Модель кода %1 - - - Refactoring - Рефакторинг - - QmlJSEditor::Internal::QmlJSOutlineTreeView @@ -36977,6 +38360,40 @@ For more information, see the "Checking Code Syntax" documentation.Редактирование QML/JS + + QmlJSEditor::QmlJSEditorDocument + + This file should only be edited in <b>Design</b> mode. + Этот файл можно редактировать только в режиме <b>дизайна</b>. + + + Switch Mode + Переключить режим + + + + QmlJSEditor::QmlJSEditorWidget + + Show Qt Quick ToolBar + Показать панель Qt Quick + + + Code Model Not Available + Модель кода недоступна + + + Code model not available. + Модель кода недоступна. + + + Code Model of %1 + Модель кода %1 + + + Refactoring + Рефакторинг + + QmlJSEditor::QuickFix @@ -37152,6 +38569,14 @@ the QML editor know about a likely URI. Module import requires a version При импорте модуля требуется версия + + Module import requires a minor version (missing dot) + При импорте модуля требуется минорная версия (отсутствует точка) + + + Module import requires a minor version (missing number) + При импорте модуля требуется минорная версия (отсутствует число) + File import requires a qualifier При импорте файла требуется спецификатор @@ -37164,14 +38589,6 @@ the QML editor know about a likely URI. Invalid import qualifier Неверный спецификатор импорта - - Unexpected token `%1' - Неожиданная лексема «%1» - - - Expected token `%1' - Ожидается лексема «%1» - QmlPreview::Internal::QmlPreviewPlugin @@ -38424,11 +39841,11 @@ Saving failed. Closing the dialog will stop the deployment. Are you sure you want to do this? - Закрытие диалога остановит установку. Закрыть? + Закрытие диалога остановит развёртывание. Закрыть? Please input a remote directory to deploy to. - Введите внешний каталог для установки. + Введите внешний каталог для развёртывания. Connection failed: %1 @@ -38438,7 +39855,7 @@ Saving failed. The remote directory "%1" already exists. Deploying to that directory will remove any files already present. Are you sure you want to continue? - Внешний каталог «%1» уже существует. Установка в него удалит все существующие в нём файлы. + Внешний каталог «%1» уже существует. Развёртывание в него удалит все существующие в нём файлы. Продолжить? @@ -38452,7 +39869,7 @@ Are you sure you want to continue? Deploy Qt to QNX Device - Установить Qt на устройство QNX + Развёртывание Qt на устройство QNX @@ -38461,9 +39878,13 @@ Are you sure you want to continue? QNX QNX + + QNX Device + Устройство QNX + Deploy Qt libraries... - Установить библиотеки Qt... + Развернуть библиотеки Qt... @@ -38514,10 +39935,6 @@ Are you sure you want to continue? Qnx::Internal::QnxDeviceWizard - - QNX Device - Устройство QNX - New QNX Device Configuration Setup Настройка новой конфигурации устройства QNX @@ -38551,6 +39968,18 @@ Are you sure you want to continue? Qnx::Internal::QnxRunConfiguration + + Executable on device: + Программа на устройстве: + + + Remote path not set + Не задан внешний путь + + + Executable on host: + Программа на машине: + Path to Qt libraries on device Путь к библиотекам Qt на устройстве @@ -38656,10 +40085,6 @@ Are you sure you want to continue? QrcEditor - - Add - Добавить - Remove Удалить @@ -38684,6 +40109,14 @@ Are you sure you want to continue? Remove Missing Files Удалить отсутствующие файлы + + Add Prefix + Добавить префикс + + + Add Files + Добавить файлы + QtCreatorSearchHandle @@ -38727,105 +40160,6 @@ For more details, see /etc/sysctl.d/10-ptrace.conf - - QtModulesInfo - - Core non-GUI classes used by other modules - Основные неграфические классы, используемые другими модулями - - - Base classes for graphical user interface (GUI) components. (Qt 4: Includes widgets. Qt 5: Includes OpenGL.) - Базовые классы для компонентов графического интерфейса пользователя (GUI). (Qt 4: включает виджеты. Qt 5: включает OpenGL.) - - - Classes to extend Qt GUI with C++ widgets (Qt 5) - Классы для улучшения Qt GUI виджетами C++ (Qt5) - - - Qt Quick 1 classes - Классы Qt Quick 1 - - - Classes for QML and JavaScript languages (Qt 5) - Классы для языков QML и JavaScript (Qt 5) - - - A declarative framework for building highly dynamic applications with custom user interfaces - Декларативная среда для создания динамичных приложений с особым интерфейсом - - - Classes for network programming - Классы для работы с сетью - - - OpenGL support classes - Классы для работы с OpenGL - - - Print support classes (Qt 5) - Классы поддержки печати (Qt 5) - - - Classes for database integration using SQL - Классы интеграции с базами данных SQL - - - Classes for evaluating Qt Scripts - Классы для обработки сценариев Qt - - - Additional Qt Script components - Дополнительные компоненты Qt Script - - - Classes for displaying the contents of SVG files - Классы для отображения содержимого файлов SVG - - - Classes for displaying and editing Web content using Chromium backend - Классы для отображения и изменения Web-содержимого с использованием движка Chromium - - - WebEngine and QWidget-based classes using Chromium backend - WebEngine и классы на базе QWidget, использующие движок Chromium - - - Classes for displaying and editing Web content - Классы для отображения и правки веб-страниц - - - WebKit1 and QWidget-based classes from Qt 4 (Qt 5) - Классы на базе WebKit1 и QWidget из Qt 4 (Qt 5) - - - Classes for handling XML - Классы для работы с XML - - - An XQuery/XPath engine for XML and custom data models - Движок XQuery/XPath для XML и пользовательских моделей данных - - - Multimedia framework classes (Qt 4 only) - Классы мультимедийной системы (только Qt 4) - - - Classes that ease porting from Qt 3 to Qt 4 (Qt 4 only) - Классы для упрощённой миграции с Qt 3 на Qt 4 (только Qt 4) - - - Classes for low-level multimedia functionality - Классы для низкоуровневой работы с мультимедиа-содержимым - - - Tool classes for unit testing - Служебные классы для юнит-тестирования - - - Classes for Inter-Process Communication using the D-Bus - Классы для межпроцессного взаимодействия с использованием D-Bus - - QtObjectPane @@ -39084,6 +40418,25 @@ For more details, see /etc/sysctl.d/10-ptrace.conf Журнал сборки помощника отладчика + + QtSupport::Internal::TranslationWizardPage + + If you plan to provide translations for your project's user interface via the Qt Linguist tool, please select a language here. A corresponding translation (.ts) file will be generated for you. + Укажите здесь язык, если планируете обеспечить проект переводами интерфейса утилитой Qt Linguist. Будет создан соответствующий файл перевода (.ts). + + + <none> + <нет> + + + Language: + Язык: + + + Translation file: + Файл перевода: + + QtSupport::ProMessageHandler @@ -39303,6 +40656,11 @@ For more details, see /etc/sysctl.d/10-ptrace.conf Qt Version is used for embedded Linux development Встраиваемый Linux + + Boot2Qt + Qt version is used for Boot2Qt development + Boot2Qt + QuickFix::ExtractFunction @@ -39372,6 +40730,21 @@ For more details, see /etc/sysctl.d/10-ptrace.conf Определяет, получает ли переключатель фокус при нажатии или нет. + + RangeDetails + + Edit note + Изменить заметку + + + View event information on mouseover. + Показывать информацию о событии при наведении курсора. + + + Close + Закрыть + + RectangleSpecifics @@ -39402,14 +40775,14 @@ For more details, see /etc/sysctl.d/10-ptrace.conf RemoteLinux Deploy to Remote Linux Host - Установить на удалённую машину с Linux + Развернуть на удалённую машину с Linux RemoteLinux::AbstractRemoteLinuxDeployService No deployment action necessary. Skipping. - Нет необходимости в установке. Пропущено. + Нет необходимости в развёртывании. Пропущено. No device configuration set. @@ -39440,19 +40813,19 @@ For more details, see /etc/sysctl.d/10-ptrace.conf RemoteLinux::AbstractRemoteLinuxDeployStep Cannot deploy: %1 - Невозможно установить: %1 + Невозможно развернуть: %1 User requests deployment to stop; cleaning up. - Пользователь потребовал остановить установку; очистка. + Пользователь потребовал остановить развёртывание; очистка. Deploy step failed. - Ошибка этапа установки. + Ошибка этапа развёртывания. Deploy step finished. - Этап установки завершён. + Этап развёртывания завершён. @@ -39485,7 +40858,7 @@ For more details, see /etc/sysctl.d/10-ptrace.conf RemoteLinux::GenericDirectUploadService Failed to retrieve remote timestamp for file "%1". Incremental deployment will not work. Error message was: %2 - Не удалось получить временную метку внешнего файла «%1». Инкрементальная установка не будет работать. Ошибка: %2 + Не удалось получить временную метку внешнего файла «%1». Инкрементальное развёртывание не будет работать. Ошибка: %2 Unexpected stat output for remote file "%1": %2 @@ -39493,7 +40866,7 @@ For more details, see /etc/sysctl.d/10-ptrace.conf All files successfully deployed. - Все файлы успешно установлены. + Все файлы успешно развёрнуты. No files need to be uploaded. @@ -39520,7 +40893,7 @@ For more details, see /etc/sysctl.d/10-ptrace.conf RemoteLinux::GenericDirectUploadStep Incremental deployment - Инкрементальная установка + Инкрементальное развёртывание Ignore missing files @@ -39620,10 +40993,6 @@ For more details, see /etc/sysctl.d/10-ptrace.conf New Generic Linux Device Configuration Setup Настройка новой конфигурации устройства на базе Linux - - Generic Linux Device - Обычное Linux-устройство - RemoteLinux::GenericLinuxDeviceConfigurationWizardFinalPage @@ -39718,10 +41087,6 @@ If you do not have a private key yet, you can also create one here. Сервис SFTP доступен. - - sftp finished unexpectedly. - sftp неожиданно завершился. - Error setting up SFTP connection: %1 @@ -39753,13 +41118,13 @@ If you do not have a private key yet, you can also create one here. SFTP will be used for deployment, because rsync is not available. - Для установки будет использоваться SFTP, так как rsync недоступен. + Для развёртывания будет использоваться SFTP, так как rsync недоступен. Deployment to this device will not work out of the box. - Установка на это устройство не работает «из коробки». + Развёртывание на это устройство не работает «из коробки». @@ -39798,6 +41163,10 @@ If you do not have a private key yet, you can also create one here. Generic Linux Обычный Linux + + Generic Linux Device + Обычное Linux-устройство + Deploy Public Key... Установить ключ... @@ -39822,50 +41191,6 @@ If you do not have a private key yet, you can also create one here. Обычное Linux-устройство - - RemoteLinux::Internal::MakeInstallStep - - Command: - Команда: - - - Install root: - Корень установки: - - - Clean install root first - Сначала очищать корень установки - - - Full command line: - Полная командная строка: - - - Install into temporary host directory - что-то сомневаюсь, что речь о том, чтобы установить в каталог временного хоста - Установить во временный каталог хоста - - - You must provide an install root. - Необходимо указать корень установки. - - - The install root "%1" could not be cleaned. - Не удалось очистить корень установки «%1». - - - The install root "%1" could not be created. - Не удалось создать корень установки «%1». - - - The "make install" step should probably not be last in the list of deploy steps. Consider moving it up. - Шаг «make install», обычно, должен быть не последним в списке шагов развёртывания. Возможно, стоит его поднять. - - - You need to add an install statement to your CMakeLists.txt file for deployment to work. - Для работы развёртывания необходимо добавить оператор установки в файл CMakeLists.txt. - - RemoteLinux::Internal::PackageUploader @@ -39932,6 +41257,21 @@ If you do not have a private key yet, you can also create one here. Содержимое внешнего stderr: «%1» + + RemoteLinux::Internal::RemoteLinuxRunConfiguration + + Executable on device: + Программа на устройстве: + + + Remote path not set + Не задан внешний путь + + + Executable on host: + Программа на машине: + + RemoteLinux::Internal::RsyncDeployService @@ -39958,6 +41298,49 @@ If you do not have a private key yet, you can also create one here. %1 (по умолчанию) + + RemoteLinux::MakeInstallStep + + Command: + Команда: + + + Install root: + Корень установки: + + + Clean install root first + Сначала очищать корень установки + + + Full command line: + Полная командная строка: + + + Install into temporary host directory + Установить во временный каталог хоста + + + You must provide an install root. + Необходимо указать корень установки. + + + The install root "%1" could not be cleaned. + Не удалось очистить корень установки «%1». + + + The install root "%1" could not be created. + Не удалось создать корень установки «%1». + + + The "make install" step should probably not be last in the list of deploy steps. Consider moving it up. + Шаг «make install», обычно, должен быть не последним в списке шагов развёртывания. Возможно, стоит его поднять. + + + You need to add an install statement to your CMakeLists.txt file for deployment to work. + Для работы развёртывания необходимо добавить оператор установки в файл CMakeLists.txt. + + RemoteLinux::PublicKeyDeploymentDialog @@ -40125,21 +41508,6 @@ If you do not have a private key yet, you can also create one here. Уничтожение текущего экземпляра приложения - - RemoteLinux::RemoteLinuxRunConfiguration - - Executable on device: - Программа на устройстве: - - - Remote path not set - Не задан внешний путь - - - Executable on host: - Программа на машине: - - RemoteLinux::RemoteLinuxSignalOperation @@ -40279,14 +41647,6 @@ If you do not have a private key yet, you can also create one here. ResourceEditor::Internal::QrcEditor - - Add Files - Добавить файлы - - - Add Prefix - Добавить префикс - Invalid file location Неверное размещение файла @@ -41434,6 +42794,10 @@ Row: %4, Column: %5 Duration Продолжительность + + Close + Закрыть + SerialTerminal::Internal::SerialControl @@ -41992,13 +43356,6 @@ Row: %4, Column: %5 Фиксация Subversion - - Syntax highlighting - - None - Нет - - SyntaxHighlightingCLI @@ -42127,18 +43484,6 @@ Row: %4, Column: %5 Configure Project Настроить проект - - The project <b>%1</b> is not yet configured.<br/>%2 cannot parse the project, because no kit has been set up. - Проект <b>%1</b> ещё не настроен.<br/>%2 не может обработать проект, так как комплект не задан. - - - The project <b>%1</b> is not yet configured.<br/>%2 uses the kit <b>%3</b> to parse the project. - Проект <b>%1</b> ещё не настроен.<br/>Для обработки проекта %2 использует комплект <b>%3</b>. - - - The project <b>%1</b> is not yet configured.<br/>%2 uses the <b>invalid</b> kit <b>%3</b> to parse the project. - Проект <b>%1</b> ещё не настроен.<br/>Для обработки проекта %2 использует <b>неверный</b> комплект <b>%3</b>. - Kit is unsuited for project Комплект не подходит проекту @@ -42202,6 +43547,10 @@ Row: %4, Column: %5 Warning Предупреждение + + Build Issue + Проблема сборки + TaskList::Internal::StopMonitoringHandler @@ -42400,12 +43749,12 @@ Row: %4, Column: %5 TextEditor::BaseTextEditor - A highlight definition was not found for this file. Would you like to update highlight definition files? - Не удалось найти определения подсветки для этого файла. Обновить файлы определений подсветки? + A highlight definition was not found for this file. Would you like to download additional highlight definition files? + Не удалось найти определения подсветки для этого файла. Загрузить дополнительные файлы определений подсветки? - Update Definitions - Обновить определения + Download Definitions + Загрузить определения More than one highlight definition was found for this file. Which one should be used to highlight this file? @@ -42434,6 +43783,14 @@ Row: %4, Column: %5 Displays context-sensitive help or type information on Shift+Mouseover. Отображать контекстную справку или информацию о типе при наведении курсора мыши с зажатой клавишей Shift. + + Unix (LF) + Unix (LF) + + + Windows (CRLF) + Windows (CRLF) + TextEditor::CodeStyleEditor @@ -42599,8 +43956,8 @@ Excluding: %3 Общая подсветка - Update finished - Обновление завершено + Download finished + Загрузка завершена @@ -43329,10 +44686,6 @@ In addition, Shift+Enter inserts an escape character at the cursor position and <html><head/><body> <p>Определения подсветки предоставляются движком <a href="https://api.kde.org/frameworks/syntax-highlighting/html/index.html">KSyntaxHighlighting</a>.</p></body></html> - - Update Definitions - Обновить определения - User Highlight Definition Files Пользовательские файлы определений подсветки @@ -43345,6 +44698,22 @@ In addition, Shift+Enter inserts an escape character at the cursor position and Reset Remembered Definitions Сбросить привязки определений + + Download missing and update existing syntax definition files. + Загрузить отсутствующие и обновить существующие файлы определения синтаксиса. + + + Download Definitions + Загрузить + + + Reload externally modified definition files. + Перезагрузить из-вне изменённые файлы определений. + + + Reload Definitions + Перезагрузить + TextEditor::Internal::LineNumberFilter @@ -44968,8 +46337,8 @@ The trace data is lost. Изменить переходную кривую... - Edit Value for Keyframe... - Изменить значение для ключевого кадра... + Edit Keyframe... + Изменить ключевой кадр... @@ -45221,12 +46590,16 @@ The trace data is lost. Проверка обновлений - Qt Updater - Программа обновления Qt + New updates are available. Start the update? + Доступны новые обновления. Начать обновление? - New updates are available. Do you want to start the update? - Доступны новые обновления. Обновить? + Start Update + Начать обновление + + + Available updates: + Доступны обновления: No updates found. @@ -45429,19 +46802,21 @@ The trace data is lost. Utils::EnvironmentDialog + + Edit Environment + Изменение среды + Enter one environment variable per line. To set or change a variable, use VARIABLE=VALUE. Existing variables can be referenced in a VALUE with ${OTHER}. -To clear a variable, put its name on a line with nothing else on it. +To clear a variable, put its name on a line with nothing else on it. +To disable a variable, prefix the line with "#" Вводите по одной переменной среды на строку. Для задания или изменения переменной используйте VARIABLE=VALUE. В значениях можно обращаться к другим переменным через ${OTHER}. -Для очистки переменной в строке укажите только её имя и больше ничего. - - - Edit Environment - Изменение среды +Для очистки переменной в строке укажите только её имя и больше ничего. +Для отключения переменной, закомментируйте строку символом «#» @@ -45457,28 +46832,10 @@ To clear a variable, put its name on a line with nothing else on it. Utils::EnvironmentModel - - <UNSET> - <не задано> - - - Variable - Переменная - - - Value - Значение - <VARIABLE> - Name when inserting a new variable <переменная> - - <VALUE> - Value when inserting a new variable - <значение> - Utils::FancyLineEdit @@ -45698,6 +47055,31 @@ To clear a variable, put its name on a line with nothing else on it. Доступ к переменным среды. + + Utils::NameValueModel + + <UNSET> + <не задано> + + + Variable + Переменная + + + Value + Значение + + + <VARIABLE> + Name when inserting a new variable + <переменная> + + + <VALUE> + Value when inserting a new variable + <значение> + + Utils::NewClassWidget @@ -45982,8 +47364,8 @@ To clear a variable, put its name on a line with nothing else on it. Подходящие настройки не найдены - <p>No valid settings file could be found.</p><p>All settings files found in directory "%1" were unsuitable for the current version of %2.</p> - <p>Не удалось найти корректный файл настроек.</p><p>Все найденные в каталоге «%1» файлы настроек не подходят для текущей версии %2.</p> + <p>No valid settings file could be found.</p><p>All settings files found in directory "%1" were unsuitable for the current version of %2, for instance because they were written by an incompatible version of %2, or because a different settings path was used.</p> + <p>Не удалось найти корректный файл настроек.</p><p>Все найденные в каталоге «%1» файлы настроек не подходят для текущей версии %2, например, потому что они могли быть написаны для несовместимой версии %2, или по причине использования другого пути к настройкам.</p> <p>No valid settings file could be found.</p><p>All settings files found in directory "%1" were either too new or too old to be read.</p> @@ -47825,11 +49207,62 @@ What do you want to do? - Welcome::Internal::IntroductionWidget + WebAssembly::Internal::EmrunRunConfigurationFactory - Take a UI Tour - Знакомство с интерфейсом пользователя + Effective emrun call: + Команда запуска emrun: + + Launch with emrun + Запустить через emrun + + + + WebAssembly::Internal::WebAssemblyDevice + + Web Browser + Браузер + + + + WebAssembly::Internal::WebAssemblyDeviceFactory + + WebAssembly Runtime + Среда WebAssembly + + + + WebAssembly::Internal::WebAssemblyToolChainFactory + + Emscripten Compiler + Компилятор Emscripten + + + WebAssembly + WebAssembly + + + + WebAssembly::Internal::WebBrowserSelectionAspect + + Web browser + Браузер + + + Web browser: + Браузер: + + + + WebAssemblyPlugin + + WebAssembly + Qt Version is meant for WebAssembly + WebAssembly + + + + Welcome::Internal::IntroductionWidget Would you like to take a quick UI tour? This tour highlights important user interface elements and shows how they are used. To take the tour later, select Help > UI Tour. Желаете познакомиться с интерфейсом программы? Всего за минуту вы узнаете, где и как используются наиболее важные элементы интерфейса пользователя. Ознакомиться можно и позже, для этого нужно зайти в Справка > Знакомство. @@ -48069,11 +49502,11 @@ What do you want to do? Deploy to Windows Phone - Установка на Windows Phone + Развёртывание на Windows Phone Deploy to Windows Phone Emulator - Установка на эмулятор Windows Phone + Развёртывание на эмулятор Windows Phone @@ -48149,7 +49582,7 @@ What do you want to do? No executable to deploy found in %1. - В %1 не обнаружен исполняемый файл для установки. + В %1 не обнаружен исполняемый файл для развёртывания. Cannot find windeployqt.exe in "%1". From 7e8e6bcba17fcae3428f2052e237e3d4dfefd4ed Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Wed, 20 Nov 2019 15:50:42 +0100 Subject: [PATCH 56/59] Android/Qmake: Execute clean on architecture changes Change-Id: Id0e1465e7ec7f6675cbf9d986352e811e6d31bec Reviewed-by: BogDan Vatra Reviewed-by: Alessandro Portale --- src/plugins/qmakeprojectmanager/qmakestep.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmakeprojectmanager/qmakestep.cpp b/src/plugins/qmakeprojectmanager/qmakestep.cpp index 671a7ee3751..dc184bf1379 100644 --- a/src/plugins/qmakeprojectmanager/qmakestep.cpp +++ b/src/plugins/qmakeprojectmanager/qmakestep.cpp @@ -600,7 +600,17 @@ QMakeStepConfigWidget::QMakeStepConfigWidget(QMakeStep *step) connect(step->qmakeBuildConfiguration(), &QmakeBuildConfiguration::qmakeBuildConfigurationChanged, this, &QMakeStepConfigWidget::qmakeBuildConfigChanged); connect(step->target(), &Target::kitChanged, this, &QMakeStepConfigWidget::qtVersionChanged); - connect(m_ui->abisListWidget, &QListWidget::itemChanged, this, &QMakeStepConfigWidget::abisChanged); + connect(m_ui->abisListWidget, &QListWidget::itemChanged, this, [this]{ + abisChanged(); + QmakeBuildConfiguration *bc = m_step->qmakeBuildConfiguration(); + if (!bc) + return; + + QList stepLists; + const Core::Id clean = ProjectExplorer::Constants::BUILDSTEPS_CLEAN; + stepLists << bc->stepList(clean); + BuildManager::buildLists(stepLists, {ProjectExplorerPlugin::displayNameForStepId(clean)}); + }); auto chooser = new Core::VariableChooser(m_ui->qmakeAdditonalArgumentsLineEdit); chooser->addMacroExpanderProvider([step] { return step->macroExpander(); }); chooser->addSupportedWidget(m_ui->qmakeAdditonalArgumentsLineEdit); From a646d0af261cadbfd5d97c3a188e6b5facf86f25 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Thu, 21 Nov 2019 13:14:21 +0100 Subject: [PATCH 57/59] Documentation: Add documentation how to build Qt Creator with CMake Change-Id: I36617ce09301165f2e18a7524a18283264957ac6 Reviewed-by: Leena Miettinen --- README.md | 50 +++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 45 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 9ebfb460a33..c96302bf474 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,7 @@ Prerequisites: * ActiveState Active Perl * MinGW with g++ 5.3 or Visual Studio 2017 or later * jom + * Ninja (optional, needed for CMake) * Python 3.5 or later (optional, needed for the python enabled debug helper) * On Mac OS X: latest Xcode * On Linux: g++ 5.3 or later @@ -38,7 +39,7 @@ Prerequisites: Clang PCH Manager and Clang Refactoring plugins, see the section "Get LLVM/Clang for the Clang Code Model". The LLVM C++ API provides no compatibility garantee, so if later versions don't compile we don't support that version.) -* CMake (only for manual builds of LLVM/Clang) +* CMake (for manual builds of LLVM/Clang, and Qt Creator itself) * Qbs 1.7.x (optional, sources also contain Qbs itself) The installed toolchains have to match the one Qt was compiled with. @@ -264,13 +265,24 @@ http://llvm.org/docs/GettingStarted.html#git-mirror: For Linux/macOS: - cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DCMAKE_INSTALL_PREFIX= ../llvm-project/llvm - make install + cmake \ + -D CMAKE_BUILD_TYPE=Release \ + -D LLVM_ENABLE_RTTI=ON \ + -D LLVM_ENABLE_PROJECTS="clang;clang-tools-extra" \ + -D CMAKE_INSTALL_PREFIX= \ + ../llvm-project/llvm + cmake --build . --target install For Windows: - cmake -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=ON -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra" -DCMAKE_INSTALL_PREFIX= ..\llvm-project\llvm - jom install + cmake ^ + -G "NMake Makefiles JOM" ^ + -D CMAKE_BUILD_TYPE=Release ^ + -D LLVM_ENABLE_RTTI=ON ^ + -D LLVM_ENABLE_PROJECTS="clang;clang-tools-extra" ^ + -D CMAKE_INSTALL_PREFIX= ^ + ..\llvm-project\llvm + cmake --build . --target install ### Clang-Format @@ -282,6 +294,34 @@ While the plugin builds without it, it will be disabled on start with an error m Note that the plugin is disabled by default. +### Building Qt Creator with CMake + +Qt Creator can also be built with CMake. The main Qt Creator dependencies, Qt and LLVM/Clang, both +offer CMake find packages, which reduce the steps of configuring Qt Creator to a minimum. + + Configure and build Qt Creator: + + mkdir build + cd build + + For Linux/macOS: + + cmake \ + -G Ninja \ + -D CMAKE_BUILD_TYPE=Release \ + -D CMAKE_PREFIX_PATH=~/Qt/5.12.5/gcc_64;~/llvm \ + ../qt-creator + cmake --build . + + For Windows: + + cmake ^ + -G Ninja ^ + -D CMAKE_BUILD_TYPE=Release ^ + -D CMAKE_PREFIX_PATH=c:\Qt\5.12.5\msvc2017_64;c:\llvm ^ + ..\qt-creator + cmake --build . + ## Third-party Components Qt Creator includes the following third-party components, From b6ed781c2838b6733c85950f5e06d099b7c68eb6 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Thu, 21 Nov 2019 14:19:19 +0100 Subject: [PATCH 58/59] ClangTools: Simplify clazy test ...in order to not run into parse errors in qstring.h involving * C++17 * >= Qt 5.14 * stdlibc++ of gcc 5.3/5.4 Change-Id: I8c06f90a88a4dd18503a81b68433604eb3bc9556 Reviewed-by: Cristian Adam Reviewed-by: Christian Stenger --- .../clangtools/clangtoolsunittests.cpp | 2 +- .../clangtidy_clazy/clazy_example.cpp | 20 ++++++------------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/plugins/clangtools/clangtoolsunittests.cpp b/src/plugins/clangtools/clangtoolsunittests.cpp index 609d666ed54..cd20781c172 100644 --- a/src/plugins/clangtools/clangtoolsunittests.cpp +++ b/src/plugins/clangtools/clangtoolsunittests.cpp @@ -159,7 +159,7 @@ void ClangToolsUnitTests::testProject_data() // Test that tidy and clazy diagnostics are emitted for the same project. addTestRow("clangtidy_clazy/clangtidy_clazy.pro", 1 /*tidy*/ + 1 /*clazy*/, - configFor("misc-unconventional-assign-operator", "base-class-event")); + configFor("misc-unconventional-assign-operator", "qgetenv")); } void ClangToolsUnitTests::addTestRow(const QByteArray &relativeFilePath, diff --git a/src/plugins/clangtools/unit-tests/clangtidy_clazy/clazy_example.cpp b/src/plugins/clangtools/unit-tests/clangtidy_clazy/clazy_example.cpp index 5cd980d24c4..c692e5e697c 100644 --- a/src/plugins/clangtools/unit-tests/clangtidy_clazy/clazy_example.cpp +++ b/src/plugins/clangtools/unit-tests/clangtidy_clazy/clazy_example.cpp @@ -23,19 +23,11 @@ ** ****************************************************************************/ -#include +#include +#include -// -Wclazy-ctor-missing-parent-argument -class TestObject : public QObject +void test() { - Q_OBJECT - -public: - TestObject(); - - bool event(QEvent *) override - { - // -Wclazy-base-class-event - return false; - } -}; + // -Wclazy-qgetenv + qgetenv("Foo").isEmpty(); +} From e53e0a808b5d0075c95fd7635ce53cc4de277f3a Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Thu, 21 Nov 2019 15:35:24 +0100 Subject: [PATCH 59/59] ProjectExplorer: Use Utils::ElidingLabel in EnvironmentKitAspectWidget Utils: :ElidingLabel re-elides on resize. Change-Id: I62709da60e7ab0156a33f373b236f71d1795d48f Reviewed-by: Christian Kandeler --- src/plugins/projectexplorer/kitinformation.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/plugins/projectexplorer/kitinformation.cpp b/src/plugins/projectexplorer/kitinformation.cpp index d3c14a0250a..500dd7d7053 100644 --- a/src/plugins/projectexplorer/kitinformation.cpp +++ b/src/plugins/projectexplorer/kitinformation.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include #include @@ -1129,7 +1130,7 @@ class EnvironmentKitAspectWidget : public KitAspectWidget public: EnvironmentKitAspectWidget(Kit *workingCopy, const KitAspect *ki) : KitAspectWidget(workingCopy, ki), - m_summaryLabel(new QLabel), + m_summaryLabel(new Utils::ElidingLabel), m_manageButton(new QPushButton), m_mainWidget(new QWidget) { @@ -1153,9 +1154,7 @@ private: void refresh() override { const Utils::EnvironmentItems changes = currentEnvironment(); - QString shortSummary = Utils::EnvironmentItem::toStringList(changes).join(QLatin1String("; ")); - QFontMetrics fm(m_summaryLabel->font()); - shortSummary = fm.elidedText(shortSummary, Qt::ElideRight, m_summaryLabel->width()); + const QString shortSummary = Utils::EnvironmentItem::toStringList(changes).join("; "); m_summaryLabel->setText(shortSummary.isEmpty() ? tr("No changes to apply.") : shortSummary); } @@ -1216,7 +1215,7 @@ private: }); } - QLabel *m_summaryLabel; + Utils::ElidingLabel *m_summaryLabel; QPushButton *m_manageButton; QCheckBox *m_vslangCheckbox; QWidget *m_mainWidget;