From 403672ca6b424e3f13a7b23fe0bcbcc4fe0f4ee1 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 5 Jun 2019 15:53:11 +0200 Subject: [PATCH 01/57] Doc: Describe moving files in the Projects sidebar view You can move files between projects by dragging and dropping them. Task-number: QTCREATORBUG-6446 Change-Id: Ia4d2a022ebb66d5a598c86c5a23fc795698facf6 Reviewed-by: Leena Miettinen --- doc/src/howto/creator-sidebar-views.qdoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/doc/src/howto/creator-sidebar-views.qdoc b/doc/src/howto/creator-sidebar-views.qdoc index 4461c14be75..3d038a425da 100644 --- a/doc/src/howto/creator-sidebar-views.qdoc +++ b/doc/src/howto/creator-sidebar-views.qdoc @@ -159,6 +159,10 @@ \li To see the absolute path of a file, move the mouse pointer over the file name. + \li To move files from one project to another, drag-and-drop them + in the project tree. \QC makes the necessary changes to project + configuration files. + \endlist \if defined(qtcreator) From 119c56ecceeecc11623283a64bdbdc22a58d36c2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 4 Jun 2019 11:07:26 +0200 Subject: [PATCH 02/57] StudioWelcome: Show text for community edition Change-Id: I34063c9c51f4f31f6481461b9505df6c1e231e3a Reviewed-by: Tim Jenssen --- .../qml/splashscreen/Welcome_splash.qml | 14 ++++++++++++++ .../studiowelcome/qml/welcomepage/main.qml | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/plugins/studiowelcome/qml/splashscreen/Welcome_splash.qml b/src/plugins/studiowelcome/qml/splashscreen/Welcome_splash.qml index 09c2e7757e9..fa90cd8a652 100644 --- a/src/plugins/studiowelcome/qml/splashscreen/Welcome_splash.qml +++ b/src/plugins/studiowelcome/qml/splashscreen/Welcome_splash.qml @@ -235,4 +235,18 @@ Image { } } } + + Text { + id: all_rights_reserved1 + x: 15 + y: 75 + color: "#ffffff" + text: qsTr("Community Edition") + font.pixelSize: 13 + font.family: Constants.titilliumWeb_light + visible: projectModel.communityVersion + ProjectModel { + id: projectModel + } + } } diff --git a/src/plugins/studiowelcome/qml/welcomepage/main.qml b/src/plugins/studiowelcome/qml/welcomepage/main.qml index 3a37cc15987..288321c2d98 100644 --- a/src/plugins/studiowelcome/qml/welcomepage/main.qml +++ b/src/plugins/studiowelcome/qml/welcomepage/main.qml @@ -185,5 +185,20 @@ Item { onClicked: Qt.openUrlExternally("http://blog.qt.io/") } } + + Text { + id: qtDesignStudio1 + x: 891 + y: 171 + color: "#ffffff" + text: qsTr("Community Edition") + anchors.right: parent.right + anchors.rightMargin: 23 + font.weight: Font.Light + font.pixelSize: 14 + font.family: Constants.titilliumWeb_regular + renderType: Text.NativeRendering + visible: projectModel.communityVersion + } } } From 58c3ad4baf99c41c5abf1bfba14e8be2afbcdf6d Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Tue, 4 Jun 2019 11:42:29 +0200 Subject: [PATCH 03/57] StudioWelcome: Add new DS logo Change-Id: I69126ea5bf53ccb777e3123d2b8d3be1bfa72027 Reviewed-by: Tim Jenssen --- .../qml/splashscreen/welcome_windows/logo.png | Bin 4024 -> 30814 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/plugins/studiowelcome/qml/splashscreen/welcome_windows/logo.png b/src/plugins/studiowelcome/qml/splashscreen/welcome_windows/logo.png index f7b6fb1736e7d51e40b344f466114610cd5a62f6..347beb789c4a0b563e552bc19aa31a43314e6e13 100644 GIT binary patch literal 30814 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 Date: Thu, 6 Jun 2019 11:18:48 +0200 Subject: [PATCH 04/57] Doc: Describe keeping source files open when closing projects This was made optional upon user request. Task-number: QTCREATORBUG-22198 Change-Id: Ie7db4199a0eab665ee29961281cd387a2dc4b3b4 Reviewed-by: Christian Kandeler --- doc/src/howto/creator-sidebar-views.qdoc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/doc/src/howto/creator-sidebar-views.qdoc b/doc/src/howto/creator-sidebar-views.qdoc index 3d038a425da..9140af5f35f 100644 --- a/doc/src/howto/creator-sidebar-views.qdoc +++ b/doc/src/howto/creator-sidebar-views.qdoc @@ -192,7 +192,10 @@ \li Expand or collapse the tree view to show or hide all files and folders. \li Close all files in a project. - \li Close projects. + \li Close projects. By default, all files in the project are also + closed. To keep them open, deselect the \uicontrol Tools > + \uicontrol Options > \uicontrol {Build & Run} > \uicontrol General + > \uicontrol {Close source files along with project} check box. \endlist For managing files and directories, the same functions are available as in From 21663b543a490e329492f25cc02d3944929d6075 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Wed, 5 Jun 2019 13:03:13 +0200 Subject: [PATCH 05/57] Doc: Update info about kit settings Change-Id: Ibe69c8930d0f311cd4da8249ecd2ab715d2d51d3 Reviewed-by: Christian Kandeler --- doc/images/qtcreator-kits.png | Bin 78121 -> 28799 bytes doc/images/qtcreator-qbs-profile-settings.png | Bin 9918 -> 6708 bytes .../creator-projects-targets.qdoc | 41 +++++++++++++----- 3 files changed, 29 insertions(+), 12 deletions(-) diff --git a/doc/images/qtcreator-kits.png b/doc/images/qtcreator-kits.png index 82dd2df34c11210f36a639e60a44f889e4370d73..05e8cc0df3508ac178adef757679804e93a6901c 100644 GIT binary patch literal 28799 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%0A}V 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 z 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 literal 9918 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 uKi`Ynf`(gkWtf>Ct8;94AI@0&UtU \uicontrol Options > + \uicontrol Kits >. For example, if you use CMake to build all your projects, + you can hide Qbs and qmake settings by default. + + To hide and show settings in the \uicontrol Kits tab for the + current kit, select \uicontrol {Settings Filter}. To view and + modify the settings displayed when you add a new kit, select + \uicontrol {Default Settings Filter}. + + \section1 Specifying Kit Settings + To add kits: \list 1 @@ -105,13 +120,13 @@ \li In the \uicontrol Device field, select a device. - \li In the \uicontrol {Emulator skin} field, select the skin to use for - the \l {Emulator}{Boot2Qt Emulator Device}. - \li In the \uicontrol Sysroot field, specify the directory where the device image is located. If you are not cross-compiling, leave this field empty. + \li In the \uicontrol {Emulator skin} field, select the skin to use for + the \l {Emulator}{Boot2Qt Emulator Device}. + \li In the \uicontrol {Compiler} field, select the C or C++ compiler that you use to build the project. You can add compilers to the list if they are installed on the development PC, but were not detected @@ -153,6 +168,10 @@ configuration that should be used by qmake. If you leave this field empty, the default mkspec of the selected Qt version is used. + \li In the \uicontrol {Additional Qbs profile settings} field, select + \uicontrol Change to add settings to Qbs build profiles. For more + information, see \l {Editing Qbs Profiles}. + \li In the \uicontrol {CMake Tool} field, select the CMake tool to use for building the project. Select \uicontrol Manage to add installed CMake tools to the list. For more information, see @@ -169,10 +188,6 @@ \uicontrol Change to edit the variables of the CMake configuration for the kit. - \li In the \uicontrol {Additional Qbs profile settings} field, select - \uicontrol Change to add settings to Qbs build profiles. For more - information, see \l {Editing Qbs Profiles}. - \endlist \QC uses the \e {default kit} if it does not have enough information to @@ -194,16 +209,18 @@ \list 1 \li Select \uicontrol Change next to the - \uicontrol {Additional Qbs Profile Settings} field. + \uicontrol {Additional Qbs Profile Settings} field to open the + \uicontrol {Custom Properties} dialog. \image qtcreator-qbs-profile-settings. - \li Select \uicontrol Add. + \li Double-click an empty cell in the \uicontrol Key column to specify + the key to add or modify as: \c .. - \li In the \uicontrol Key column, spefify the key to add or modify as: - \c .. + \li Double-click the cell on the same row in the \uicontrol Value column + to specify a value as a JSON literal. - \li In the \uicontrol Value column, specify a value as a JSON literal. + \li Select \uicontrol Add to add the key-value pair. \li Click \uicontrol OK. From e5dde74b9fcdb3c57a03bc24ac135dfa32e10892 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 5 Jun 2019 18:03:15 +0200 Subject: [PATCH 06/57] QmlDesigner: Work around layout issue Layout.fillWidth: true does not work without an explicit size. Change-Id: I4308016febddef1735d6e5261ac5bc989496bac9 Reviewed-by: Tim Jenssen --- .../qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml index 2dbbbff76bb..2b97be28f31 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml @@ -117,6 +117,7 @@ Rectangle { placeholderText: qsTr("id") text: backendValues.id.value Layout.fillWidth: true + width: 240 showTranslateCheckBox: false showExtendedFunctionButton: false enabled: !modelNodeBackend.multiSelection From cf1be672647f9696dbccf7decb4ca9db06c2792a Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 31 May 2019 16:49:04 +0200 Subject: [PATCH 07/57] QmlDesigner: Use lambdas for transactions Using lambdas we do not have to repeat the try catch block all over again. This also avoids sublte mistakes when catching the exception. Change-Id: I514fa9b64f43ef08fdc27bf702ec2b173ab1dfd6 Reviewed-by: Tim Jenssen --- .../componentcore/layoutingridlayout.cpp | 11 +- .../componentcore/modelnodeoperations.cpp | 128 +++----- .../components/integration/designdocument.cpp | 41 +-- .../navigator/navigatortreemodel.cpp | 10 +- .../components/navigator/navigatorview.cpp | 10 +- .../propertyeditor/gradientmodel.cpp | 40 ++- .../propertyeditorcontextobject.cpp | 29 +- .../propertyeditor/propertyeditorview.cpp | 34 +-- .../propertyeditor/qmlanchorbindingproxy.cpp | 284 ++++-------------- .../propertyeditor/qmlanchorbindingproxy.h | 2 +- .../designercore/include/abstractview.h | 5 + .../designercore/model/abstractview.cpp | 14 + .../designercore/model/modelmerger.cpp | 34 +-- .../designercore/model/qmlanchors.cpp | 118 ++++---- .../designercore/model/qmlitemnode.cpp | 20 +- .../connectioneditor/backendmodel.cpp | 45 +-- .../connectioneditor/bindingmodel.cpp | 13 +- .../connectioneditor/connectionmodel.cpp | 37 +-- .../dynamicpropertiesmodel.cpp | 41 +-- .../pathtool/pathitem.cpp | 83 +++-- .../timelineeditor/easingcurvedialog.cpp | 15 +- .../timelineeditor/timelineactions.cpp | 43 +-- .../timelineeditor/timelinegraphicsscene.cpp | 23 +- .../timelineeditor/timelinemovetool.cpp | 14 +- .../timelineeditor/timelinepropertyitem.cpp | 10 +- .../timelineeditor/timelinesectionitem.cpp | 15 +- .../timelineeditor/timelinesettingsmodel.cpp | 58 ++-- .../timelineeditor/timelineview.cpp | 33 +- 28 files changed, 391 insertions(+), 819 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp index 5ec3ea557b3..ba520a1ca33 100644 --- a/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp +++ b/src/plugins/qmldesigner/components/componentcore/layoutingridlayout.cpp @@ -185,17 +185,16 @@ void LayoutInGridLayout::doIt() if (qmlItemNode.hasInstanceParentItem()) { ModelNode layoutNode; - { - RewriterTransaction transaction(m_selectionContext.view(), QByteArrayLiteral("LayoutInGridLayout1")); + + m_selectionContext.view()->executeInTransaction("LayoutInGridLayout1",[this, &layoutNode, layoutType](){ QTC_ASSERT(m_selectionContext.view()->model()->hasNodeMetaInfo(layoutType), return); NodeMetaInfo metaInfo = m_selectionContext.view()->model()->metaInfo(layoutType); layoutNode = m_selectionContext.view()->createModelNode(layoutType, metaInfo.majorVersion(), metaInfo.minorVersion()); reparentTo(layoutNode, m_parentNode); - } + }); - { - RewriterTransaction transaction(m_selectionContext.view(), QByteArrayLiteral("LayoutInGridLayout2")); + m_selectionContext.view()->executeInTransaction("LayoutInGridLayout2", [this, layoutNode](){ fillEmptyCells(); @@ -208,7 +207,7 @@ void LayoutInGridLayout::doIt() reparentToNodeAndRemovePositionForModelNodes(layoutNode, sortedSelectedNodes); setSizeAsPreferredSize(sortedSelectedNodes); setSpanning(layoutNode); - } + }); } } } diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index 691c1b6ca51..3c31998576b 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -240,9 +240,7 @@ void changeOrder(const SelectionContext &selectionState, OderAction orderAction) if (!modelNode.parentProperty().isNodeListProperty()) return; - try { - RewriterTransaction transaction(selectionState.view(), QByteArrayLiteral("DesignerActionManager|raise")); - + selectionState.view()->executeInTransaction("DesignerActionManager|raise",[orderAction, selectionState, modelNode](){ ModelNode modelNode = selectionState.currentSingleSelectedNode(); NodeListProperty parentProperty = modelNode.parentProperty().toNodeListProperty(); const int index = parentProperty.indexOf(modelNode); @@ -255,11 +253,7 @@ void changeOrder(const SelectionContext &selectionState, OderAction orderAction) if (index > 0) parentProperty.slide(index, index - 1); } - - transaction.commit(); - } catch (const RewritingException &e) { //better save then sorry - e.showException(); - } + }); } void raise(const SelectionContext &selectionState) @@ -328,16 +322,13 @@ void resetSize(const SelectionContext &selectionState) if (!selectionState.view()) return; - try { - RewriterTransaction transaction(selectionState.view(), QByteArrayLiteral("DesignerActionManager|resetSize")); + selectionState.view()->executeInTransaction("DesignerActionManager|resetSize",[selectionState](){ foreach (ModelNode node, selectionState.selectedModelNodes()) { QmlItemNode itemNode(node); itemNode.removeProperty("width"); itemNode.removeProperty("height"); } - } catch (const RewritingException &e) { //better save then sorry - e.showException(); - } + }); } void resetPosition(const SelectionContext &selectionState) @@ -345,17 +336,13 @@ void resetPosition(const SelectionContext &selectionState) if (!selectionState.view()) return; - try { - RewriterTransaction transaction(selectionState.view(), QByteArrayLiteral("DesignerActionManager|resetPosition")); + selectionState.view()->executeInTransaction("DesignerActionManager|resetPosition",[selectionState](){ foreach (ModelNode node, selectionState.selectedModelNodes()) { QmlItemNode itemNode(node); itemNode.removeProperty("x"); itemNode.removeProperty("y"); } - transaction.commit(); - } catch (const RewritingException &e) { //better save then sorry - e.showException(); - } + }); } void goIntoComponentOperation(const SelectionContext &selectionState) @@ -372,11 +359,12 @@ void resetZ(const SelectionContext &selectionState) if (!selectionState.view()) return; - RewriterTransaction transaction(selectionState.view(), QByteArrayLiteral("DesignerActionManager|resetZ")); - foreach (ModelNode node, selectionState.selectedModelNodes()) { - QmlItemNode itemNode(node); - itemNode.removeProperty("z"); - } + selectionState.view()->executeInTransaction("DesignerActionManager|resetZ",[selectionState](){ + foreach (ModelNode node, selectionState.selectedModelNodes()) { + QmlItemNode itemNode(node); + itemNode.removeProperty("z"); + } + }); } static inline void backupPropertyAndRemove(const ModelNode &node, const PropertyName &propertyName) @@ -404,9 +392,7 @@ void anchorsFill(const SelectionContext &selectionState) if (!selectionState.view()) return; - try { - RewriterTransaction transaction(selectionState.view(), QByteArrayLiteral("DesignerActionManager|anchorsFill")); - + selectionState.view()->executeInTransaction("DesignerActionManager|anchorsFill",[selectionState](){ ModelNode modelNode = selectionState.currentSingleSelectedNode(); QmlItemNode node = modelNode; @@ -417,11 +403,7 @@ void anchorsFill(const SelectionContext &selectionState) backupPropertyAndRemove(modelNode, "width"); backupPropertyAndRemove(modelNode, "height"); } - - transaction.commit(); - } catch (const RewritingException &e) { //better save then sorry - e.showException(); - } + }); } void anchorsReset(const SelectionContext &selectionState) @@ -429,19 +411,19 @@ void anchorsReset(const SelectionContext &selectionState) if (!selectionState.view()) return; - RewriterTransaction transaction(selectionState.view(), QByteArrayLiteral("DesignerActionManager|anchorsReset")); + selectionState.view()->executeInTransaction("DesignerActionManager|anchorsReset",[selectionState](){ + ModelNode modelNode = selectionState.currentSingleSelectedNode(); - ModelNode modelNode = selectionState.currentSingleSelectedNode(); - - QmlItemNode node = modelNode; - if (node.isValid()) { - node.anchors().removeAnchors(); - node.anchors().removeMargins(); - restoreProperty(node, "x"); - restoreProperty(node, "y"); - restoreProperty(node, "width"); - restoreProperty(node, "height"); - } + QmlItemNode node = modelNode; + if (node.isValid()) { + node.anchors().removeAnchors(); + node.anchors().removeMargins(); + restoreProperty(node, "x"); + restoreProperty(node, "y"); + restoreProperty(node, "width"); + restoreProperty(node, "height"); + } + }); } using LessThan = std::function; @@ -481,7 +463,7 @@ bool compareByGrid(const ModelNode &node1, const ModelNode &node2) static void layoutHelperFunction(const SelectionContext &selectionContext, const TypeName &layoutType, - LessThan lessThan) + const LessThan &lessThan) { if (!selectionContext.view() || !selectionContext.hasSingleSelectedModelNode() @@ -492,10 +474,8 @@ static void layoutHelperFunction(const SelectionContext &selectionContext, const QmlItemNode qmlItemNode = QmlItemNode(selectionContext.firstSelectedModelNode()); if (qmlItemNode.hasInstanceParentItem()) { - ModelNode layoutNode; - { - RewriterTransaction transaction(selectionContext.view(), QByteArrayLiteral("DesignerActionManager|layoutHelperFunction1")); + selectionContext.view()->executeInTransaction("DesignerActionManager|layoutHelperFunction1",[=, &layoutNode](){ QmlItemNode parentNode = qmlItemNode.instanceParentItem(); @@ -504,10 +484,9 @@ static void layoutHelperFunction(const SelectionContext &selectionContext, layoutNode = selectionContext.view()->createModelNode(layoutType, metaInfo.majorVersion(), metaInfo.minorVersion()); reparentTo(layoutNode, parentNode); - } + }); - { - RewriterTransaction transaction(selectionContext.view(), QByteArrayLiteral("DesignerActionManager|layoutHelperFunction2")); + selectionContext.view()->executeInTransaction("DesignerActionManager|layoutHelperFunction2",[=](){ QList sortedSelectedNodes = selectionContext.selectedModelNodes(); Utils::sort(sortedSelectedNodes, lessThan); @@ -516,7 +495,7 @@ static void layoutHelperFunction(const SelectionContext &selectionContext, LayoutInGridLayout::reparentToNodeAndRemovePositionForModelNodes(layoutNode, sortedSelectedNodes); if (layoutType.contains("Layout")) LayoutInGridLayout::setSizeAsPreferredSize(sortedSelectedNodes); - } + }); } } } @@ -662,16 +641,9 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState if (!qmlObjectNode.isRootModelNode()) { isModelNodeRoot = false; - try { - RewriterTransaction transaction = - qmlObjectNode.view()->beginRewriterTransaction(QByteArrayLiteral("NavigatorTreeModel:exportItem")); - - QmlObjectNode qmlObjectNode(modelNode); + qmlObjectNode.view()->executeInTransaction("NavigatorTreeModel:exportItem", [&qmlObjectNode](){ qmlObjectNode.ensureAliasExport(); - transaction.commit(); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } + }); } QString itemId = modelNode.id(); @@ -708,14 +680,10 @@ void addSignalHandlerOrGotoImplementation(const SelectionContext &selectionState if (dialog->signal().isEmpty()) return; - try { - RewriterTransaction transaction = - qmlObjectNode.view()->beginRewriterTransaction(QByteArrayLiteral("NavigatorTreeModel:exportItem")); + qmlObjectNode.view()->executeInTransaction("NavigatorTreeModel:exportItem", [=](){ addSignal(typeName, itemId, dialog->signal(), isModelNodeRoot); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } + }); addSignal(typeName, itemId, dialog->signal(), isModelNodeRoot); @@ -751,9 +719,7 @@ void removeLayout(const SelectionContext &selectionContext) if (!parent.isValid()) return; - { - RewriterTransaction transaction(selectionContext.view(), QByteArrayLiteral("DesignerActionManager|removeLayout")); - + selectionContext.view()->executeInTransaction("DesignerActionManager|removeLayout", [selectionContext, &layoutItem, parent](){ foreach (const ModelNode &modelNode, selectionContext.currentSingleSelectedNode().directSubModelNodes()) { if (QmlItemNode::isValidQmlItemNode(modelNode)) { @@ -772,7 +738,7 @@ void removeLayout(const SelectionContext &selectionContext) parent.modelNode().defaultNodeListProperty().reparentHere(modelNode); } layoutItem.destroy(); - } + }); } void removePositioner(const SelectionContext &selectionContext) @@ -826,9 +792,7 @@ void addItemToStackedContainer(const SelectionContext &selectionContext) } } - try { - RewriterTransaction transaction = - view->beginRewriterTransaction(QByteArrayLiteral("DesignerActionManager:addItemToStackedContainer")); + view->executeInTransaction("DesignerActionManager:addItemToStackedContainer", [=](){ NodeMetaInfo itemMetaInfo = view->model()->metaInfo("QtQuick.Item", -1, -1); QTC_ASSERT(itemMetaInfo.isValid(), return); @@ -853,11 +817,7 @@ void addItemToStackedContainer(const SelectionContext &selectionContext) } } - - transaction.commit(); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } + }); } PropertyName getIndexPropertyName(const ModelNode &modelNode) @@ -969,9 +929,8 @@ void addTabBarToStackedContainer(const SelectionContext &selectionContext) const PropertyName indexPropertyName = getIndexPropertyName(container); QTC_ASSERT(container.metaInfo().hasProperty(indexPropertyName), return); - try { - RewriterTransaction transaction = - view->beginRewriterTransaction(QByteArrayLiteral("DesignerActionManager:addItemToStackedContainer")); + view->executeInTransaction("DesignerActionManager:addItemToStackedContainer", + [view, container, containerItemNode, tabBarMetaInfo, tabButtonMetaInfo, indexPropertyName](){ ModelNode tabBarNode = view->createModelNode("QtQuick.Controls.TabBar", @@ -1003,11 +962,8 @@ void addTabBarToStackedContainer(const SelectionContext &selectionContext) container.removeProperty(indexPropertyName); const QString expression = id + "." + QString::fromLatin1(indexPropertyName); container.bindingProperty(indexPropertyName).setExpression(expression); + }); - transaction.commit(); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } } bool addImageToProject(const QStringList &fileNames, const QString &defaultDirectory) diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index a10225cc069..4f23154945d 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -365,18 +365,13 @@ void DesignDocument::deleteSelected() if (!currentModel()) return; - try { - RewriterTransaction transaction(rewriterView(), QByteArrayLiteral("DesignDocument::deleteSelected")); + rewriterView()->executeInTransaction("DesignDocument::deleteSelected", [this](){ QList toDelete = view()->selectedModelNodes(); foreach (ModelNode node, toDelete) { if (node.isValid() && !node.isRootNode() && QmlObjectNode::isValidQmlObjectNode(node)) QmlObjectNode(node).destroy(); } - - transaction.commit(); - } catch (const RewritingException &e) { - e.showException(); - } + }); } void DesignDocument::copySelected() @@ -465,10 +460,8 @@ void DesignDocument::paste() } } - QList pastedNodeList; - - try { - RewriterTransaction transaction(rewriterView(), QByteArrayLiteral("DesignDocument::paste1")); + rewriterView()->executeInTransaction("DesignDocument::paste1", [this, &view, selectedNodes, targetNode](){ + QList pastedNodeList; int offset = double(qrand()) / RAND_MAX * 20 - 10; @@ -481,14 +474,10 @@ void DesignDocument::paste() } view.setSelectedModelNodes(pastedNodeList); - transaction.commit(); - } catch (const RewritingException &e) { - qWarning() << e.description(); //silent error - } - } else { - try { - RewriterTransaction transaction(rewriterView(), QByteArrayLiteral("DesignDocument::paste2")); + }); + } else { + rewriterView()->executeInTransaction("DesignDocument::paste1", [this, &view, selectedNodes, rootNode](){ currentModel()->attachView(&view); ModelNode pastedNode(view.insertModel(rootNode)); ModelNode targetNode; @@ -500,9 +489,9 @@ void DesignDocument::paste() targetNode = view.rootModelNode(); if (targetNode.hasParentProperty() && - (pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName()) && - (pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value()) && - (pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value())) + (pastedNode.simplifiedTypeName() == targetNode.simplifiedTypeName()) && + (pastedNode.variantProperty("width").value() == targetNode.variantProperty("width").value()) && + (pastedNode.variantProperty("height").value() == targetNode.variantProperty("height").value())) targetNode = targetNode.parentProperty().parentModelNode(); @@ -514,15 +503,9 @@ void DesignDocument::paste() } else { qWarning() << "Cannot reparent to" << targetNode; } - - transaction.commit(); - NodeMetaInfo::clearCache(); - view.setSelectedModelNodes({pastedNode}); - transaction.commit(); - } catch (const RewritingException &e) { - qWarning() << e.description(); //silent error - } + }); + NodeMetaInfo::clearCache(); } } diff --git a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp index 126fed8e68f..4ceb51e985e 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatortreemodel.cpp @@ -545,10 +545,9 @@ void NavigatorTreeModel::handleItemLibraryImageDrop(const QMimeData *mimeData, i void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProperty, const QList &modelNodes, int targetIndex) { QTC_ASSERT(m_view, return); - try { - const TypeName propertyQmlType = parentProperty.parentModelNode().metaInfo().propertyTypeName(parentProperty.name()); - RewriterTransaction transaction = m_view->beginRewriterTransaction(QByteArrayLiteral("NavigatorTreeModel::moveNodesInteractive")); + m_view->executeInTransaction("NavigatorTreeModel::moveNodesInteractive",[this, &parentProperty, modelNodes, targetIndex](){ + const TypeName propertyQmlType = parentProperty.parentModelNode().metaInfo().propertyTypeName(parentProperty.name()); foreach (const ModelNode &modelNode, modelNodes) { if (modelNode.isValid() && modelNode != parentProperty.parentModelNode() @@ -565,10 +564,7 @@ void NavigatorTreeModel::moveNodesInteractive(NodeAbstractProperty &parentProper } } } - transaction.commit(); - } catch (const RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } + }); } Qt::DropActions NavigatorTreeModel::supportedDropActions() const diff --git a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp index 07434102fce..f43081f14b2 100644 --- a/src/plugins/qmldesigner/components/navigator/navigatorview.cpp +++ b/src/plugins/qmldesigner/components/navigator/navigatorview.cpp @@ -198,16 +198,10 @@ void NavigatorView::handleChangedExport(const ModelNode &modelNode, bool exporte if (rootNode.hasProperty(modelNodeId)) rootNode.removeProperty(modelNodeId); if (exported) { - try { - RewriterTransaction transaction = - beginRewriterTransaction(QByteArrayLiteral("NavigatorTreeModel:exportItem")); - + executeInTransaction("NavigatorTreeModel:exportItem", [this, modelNode](){ QmlObjectNode qmlObjectNode(modelNode); qmlObjectNode.ensureAliasExport(); - transaction.commit(); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } + }); } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index 471ec2abd4d..d4b1f471848 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -36,7 +36,7 @@ #include #include #include -#include +#include #include @@ -147,18 +147,16 @@ void GradientModel::addGradient() return; if (!m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) { - try { + if (m_gradientTypeName != "Gradient") + ensureShapesImport(); + + view()->executeInTransaction("GradientModel::addGradient", [this](){ QColor color = m_itemNode.instanceValue("color").value(); if (!color.isValid()) color = QColor(Qt::white); - if (m_gradientTypeName != "Gradient") - ensureShapesImport(); - - QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::addGradient")); - QmlDesigner::ModelNode gradientNode = createGradientNode(); m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).reparentHere(gradientNode); @@ -172,11 +170,7 @@ void GradientModel::addGradient() gradientStopNode.variantProperty("position").setValue(1.0); gradientStopNode.variantProperty("color").setValue(QColor(Qt::black)); gradientNode.nodeListProperty("stops").reparentHere(gradientStopNode); - - } catch (const QmlDesigner::Exception &e) { - e.showException(); - } - + }); } setupModel(); @@ -244,18 +238,18 @@ qreal GradientModel::getPosition(int index) const void GradientModel::removeStop(int index) { if (index < rowCount() - 1 && index != 0) { - QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::removeStop")); - QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); - QmlDesigner::QmlObjectNode stop = gradientNode.nodeListProperty("stops").at(index); - if (stop.isValid()) { - stop.destroy(); - setupModel(); - } + view()->executeInTransaction("GradientModel::removeStop", [this, index](){ + QmlDesigner::ModelNode gradientNode = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode(); + QmlDesigner::QmlObjectNode stop = gradientNode.nodeListProperty("stops").at(index); + if (stop.isValid()) { + stop.destroy(); + setupModel(); + } + }); } qWarning() << Q_FUNC_INFO << "invalid index"; } - void GradientModel::deleteGradient() { if (!m_itemNode.isValid()) @@ -385,7 +379,11 @@ void GradientModel::ensureShapesImport() { if (!hasShapesImport()) { QmlDesigner::Import timelineImport = QmlDesigner::Import::createLibraryImport("QtQuick.Shapes", "1.0"); - model()->changeImports({timelineImport}, {}); + try { + model()->changeImports({timelineImport}, {}); + } catch (const QmlDesigner::Exception &) { + QTC_ASSERT(false, return); + } } } diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp index dc8243e1c81..8fdab5a821e 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorcontextobject.cpp @@ -152,22 +152,14 @@ void PropertyEditorContextObject::toogleExportAlias() PropertyName modelNodeId = selectedNode.id().toUtf8(); ModelNode rootModelNode = rewriterView->rootModelNode(); - try { - RewriterTransaction transaction = - rewriterView->beginRewriterTransaction(QByteArrayLiteral("PropertyEditorContextObject:toogleExportAlias")); - + rewriterView->executeInTransaction("PropertyEditorContextObject:toogleExportAlias", [&objectNode, &rootModelNode, modelNodeId](){ if (!objectNode.isAliasExported()) objectNode.ensureAliasExport(); else if (rootModelNode.hasProperty(modelNodeId)) rootModelNode.removeProperty(modelNodeId); - - transaction.commit(); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } + }); } - } void PropertyEditorContextObject::changeTypeName(const QString &typeName) @@ -181,11 +173,8 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) QTC_ASSERT(!rewriterView->selectedModelNodes().isEmpty(), return); - ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); - - try { - RewriterTransaction transaction = - rewriterView->beginRewriterTransaction(QByteArrayLiteral("PropertyEditorContextObject:changeTypeName")); + rewriterView->executeInTransaction("PropertyEditorContextObject:changeTypeName", [this, rewriterView, typeName](){ + ModelNode selectedNode = rewriterView->selectedModelNodes().constFirst(); NodeMetaInfo metaInfo = m_model->metaInfo(typeName.toLatin1()); if (!metaInfo.isValid()) { @@ -193,16 +182,10 @@ void PropertyEditorContextObject::changeTypeName(const QString &typeName) return; } if (selectedNode.isRootNode()) - rewriterView->changeRootNodeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); + rewriterView->changeRootNodeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); else selectedNode.changeType(metaInfo.typeName(), metaInfo.majorVersion(), metaInfo.minorVersion()); - - transaction.commit(); - } catch (RewritingException &exception) { //better safe than sorry! There always might be cases where we fail - exception.showException(); - } - - + }); } void PropertyEditorContextObject::insertKeyframe(const QString &propertyName) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index d0c98c896ff..bb02da3527a 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -235,9 +235,7 @@ void PropertyEditorView::changeExpression(const QString &propertyName) if (!m_selectedNode.isValid()) return; - RewriterTransaction transaction = beginRewriterTransaction(QByteArrayLiteral("PropertyEditorView::changeExpression")); - - try { + executeInTransaction("PropertyEditorView::changeExpression", [this, name](){ PropertyName underscoreName(name); underscoreName.replace('.', '_'); @@ -253,7 +251,6 @@ void PropertyEditorView::changeExpression(const QString &propertyName) if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "QColor") { if (QColor(value->expression().remove('"')).isValid()) { qmlObjectNode.setVariantProperty(name, QColor(value->expression().remove('"'))); - transaction.commit(); //committing in the try block return; } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "bool") { @@ -263,7 +260,6 @@ void PropertyEditorView::changeExpression(const QString &propertyName) qmlObjectNode.setVariantProperty(name, true); else qmlObjectNode.setVariantProperty(name, false); - transaction.commit(); //committing in the try block return; } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "int") { @@ -271,7 +267,6 @@ void PropertyEditorView::changeExpression(const QString &propertyName) int intValue = value->expression().toInt(&ok); if (ok) { qmlObjectNode.setVariantProperty(name, intValue); - transaction.commit(); //committing in the try block return; } } else if (qmlObjectNode.modelNode().metaInfo().propertyTypeName(name) == "qreal") { @@ -279,7 +274,6 @@ void PropertyEditorView::changeExpression(const QString &propertyName) qreal realValue = value->expression().toDouble(&ok); if (ok) { qmlObjectNode.setVariantProperty(name, realValue); - transaction.commit(); //committing in the try block return; } } @@ -291,12 +285,7 @@ void PropertyEditorView::changeExpression(const QString &propertyName) if (qmlObjectNode.expression(name) != value->expression() || !qmlObjectNode.propertyAffectedByCurrentState(name)) qmlObjectNode.setBindingProperty(name, value->expression()); - transaction.commit(); //committing in the try block - } - - catch (const RewritingException &e) { - e.showException(); - } + }); /* end of transaction */ } void PropertyEditorView::exportPopertyAsAlias(const QString &name) @@ -310,9 +299,7 @@ void PropertyEditorView::exportPopertyAsAlias(const QString &name) if (!m_selectedNode.isValid()) return; - RewriterTransaction transaction = beginRewriterTransaction(QByteArrayLiteral("PropertyEditorView::exportPopertyAsAlias")); - - try { + executeInTransaction("PropertyEditorView::exportPopertyAsAlias", [this, name](){ const QString id = m_selectedNode.validId(); QString upperCasePropertyName = name; upperCasePropertyName.replace(0, 1, upperCasePropertyName.at(0).toUpper()); @@ -326,11 +313,7 @@ void PropertyEditorView::exportPopertyAsAlias(const QString &name) return; } rootModelNode().bindingProperty(propertyName).setDynamicTypeNameAndExpression("alias", id + "." + name); - - transaction.commit(); //committing in the try block - } catch (const RewritingException &e) { - e.showException(); - } + }); } void PropertyEditorView::removeAliasExport(const QString &name) @@ -344,9 +327,7 @@ void PropertyEditorView::removeAliasExport(const QString &name) if (!m_selectedNode.isValid()) return; - RewriterTransaction transaction = beginRewriterTransaction(QByteArrayLiteral("PropertyEditorView::exportPopertyAsAlias")); - - try { + executeInTransaction("PropertyEditorView::exportPopertyAsAlias", [this, name](){ const QString id = m_selectedNode.validId(); for (const BindingProperty &property : rootModelNode().bindingProperties()) @@ -354,10 +335,7 @@ void PropertyEditorView::removeAliasExport(const QString &name) rootModelNode().removeProperty(property.name()); break; } - transaction.commit(); //committing in the try block - } catch (const RewritingException &e) { - e.showException(); - } + }); } bool PropertyEditorView::locked() const diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp index bc6b4376b66..7a38f74f34e 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.cpp @@ -292,9 +292,9 @@ void QmlAnchorBindingProxy::setDefaultRelativeRightTarget() } } -RewriterTransaction QmlAnchorBindingProxy::beginRewriterTransaction(const QByteArray &identifier) +bool QmlAnchorBindingProxy::executeInTransaction(const QByteArray &identifier, const AbstractView::OperationBlock &lambda) { - return m_qmlItemNode.modelNode().view()->beginRewriterTransaction(identifier); + return m_qmlItemNode.modelNode().view()->executeInTransaction(identifier, lambda); } bool QmlAnchorBindingProxy::hasParent() const @@ -361,20 +361,11 @@ void QmlAnchorBindingProxy::setTopTarget(const QString &target) if (!newTarget.isValid()) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setTopTarget")); - + executeInTransaction("QmlAnchorBindingProxy::setTopTarget", [this, newTarget](){ m_topTarget = newTarget; - setDefaultRelativeTopTarget(); - anchorTop(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit topTargetChanged(); } @@ -393,18 +384,12 @@ void QmlAnchorBindingProxy::setBottomTarget(const QString &target) if (!newTarget.isValid()) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setBottomTarget")); - + executeInTransaction("QmlAnchorBindingProxy::setBottomTarget", [this, newTarget](){ m_bottomTarget = newTarget; setDefaultRelativeBottomTarget(); anchorBottom(); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit bottomTargetChanged(); } @@ -422,18 +407,11 @@ void QmlAnchorBindingProxy::setLeftTarget(const QString &target) if (!newTarget.isValid()) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setLeftTarget")); - + executeInTransaction("QmlAnchorBindingProxy::setLeftTarget", [this, newTarget](){ m_leftTarget = newTarget; setDefaultRelativeLeftTarget(); anchorLeft(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit leftTargetChanged(); } @@ -451,18 +429,11 @@ void QmlAnchorBindingProxy::setRightTarget(const QString &target) if (!newTarget.isValid()) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRightTarget")); - + executeInTransaction("QmlAnchorBindingProxy::setRightTarget", [this, newTarget](){ m_rightTarget = newTarget; setDefaultRelativeRightTarget(); anchorRight(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit rightTargetChanged(); } @@ -480,17 +451,10 @@ void QmlAnchorBindingProxy::setVerticalTarget(const QString &target) if (!newTarget.isValid()) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setVerticalTarget")); - + executeInTransaction("QmlAnchorBindingProxy::setVerticalTarget", [this, newTarget](){ m_verticalTarget = newTarget; anchorVertical(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit verticalTargetChanged(); } @@ -508,17 +472,10 @@ void QmlAnchorBindingProxy::setHorizontalTarget(const QString &target) if (!newTarget.isValid()) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setHorizontalTarget")); - + executeInTransaction("QmlAnchorBindingProxy::setHorizontalTarget", [this, newTarget](){ m_horizontalTarget = newTarget; - anchorHorizontal();\ - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + anchorHorizontal(); + }); emit horizontalTargetChanged(); } @@ -531,18 +488,10 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetTop(QmlAnchorBindingProxy::Re if (target == m_relativeTopTarget) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetTop")); - + executeInTransaction("QmlAnchorBindingProxy::setRelativeAnchorTargetTop", [this, target](){ m_relativeTopTarget = target; - anchorTop(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetTopChanged(); } @@ -555,19 +504,10 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetBottom(QmlAnchorBindingProxy: if (target == m_relativeBottomTarget) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetBottom")); - + executeInTransaction("QmlAnchorBindingProxy::setRelativeAnchorTargetBottom", [this, target](){ m_relativeBottomTarget = target; - - anchorBottom(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetBottomChanged(); } @@ -580,18 +520,11 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetLeft(QmlAnchorBindingProxy::R if (target == m_relativeLeftTarget) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetLeft")); - + executeInTransaction("QmlAnchorBindingProxy::setRelativeAnchorTargetLeft", [this, target](){ m_relativeLeftTarget = target; - anchorLeft(); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetLeftChanged(); } @@ -604,18 +537,10 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetRight(QmlAnchorBindingProxy:: if (target == m_relativeRightTarget) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetRight")); - + executeInTransaction("QmlAnchorBindingProxy::setRelativeAnchorTargetRight", [this, target](){ m_relativeRightTarget = target; - anchorRight(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetRightChanged(); @@ -629,18 +554,11 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetVertical(QmlAnchorBindingProx if (target == m_relativeVerticalTarget) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetVertical")); + executeInTransaction("QmlAnchorBindingProxy::setRelativeAnchorTargetVertical", [this, target](){ m_relativeVerticalTarget = target; - anchorVertical(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetVerticalChanged(); } @@ -653,18 +571,10 @@ void QmlAnchorBindingProxy::setRelativeAnchorTargetHorizontal(QmlAnchorBindingPr if (target == m_relativeHorizontalTarget) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRelativeAnchorTargetHorizontal")); - + executeInTransaction("QmlAnchorBindingProxy::setRelativeAnchorTargetHorizontal", [this, target](){ m_relativeHorizontalTarget = target; - anchorHorizontal(); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetHorizontalChanged(); } @@ -709,12 +619,10 @@ int QmlAnchorBindingProxy::indexOfPossibleTargetItem(const QString &targetName) return possibleTargetItems().indexOf(targetName); } -void QmlAnchorBindingProxy::resetLayout() { - - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::resetLayout")); +void QmlAnchorBindingProxy::resetLayout() +{ + executeInTransaction("QmlAnchorBindingProxy::resetLayout", [this](){ m_qmlItemNode.anchors().removeAnchors(); m_qmlItemNode.anchors().removeMargins(); @@ -722,11 +630,7 @@ void QmlAnchorBindingProxy::resetLayout() { restoreProperty(modelNode(), "y"); restoreProperty(modelNode(), "width"); restoreProperty(modelNode(), "height"); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit topAnchorChanged(); emit bottomAnchorChanged(); @@ -743,10 +647,7 @@ void QmlAnchorBindingProxy::setBottomAnchor(bool anchor) if (bottomAnchored() == anchor) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setBottomAnchor")); - + executeInTransaction("QmlAnchorBindingProxy::setBottomAnchor", [this, anchor](){ if (!anchor) { removeBottomAnchor(); } else { @@ -756,10 +657,7 @@ void QmlAnchorBindingProxy::setBottomAnchor(bool anchor) backupPropertyAndRemove(modelNode(), "height"); } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetBottomChanged(); emit bottomAnchorChanged(); @@ -776,10 +674,8 @@ void QmlAnchorBindingProxy::setLeftAnchor(bool anchor) if (leftAnchored() == anchor) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setLeftAnchor")); + executeInTransaction("QmlAnchorBindingProxy::setLeftAnchor", [this, anchor](){ if (!anchor) { removeLeftAnchor(); } else { @@ -791,10 +687,7 @@ void QmlAnchorBindingProxy::setLeftAnchor(bool anchor) backupPropertyAndRemove(modelNode(), "width"); } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetLeftChanged(); emit leftAnchorChanged(); @@ -810,10 +703,7 @@ void QmlAnchorBindingProxy::setRightAnchor(bool anchor) if (rightAnchored() == anchor) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setRightAnchor")); - + executeInTransaction("QmlAnchorBindingProxy::setRightAnchor", [this, anchor](){ if (!anchor) { removeRightAnchor(); } else { @@ -824,10 +714,7 @@ void QmlAnchorBindingProxy::setRightAnchor(bool anchor) backupPropertyAndRemove(modelNode(), "width"); } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetRightChanged(); emit rightAnchorChanged(); @@ -1026,10 +913,7 @@ void QmlAnchorBindingProxy::setTopAnchor(bool anchor) if (topAnchored() == anchor) return; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setTopAnchor")); - + executeInTransaction("QmlAnchorBindingProxy::setTopAnchor", [this, anchor](){ if (!anchor) { removeTopAnchor(); } else { @@ -1040,10 +924,7 @@ void QmlAnchorBindingProxy::setTopAnchor(bool anchor) if (bottomAnchored()) backupPropertyAndRemove(modelNode(), "height"); } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit relativeAnchorTargetTopChanged(); emit topAnchorChanged(); @@ -1052,70 +933,44 @@ void QmlAnchorBindingProxy::setTopAnchor(bool anchor) } void QmlAnchorBindingProxy::removeTopAnchor() { - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::removeTopAnchor")); - + executeInTransaction("QmlAnchorBindingProxy::removeTopAnchor", [this](){ m_qmlItemNode.anchors().removeAnchor(AnchorLineTop); m_qmlItemNode.anchors().removeMargin(AnchorLineTop); restoreProperty(modelNode(), "y"); restoreProperty(modelNode(), "height"); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } -void QmlAnchorBindingProxy::removeBottomAnchor() { - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::removeBottomAnchor")); - +void QmlAnchorBindingProxy::removeBottomAnchor() +{ + executeInTransaction("QmlAnchorBindingProxy::removeBottomAnchor", [this](){ m_qmlItemNode.anchors().removeAnchor(AnchorLineBottom); m_qmlItemNode.anchors().removeMargin(AnchorLineBottom); - restoreProperty(modelNode(), "height"); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } -void QmlAnchorBindingProxy::removeLeftAnchor() { - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::removeLeftAnchor")); - +void QmlAnchorBindingProxy::removeLeftAnchor() +{ + executeInTransaction("QmlAnchorBindingProxy::removeLeftAnchor", [this](){ m_qmlItemNode.anchors().removeAnchor(AnchorLineLeft); m_qmlItemNode.anchors().removeMargin(AnchorLineLeft); restoreProperty(modelNode(), "x"); restoreProperty(modelNode(), "width"); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } -void QmlAnchorBindingProxy::removeRightAnchor() { - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::removeRightAnchor")); - +void QmlAnchorBindingProxy::removeRightAnchor() +{ + executeInTransaction("QmlAnchorBindingProxy::removeRightAnchor", [this](){ m_qmlItemNode.anchors().removeAnchor(AnchorLineRight); m_qmlItemNode.anchors().removeMargin(AnchorLineRight); restoreProperty(modelNode(), "width"); - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } void QmlAnchorBindingProxy::setVerticalCentered(bool centered) @@ -1128,10 +983,7 @@ void QmlAnchorBindingProxy::setVerticalCentered(bool centered) m_locked = true; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setVerticalCentered")); - + executeInTransaction("QmlAnchorBindingProxy::setVerticalCentered", [this, centered](){ if (!centered) { m_qmlItemNode.anchors().removeAnchor(AnchorLineVerticalCenter); m_qmlItemNode.anchors().removeMargin(AnchorLineVerticalCenter); @@ -1141,10 +993,7 @@ void QmlAnchorBindingProxy::setVerticalCentered(bool centered) anchorVertical(); } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); m_locked = false; emit relativeAnchorTargetVerticalChanged(); @@ -1161,10 +1010,7 @@ void QmlAnchorBindingProxy::setHorizontalCentered(bool centered) m_locked = true; - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::setHorizontalCentered")); - + executeInTransaction("QmlAnchorBindingProxy::setHorizontalCentered", [this, centered](){ if (!centered) { m_qmlItemNode.anchors().removeAnchor(AnchorLineHorizontalCenter); m_qmlItemNode.anchors().removeMargin(AnchorLineHorizontalCenter); @@ -1173,11 +1019,7 @@ void QmlAnchorBindingProxy::setHorizontalCentered(bool centered) anchorHorizontal(); } - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); m_locked = false; emit relativeAnchorTargetHorizontalChanged(); @@ -1256,12 +1098,7 @@ bool QmlAnchorBindingProxy::horizontalCentered() void QmlAnchorBindingProxy::fill() { - - try { - RewriterTransaction transaction = beginRewriterTransaction( - QByteArrayLiteral("QmlAnchorBindingProxy::fill")); - - + executeInTransaction("QmlAnchorBindingProxy::fill", [this](){ backupPropertyAndRemove(modelNode(), "x"); backupPropertyAndRemove(modelNode(), "y"); backupPropertyAndRemove(modelNode(), "width"); @@ -1277,10 +1114,7 @@ void QmlAnchorBindingProxy::fill() m_qmlItemNode.anchors().removeMargin(AnchorLineTop); m_qmlItemNode.anchors().removeMargin(AnchorLineBottom); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); emit topAnchorChanged(); emit bottomAnchorChanged(); diff --git a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h index cf42ea055ac..0bd562add20 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h +++ b/src/plugins/qmldesigner/components/propertyeditor/qmlanchorbindingproxy.h @@ -210,7 +210,7 @@ private: void setDefaultRelativeLeftTarget(); void setDefaultRelativeRightTarget(); - RewriterTransaction beginRewriterTransaction(const QByteArray &identifier); + bool executeInTransaction(const QByteArray &identifier, const AbstractView::OperationBlock &lambda); QmlItemNode targetIdToNode(const QString &id) const; QString idForNode(const QmlItemNode &qmlItemNode) const; diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index d32a403e5c1..dcbeb5ee74d 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -39,6 +39,8 @@ #include #include +#include + QT_BEGIN_NAMESPACE class QStyle; class QToolButton; @@ -263,6 +265,9 @@ public: void activateTimelineRecording(const ModelNode &timeline); void deactivateTimelineRecording(); + using OperationBlock = std::function; + bool executeInTransaction(const QByteArray &identifier, const OperationBlock &lambda); + protected: void setModel(Model * model); void removeModel(); diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index 4e3596001c2..eb7ed16b9ab 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -616,6 +616,20 @@ void AbstractView::deactivateTimelineRecording() model()->d->notifyCurrentTimelineChanged(ModelNode()); } +bool AbstractView::executeInTransaction(const QByteArray &identifier, const AbstractView::OperationBlock &lambda) +{ + try { + RewriterTransaction transaction = beginRewriterTransaction(identifier); + lambda(); + transaction.commit(); + } catch (const Exception &e) { + e.showException(); + return false; + } + + return true; +} + QList AbstractView::allModelNodes() const { return toModelNodeList(model()->d->allNodes()); diff --git a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp index 161cf1f9f52..8517f9cb827 100644 --- a/src/plugins/qmldesigner/designercore/model/modelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelmerger.cpp @@ -178,29 +178,23 @@ void ModelMerger::replaceModel(const ModelNode &modelNode) view()->model()->changeImports(modelNode.model()->imports(), {}); view()->model()->setFileUrl(modelNode.model()->fileUrl()); - try { - RewriterTransaction transaction(view()->beginRewriterTransaction(QByteArrayLiteral("ModelMerger::replaceModel"))); + view()->executeInTransaction("ModelMerger::replaceModel", [this, modelNode](){ + ModelNode rootNode(view()->rootModelNode()); - ModelNode rootNode(view()->rootModelNode()); + foreach (const PropertyName &propertyName, rootNode.propertyNames()) + rootNode.removeProperty(propertyName); - foreach (const PropertyName &propertyName, rootNode.propertyNames()) - rootNode.removeProperty(propertyName); + QHash idRenamingHash; + setupIdRenamingHash(modelNode, idRenamingHash, view()); - QHash idRenamingHash; - setupIdRenamingHash(modelNode, idRenamingHash, view()); - - syncAuxiliaryProperties(rootNode, modelNode); - syncVariantProperties(rootNode, modelNode); - syncBindingProperties(rootNode, modelNode, idRenamingHash); - syncId(rootNode, modelNode, idRenamingHash); - syncNodeProperties(rootNode, modelNode, idRenamingHash, view()); - syncNodeListProperties(rootNode, modelNode, idRenamingHash, view()); - m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); - - transaction.commit(); - } catch (const RewritingException &e) { - qWarning() << e.description(); //silent error - } + syncAuxiliaryProperties(rootNode, modelNode); + syncVariantProperties(rootNode, modelNode); + syncBindingProperties(rootNode, modelNode, idRenamingHash); + syncId(rootNode, modelNode, idRenamingHash); + syncNodeProperties(rootNode, modelNode, idRenamingHash, view()); + syncNodeListProperties(rootNode, modelNode, idRenamingHash, view()); + m_view->changeRootNodeType(modelNode.type(), modelNode.majorVersion(), modelNode.minorVersion()); + }); } } //namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp b/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp index 7b83330a32a..ba821dd788b 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlanchors.cpp @@ -161,22 +161,23 @@ void QmlAnchors::setAnchor(AnchorLineType sourceAnchorLine, const QmlItemNode &targetQmlItemNode, AnchorLineType targetAnchorLine) { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::setAnchor")); - if (qmlItemNode().isInBaseState()) { - if ((qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) - || ((qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)))) { - removeAnchor(sourceAnchorLine); - } + qmlItemNode().view()->executeInTransaction("QmlAnchors::setAnchor", [this, sourceAnchorLine, targetQmlItemNode, targetAnchorLine](){ + if (qmlItemNode().isInBaseState()) { + if ((qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) + || ((qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)))) { + removeAnchor(sourceAnchorLine); + } - const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); - ModelNode targetModelNode = targetQmlItemNode.modelNode(); - QString targetExpression = targetModelNode.validId(); - if (targetQmlItemNode.modelNode() == qmlItemNode().modelNode().parentProperty().parentModelNode()) - targetExpression = QLatin1String("parent"); - if (sourceAnchorLine != AnchorLineCenter && sourceAnchorLine != AnchorLineFill) - targetExpression = targetExpression + QLatin1Char('.') + QString::fromLatin1(lineTypeToString(targetAnchorLine)); - qmlItemNode().modelNode().bindingProperty(propertyName).setExpression(targetExpression); - } + const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); + ModelNode targetModelNode = targetQmlItemNode.modelNode(); + QString targetExpression = targetModelNode.validId(); + if (targetQmlItemNode.modelNode() == qmlItemNode().modelNode().parentProperty().parentModelNode()) + targetExpression = QLatin1String("parent"); + if (sourceAnchorLine != AnchorLineCenter && sourceAnchorLine != AnchorLineFill) + targetExpression = targetExpression + QLatin1Char('.') + QString::fromLatin1(lineTypeToString(targetAnchorLine)); + qmlItemNode().modelNode().bindingProperty(propertyName).setExpression(targetExpression); + } + }); } bool detectHorizontalCycle(const ModelNode &node, QList knownNodeList) @@ -315,47 +316,49 @@ AnchorLine QmlAnchors::instanceAnchor(AnchorLineType sourceAnchorLine) const void QmlAnchors::removeAnchor(AnchorLineType sourceAnchorLine) { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::removeAnchor")); - if (qmlItemNode().isInBaseState()) { - const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) { - qmlItemNode().modelNode().removeProperty("anchors.fill"); - qmlItemNode().modelNode().bindingProperty("anchors.top").setExpression(QLatin1String("parent.top")); - qmlItemNode().modelNode().bindingProperty("anchors.left").setExpression(QLatin1String("parent.left")); - qmlItemNode().modelNode().bindingProperty("anchors.bottom").setExpression(QLatin1String("parent.bottom")); - qmlItemNode().modelNode().bindingProperty("anchors.right").setExpression(QLatin1String("parent.right")); + qmlItemNode().view()->executeInTransaction("QmlAnchors::removeAnchor", [this, sourceAnchorLine](){ + if (qmlItemNode().isInBaseState()) { + const PropertyName propertyName = anchorPropertyName(sourceAnchorLine); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill") && (sourceAnchorLine & AnchorLineFill)) { + qmlItemNode().modelNode().removeProperty("anchors.fill"); + qmlItemNode().modelNode().bindingProperty("anchors.top").setExpression(QLatin1String("parent.top")); + qmlItemNode().modelNode().bindingProperty("anchors.left").setExpression(QLatin1String("parent.left")); + qmlItemNode().modelNode().bindingProperty("anchors.bottom").setExpression(QLatin1String("parent.bottom")); + qmlItemNode().modelNode().bindingProperty("anchors.right").setExpression(QLatin1String("parent.right")); - } else if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)) { - qmlItemNode().modelNode().removeProperty("anchors.centerIn"); - qmlItemNode().modelNode().bindingProperty("anchors.horizontalCenter").setExpression(QLatin1String("parent.horizontalCenter")); - qmlItemNode().modelNode().bindingProperty("anchors.verticalCenter").setExpression(QLatin1String("parent.verticalCenter")); + } else if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn") && (sourceAnchorLine & AnchorLineCenter)) { + qmlItemNode().modelNode().removeProperty("anchors.centerIn"); + qmlItemNode().modelNode().bindingProperty("anchors.horizontalCenter").setExpression(QLatin1String("parent.horizontalCenter")); + qmlItemNode().modelNode().bindingProperty("anchors.verticalCenter").setExpression(QLatin1String("parent.verticalCenter")); + } + + qmlItemNode().modelNode().removeProperty(propertyName); } - - qmlItemNode().modelNode().removeProperty(propertyName); - } + }); } void QmlAnchors::removeAnchors() { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::removeAnchors")); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill")) - qmlItemNode().modelNode().removeProperty("anchors.fill"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn")) - qmlItemNode().modelNode().removeProperty("anchors.centerIn"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.top")) - qmlItemNode().modelNode().removeProperty("anchors.top"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.left")) - qmlItemNode().modelNode().removeProperty("anchors.left"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.right")) - qmlItemNode().modelNode().removeProperty("anchors.right"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.bottom")) - qmlItemNode().modelNode().removeProperty("anchors.bottom"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.horizontalCenter")) - qmlItemNode().modelNode().removeProperty("anchors.horizontalCenter"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.verticalCenter")) - qmlItemNode().modelNode().removeProperty("anchors.verticalCenter"); - if (qmlItemNode().nodeInstance().hasAnchor("anchors.baseline")) - qmlItemNode().modelNode().removeProperty("anchors.baseline"); + qmlItemNode().view()->executeInTransaction("QmlAnchors::removeAnchors", [this](){ + if (qmlItemNode().nodeInstance().hasAnchor("anchors.fill")) + qmlItemNode().modelNode().removeProperty("anchors.fill"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.centerIn")) + qmlItemNode().modelNode().removeProperty("anchors.centerIn"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.top")) + qmlItemNode().modelNode().removeProperty("anchors.top"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.left")) + qmlItemNode().modelNode().removeProperty("anchors.left"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.right")) + qmlItemNode().modelNode().removeProperty("anchors.right"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.bottom")) + qmlItemNode().modelNode().removeProperty("anchors.bottom"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.horizontalCenter")) + qmlItemNode().modelNode().removeProperty("anchors.horizontalCenter"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.verticalCenter")) + qmlItemNode().modelNode().removeProperty("anchors.verticalCenter"); + if (qmlItemNode().nodeInstance().hasAnchor("anchors.baseline")) + qmlItemNode().modelNode().removeProperty("anchors.baseline"); + }); } bool QmlAnchors::instanceHasAnchor(AnchorLineType sourceAnchorLine) const @@ -532,13 +535,14 @@ void QmlAnchors::removeMargin(AnchorLineType sourceAnchorLineType) void QmlAnchors::removeMargins() { - RewriterTransaction transaction = qmlItemNode().view()->beginRewriterTransaction(QByteArrayLiteral("QmlAnchors::removeMargins")); - removeMargin(AnchorLineLeft); - removeMargin(AnchorLineRight); - removeMargin(AnchorLineTop); - removeMargin(AnchorLineBottom); - removeMargin(AnchorLineHorizontalCenter); - removeMargin(AnchorLineVerticalCenter); + qmlItemNode().view()->executeInTransaction("QmlAnchors::removeMargins", [this](){ + removeMargin(AnchorLineLeft); + removeMargin(AnchorLineRight); + removeMargin(AnchorLineTop); + removeMargin(AnchorLineBottom); + removeMargin(AnchorLineHorizontalCenter); + removeMargin(AnchorLineVerticalCenter); + }); } void QmlAnchors::fill() diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index f02ca1ead73..ea40b46e8bf 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -102,9 +102,7 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibrary { QmlItemNode newQmlItemNode; - try { - RewriterTransaction transaction = view->beginRewriterTransaction(QByteArrayLiteral("QmlItemNode::createQmlItemNode")); - + view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlItemNode, &parentproperty](){ NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); int minorVersion = metaInfo.minorVersion(); @@ -139,7 +137,7 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibrary parentproperty.reparentHere(newQmlItemNode); if (!newQmlItemNode.isValid()) - return newQmlItemNode; + return; newQmlItemNode.setId(view->generateNewId(itemLibraryEntry.name())); @@ -150,10 +148,7 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, const ItemLibrary newQmlItemNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); Q_ASSERT(newQmlItemNode.isValid()); - } - catch (const RewritingException &e) { - e.showException(); - } + }); Q_ASSERT(newQmlItemNode.isValid()); @@ -174,10 +169,8 @@ QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QS { QmlItemNode newQmlItemNode; - if (parentproperty.isValid()) { - RewriterTransaction transaction = view->beginRewriterTransaction(QByteArrayLiteral("QmlItemNode::createQmlItemNodeFromImage")); - - if (view->model()->hasNodeMetaInfo("QtQuick.Image")) { + if (parentproperty.isValid() && view->model()->hasNodeMetaInfo("QtQuick.Image")) { + view->executeInTransaction("QmlItemNode::createQmlItemNodeFromImage", [=, &newQmlItemNode, &parentproperty](){ NodeMetaInfo metaInfo = view->model()->metaInfo("QtQuick.Image"); QList > propertyPairList; propertyPairList.append({PropertyName("x"), QVariant(qRound(position.x()))}); @@ -200,8 +193,7 @@ QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QS newQmlItemNode.modelNode().variantProperty("fillMode").setEnumeration("Image.PreserveAspectFit"); Q_ASSERT(newQmlItemNode.isValid()); - } - Q_ASSERT(newQmlItemNode.isValid()); + }); } return newQmlItemNode; diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp index f356788a55d..4a004ca5753 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/backendmodel.cpp @@ -232,27 +232,24 @@ void BackendModel::addNewBackend() Import import = Import::createLibraryImport(importSplit.constFirst(), importSplit.constLast()); - try { - - /* We cannot add an import and add a node from that import in a single transaction. + /* We cannot add an import and add a node from that import in a single transaction. * We need the import to have the meta info available. */ - if (!model->hasImport(import)) - model->changeImports({import}, {}); + if (!model->hasImport(import)) + model->changeImports({import}, {}); - QString propertyName = m_connectionView->generateNewId(typeName); + QString propertyName = m_connectionView->generateNewId(typeName); - NodeMetaInfo metaInfo = model->metaInfo(typeName.toUtf8()); + NodeMetaInfo metaInfo = model->metaInfo(typeName.toUtf8()); - QTC_ASSERT(metaInfo.isValid(), return); + QTC_ASSERT(metaInfo.isValid(), return); - int minorVersion = metaInfo.minorVersion(); - int majorVersion = metaInfo.majorVersion(); - - /* Add a property for non singleton types. For singletons just adding the import is enough. */ - if (!dialog.isSingleton()) { - RewriterTransaction transaction = m_connectionView->beginRewriterTransaction("BackendModel::addNewBackend"); + /* Add a property for non singleton types. For singletons just adding the import is enough. */ + if (!dialog.isSingleton()) { + m_connectionView->executeInTransaction("BackendModel::addNewBackend", [=, &dialog](){ + int minorVersion = metaInfo.minorVersion(); + int majorVersion = metaInfo.majorVersion(); if (dialog.localDefinition()) { ModelNode newNode = m_connectionView->createModelNode(metaInfo.typeName(), majorVersion, minorVersion); @@ -263,14 +260,9 @@ void BackendModel::addNewBackend() m_connectionView->rootModelNode().bindingProperty( propertyName.toUtf8()).setDynamicTypeNameAndExpression(typeName.toUtf8(), "null"); } - transaction.commit(); - } - - } catch (const Exception &e) { - e.showException(); + }); } } - resetModel(); } @@ -279,11 +271,9 @@ void BackendModel::updatePropertyName(int rowNumber) const PropertyName newName = data(index(rowNumber, 1)).toString().toUtf8(); const PropertyName oldName = data(index(rowNumber, 0), Qt::UserRole + 1).toString().toUtf8(); - ModelNode rootModelNode = m_connectionView->rootModelNode(); - - try { - RewriterTransaction transaction = m_connectionView->beginRewriterTransaction("BackendModel::updatePropertyName"); + m_connectionView->executeInTransaction("BackendModel::updatePropertyName", [this, newName, oldName](){ + ModelNode rootModelNode = m_connectionView->rootModelNode(); if (rootModelNode.property(oldName).isNodeProperty()) { const TypeName typeName = rootModelNode.nodeProperty(oldName).dynamicTypeName(); @@ -306,12 +296,7 @@ void BackendModel::updatePropertyName(int rowNumber) qWarning() << Q_FUNC_INFO << oldName << newName << "failed..."; QTC_ASSERT(false, return); } - - transaction.commit(); - - } catch (const Exception &e) { - e.showException(); - } + }); } void BackendModel::handleDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp index cd8c92b82c1..2cff12b044d 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/bindingmodel.cpp @@ -290,8 +290,6 @@ void BindingModel::addModelNode(const ModelNode &modelNode) void BindingModel::updateExpression(int row) { - BindingProperty bindingProperty = bindingPropertyForRow(row); - const QString sourceNode = data(index(row, SourceModelNodeRow)).toString().trimmed(); const QString sourceProperty = data(index(row, SourcePropertyNameRow)).toString().trimmed(); @@ -302,15 +300,10 @@ void BindingModel::updateExpression(int row) expression = sourceNode + QLatin1String(".") + sourceProperty; } - RewriterTransaction transaction = - connectionView()->beginRewriterTransaction(QByteArrayLiteral("BindingModel::updateExpression")); - try { + connectionView()->executeInTransaction("BindingModel::updateExpression", [this, row, expression](){ + BindingProperty bindingProperty = bindingPropertyForRow(row); bindingProperty.setExpression(expression.trimmed()); - transaction.commit(); //committing in the try block - } catch (Exception &e) { - m_exceptionError = e.description(); - QTimer::singleShot(200, this, &BindingModel::handleException); - } + }); } void BindingModel::updatePropertyName(int rowNumber) diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp index 8cd297890e9..80caf51ce06 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/connectionmodel.cpp @@ -182,26 +182,21 @@ void ConnectionModel::updateSource(int row) void ConnectionModel::updateSignalName(int rowNumber) { SignalHandlerProperty signalHandlerProperty = signalHandlerPropertyForRow(rowNumber); - - const PropertyName newName = data(index(rowNumber, TargetPropertyNameRow)).toString().toUtf8(); - const QString source = signalHandlerProperty.source(); ModelNode connectionNode = signalHandlerProperty.parentModelNode(); + const PropertyName newName = data(index(rowNumber, TargetPropertyNameRow)).toString().toUtf8(); if (!newName.isEmpty()) { - RewriterTransaction transaction = - connectionView()->beginRewriterTransaction(QByteArrayLiteral("ConnectionModel::updateSignalName")); - try { + connectionView()->executeInTransaction("ConnectionModel::updateSignalName", [=, &connectionNode](){ + + const QString source = signalHandlerProperty.source(); + connectionNode.signalHandlerProperty(newName).setSource(source); connectionNode.removeProperty(signalHandlerProperty.name()); - transaction.commit(); //committing in the try block - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); QStandardItem* idItem = item(rowNumber, 0); SignalHandlerProperty newSignalHandlerProperty = connectionNode.signalHandlerProperty(newName); updateCustomData(idItem, newSignalHandlerProperty); - } else { qWarning() << "BindingModel::updatePropertyName invalid property name"; } @@ -214,14 +209,9 @@ void ConnectionModel::updateTargetNode(int rowNumber) ModelNode connectionNode = signalHandlerProperty.parentModelNode(); if (!newTarget.isEmpty()) { - RewriterTransaction transaction = - connectionView()->beginRewriterTransaction(QByteArrayLiteral("ConnectionModel::updateTargetNode")); - try { + connectionView()->executeInTransaction("ConnectionModel::updateTargetNode", [= ,&connectionNode](){ connectionNode.bindingProperty("target").setExpression(newTarget); - transaction.commit(); //committing in the try block - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); QStandardItem* idItem = item(rowNumber, 0); updateCustomData(idItem, signalHandlerProperty); @@ -256,12 +246,10 @@ void ConnectionModel::addConnection() if (rootModelNode.isValid() && rootModelNode.metaInfo().isValid()) { - NodeMetaInfo nodeMetaInfo = connectionView()->model()->metaInfo("QtQuick.Connections"); + NodeMetaInfo nodeMetaInfo = connectionView()->model()->metaInfo("QtQuick.Connections"); if (nodeMetaInfo.isValid()) { - RewriterTransaction transaction = - connectionView()->beginRewriterTransaction(QByteArrayLiteral("ConnectionModel::addConnection")); - try { + connectionView()->executeInTransaction("ConnectionModel::addConnection", [=](){ ModelNode newNode = connectionView()->createModelNode("QtQuick.Connections", nodeMetaInfo.majorVersion(), nodeMetaInfo.minorVersion()); @@ -276,10 +264,7 @@ void ConnectionModel::addConnection() } else { newNode.bindingProperty("target").setExpression(QLatin1String("parent")); } - transaction.commit(); - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); } } } diff --git a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp index 8d4186a5b54..0a08e5c8839 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/connectioneditor/dynamicpropertiesmodel.cpp @@ -464,19 +464,16 @@ void DynamicPropertiesModel::updatePropertyName(int rowNumber) BindingProperty bindingProperty = bindingPropertyForRow(rowNumber); - if (bindingProperty.isBindingProperty()) { - const QString expression = bindingProperty.expression(); - const PropertyName dynamicPropertyType = bindingProperty.dynamicTypeName(); - ModelNode targetNode = bindingProperty.parentModelNode(); + ModelNode targetNode = bindingProperty.parentModelNode(); + + if (bindingProperty.isBindingProperty()) { + connectionView()->executeInTransaction("DynamicPropertiesModel::updatePropertyName", [bindingProperty, newName, &targetNode](){ + const QString expression = bindingProperty.expression(); + const PropertyName dynamicPropertyType = bindingProperty.dynamicTypeName(); - RewriterTransaction transaction = connectionView()->beginRewriterTransaction(QByteArrayLiteral("DynamicPropertiesModel::updatePropertyName")); - try { targetNode.bindingProperty(newName).setDynamicTypeNameAndExpression(dynamicPropertyType, expression); targetNode.removeProperty(bindingProperty.name()); - transaction.commit(); //committing in the try block - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); updateCustomData(rowNumber, targetNode.bindingProperty(newName)); return; @@ -489,14 +486,10 @@ void DynamicPropertiesModel::updatePropertyName(int rowNumber) const PropertyName dynamicPropertyType = variantProperty.dynamicTypeName(); ModelNode targetNode = variantProperty.parentModelNode(); - RewriterTransaction transaction = connectionView()->beginRewriterTransaction(QByteArrayLiteral("DynamicPropertiesModel::updatePropertyName")); - try { + connectionView()->executeInTransaction("DynamicPropertiesModel::updatePropertyName", [=](){ targetNode.variantProperty(newName).setDynamicTypeNameAndValue(dynamicPropertyType, value); targetNode.removeProperty(variantProperty.name()); - transaction.commit(); //committing in the try block - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); updateCustomData(rowNumber, targetNode.variantProperty(newName)); } @@ -519,14 +512,10 @@ void DynamicPropertiesModel::updatePropertyType(int rowNumber) const PropertyName propertyName = bindingProperty.name(); ModelNode targetNode = bindingProperty.parentModelNode(); - RewriterTransaction transaction = connectionView()->beginRewriterTransaction(QByteArrayLiteral("DynamicPropertiesModel::updatePropertyType")); - try { + connectionView()->executeInTransaction("DynamicPropertiesModel::updatePropertyType", [=](){ targetNode.removeProperty(bindingProperty.name()); targetNode.bindingProperty(propertyName).setDynamicTypeNameAndExpression(newType, expression); - transaction.commit(); //committing in the try block - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); updateCustomData(rowNumber, targetNode.bindingProperty(propertyName)); return; @@ -539,18 +528,14 @@ void DynamicPropertiesModel::updatePropertyType(int rowNumber) ModelNode targetNode = variantProperty.parentModelNode(); const PropertyName propertyName = variantProperty.name(); - RewriterTransaction transaction = connectionView()->beginRewriterTransaction(QByteArrayLiteral("DynamicPropertiesModel::updatePropertyType")); - try { + connectionView()->executeInTransaction("DynamicPropertiesModel::updatePropertyType", [=](){ targetNode.removeProperty(variantProperty.name()); if (newType == "alias") { //alias properties have to be bindings targetNode.bindingProperty(propertyName).setDynamicTypeNameAndExpression(newType, QLatin1String("none.none")); } else { targetNode.variantProperty(propertyName).setDynamicTypeNameAndValue(newType, convertVariantForTypeName(value, newType)); } - transaction.commit(); //committing in the try block - } catch (Exception &e) { //better save then sorry - QMessageBox::warning(nullptr, tr("Error"), e.description()); - } + }); updateCustomData(rowNumber, targetNode.variantProperty(propertyName)); diff --git a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp index ad5437f34e9..76fe6f0b90f 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/pathtool/pathitem.cpp @@ -133,46 +133,7 @@ void PathItem::writePathToProperty() ModelNode pathNode = pathModelNode(formEditorItem()); - RewriterTransaction rewriterTransaction = pathNode.view()->beginRewriterTransaction(QByteArrayLiteral("PathItem::writePathToProperty")); - - QList pathSegmentNodes = pathNode.nodeListProperty("pathElements").toModelNodeList(); - - foreach (ModelNode pathSegment, pathSegmentNodes) - pathSegment.destroy(); - - if (!m_cubicSegments.isEmpty()) { - pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); - pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); - - foreach (const CubicSegment &cubicSegment, m_cubicSegments) { - writePathAttributes(pathNode, cubicSegment.attributes()); - writePathPercent(pathNode, cubicSegment.percent()); - - if (cubicSegment.canBeConvertedToLine()) - writeLinePath(pathNode, cubicSegment); - else if (cubicSegment.canBeConvertedToQuad()) - writeQuadPath(pathNode, cubicSegment); - else - writeCubicPath(pathNode, cubicSegment); - } - - writePathAttributes(pathNode, m_lastAttributes); - writePathPercent(pathNode, m_lastPercent); - } - - rewriterTransaction.commit(); -} - -void PathItem::writePathAsCubicSegmentsOnly() -{ - try { - PathUpdateDisabler pathUpdateDisabler(this); - - ModelNode pathNode = pathModelNode(formEditorItem()); - - RewriterTransaction rewriterTransaction = - pathNode.view()->beginRewriterTransaction(QByteArrayLiteral("PathItem::writePathAsCubicSegmentsOnly")); - + pathNode.view()->executeInTransaction("PathItem::writePathToProperty", [this, &pathNode](){ QList pathSegmentNodes = pathNode.nodeListProperty("pathElements").toModelNodeList(); foreach (ModelNode pathSegment, pathSegmentNodes) @@ -182,21 +143,51 @@ void PathItem::writePathAsCubicSegmentsOnly() pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); - foreach (const CubicSegment &cubicSegment, m_cubicSegments) { writePathAttributes(pathNode, cubicSegment.attributes()); writePathPercent(pathNode, cubicSegment.percent()); - writeCubicPath(pathNode, cubicSegment); + + if (cubicSegment.canBeConvertedToLine()) + writeLinePath(pathNode, cubicSegment); + else if (cubicSegment.canBeConvertedToQuad()) + writeQuadPath(pathNode, cubicSegment); + else + writeCubicPath(pathNode, cubicSegment); } writePathAttributes(pathNode, m_lastAttributes); writePathPercent(pathNode, m_lastPercent); } + }); +} - rewriterTransaction.commit(); - } catch (const RewritingException &e) { - e.showException(); - } +void PathItem::writePathAsCubicSegmentsOnly() +{ + PathUpdateDisabler pathUpdateDisabler(this); + + ModelNode pathNode = pathModelNode(formEditorItem()); + pathNode.view()->executeInTransaction("PathItem::writePathAsCubicSegmentsOnly", [this, &pathNode](){ + + QList pathSegmentNodes = pathNode.nodeListProperty("pathElements").toModelNodeList(); + + foreach (ModelNode pathSegment, pathSegmentNodes) + pathSegment.destroy(); + + if (!m_cubicSegments.isEmpty()) { + pathNode.variantProperty("startX").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().x()); + pathNode.variantProperty("startY").setValue(m_cubicSegments.constFirst().firstControlPoint().coordinate().y()); + + + foreach (const CubicSegment &cubicSegment, m_cubicSegments) { + writePathAttributes(pathNode, cubicSegment.attributes()); + writePathPercent(pathNode, cubicSegment.percent()); + writeCubicPath(pathNode, cubicSegment); + } + + writePathAttributes(pathNode, m_lastAttributes); + writePathPercent(pathNode, m_lastPercent); + } + }); } void PathItem::setFormEditorItem(FormEditorItem *formEditorItem) diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/easingcurvedialog.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/easingcurvedialog.cpp index 844be8e12fa..a069dc187b6 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/easingcurvedialog.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/easingcurvedialog.cpp @@ -202,22 +202,13 @@ bool EasingCurveDialog::apply() msgBox.exec(); return false; } + AbstractView *view = m_frames.first().view(); - try { - AbstractView *view = m_frames.first().view(); - RewriterTransaction transaction(view->beginRewriterTransaction("EasingCurveDialog::apply")); - + return view->executeInTransaction("EasingCurveDialog::apply", [this, view](){ auto expression = m_splineEditor->easingCurve().toString(); for (const auto &frame : m_frames) frame.bindingProperty("easing.bezierCurve").setExpression(expression); - - transaction.commit(); - return true; - } catch (const RewritingException &e) { - e.showException(); - } - - return false; + }); } void EasingCurveDialog::textChanged() diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineactions.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineactions.cpp index 419e9294a2c..4751765874b 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineactions.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineactions.cpp @@ -48,28 +48,18 @@ TimelineActions::TimelineActions() = default; void TimelineActions::deleteAllKeyframesForTarget(const ModelNode &targetNode, const QmlTimeline &timeline) { - try { - RewriterTransaction transaction(targetNode.view()->beginRewriterTransaction( - "TimelineActions::deleteAllKeyframesForTarget")); - + targetNode.view()->executeInTransaction("TimelineActions::deleteAllKeyframesForTarget", [=](){ if (timeline.isValid()) { for (auto frames : timeline.keyframeGroupsForTarget(targetNode)) frames.destroy(); } - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } void TimelineActions::insertAllKeyframesForTarget(const ModelNode &targetNode, const QmlTimeline &timeline) { - try { - RewriterTransaction transaction(targetNode.view()->beginRewriterTransaction( - "TimelineGraphicsScene::insertAllKeyframesForTarget")); - + targetNode.view()->executeInTransaction("TimelineActions::insertAllKeyframesForTarget", [=](){ auto object = QmlObjectNode(targetNode); if (timeline.isValid() && object.isValid()) { for (auto frames : timeline.keyframeGroupsForTarget(targetNode)) { @@ -78,10 +68,7 @@ void TimelineActions::insertAllKeyframesForTarget(const ModelNode &targetNode, } } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } void TimelineActions::copyAllKeyframesForTarget(const ModelNode &targetNode, @@ -117,11 +104,10 @@ void TimelineActions::pasteKeyframesToTarget(const ModelNode &targetNode, pasteModel->detachView(&view); - try { - targetNode.view()->model()->attachView(&view); + view.executeInTransaction("TimelineActions::pasteKeyframesToTarget", [=, &view](){ - RewriterTransaction transaction( - view.beginRewriterTransaction("TimelineActions::pasteKeyframesToTarget")); + + targetNode.view()->model()->attachView(&view); ModelNode nonConstTargetNode = targetNode; nonConstTargetNode.validId(); @@ -144,11 +130,7 @@ void TimelineActions::pasteKeyframesToTarget(const ModelNode &targetNode, timeline.modelNode().defaultNodeListProperty().reparentHere(newNode); } } - - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } } @@ -296,9 +278,7 @@ void TimelineActions::pasteKeyframes(AbstractView *timelineView, const QmlTimeli ModelNode rootNode = view.rootModelNode(); - try { - RewriterTransaction transaction( - timelineView->beginRewriterTransaction("TimelineActions::pasteKeyframes")); + timelineView->executeInTransaction("TimelineActions::pasteKeyframes", [=](){ if (isKeyframe(rootNode)) pasteKeyframe(currentTime, rootNode, timelineView, timeline); else @@ -308,10 +288,7 @@ void TimelineActions::pasteKeyframes(AbstractView *timelineView, const QmlTimeli timelineView, timeline); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } bool TimelineActions::clipboardContainsKeyframes() diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp index eb09492397b..99cc4867101 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinegraphicsscene.cpp @@ -663,26 +663,16 @@ void TimelineGraphicsScene::deleteKeyframeGroup(const ModelNode &group) if (!QmlTimelineKeyframeGroup::isValidQmlTimelineKeyframeGroup(group)) return; - ModelNode nonConst = group; - - try { - RewriterTransaction transaction(timelineView()->beginRewriterTransaction( - "TimelineGraphicsScene::handleKeyframeGroupDeletion")); - + timelineView()->executeInTransaction("TimelineGraphicsScene::handleKeyframeGroupDeletion", [group](){ + ModelNode nonConst = group; nonConst.destroy(); + }); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } } void TimelineGraphicsScene::deleteKeyframes(const QList &frames) { - try { - RewriterTransaction transaction(timelineView()->beginRewriterTransaction( - "TimelineGraphicsScene::handleKeyframeDeletion")); - + timelineView()->executeInTransaction("TimelineGraphicsScene::handleKeyframeDeletion", [frames](){ for (auto keyframe : frames) { if (keyframe.isValid()) { ModelNode frame = keyframe; @@ -692,10 +682,7 @@ void TimelineGraphicsScene::deleteKeyframes(const QList &frames) parent.destroy(); } } - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } void TimelineGraphicsScene::activateLayout() diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinemovetool.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinemovetool.cpp index 49d35b781b9..0384d7c0a31 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinemovetool.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinemovetool.cpp @@ -136,15 +136,12 @@ void TimelineMoveTool::mouseReleaseEvent(TimelineMovableAbstractItem *item, } } - try { - RewriterTransaction transaction(scene()->timelineView()->beginRewriterTransaction( - "TimelineMoveTool::mouseReleaseEvent")); - + scene()->timelineView()->executeInTransaction("TimelineMoveTool::mouseReleaseEvent", [this, current](){ current->commitPosition(mapToItem(current, current->rect().center())); if (current->asTimelineKeyframeItem()) { double frame = std::round( - current->mapFromSceneToFrame(current->rect().center().x())); + current->mapFromSceneToFrame(current->rect().center().x())); scene()->statusBarMessageChanged(QObject::tr("Frame %1").arg(frame)); @@ -152,12 +149,7 @@ void TimelineMoveTool::mouseReleaseEvent(TimelineMovableAbstractItem *item, if (keyframe != current) keyframe->commitPosition(mapToItem(current, keyframe->rect().center())); } - - transaction.commit(); - - } catch (const Exception &e) { - e.showException(); - } + }); } } diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinepropertyitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinepropertyitem.cpp index d0b89dfef4d..beeca23183b 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinepropertyitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinepropertyitem.cpp @@ -534,15 +534,9 @@ void TimelineKeyframeItem::commitPosition(const QPointF &point) blockUpdates(); - try { - RewriterTransaction transaction( - m_frame.view()->beginRewriterTransaction("TimelineKeyframeItem::commitPosition")); - + m_frame.view()->executeInTransaction("TimelineKeyframeItem::commitPosition", [this, frame](){ m_frame.variantProperty("frame").setValue(frame); - transaction.commit(); - } catch (const RewritingException &e) { - e.showException(); - } + }); enableUpdates(); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp index 32012dd145c..7bd784a7dd8 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesectionitem.cpp @@ -821,20 +821,15 @@ void TimelineBarItem::commitPosition(const QPointF & /*point*/) { if (sectionItem()->view()) { if (m_handle != Location::Undefined) { - qreal scaleFactor = rect().width() / m_oldRect.width(); + sectionItem()->view()->executeInTransaction("TimelineBarItem::commitPosition", [this](){ + qreal scaleFactor = rect().width() / m_oldRect.width(); - qreal moved = (rect().topLeft().x() - m_oldRect.topLeft().x()) / rulerScaling(); - qreal supposedFirstFrame = qRound(sectionItem()->firstFrame() + moved); + qreal moved = (rect().topLeft().x() - m_oldRect.topLeft().x()) / rulerScaling(); + qreal supposedFirstFrame = qRound(sectionItem()->firstFrame() + moved); - try { - RewriterTransaction transaction(sectionItem()->view()->beginRewriterTransaction( - "TimelineBarItem::commitPosition")); sectionItem()->scaleAllFrames(scaleFactor); sectionItem()->moveAllFrames(supposedFirstFrame - sectionItem()->firstFrame()); - transaction.commit(); - } catch (const RewritingException &e) { - e.showException(); - } + }); } } diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesettingsmodel.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesettingsmodel.cpp index 47426d97551..f75d1299839 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesettingsmodel.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelinesettingsmodel.cpp @@ -266,15 +266,13 @@ ModelNode TimelineSettingsModel::animationForTimelineAndState(const QmlTimeline void TimelineSettingsModel::updateTimeline(int row) { - QmlModelState modelState(stateForRow(row)); - QmlTimeline timeline(timelineForRow(row)); - ModelNode animation(animationForRow(row)); - QmlTimeline oldTimeline = timelineView()->timelineForState(modelState); - RewriterTransaction transaction = timelineView()->beginRewriterTransaction( - QByteArrayLiteral("TimelineSettingsModel::updateTimeline")); + timelineView()->executeInTransaction("TimelineSettingsModel::updateTimeline", [this, row](){ + QmlModelState modelState(stateForRow(row)); + QmlTimeline timeline(timelineForRow(row)); + ModelNode animation(animationForRow(row)); + QmlTimeline oldTimeline = timelineView()->timelineForState(modelState); - try { if (modelState.isBaseState()) { if (oldTimeline.isValid()) oldTimeline.modelNode().variantProperty("enabled").setValue(false); @@ -301,27 +299,20 @@ void TimelineSettingsModel::updateTimeline(int row) propertyChanges.modelNode().variantProperty("enabled").setValue(true); } } - - } catch (Exception &e) { - m_exceptionError = e.description(); - QTimer::singleShot(200, this, &TimelineSettingsModel::handleException); - } + }); resetRow(row); } void TimelineSettingsModel::updateAnimation(int row) { - QmlModelState modelState(stateForRow(row)); - QmlTimeline timeline(timelineForRow(row)); - ModelNode animation(animationForRow(row)); - QmlTimeline oldTimeline = timelineView()->timelineForState(modelState); - ModelNode oldAnimation = animationForTimelineAndState(oldTimeline, modelState); + timelineView()->executeInTransaction("TimelineSettingsModel::updateAnimation", [this, row](){ + QmlModelState modelState(stateForRow(row)); + QmlTimeline timeline(timelineForRow(row)); + ModelNode animation(animationForRow(row)); + QmlTimeline oldTimeline = timelineView()->timelineForState(modelState); + ModelNode oldAnimation = animationForTimelineAndState(oldTimeline, modelState); - RewriterTransaction transaction = timelineView()->beginRewriterTransaction( - QByteArrayLiteral("TimelineSettingsModel::updateAnimation")); - - try { if (modelState.isBaseState()) { if (oldAnimation.isValid()) oldAnimation.variantProperty("running").setValue(false); @@ -353,27 +344,20 @@ void TimelineSettingsModel::updateAnimation(int row) propertyChanges.modelNode().variantProperty("running").setValue(true); } } - } catch (Exception &e) { - m_exceptionError = e.description(); - QTimer::singleShot(200, this, &TimelineSettingsModel::handleException); - } - + }); resetRow(row); } void TimelineSettingsModel::updateFixedFrameRow(int row) { - QmlModelState modelState(stateForRow(row)); - QmlTimeline timeline(timelineForRow(row)); + timelineView()->executeInTransaction("TimelineSettingsModel::updateFixedFrameRow", [this, row](){ + QmlModelState modelState(stateForRow(row)); + QmlTimeline timeline(timelineForRow(row)); - ModelNode animation = animationForTimelineAndState(timeline, modelState); + ModelNode animation = animationForTimelineAndState(timeline, modelState); - RewriterTransaction transaction = timelineView()->beginRewriterTransaction( - QByteArrayLiteral("TimelineSettingsModel::updateFixedFrameRow")); + int fixedFrame = fixedFrameForRow(row); - int fixedFrame = fixedFrameForRow(row); - - try { if (modelState.isBaseState()) { if (animation.isValid()) animation.variantProperty("running").setValue(false); @@ -390,10 +374,8 @@ void TimelineSettingsModel::updateFixedFrameRow(int row) if (propertyChanges.isValid()) propertyChanges.modelNode().variantProperty("currentFrame").setValue(fixedFrame); } - } catch (Exception &e) { - m_exceptionError = e.description(); - QTimer::singleShot(200, this, &TimelineSettingsModel::handleException); - } + + }); resetRow(row); } diff --git a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp index 653ed27ba75..f39a17db2ff 100644 --- a/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp +++ b/src/plugins/qmldesigner/qmldesignerextension/timelineeditor/timelineview.cpp @@ -264,9 +264,7 @@ const QmlTimeline TimelineView::addNewTimeline() ModelNode timelineNode; - try { - RewriterTransaction transaction(beginRewriterTransaction("TimelineView::addNewTimeline")); - + executeInTransaction("TimelineView::addNewTimeline", [=, &timelineNode](){ bool hasTimelines = getTimelines().isEmpty(); timelineNode = createModelNode(timelineType, @@ -279,10 +277,7 @@ const QmlTimeline TimelineView::addNewTimeline() timelineNode.variantProperty("enabled").setValue(hasTimelines); rootModelNode().defaultNodeListProperty().reparentHere(timelineNode); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); return QmlTimeline(timelineNode); } @@ -300,10 +295,8 @@ ModelNode TimelineView::addAnimation(QmlTimeline timeline) QTC_ASSERT(metaInfo.isValid(), return ModelNode()); ModelNode animationNode; - try { - RewriterTransaction transaction( - beginRewriterTransaction("TimelineSettingsDialog::addAnimation")); + executeInTransaction("TimelineView::addAnimation", [=, &animationNode](){ animationNode = createModelNode(animationType, metaInfo.majorVersion(), metaInfo.minorVersion()); @@ -321,10 +314,7 @@ ModelNode TimelineView::addAnimation(QmlTimeline timeline) if (timeline.modelNode().hasProperty("currentFrame")) timeline.modelNode().removeProperty("currentFrame"); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); return animationNode; } @@ -390,28 +380,23 @@ void TimelineView::insertKeyframe(const ModelNode &target, const PropertyName &p QmlTimeline timeline = widget()->graphicsScene()->currentTimeline(); ModelNode targetNode = target; if (timeline.isValid() && targetNode.isValid() - && QmlObjectNode::isValidQmlObjectNode(targetNode)) { - try { - RewriterTransaction transaction( - beginRewriterTransaction("TimelineView::insertKeyframe")); + && QmlObjectNode::isValidQmlObjectNode(targetNode)) { + executeInTransaction("TimelineView::insertKeyframe", [=, &timeline, &targetNode](){ targetNode.validId(); QmlTimelineKeyframeGroup timelineFrames( - timeline.keyframeGroup(targetNode, propertyName)); + timeline.keyframeGroup(targetNode, propertyName)); QTC_ASSERT(timelineFrames.isValid(), return ); const qreal frame - = timeline.modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); + = timeline.modelNode().auxiliaryData("currentFrame@NodeInstance").toReal(); const QVariant value = QmlObjectNode(targetNode).instanceValue(propertyName); timelineFrames.setValue(value, frame); - transaction.commit(); - } catch (const Exception &e) { - e.showException(); - } + }); } } From 52ddea91eec97293cb44d4f49fac320b1f3cc47c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 5 Jun 2019 18:05:52 +0200 Subject: [PATCH 08/57] QmlDesigner: Add missing properties to LineEdit and ComboBox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I7e9a9159aa75973f04a660a16c2d00aa294ab944 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ComboBox.qml | 4 ++++ .../imports/HelperWidgets/LineEdit.qml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml index 18f30dce1c3..65178606324 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ComboBox.qml @@ -45,6 +45,8 @@ Controls.ComboBox { property bool block: false + property bool showExtendedFunctionButton: true + ExtendedFunctionLogic { id: extFuncLogic backendValue: comboBox.backendValue @@ -54,6 +56,8 @@ Controls.ComboBox { actionIndicator.icon.text: extFuncLogic.glyph actionIndicator.onClicked: extFuncLogic.show() + actionIndicator.visible: showExtendedFunctionButton + ColorLogic { id: colorLogic backendValue: comboBox.backendValue diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml index 18b25924b3f..0dfa558c09e 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/LineEdit.qml @@ -45,6 +45,8 @@ Controls.TextField { property bool showExtendedFunctionButton: true + actionIndicator.visible: showExtendedFunctionButton + signal commitData property string context From 14ede3af6f1a2f5f3c6d74c56753f06085672dcf Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 5 Jun 2019 18:04:00 +0200 Subject: [PATCH 09/57] QmlDesigner: Use new controls for GradientPropertySpinBox Change-Id: I30175e89f375cd6dc56a255d195c1788aa873577 Reviewed-by: Thomas Hartmann --- .../HelperWidgets/GradientPropertySpinBox.qml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml index 4ca86b097d3..54483e1598c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml @@ -25,20 +25,20 @@ import QtQuick 2.1 import QtQuick.Layouts 1.0 -import QtQuick.Controls 1.0 as Controls import QtQuickDesignerTheme 1.0 -import QtQuick.Controls.Styles 1.1 +import StudioControls 1.0 as StudioControls -DoubleSpinBox { +StudioControls.SpinBox { id: spinBox width: 82 Layout.minimumWidth: 82 property string propertyName + actionIndicatorVisible: false - minimumValue: -9999 - maximumValue: 9999 + from: -9999 + to: 9999 Component.onCompleted: spinBox.value = gradientLine.model.readGradientProperty(propertyName) - onValueChanged: gradientLine.model.setGradientProperty(propertyName, spinBox.value) + onCompressedValueModified: gradientLine.model.setGradientProperty(propertyName, spinBox.value) stepSize: 1 } From fc711ed66fa4b0f22cc85942e62997340d019667 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 5 Jun 2019 18:05:22 +0200 Subject: [PATCH 10/57] QmlDesigner: Implement DoubleSpinBox with new controls Change-Id: Icf42b8633df2f9b35bafe92a3fde4cdbb03cbf72 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/DoubleSpinBox.qml | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml index ca789fab43d..b8b536799dc 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml @@ -24,20 +24,38 @@ ****************************************************************************/ import QtQuick 2.1 -import QtQuick.Controls 1.0 import QtQuickDesignerTheme 1.0 +import StudioControls 1.0 as StudioControls -SpinBox { +StudioControls.SpinBox { id: spinBox width: 76 decimals: 2 + + property real minimumValue: 0.0 + property real maximumValue: 1.0 stepSize: 0.1 - minimumValue: 0 - maximumValue: 1 - property color textColor: Theme.color(Theme.PanelTextColorLight) + actionIndicatorVisible: false - style: CustomSpinBoxStyle { + property bool __initialized: false + Component.onCompleted: { + spinBox.__initialized = true + + convert("stepSize", stepSize) + convert("from", minimumValue) + convert("to", maximumValue) } + + onStepSizeChanged: convert("stepSize", stepSize) + onMinimumValueChanged: convert("from", minimumValue) + onMaximumValueChanged: convert("to", maximumValue) + + function convert(target, value) { + if (!spinBox.__initialized) + return + spinBox[target] = Math.round(value * spinBox.factor) + } + } From d9b82138565926ac25a0dc09b5f2b613107c0ad9 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 5 Jun 2019 18:06:25 +0200 Subject: [PATCH 11/57] QmlDesigner: Use new controls for font section MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I53041a989f71f990c6051b87d84631c3e94a0f34 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/FontSection.qml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml index 10d562da158..b9b75ce69e3 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml @@ -26,7 +26,7 @@ import QtQuick 2.1 import HelperWidgets 2.0 import QtQuick.Layouts 1.0 -import QtQuick.Controls 1.0 as Controls +import StudioControls 1.0 as StudioControls import QtQuickDesignerTheme 1.0 Section { @@ -111,11 +111,13 @@ Section { } } - Controls.ComboBox { + StudioControls.ComboBox { id: sizeType model: ["pixels", "points"] property color textColor: Theme.color(Theme.PanelTextColorLight) - onCurrentIndexChanged: { + actionIndicatorVisible: false + + onActivated: { if (sizeWidget.isSetup) return; if (currentText == "pixels") { @@ -128,10 +130,6 @@ Section { } Layout.fillWidth: true - - style: CustomComboBoxStyle { - } - } } From 726c51eb8cb8488fe503ac9cfe053f447d00a175 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Wed, 5 Jun 2019 18:06:50 +0200 Subject: [PATCH 12/57] QmlDesigner: Use onCompressedValueModified MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I7ebe5a8db4b78ac086d0301f6d6d84fb99c83cda Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ColorButton.qml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml index c7d6435ad10..62ca268e14b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml @@ -281,7 +281,7 @@ Item { maximumValue: 255 decimals: 0 - onValueChanged: { + onCompressedValueModified: { if (color.r !== value && !colorButton.block) { color.r = (value / 255.0) colorButton.clicked() @@ -310,7 +310,7 @@ Item { maximumValue: 255 decimals: 0 - onValueChanged: { + onCompressedValueModified: { if (color.g !== value && !colorButton.block) { color.g = (value / 255.0) colorButton.clicked() @@ -338,7 +338,7 @@ Item { maximumValue: 255 decimals: 0 - onValueChanged: { + onCompressedValueModified: { if (color.b !== value && !colorButton.block) { color.b = (value / 255.0) colorButton.clicked() @@ -361,7 +361,7 @@ Item { DoubleSpinBox { id: alphaSlider width: 64 - onValueChanged: { + onCompressedValueModified: { if (colorButton.alpha !== value && !colorButton.block) { colorButton.alpha = value colorButton.clicked() @@ -387,7 +387,7 @@ Item { DoubleSpinBox { id: hueSlider2 width: 64 - onValueChanged: { + onCompressedValueModified: { if (colorButton.hue !== value && !colorButton.block) { colorButton.hue = value colorButton.clicked() @@ -410,7 +410,7 @@ Item { DoubleSpinBox { id: saturationSlider width: 64 - onValueChanged: { + onCompressedValueModified: { if (colorButton.saturation !== value && !colorButton.block) { colorButton.saturation = value colorButton.clicked() @@ -432,7 +432,7 @@ Item { DoubleSpinBox { id: lightnessSlider width: 64 - onValueChanged: { + onCompressedValueModified: { if (colorButton.lightness !== value && !colorButton.block) { colorButton.lightness = value colorButton.clicked() From 4edfa4c740fa93700f18246a20aee805030ed700 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 14:52:40 +0200 Subject: [PATCH 13/57] QmlDesigner: Use new controls for FontComboBox Change-Id: I72946b4adb8e160c05191da0c96011881cd09543 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/FontComboBox.qml | 24 ++++++++++--------- .../imports/HelperWidgets/FontSection.qml | 1 + 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml index 6cca085da75..4f085015fed 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml @@ -26,14 +26,16 @@ import QtQuick 2.1 import HelperWidgets 2.0 import QtQuick.Layouts 1.0 -import QtQuick.Controls 1.0 as Controls +import StudioControls 1.0 as StudioControls -Controls.ComboBox { +StudioControls.ComboBox { id: comboBox property variant backendValue property color textColor: colorLogic.textColor + labelColor: colorLogic.textColor + onTextColorChanged: setColor() editable: true @@ -43,10 +45,17 @@ Controls.ComboBox { editText = comboBox.backendValue.valueToString } - style: CustomComboBoxStyle { - textColor: comboBox.textColor + ExtendedFunctionLogic { + id: extFuncLogic + backendValue: comboBox.backendValue } + actionIndicator.icon.color: extFuncLogic.color + actionIndicator.icon.text: extFuncLogic.glyph + actionIndicator.onClicked: extFuncLogic.show() + + actionIndicator.visible: showExtendedFunctionButton + ColorLogic { id: colorLogic backendValue: comboBox.backendValue @@ -82,13 +91,6 @@ Controls.ComboBox { backendValue.value = indexText; } - ExtendedFunctionButton { - x: 2 - anchors.verticalCenter: parent.verticalCenter - backendValue: comboBox.backendValue - visible: comboBox.enabled - } - Connections { target: modelNodeBackend onSelectionChanged: { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml index b9b75ce69e3..28621e4be6c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontSection.qml @@ -63,6 +63,7 @@ Section { FontComboBox { backendValue: fontSection.fontFamily Layout.fillWidth: true + width: 160 } Label { From b6703b989db210c3ccd0f8de6f1b2711529cf187 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 10:52:44 +0200 Subject: [PATCH 14/57] QmlDesigner: Remove focus when clicking outside MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I400401c547461cfca22f7af026cf9c33704e8f6a Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml | 4 ++++ .../imports/HelperWidgets/ToolTipArea.qml | 2 ++ 2 files changed, 6 insertions(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml index 2b97be28f31..5d6a6fa1f19 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml @@ -33,6 +33,10 @@ Rectangle { width: 320 height: 400 color: Theme.qmlDesignerBackgroundColorDarkAlternate() + MouseArea { + anchors.fill: parent + onClicked: forceActiveFocus() + } ScrollView { anchors.fill: parent diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ToolTipArea.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ToolTipArea.qml index 9b51f1f4d32..df39546d93c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ToolTipArea.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ToolTipArea.qml @@ -34,6 +34,8 @@ MouseArea { onExited: Tooltip.hideText() onCanceled: Tooltip.hideText() + onClicked: forceActiveFocus() + hoverEnabled: true property string tooltip From 98f6c55653a96aaa55f15f62d55dcceae2c695bb Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 10:53:42 +0200 Subject: [PATCH 15/57] QmlDesigner: Set proper closePolicy for Menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is required for macOS. Change-Id: Ib0631583104a46a3828529ac4a64adbe7cbfd774 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../propertyEditorQmlSources/imports/StudioControls/Menu.qml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml index f9db27c6ac0..5b0bc5875ac 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml @@ -41,6 +41,9 @@ T.Menu { margins: 0 overlap: 1 + + closePolicy: T.Popup.CloseOnPressOutside | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnEscape + padding: 0 delegate: MenuItem { From 68a6c5dfd96e8c9474ef0eba2da4427085d39fc5 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 14:53:21 +0200 Subject: [PATCH 16/57] QmlDesigner: Use sliderIndicatorVisible for some properties MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I5827bd15c42f65f23f8b47a0f110c37311d26631 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../propertyEditorQmlSources/QtQuick/AdvancedSection.qml | 9 ++++++--- .../propertyEditorQmlSources/QtQuick/ItemPane.qml | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml index 3cf02f122eb..6d9c073c77a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/AdvancedSection.qml @@ -49,13 +49,14 @@ Section { SecondColumnLayout { SpinBox { + sliderIndicatorVisible: true backendValue: backendValues.scale hasSlider: true decimals: 2 minimumValue: 0.01 stepSize: 0.1 maximumValue: 10 - Layout.preferredWidth: 100 + Layout.preferredWidth: 140 } ExpandingSpacer { } @@ -65,12 +66,13 @@ Section { } SecondColumnLayout { SpinBox { + sliderIndicatorVisible: true backendValue: backendValues.rotation hasSlider: true decimals: 2 minimumValue: -360 maximumValue: 360 - Layout.preferredWidth: 100 + Layout.preferredWidth: 140 } ExpandingSpacer { } @@ -80,11 +82,12 @@ Section { } SecondColumnLayout { SpinBox { + sliderIndicatorVisible: true backendValue: backendValues.z hasSlider: true minimumValue: -100 maximumValue: 100 - Layout.preferredWidth: 100 + Layout.preferredWidth: 140 } ExpandingSpacer { } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml index 5d6a6fa1f19..0f1e828431f 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/ItemPane.qml @@ -188,6 +188,7 @@ Rectangle { SecondColumnLayout { SpinBox { + sliderIndicatorVisible: true backendValue: backendValues.opacity decimals: 2 From 1435d43f20515352dd8b4848db99cb0b349ebfac Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 14:51:20 +0200 Subject: [PATCH 17/57] QmlDesigner: Add sliderIndicatorVisible to SpinBox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I6a136b537a755a63350514ce2e2d5d42f93c503b Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml index 196974d1038..54578d012b7 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml @@ -38,6 +38,7 @@ Item { property real stepSize: 1.0 property alias backendValue: spinBox.backendValue + property alias sliderIndicatorVisible: spinBox.sliderIndicatorVisible width: 120 implicitHeight: spinBox.height From 422553ca2f57d8e83ce26d3af5f4b7376bb137af Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 14:51:54 +0200 Subject: [PATCH 18/57] QmlDesigner: Add ExtendedFunctionLogic to qmldir MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I6888ecba5994f42a6f7c3d0b878b4c26a6cf35d0 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../propertyEditorQmlSources/imports/HelperWidgets/qmldir | 1 + 1 file changed, 1 insertion(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir index 9480f1d9a3a..007fb08d493 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/qmldir @@ -17,6 +17,7 @@ CustomComboBoxStyle 2.0 CustomComboBoxStyle.qml CustomSpinBoxStyle 2.0 CustomSpinBoxStyle.qml ExpandingSpacer 2.0 ExpandingSpacer.qml ExtendedFunctionButton 2.0 ExtendedFunctionButton.qml +ExtendedFunctionLogic 2.0 ExtendedFunctionLogic.qml FlickableSection 2.0 FlickableSection.qml FontComboBox 2.0 FontComboBox.qml FontSection 2.0 FontSection.qml From fed8f7745cba553b3c70d6d1b3d4b93ea301b3eb Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 15:59:26 +0200 Subject: [PATCH 19/57] QmlDesigner: Fix hasSlider: in SpinBox This property exists for compatibility reasons. Change-Id: I25a4454da953f0b7165e1ef5aeeba28e9ab1087a Reviewed-by: Thomas Hartmann --- .../propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml index 54578d012b7..29ef06451ce 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml @@ -68,7 +68,7 @@ Item { property real realValue: value / factor property variant backendValue - property bool hasSlider: false + property bool hasSlider: wrapper.sliderIndicatorVisible from: minimumValue * factor to: maximumValue * factor From 6b82dd201feeab41add8b4cd99c399beeb7e8278 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 15:58:45 +0200 Subject: [PATCH 20/57] QmlDesigner: Fix QML warning Change-Id: Ic5fae60c8efb9009c310d558f3dc9629822a40f7 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/FontComboBox.qml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml index 4f085015fed..16de1a90ef7 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/FontComboBox.qml @@ -54,6 +54,8 @@ StudioControls.ComboBox { actionIndicator.icon.text: extFuncLogic.glyph actionIndicator.onClicked: extFuncLogic.show() + property bool showExtendedFunctionButton: true + actionIndicator.visible: showExtendedFunctionButton ColorLogic { From 9f0a0cd8c6debb707b44e84dc66a542f9d779854 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 16:00:35 +0200 Subject: [PATCH 21/57] QmlDesigner: Add wrapper pattern to DoubleSpinBox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is unfortunately required for step size. We need real in the API while QQC2 has int. Change-Id: I162c13a3edc24c34271a1dbf8e19f55b9fe2d034 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/DoubleSpinBox.qml | 80 +++++++++++++------ 1 file changed, 57 insertions(+), 23 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml index b8b536799dc..f64b4fc6fd0 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml @@ -27,35 +27,69 @@ import QtQuick 2.1 import QtQuickDesignerTheme 1.0 import StudioControls 1.0 as StudioControls -StudioControls.SpinBox { - id: spinBox - width: 76 - decimals: 2 +Item { + id: wrapper + + property alias decimals: spinBox.decimals + property alias hasSlider: spinBox.hasSlider property real minimumValue: 0.0 property real maximumValue: 1.0 - stepSize: 0.1 + property real stepSize: 0.1 - actionIndicatorVisible: false + property alias sliderIndicatorVisible: spinBox.sliderIndicatorVisible - property bool __initialized: false + property real value - Component.onCompleted: { - spinBox.__initialized = true + onValueChanged: spinBox.value = wrapper.value * spinBox.factor + + signal compressedValueModified + signal valueModified + + width: 90 + implicitHeight: spinBox.height + + onStepSizeChanged: spinBox.convert("stepSize", wrapper.stepSize) + onMinimumValueChanged: spinBox.convert("from", wrapper.minimumValue) + onMaximumValueChanged: spinBox.convert("to", wrapper.maximumValue) + + StudioControls.SpinBox { + id: spinBox + + onValueModified: wrapper.valueModified() + onCompressedValueModified: wrapper.compressedValueModified() + + onValueChanged: { + if (spinBox.__initialized) + wrapper.value = spinBox.value / spinBox.factor + } + + width: wrapper.width + decimals: 2 + + actionIndicatorVisible: false + + property bool __initialized: false + + property bool hasSlider: spinBox.sliderIndicatorVisible + + Component.onCompleted: { + spinBox.__initialized = true + + spinBox.convert("stepSize", wrapper.stepSize) + spinBox.convert("from", wrapper.minimumValue) + spinBox.convert("to", wrapper.maximumValue) + + spinBox.value = wrapper.value * spinBox.factor + + print("complete " + spinBox.value) + } + + function convert(target, value) { + if (!spinBox.__initialized) + return + spinBox[target] = Math.round(value * spinBox.factor) + } - convert("stepSize", stepSize) - convert("from", minimumValue) - convert("to", maximumValue) } - - onStepSizeChanged: convert("stepSize", stepSize) - onMinimumValueChanged: convert("from", minimumValue) - onMaximumValueChanged: convert("to", maximumValue) - - function convert(target, value) { - if (!spinBox.__initialized) - return - spinBox[target] = Math.round(value * spinBox.factor) - } - } From cd42ebb840b1711ac85fe47560718f74afc6030c Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 17:36:32 +0200 Subject: [PATCH 22/57] QmlDesigner: Use new controls in UrlChooser MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I07e6110f4e2d2c7458860db0432fb58afacf7015 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/UrlChooser.qml | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml index 0c89aa119e2..d4b59a32d9d 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/UrlChooser.qml @@ -25,7 +25,7 @@ import QtQuick 2.1 import HelperWidgets 2.0 -import QtQuick.Controls 1.1 as Controls +import StudioControls 1.0 as StudioControls import QtQuick.Layouts 1.0 import QtQuick.Controls.Styles 1.1 @@ -49,14 +49,16 @@ RowLayout { backendValue: urlChooser.backendValue } - Controls.ComboBox { + StudioControls.ComboBox { id: comboBox - ExtendedFunctionButton { - x: 2 - anchors.verticalCenter: parent.verticalCenter - backendValue: urlChooser.backendValue - visible: urlChooser.enabled + actionIndicator.icon.color: extFuncLogic.color + actionIndicator.icon.text: extFuncLogic.glyph + actionIndicator.onClicked: extFuncLogic.show() + + ExtendedFunctionLogic { + id: extFuncLogic + backendValue: comboBox.backendValue } property bool isComplete: false @@ -86,9 +88,6 @@ RowLayout { Layout.fillWidth: true editable: true - style: CustomComboBoxStyle { - textColor: urlChooser.textColor - } model: fileModel.fileModel From 641cc7ee0650b64de042a7d41a88832838ba36f9 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 17:36:59 +0200 Subject: [PATCH 23/57] QmlDesigner: Use new controls in TargetComboBox MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: I8f65e673843c119de1f910b7e2c4d35fccfd8a94 Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../QtQuick/TargetComboBox.qml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TargetComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TargetComboBox.qml index 1e823bdeb02..b500f8c6a7b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TargetComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/QtQuick/TargetComboBox.qml @@ -26,14 +26,16 @@ import QtQuick 2.0 import HelperWidgets 2.0 import QtQuick.Layouts 1.0 -import QtQuick.Controls 1.0 as Controls +import StudioControls 1.0 as StudioControls import QtQuickDesignerTheme 1.0 -Controls.ComboBox { +StudioControls.ComboBox { property string targetName: anchorBackend.topTarget property color textColor: Theme.color(Theme.PanelTextColorLight) + actionIndicatorVisible: false + id: targetComboBox Connections { @@ -50,8 +52,4 @@ Controls.ComboBox { } model: anchorBackend.possibleTargetItems - - style: CustomComboBoxStyle { - textColor: targetComboBox.textColor - } } From 7459afaf3c2aac2098be1995203f712544d50cb2 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 17:46:35 +0200 Subject: [PATCH 24/57] QmlDesigner: Remove print MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change-Id: Iadf0a1343974eb034ecca1e5b64b90b4a525849f Reviewed-by: Henning Gründl Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/DoubleSpinBox.qml | 2 -- 1 file changed, 2 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml index f64b4fc6fd0..5b368565aea 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/DoubleSpinBox.qml @@ -81,8 +81,6 @@ Item { spinBox.convert("to", wrapper.maximumValue) spinBox.value = wrapper.value * spinBox.factor - - print("complete " + spinBox.value) } function convert(target, value) { From 6fd355b84b48682012c3914d264848084fe7b230 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Wed, 5 Jun 2019 09:26:12 +0200 Subject: [PATCH 25/57] TextEditor: force rehighlight of next block if state changed If the user state of a block changes while it gets highlighted the next block will be rehighlighted too. Currently we store the indentation depth in the block user state. So in order to store the indentation depth _and_ the information whether the next block needs to be rehighlighted we bit shift the indentation depth via the brace depth helper functions from TextDocumentLayaout. And we cannot store the struct KSyntaxHighlighting::State in the block user state (int) directly to indicate that the next block also needs a rehighlight so we toggle just the last bit of the user state. Fixes: QTCREATORBUG-22290 Change-Id: I632f4416a725dc5fa1667bcab34fb2701294c9b8 Reviewed-by: Christian Stenger --- src/plugins/texteditor/highlighter.cpp | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/plugins/texteditor/highlighter.cpp b/src/plugins/texteditor/highlighter.cpp index 07ec2fcf964..ee958795ae5 100644 --- a/src/plugins/texteditor/highlighter.cpp +++ b/src/plugins/texteditor/highlighter.cpp @@ -274,9 +274,9 @@ void Highlighter::highlightBlock(const QString &text) { if (!definition().isValid()) return; - const QTextBlock block = currentBlock(); + QTextBlock block = currentBlock(); KSyntaxHighlighting::State state; - setCurrentBlockState(qMax(0, previousBlockState())); + TextDocumentLayout::setBraceDepth(block, TextDocumentLayout::braceDepth(block.previous())); if (TextBlockUserData *data = TextDocumentLayout::testUserData(block)) { state = data->syntaxState(); data->setFoldingStartIncluded(false); @@ -298,8 +298,11 @@ void Highlighter::highlightBlock(const QString &text) if (nextBlock.isValid()) { TextBlockUserData *data = TextDocumentLayout::userData(nextBlock); - data->setSyntaxState(state); - data->setFoldingIndent(currentBlockState()); + if (data->syntaxState() != state) { + data->setSyntaxState(state); + setCurrentBlockState(currentBlockState() ^ 1); // force rehighlight of next block + } + data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); } formatSpaces(text); @@ -316,24 +319,24 @@ void Highlighter::applyFolding(int offset, { if (!region.isValid()) return; - const QTextBlock &block = currentBlock(); + QTextBlock block = currentBlock(); const QString &text = block.text(); TextBlockUserData *data = TextDocumentLayout::userData(currentBlock()); const bool fromStart = TabSettings::firstNonSpace(text) == offset; const bool toEnd = (offset + length) == (text.length() - TabSettings::trailingWhitespaces(text)); if (region.type() == KSyntaxHighlighting::FoldingRegion::Begin) { - setCurrentBlockState(currentBlockState() + 1); + TextDocumentLayout::changeBraceDepth(block, 1); // if there is only a folding begin in the line move the current block into the fold if (fromStart && toEnd) { - data->setFoldingIndent(currentBlockState()); + data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); data->setFoldingStartIncluded(true); } } else if (region.type() == KSyntaxHighlighting::FoldingRegion::End) { - setCurrentBlockState(qMax(0, currentBlockState() - 1)); + TextDocumentLayout::changeBraceDepth(block, -1); // if the folding end is at the end of the line move the current block into the fold if (toEnd) data->setFoldingEndIncluded(true); else - data->setFoldingIndent(currentBlockState()); + data->setFoldingIndent(TextDocumentLayout::braceDepth(block)); } } From 12038dd01291bec3d01ea55311ff1f8b9001e742 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 24 May 2019 14:34:01 +0200 Subject: [PATCH 26/57] AutoTest: Enhance reporting passes and fails Depending on the report and log level of Boost UTF the number of test passes and fails might be wrong. Circumvent by providing a way to report a summary. Change-Id: I6d2cb7674550f10a0263e08d21cce42569f3d7a8 Reviewed-by: David Schulz --- src/plugins/autotest/testoutputreader.h | 3 +++ src/plugins/autotest/testresultmodel.cpp | 25 ++++++++++++++++++++++-- src/plugins/autotest/testresultmodel.h | 5 +++-- src/plugins/autotest/testrunner.cpp | 3 +++ src/plugins/autotest/testrunner.h | 1 + 5 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/plugins/autotest/testoutputreader.h b/src/plugins/autotest/testoutputreader.h index b78f9cbecbd..87216a2570c 100644 --- a/src/plugins/autotest/testoutputreader.h +++ b/src/plugins/autotest/testoutputreader.h @@ -48,6 +48,8 @@ public: void createAndReportResult(const QString &message, ResultType type); bool hadValidOutput() const { return m_hadValidOutput; } int disabledTests() const { return m_disabled; } + bool hasSummary() const { return !m_summary.isEmpty(); } + QHash summary() const { return m_summary; } void setId(const QString &id) { m_id = id; } QString id() const { return m_id; } @@ -64,6 +66,7 @@ protected: QProcess *m_testApplication; // not owned QString m_buildDir; QString m_id; + QHash m_summary; int m_disabled = -1; private: bool m_hadValidOutput = false; diff --git a/src/plugins/autotest/testresultmodel.cpp b/src/plugins/autotest/testresultmodel.cpp index 874e813660e..f07bc5f0085 100644 --- a/src/plugins/autotest/testresultmodel.cpp +++ b/src/plugins/autotest/testresultmodel.cpp @@ -23,10 +23,11 @@ ** ****************************************************************************/ +#include "testresultmodel.h" #include "autotesticons.h" #include "autotestplugin.h" #include "testresultdelegate.h" -#include "testresultmodel.h" +#include "testrunner.h" #include "testsettings.h" #include @@ -220,6 +221,10 @@ QString TestResultItem::resultString() const TestResultModel::TestResultModel(QObject *parent) : Utils::TreeModel(new TestResultItem(TestResultPtr()), parent) { + connect(TestRunner::instance(), &TestRunner::reportSummary, + this, [this](const QString &id, const QHash &summary){ + m_reportedSummary.insert(id, summary); + }); } void TestResultModel::updateParent(const TestResultItem *item) @@ -256,7 +261,7 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx return; } - m_testResultCount[testResult->result()]++; + m_testResultCount[testResult->id()][testResult->result()]++; TestResultItem *newItem = new TestResultItem(testResult); TestResultItem *root = nullptr; @@ -314,6 +319,7 @@ void TestResultModel::clearTestResults() { clear(); m_testResultCount.clear(); + m_reportedSummary.clear(); m_disabled = 0; m_fileNames.clear(); m_maxWidthOfFileName = 0; @@ -363,6 +369,21 @@ int TestResultModel::maxWidthOfLineNumber(const QFont &font) return m_widthOfLineNumber; } +int TestResultModel::resultTypeCount(ResultType type) const +{ + int result = 0; + + for (auto resultsForId : m_testResultCount.values()) + result += resultsForId.value(type, 0); + + for (auto id : m_reportedSummary.keys()) { + if (int counted = m_testResultCount.value(id).value(type)) + result -= counted; + result += m_reportedSummary[id].value(type); + } + return result; +} + TestResultItem *TestResultModel::findParentItemFor(const TestResultItem *item, const TestResultItem *startItem) const { diff --git a/src/plugins/autotest/testresultmodel.h b/src/plugins/autotest/testresultmodel.h index 38c880003b6..6370296ac04 100644 --- a/src/plugins/autotest/testresultmodel.h +++ b/src/plugins/autotest/testresultmodel.h @@ -84,7 +84,7 @@ public: int maxWidthOfFileName(const QFont &font); int maxWidthOfLineNumber(const QFont &font); - int resultTypeCount(ResultType type) const { return m_testResultCount.value(type, 0); } + int resultTypeCount(ResultType type) const; int disabledTests() const { return m_disabled; } void raiseDisabledTests(int amount) { m_disabled += amount; } @@ -94,7 +94,8 @@ private: TestResultItem *findParentItemFor(const TestResultItem *item, const TestResultItem *startItem = nullptr) const; void updateParent(const TestResultItem *item); - QMap m_testResultCount; + QHash> m_testResultCount; + QHash> m_reportedSummary; int m_widthOfLineNumber = 0; int m_maxWidthOfFileName = 0; int m_disabled = 0; diff --git a/src/plugins/autotest/testrunner.cpp b/src/plugins/autotest/testrunner.cpp index e1f4497580c..cf432870e3a 100644 --- a/src/plugins/autotest/testrunner.cpp +++ b/src/plugins/autotest/testrunner.cpp @@ -270,6 +270,9 @@ void TestRunner::onProcessFinished() const int disabled = m_currentOutputReader->disabledTests(); if (disabled > 0) emit hadDisabledTests(disabled); + if (m_currentOutputReader->hasSummary()) + emit reportSummary(m_currentOutputReader->id(), m_currentOutputReader->summary()); + resetInternalPointers(); if (!m_fakeFutureInterface) { diff --git a/src/plugins/autotest/testrunner.h b/src/plugins/autotest/testrunner.h index 79e7a8c389c..5628a6d29eb 100644 --- a/src/plugins/autotest/testrunner.h +++ b/src/plugins/autotest/testrunner.h @@ -71,6 +71,7 @@ signals: void requestStopTestRun(); void testResultReady(const TestResultPtr &result); void hadDisabledTests(int disabled); + void reportSummary(const QString &id, const QHash &summary); private: void buildProject(ProjectExplorer::Project *project); From 77902649a8dc432e8bf3cb7865ac076be8678884 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 27 May 2019 13:31:32 +0200 Subject: [PATCH 27/57] AutoTest: Use reporting summary from Boost UTF Handle all combinations of LogFormat and ReportFormat correctly and be able to summarize the test result correctly by reporting the correct number of Passes, Fails and Skips. Change-Id: I47e6fefa2bb2cbb7a25f2ed474a3bb2da1e1e769 Reviewed-by: David Schulz --- .../autotest/boost/boosttestoutputreader.cpp | 48 ++++++++++++++++--- 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/src/plugins/autotest/boost/boosttestoutputreader.cpp b/src/plugins/autotest/boost/boosttestoutputreader.cpp index 03699e92dff..58e54160e57 100644 --- a/src/plugins/autotest/boost/boosttestoutputreader.cpp +++ b/src/plugins/autotest/boost/boosttestoutputreader.cpp @@ -133,6 +133,8 @@ void BoostTestOutputReader::handleMessageMatch(const QRegularExpressionMatch &ma if (m_currentTest.isEmpty() || m_logLevel > LogLevel::UnitScope) m_currentTest = caseFromContent(content); m_result = ResultType::Fail; + if (m_reportLevel == ReportLevel::No) + ++m_summary[ResultType::Fail]; m_description = content; } else if (content.startsWith("fatal error:")) { if (m_currentTest.isEmpty() || m_logLevel > LogLevel::UnitScope) @@ -171,6 +173,8 @@ void BoostTestOutputReader::handleMessageMatch(const QRegularExpressionMatch &ma } else if (content.startsWith("Test case ")) { m_currentTest = match.captured(4); m_result = ResultType::Skip; + if (m_reportLevel == ReportLevel::Confirm || m_reportLevel == ReportLevel::No) + ++m_summary[ResultType::Skip]; m_description = content; } @@ -193,10 +197,10 @@ void BoostTestOutputReader::processOutputLine(const QByteArray &outputLineWithNe static QRegularExpression noAssertion("^Test case (.*) did not check any assertions$"); static QRegularExpression summaryPreamble("^\\s*Test (module|suite|case) \"(.*)\" has " - "(failed|passed) with:$"); + "(failed|passed)( with:)?$"); static QRegularExpression summarySkip("^\\s+Test case \"(.*)\" was skipped$"); static QRegularExpression summaryDetail("^\\s+(\\d+) test cases? out of (\\d+) " - "(failed|passed)$"); + "(failed|passed|skipped)$"); static QRegularExpression summaryAssertion("^\\s+(\\d+) assertions? out of (\\d+) " "(failed|passed)$"); @@ -284,16 +288,34 @@ void BoostTestOutputReader::processOutputLine(const QByteArray &outputLineWithNe return; } - // should summary get reported unconditionally? match = summaryPreamble.match(line); if (match.hasMatch()) { createAndReportResult(match.captured(0), ResultType::MessageInfo); + if (m_reportLevel == ReportLevel::Detailed || match.captured(4).isEmpty()) { + if (match.captured(1) == "case") { + if (match.captured(3) == "passed") + ++m_summary[ResultType::Pass]; + else + ++m_summary[ResultType::Fail]; + } + } return; } match = summaryDetail.match(line); if (match.hasMatch()) { createAndReportResult(match.captured(0), ResultType::MessageInfo); + int report = match.captured(1).toInt(); + QString type = match.captured(3); + if (m_reportLevel != ReportLevel::Detailed) { + if (type == "passed") + m_summary[ResultType::Pass] += report; + else if (type == "failed") + m_summary[ResultType::Fail] += report; + else if (type == "skipped") + m_summary[ResultType::Skip] += report; + } + return; } @@ -306,6 +328,8 @@ void BoostTestOutputReader::processOutputLine(const QByteArray &outputLineWithNe match = summarySkip.match(line); if (match.hasMatch()) { createAndReportResult(match.captured(0), ResultType::MessageInfo); + if (m_reportLevel == ReportLevel::Detailed) + ++m_summary[ResultType::Skip]; return; } @@ -316,11 +340,17 @@ void BoostTestOutputReader::processOutputLine(const QByteArray &outputLineWithNe BoostTestResult *result = new BoostTestResult(id(), m_projectFile, QString()); int failed = match.captured(1).toInt(); QString txt = tr("%1 failures detected in %2.").arg(failed).arg(match.captured(3)); + int passed = (m_testCaseCount != -1) + ? m_testCaseCount - failed - m_summary[ResultType::Skip] : -1; if (m_testCaseCount != -1) - txt.append(' ').append(tr("%1 tests passed.").arg(m_testCaseCount - failed)); + txt.append(' ').append(tr("%1 tests passed.").arg(passed)); result->setDescription(txt); - result->setResult(ResultType::MessageInfo); // TODO report similar to disabled tests + result->setResult(ResultType::MessageInfo); reportResult(TestResultPtr(result)); + if (m_reportLevel == ReportLevel::Confirm) { // for the final summary + m_summary[ResultType::Pass] += passed; + m_summary[ResultType::Fail] += failed; + } m_testCaseCount = -1; return; } @@ -333,8 +363,10 @@ void BoostTestOutputReader::processOutputLine(const QByteArray &outputLineWithNe if (m_testCaseCount != -1) txt.append(' ').append(tr("%1 tests passed.").arg(m_testCaseCount)); result->setDescription(txt); - result->setResult(ResultType::MessageInfo); // TODO report similar to disabled tests + result->setResult(ResultType::MessageInfo); reportResult(TestResultPtr(result)); + if (m_reportLevel == ReportLevel::Confirm) // for the final summary + m_summary.insert(ResultType::Pass, m_testCaseCount); return; } @@ -379,6 +411,10 @@ TestResultPtr BoostTestOutputReader::createDefaultResult() const } void BoostTestOutputReader::onFinished(int exitCode, QProcess::ExitStatus /*exitState*/) { + if (m_reportLevel == ReportLevel::No && m_testCaseCount != -1) { + int reportedFailsAndSkips = m_summary[ResultType::Fail] + m_summary[ResultType::Skip]; + m_summary.insert(ResultType::Pass, m_testCaseCount - reportedFailsAndSkips); + } // boost::exit_success (0), boost::exit_test_failure (201) // or boost::exit_exception_failure (200) // be graceful and do not add a fatal for exit_test_failure From 6b124b580e857f7767f817700a42ad41f364a92f Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 3 Jun 2019 13:14:05 +0200 Subject: [PATCH 28/57] AutoTest: Add support for decorator fixture Boost tests and suites can have the fixture decorator. Detect this and reflect it on the test tree view. Change-Id: I16e0ddefcdc433647aa41810040d9d7cd0c4bf2d Reviewed-by: David Schulz --- src/plugins/autotest/boost/boostcodeparser.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/plugins/autotest/boost/boostcodeparser.cpp b/src/plugins/autotest/boost/boostcodeparser.cpp index 43af677159b..95d8ac6be6b 100644 --- a/src/plugins/autotest/boost/boostcodeparser.cpp +++ b/src/plugins/autotest/boost/boostcodeparser.cpp @@ -133,6 +133,7 @@ void BoostCodeParser::handleSuiteBegin(bool isFixture) m_currentSuite.prepend(m_suites.last().fullName + '/'); if (isFixture) { // fixture suites have a (fixture) class name as 2nd parameter + m_currentState.setFlag(BoostTestTreeItem::Fixture); if (!skipCommentsUntil(T_COMMA)) return; if (!skipCommentsUntil(T_IDENTIFIER)) @@ -279,8 +280,11 @@ void BoostCodeParser::handleDecorators() } else { // FIXME we have a const(expr) bool? currently not easily achievable } + } else if (symbolName == "decorator::fixture" + || (aliasedOrReal && simplifiedName.startsWith("::fixture"))){ + m_currentState.setFlag(BoostTestTreeItem::Fixture); } - // TODO.. fixture, label, depends_on, label, precondition, timeout,... + // TODO.. depends_on, label, precondition, timeout,... skipCommentsUntil(T_LPAREN); skipCommentsUntil(T_RPAREN); From c23fe4f403734b5285a7bbcdc85e41b4ffae7f81 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 3 Jun 2019 13:17:55 +0200 Subject: [PATCH 29/57] AutoTest: Remove wrong todos These todos have been resolved already or turned out to be wrong / not necessary. Change-Id: Iefa46bd8144834a60fbb9d523ac73d3372d4a6b6 Reviewed-by: David Schulz --- src/plugins/autotest/boost/boosttestoutputreader.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/plugins/autotest/boost/boosttestoutputreader.cpp b/src/plugins/autotest/boost/boosttestoutputreader.cpp index 58e54160e57..3ae5756d3a5 100644 --- a/src/plugins/autotest/boost/boosttestoutputreader.cpp +++ b/src/plugins/autotest/boost/boosttestoutputreader.cpp @@ -107,7 +107,7 @@ void BoostTestOutputReader::sendCompleteInformation() if (m_lineNumber) { result->setLine(m_lineNumber); result->setFileName(m_fileName); - } // else TODO + } result->setDescription(m_description); result->setResult(m_result); @@ -406,7 +406,6 @@ TestResultPtr BoostTestOutputReader::createDefaultResult() const result->setTestSuite(m_currentSuite); result->setTestCase(m_currentTest); - // TODO find corresponding TestTreeItem and set filename/line return TestResultPtr(result); } @@ -418,7 +417,6 @@ void BoostTestOutputReader::onFinished(int exitCode, QProcess::ExitStatus /*exit // boost::exit_success (0), boost::exit_test_failure (201) // or boost::exit_exception_failure (200) // be graceful and do not add a fatal for exit_test_failure - // but exit code 0 can be forced with an option - what todo in that case? if (m_logLevel == LogLevel::Nothing && m_reportLevel == ReportLevel::No) { switch (exitCode) { case 0: From c20824f5ff77ecb8fee9ed480a124f4d41faa0fa Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 3 Jun 2019 14:18:48 +0200 Subject: [PATCH 30/57] AutoTest: Support data-driven test with fixture Boost has a special macro to indicate a data-driven test with support for a fixture class. Find and handle these test cases as well. Change-Id: I9f3d22b7b2df35edfdf0a017da3005f67ade017f Reviewed-by: David Schulz --- src/plugins/autotest/boost/boostcodeparser.cpp | 9 +++++++++ src/plugins/autotest/boost/boosttestparser.cpp | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/plugins/autotest/boost/boostcodeparser.cpp b/src/plugins/autotest/boost/boostcodeparser.cpp index 95d8ac6be6b..f15b8307d4d 100644 --- a/src/plugins/autotest/boost/boostcodeparser.cpp +++ b/src/plugins/autotest/boost/boostcodeparser.cpp @@ -112,6 +112,9 @@ void BoostCodeParser::handleIdentifier() handleTestCase(TestCaseType::Fixture); } else if (identifier == "BOOST_DATA_TEST_CASE") { handleTestCase(TestCaseType::Data); + } else if (identifier == "BOOST_DATA_TEST_CASE_F") { + m_currentState.setFlag(BoostTestTreeItem::Fixture); + handleTestCase(TestCaseType::Data); } else if (identifier == "BOOST_TEST_DECORATOR") { handleDecorator(); } @@ -195,6 +198,12 @@ void BoostCodeParser::handleTestCase(TestCaseType testCaseType) } if (testCaseType == TestCaseType::Parameter) m_currentState |= BoostTestTreeItem::Parameterized; + } else if (m_currentState.testFlag(BoostTestTreeItem::Fixture)) { + // ignore first parameter (fixture) and first comma + if (!skipCommentsUntil(T_IDENTIFIER)) + return; + if (!skipCommentsUntil(T_COMMA)) + return; } if (!skipCommentsUntil(T_IDENTIFIER)) return; diff --git a/src/plugins/autotest/boost/boosttestparser.cpp b/src/plugins/autotest/boost/boosttestparser.cpp index e1e87ab2993..0d349de40a1 100644 --- a/src/plugins/autotest/boost/boosttestparser.cpp +++ b/src/plugins/autotest/boost/boosttestparser.cpp @@ -40,7 +40,7 @@ namespace BoostTestUtils { static const QStringList relevant = { QStringLiteral("BOOST_AUTO_TEST_CASE"), QStringLiteral("BOOST_TEST_CASE"), QStringLiteral("BOOST_DATA_TEST_CASE"), QStringLiteral("BOOST_FIXTURE_TEST_CASE"), - QStringLiteral("BOOST_PARAM_TEST_CASE") + QStringLiteral("BOOST_PARAM_TEST_CASE"), QStringLiteral("BOOST_DATA_TEST_CASE_F") }; bool isBoostTestMacro(const QString ¯o) From 679b31f841de88a57e0dda883ca4ac5812a9e8e2 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Mon, 3 Jun 2019 14:47:54 +0200 Subject: [PATCH 31/57] AutoTest: Add support for templated boost tests Change-Id: I393d20f186a47d7d1d18775a8f1102890c9de9f4 Reviewed-by: David Schulz --- src/plugins/autotest/boost/boostcodeparser.cpp | 10 +++++++++- src/plugins/autotest/boost/boosttestparser.cpp | 4 +++- .../autotest/boost/boosttesttreeitem.cpp | 17 ++++++++++++++--- src/plugins/autotest/boost/boosttesttreeitem.h | 1 + 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/plugins/autotest/boost/boostcodeparser.cpp b/src/plugins/autotest/boost/boostcodeparser.cpp index f15b8307d4d..79c612285b1 100644 --- a/src/plugins/autotest/boost/boostcodeparser.cpp +++ b/src/plugins/autotest/boost/boostcodeparser.cpp @@ -115,6 +115,13 @@ void BoostCodeParser::handleIdentifier() } else if (identifier == "BOOST_DATA_TEST_CASE_F") { m_currentState.setFlag(BoostTestTreeItem::Fixture); handleTestCase(TestCaseType::Data); + } else if (identifier == "BOOST_AUTO_TEST_CASE_TEMPLATE") { + m_currentState.setFlag(BoostTestTreeItem::Templated); + handleTestCase(TestCaseType::Auto); + } else if (identifier == "BOOST_FIXTURE_TEST_CASE_TEMPLATE") { + m_currentState.setFlag(BoostTestTreeItem::Fixture); + m_currentState.setFlag(BoostTestTreeItem::Templated); + handleTestCase(TestCaseType::Auto); } else if (identifier == "BOOST_TEST_DECORATOR") { handleDecorator(); } @@ -237,7 +244,8 @@ void BoostCodeParser::handleTestCase(TestCaseType testCaseType) m_currentState = BoostTestTreeItem::Enabled; } } else { - handleDecorators(); + if (!m_currentState.testFlag(BoostTestTreeItem::Templated)) + handleDecorators(); locationAndType = locationAndTypeFromToken(token, m_source, m_currentState, m_suites); m_testCases.append(locationAndType); m_currentState = BoostTestTreeItem::Enabled; diff --git a/src/plugins/autotest/boost/boosttestparser.cpp b/src/plugins/autotest/boost/boosttestparser.cpp index 0d349de40a1..6f953e515a8 100644 --- a/src/plugins/autotest/boost/boosttestparser.cpp +++ b/src/plugins/autotest/boost/boosttestparser.cpp @@ -40,7 +40,9 @@ namespace BoostTestUtils { static const QStringList relevant = { QStringLiteral("BOOST_AUTO_TEST_CASE"), QStringLiteral("BOOST_TEST_CASE"), QStringLiteral("BOOST_DATA_TEST_CASE"), QStringLiteral("BOOST_FIXTURE_TEST_CASE"), - QStringLiteral("BOOST_PARAM_TEST_CASE"), QStringLiteral("BOOST_DATA_TEST_CASE_F") + QStringLiteral("BOOST_PARAM_TEST_CASE"), QStringLiteral("BOOST_DATA_TEST_CASE_F"), + QStringLiteral("BOOST_AUTO_TEST_CASE_TEMPLATE"), + QStringLiteral("BOOST_FIXTURE_TEST_CASE_TEMPLATE"), }; bool isBoostTestMacro(const QString ¯o) diff --git a/src/plugins/autotest/boost/boosttesttreeitem.cpp b/src/plugins/autotest/boost/boosttesttreeitem.cpp index ac1e900b47c..e2e58c28aff 100644 --- a/src/plugins/autotest/boost/boosttesttreeitem.cpp +++ b/src/plugins/autotest/boost/boosttesttreeitem.cpp @@ -233,7 +233,10 @@ QList BoostTestTreeItem::getSelectedTestConfigurations() co if (!item->enabled()) // ignore child tests known to be disabled when using run selected return; if (item->checked() == Qt::Checked) { - QString tcName = handleSpecialFunctionNames(item->name()); + QString tcName = item->name(); + if (item->state().testFlag(BoostTestTreeItem::Templated)) + tcName.append("<*"); + tcName = handleSpecialFunctionNames(tcName); testCasesForProjectFile[item->proFile()].testCases.append( item->prependWithParentsSuitePaths(tcName)); testCasesForProjectFile[item->proFile()].internalTargets.unite(item->internalTargets()); @@ -268,12 +271,17 @@ TestConfiguration *BoostTestTreeItem::testConfiguration() const QString tcName = handleSpecialFunctionNames(boostItem->name()); if (boostItem->type() == TestSuite) // execute everything below a suite tcName.append("/*"); + else if (boostItem->state().testFlag(BoostTestTreeItem::Templated)) + tcName.append("<*"); testCases.append(boostItem->prependWithParentsSuitePaths(tcName)); } } }); } else { - testCases.append(prependWithParentsSuitePaths(handleSpecialFunctionNames(name()))); + QString tcName = name(); + if (state().testFlag(BoostTestTreeItem::Templated)) + tcName.append("<*"); + testCases.append(prependWithParentsSuitePaths(handleSpecialFunctionNames(tcName))); } BoostTestConfiguration *config = new BoostTestConfiguration; @@ -297,12 +305,15 @@ TestConfiguration *BoostTestTreeItem::debugConfiguration() const QString BoostTestTreeItem::nameSuffix() const { static QString markups[] = {QCoreApplication::translate("BoostTestTreeItem", "parameterized"), - QCoreApplication::translate("BoostTestTreeItem", "fixture")}; + QCoreApplication::translate("BoostTestTreeItem", "fixture"), + QCoreApplication::translate("BoostTestTreeItem", "templated")}; QString suffix; if (m_state & Parameterized) suffix = QString(" [") + markups[0]; if (m_state & Fixture) suffix += (suffix.isEmpty() ? QString(" [") : QString(", ")) + markups[1]; + if (m_state & Templated) + suffix += (suffix.isEmpty() ? QString(" [") : QString(", ")) + markups[2]; if (!suffix.isEmpty()) suffix += ']'; return suffix; diff --git a/src/plugins/autotest/boost/boosttesttreeitem.h b/src/plugins/autotest/boost/boosttesttreeitem.h index 31d4dd00456..1149720f9d0 100644 --- a/src/plugins/autotest/boost/boosttesttreeitem.h +++ b/src/plugins/autotest/boost/boosttesttreeitem.h @@ -43,6 +43,7 @@ public: Parameterized = 0x10, Fixture = 0x20, + Templated = 0x40, }; Q_FLAGS(TestState) Q_DECLARE_FLAGS(TestStates, TestState) From 44a282396ff28198af62431ce7c79fdf9a32f619 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Fri, 7 Jun 2019 10:49:39 +0200 Subject: [PATCH 32/57] Tests: Fix build with MSVC 2017 Change-Id: I252ec40b026719f6cd5446b61b63dfdbd20e8ae9 Reviewed-by: Christian Kandeler --- tests/manual/proparser/testreader.pro | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/manual/proparser/testreader.pro b/tests/manual/proparser/testreader.pro index a7b7d74cd3c..0e10613a1ab 100644 --- a/tests/manual/proparser/testreader.pro +++ b/tests/manual/proparser/testreader.pro @@ -24,7 +24,8 @@ SOURCES += \ qmakebuiltins.cpp \ proitems.cpp \ qmakevfs.cpp \ - ioutils.cpp + ioutils.cpp \ + registry.cpp HEADERS += \ qmake_global.h \ @@ -35,7 +36,8 @@ HEADERS += \ profileevaluator.h \ proitems.h \ qmakevfs.h \ - ioutils.h + ioutils.h \ + registry_p.h RESOURCES += proparser.qrc DEFINES += QMAKE_BUILTIN_PRFS @@ -43,3 +45,5 @@ DEFINES += QMAKE_BUILTIN_PRFS DEFINES += QT_NO_CAST_TO_ASCII QT_RESTRICTED_CAST_FROM_ASCII DEFINES += QT_USE_FAST_OPERATOR_PLUS QT_USE_FAST_CONCATENATION DEFINES += PROEVALUATOR_FULL PROEVALUATOR_CUMULATIVE PROEVALUATOR_INIT_PROPS + +win32: LIBS *= -ladvapi32 From d74e68bc3cbd3403d6de79a0b3c580c329ca7212 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Jun 2019 13:46:21 +0200 Subject: [PATCH 33/57] QmlDesigner: Fix soft assert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The node can acutally be invalid. Change-Id: I18430a538ce947c724ddca85e9fc5e40175019d4 Reviewed-by: Tim Jenssen Reviewed-by: Henning Gründl --- .../components/propertyeditor/propertyeditorqmlbackend.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp index 40c5cfda6e9..39baecbaadd 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorqmlbackend.cpp @@ -481,7 +481,9 @@ static NodeMetaInfo findCommonSuperClass(const NodeMetaInfo &first, const NodeMe NodeMetaInfo PropertyEditorQmlBackend::findCommonAncestor(const ModelNode &node) { - QTC_ASSERT(node.isValid(), return {}); + if (!node.isValid()) + return {}; + QTC_ASSERT(node.metaInfo().isValid(), return {}); AbstractView *view = node.view(); From 52f718fdcbf0a460fdc1e8ffbf0225955cdaa4ac Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 6 Jun 2019 14:50:51 +0200 Subject: [PATCH 34/57] QmlDesigner: Some layout adjustments Change-Id: Ibf752ff24c1e79629a49061abeb7f87136a7a316 Reviewed-by: Aleksei German Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ColorEditor.qml | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index 8bbb5698efb..cafd439c07b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -588,18 +588,8 @@ Column { } } - //empty spacer 2 Item { - height: 6 - } - - Item { - height: 6 - } - - //spacer 3 - Item { - height: 6 + height: 8 } ColorButton { @@ -622,13 +612,17 @@ Column { onClicked: colorEditor.color = colorButton.color } - //empty spacer 4 - Item { height: 2 } - Item { height: 2 } - - //spacer 5 Item { - height: 4 + height: 1 + } + + Item { + height: 2 + visible: checkButton.checked + } + + Item { + height: 1 } Item { @@ -705,8 +699,6 @@ Column { } } - ExpandingSpacer { - } } } } From 20b1941aeda2a6ad5bd498cd2206e9847c184173 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Fri, 7 Jun 2019 09:57:27 +0200 Subject: [PATCH 35/57] QmlDesigner: Fix studio controls * Fix CheckBox hover and focus behavior * Fix CheckBox long label issue * Refactor SpinBox wrapper property * Fix SpinBoxIndicator active focus on use * Refactor edit state in all controls Change-Id: Ice12aac7b97a36a658dadfac68457aefe0d757a1 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/CheckBox.qml | 4 ++-- .../imports/HelperWidgets/SpinBox.qml | 2 +- .../imports/StudioControls/AbstractButton.qml | 2 +- .../StudioControls/ActionIndicator.qml | 8 +++---- .../imports/StudioControls/CheckBox.qml | 24 ++++++++++--------- .../imports/StudioControls/CheckIndicator.qml | 6 ++--- .../imports/StudioControls/ComboBox.qml | 8 +++---- .../imports/StudioControls/ComboBoxInput.qml | 10 ++++---- .../imports/StudioControls/Menu.qml | 3 +-- .../imports/StudioControls/Slider.qml | 7 +++--- .../imports/StudioControls/SliderPopup.qml | 1 - .../imports/StudioControls/SpinBox.qml | 15 ++++-------- .../StudioControls/SpinBoxIndicator.qml | 5 +++- .../imports/StudioControls/SpinBoxInput.qml | 10 ++++---- .../imports/StudioControls/TextField.qml | 11 ++++----- 15 files changed, 56 insertions(+), 60 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/CheckBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/CheckBox.qml index 48d8ffaa53d..8642b9d924c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/CheckBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/CheckBox.qml @@ -47,8 +47,8 @@ Controls.CheckBox { id: colorLogic backendValue: checkBox.backendValue onValueFromBackendChanged: { - if (checkBox.checked !== valueFromBackend) - checkBox.checked = valueFromBackend; + if (checkBox.checked !== colorLogic.valueFromBackend) + checkBox.checked = colorLogic.valueFromBackend; } } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml index 29ef06451ce..eb941166fe2 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SpinBox.qml @@ -91,7 +91,7 @@ Item { } } - textColor: colorLogic.textColor + labelColor: colorLogic.textColor onCompressedValueModified: { if (backendValue.value !== realValue) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/AbstractButton.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/AbstractButton.qml index 3241eb405d5..6746508be26 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/AbstractButton.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/AbstractButton.qml @@ -40,7 +40,7 @@ T.AbstractButton { height: StudioTheme.Values.height width: StudioTheme.Values.height z: myButton.checked ? 10 : 3 - activeFocusOnTab: false // TODO Decision pending. Focus for AbstractButtons? + activeFocusOnTab: false background: Rectangle { id: buttonBackground diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml index e263f9337aa..c2a660228d1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ActionIndicator.qml @@ -70,7 +70,7 @@ Rectangle { name: "default" when: myControl.enabled && !actionIndicator.hover && !actionIndicator.pressed && !myControl.hover - && !myControl.activeFocus && !myControl.drag + && !myControl.edit && !myControl.drag PropertyChanges { target: actionIndicator color: StudioTheme.Values.themeControlBackground @@ -80,7 +80,7 @@ Rectangle { State { name: "hovered" when: actionIndicator.hover && !actionIndicator.pressed - && !myControl.activeFocus && !myControl.drag + && !myControl.edit && !myControl.drag PropertyChanges { target: actionIndicatorIcon scale: 1.2 @@ -89,7 +89,7 @@ Rectangle { State { name: "globalHover" when: myControl.hover && !actionIndicator.hover - && !actionIndicator.pressed && !myControl.activeFocus + && !actionIndicator.pressed && !myControl.edit && !myControl.drag PropertyChanges { target: actionIndicator @@ -99,7 +99,7 @@ Rectangle { }, State { name: "edit" - when: myControl.activeFocus + when: myControl.edit PropertyChanges { target: actionIndicator color: StudioTheme.Values.themeFocusEdit diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml index 2f122a7b89d..142421ee997 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckBox.qml @@ -32,7 +32,8 @@ T.CheckBox { property alias actionIndicator: actionIndicator - property bool hover: myCheckBox.hovered // TODO two underscores + property bool hover: myCheckBox.hovered + property bool edit: false property alias actionIndicatorVisible: actionIndicator.visible property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth @@ -43,21 +44,23 @@ T.CheckBox { font.pixelSize: StudioTheme.Values.myFontSize - height: StudioTheme.Values.height - width: StudioTheme.Values.height * 5 + implicitWidth: Math.max( + implicitBackgroundWidth + leftInset + rightInset, + implicitContentWidth + leftPadding + rightPadding + + implicitIndicatorWidth + spacing + actionIndicator.width) + implicitHeight: Math.max( + implicitBackgroundHeight + topInset + bottomInset, + implicitContentHeight + topPadding + bottomPadding, + implicitIndicatorHeight + topPadding + bottomPadding) spacing: StudioTheme.Values.checkBoxSpacing hoverEnabled: true - activeFocusOnTab: false // TODO Decision pending. Focus for CheckBoxes? + activeFocusOnTab: false contentItem: T.Label { id: checkBoxLabel leftPadding: 0 rightPadding: 0 - - width: 20 // TODO Not working - elide: Text.ElideRight - verticalAlignment: Text.AlignVCenter text: myCheckBox.text font: myCheckBox.font @@ -68,9 +71,7 @@ T.CheckBox { id: actionIndicator myControl: myCheckBox // TODO global hover issue. Can be solved with extra property in ActionIndicator - x: checkBoxLabel.visible ? checkBoxLabel.contentWidth - + (myCheckBox.spacing - * StudioTheme.Values.scaleFactor) : 0 // TODO scale factor + x: checkBoxLabel.visible ? checkBoxLabel.contentWidth + myCheckBox.spacing : 0 y: 0 width: actionIndicator.visible ? __actionIndicatorWidth : 0 height: actionIndicator.visible ? __actionIndicatorHeight : 0 @@ -125,6 +126,7 @@ T.CheckBox { State { name: "hovered" when: myCheckBox.hovered && !myCheckBox.pressed + && !actionIndicator.hover PropertyChanges { target: checkBoxBackground color: StudioTheme.Values.themeHoverHighlight diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckIndicator.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckIndicator.qml index 73788710bdb..4c314b9101e 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckIndicator.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/CheckIndicator.qml @@ -73,7 +73,7 @@ Rectangle { name: "default" when: myControl.enabled && !(checkIndicator.hover || myControl.hover) - && !checkIndicator.checked && !myControl.activeFocus + && !checkIndicator.checked && !myControl.edit && !myControl.drag PropertyChanges { target: checkIndicator @@ -84,7 +84,7 @@ Rectangle { State { name: "hovered" when: (checkIndicator.hover || myControl.hover) - && !checkIndicator.checked && !myControl.activeFocus + && !checkIndicator.checked && !myControl.edit && !myControl.drag PropertyChanges { target: checkIndicator @@ -103,7 +103,7 @@ Rectangle { }, State { name: "edit" - when: myControl.activeFocus && !checkIndicator.checked + when: myControl.edit && !checkIndicator.checked && !(checkIndicator.hover && myControl.hover) PropertyChanges { target: checkIndicator diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml index 3ee5a02b7cd..c61e7e0dbf6 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml @@ -32,10 +32,10 @@ T.ComboBox { id: myComboBox property alias actionIndicator: actionIndicator - property alias labelColor: comboBoxInput.color property bool hover: false // This property is used to indicate the global hover state + property bool edit: myComboBox.activeFocus property alias actionIndicatorVisible: actionIndicator.visible property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth @@ -203,7 +203,7 @@ T.ComboBox { states: [ State { name: "default" - when: !myComboBox.hover && !myComboBox.activeFocus + when: !myComboBox.hover && !myComboBox.edit PropertyChanges { target: myComboBox wheelEnabled: false @@ -220,7 +220,7 @@ T.ComboBox { }, State { name: "focus" - when: myComboBox.activeFocus && !myComboBox.editable + when: myComboBox.edit && !myComboBox.editable PropertyChanges { target: myComboBox wheelEnabled: true @@ -232,7 +232,7 @@ T.ComboBox { }, State { name: "edit" - when: myComboBox.activeFocus && myComboBox.editable + when: myComboBox.edit && myComboBox.editable PropertyChanges { target: myComboBox wheelEnabled: true diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBoxInput.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBoxInput.qml index 06e6ecb2b68..2ea123f90d2 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBoxInput.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBoxInput.qml @@ -32,7 +32,7 @@ TextInput { property T.Control myControl - property bool edit: false + property bool edit: textInput.activeFocus property bool drag: false z: 2 @@ -99,7 +99,7 @@ TextInput { states: [ State { name: "default" - when: myControl.enabled && !textInput.activeFocus + when: myControl.enabled && !textInput.edit && !mouseArea.containsMouse && !myControl.drag PropertyChanges { target: textInputArea @@ -113,7 +113,7 @@ TextInput { }, State { name: "hovered" - when: myControl.hover && !textInput.activeFocus && !myControl.drag + when: myControl.hover && !textInput.edit && !myControl.drag PropertyChanges { target: textInputArea color: StudioTheme.Values.themeHoverHighlight @@ -122,7 +122,7 @@ TextInput { }, State { name: "focus" - when: textInput.activeFocus && !myControl.editable + when: textInput.edit && !myControl.editable PropertyChanges { target: textInputArea color: StudioTheme.Values.themeFocusEdit @@ -131,7 +131,7 @@ TextInput { }, State { name: "edit" - when: textInput.activeFocus && myControl.editable + when: textInput.edit && myControl.editable extend: "focus" PropertyChanges { target: tapHandler diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml index 5b0bc5875ac..01a86847fc3 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Menu.qml @@ -41,11 +41,10 @@ T.Menu { margins: 0 overlap: 1 + padding: 0 closePolicy: T.Popup.CloseOnPressOutside | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnEscape - padding: 0 - delegate: MenuItem { } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Slider.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Slider.qml index 955d73d6c72..7e111b6851a 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Slider.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/Slider.qml @@ -47,6 +47,7 @@ T.Slider { property string __inactiveColor: StudioTheme.Values.themeSliderInactiveTrack property bool hover: false // This property is used to indicate the global hover state + property bool edit: slider.activeFocus property alias actionIndicatorVisible: actionIndicator.visible property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth @@ -223,7 +224,7 @@ T.Slider { states: [ State { name: "default" - when: slider.enabled && !slider.hover && !slider.activeFocus + when: slider.enabled && !slider.hover && !slider.edit PropertyChanges { target: slider wheelEnabled: false @@ -231,7 +232,7 @@ T.Slider { }, State { name: "hovered" - when: slider.enabled && slider.hover && !slider.activeFocus + when: slider.enabled && slider.hover && !slider.edit PropertyChanges { target: slider __activeColor: StudioTheme.Values.themeSliderActiveTrackHover @@ -244,7 +245,7 @@ T.Slider { }, State { name: "focus" - when: slider.enabled && slider.activeFocus + when: slider.enabled && slider.edit PropertyChanges { target: slider wheelEnabled: true diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SliderPopup.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SliderPopup.qml index 27e8185da3a..beb6da4a8fb 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SliderPopup.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SliderPopup.qml @@ -33,7 +33,6 @@ T.Popup { property T.Control myControl dim: false - closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent background: Rectangle { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBox.qml index ef98c0f9ffd..e10a334bd66 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBox.qml @@ -30,7 +30,7 @@ import StudioTheme 1.0 as StudioTheme T.SpinBox { id: mySpinBox - property alias textColor: spinBoxInput.color + property alias labelColor: spinBoxInput.color property alias actionIndicator: actionIndicator property int decimals: 0 @@ -40,7 +40,7 @@ T.SpinBox { property real minStepSize: 1 property real maxStepSize: 10 - property bool edit: false + property bool edit: spinBoxInput.activeFocus property bool hover: false // This property is used to indicate the global hover state property bool drag: false @@ -91,11 +91,6 @@ T.SpinBox { top: Math.max(mySpinBox.from, mySpinBox.to) } - Connections { - target: spinBoxInput - onActiveFocusChanged: mySpinBox.edit = spinBoxInput.activeFocus - } - ActionIndicator { id: actionIndicator myControl: mySpinBox @@ -188,7 +183,7 @@ T.SpinBox { State { name: "default" when: mySpinBox.enabled && !mySpinBox.hover - && !mySpinBox.activeFocus && !mySpinBox.drag + && !mySpinBox.edit && !mySpinBox.drag PropertyChanges { target: mySpinBox __wheelEnabled: false @@ -205,7 +200,7 @@ T.SpinBox { }, State { name: "edit" - when: spinBoxInput.activeFocus + when: mySpinBox.edit PropertyChanges { target: mySpinBox __wheelEnabled: true @@ -245,7 +240,7 @@ T.SpinBox { // QTBUG-75862 && mySpinBox.focusReason === Qt.TabFocusReason) spinBoxInput.selectAll() - if (sliderPopup.opened && !activeFocus) + if (sliderPopup.opened && !mySpinBox.activeFocus) sliderPopup.close() } diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxIndicator.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxIndicator.qml index ab1e90f3860..f75b8b47fd1 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxIndicator.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxIndicator.qml @@ -47,7 +47,10 @@ Rectangle { anchors.fill: parent hoverEnabled: true onContainsMouseChanged: spinBoxIndicator.hover = containsMouse - onPressed: mouse.accepted = false + onPressed: { + myControl.forceActiveFocus() + mouse.accepted = false + } } T.Label { diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxInput.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxInput.qml index 599f6fd5b5f..e2f718176ee 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxInput.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/SpinBoxInput.qml @@ -32,7 +32,7 @@ TextInput { property T.Control myControl - property bool edit: false + property bool edit: textInput.activeFocus property bool drag: false z: 2 @@ -53,7 +53,7 @@ TextInput { activeFocusOnPress: false clip: true - // TextInput foucs needs to be set to activeFocus whenever it changes, + // TextInput focus needs to be set to activeFocus whenever it changes, // otherwise TextInput will get activeFocus whenever the parent SpinBox gets // activeFocus. This will lead to weird side effects. onActiveFocusChanged: textInput.focus = activeFocus @@ -139,7 +139,7 @@ TextInput { states: [ State { name: "default" - when: myControl.enabled && !textInput.activeFocus + when: myControl.enabled && !textInput.edit && !mouseArea.containsMouse && !myControl.drag PropertyChanges { target: textInputArea @@ -161,7 +161,7 @@ TextInput { }, State { name: "hovered" - when: myControl.hover && !textInput.activeFocus && !myControl.drag + when: myControl.hover && !textInput.edit && !myControl.drag PropertyChanges { target: textInputArea color: StudioTheme.Values.themeHoverHighlight @@ -170,7 +170,7 @@ TextInput { }, State { name: "edit" - when: textInput.activeFocus + when: textInput.edit PropertyChanges { target: textInputArea color: StudioTheme.Values.themeFocusEdit diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TextField.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TextField.qml index 3525bfa41bc..80ca6fd1c7b 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TextField.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/TextField.qml @@ -31,10 +31,9 @@ T.TextField { id: myTextField property alias actionIndicator: actionIndicator - property alias translationIndicator: translationIndicator - property bool edit: false + property bool edit: myTextField.activeFocus property bool hover: false // This property is used to indicate the global hover state property alias actionIndicatorVisible: actionIndicator.visible @@ -68,8 +67,6 @@ T.TextField { rightPadding: StudioTheme.Values.inputHorizontalPadding + translationIndicator.width - (translationIndicatorVisible ? StudioTheme.Values.border : 0) - onActiveFocusChanged: myTextField.edit = myTextField.activeFocus - MouseArea { id: mouseArea anchors.fill: parent @@ -126,7 +123,7 @@ T.TextField { State { name: "default" when: myTextField.enabled && !myTextField.hover - && !myTextField.activeFocus + && !myTextField.edit PropertyChanges { target: textFieldBackground color: StudioTheme.Values.themeControlBackground @@ -139,7 +136,7 @@ T.TextField { }, State { name: "hovered" - when: myTextField.hover && !myTextField.activeFocus + when: myTextField.hover && !myTextField.edit PropertyChanges { target: textFieldBackground color: StudioTheme.Values.themeHoverHighlight @@ -148,7 +145,7 @@ T.TextField { }, State { name: "edit" - when: myTextField.activeFocus + when: myTextField.edit PropertyChanges { target: textFieldBackground color: StudioTheme.Values.themeFocusEdit From 9ea159ca229f94ade6327fdd5873401293636308 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 6 Jun 2019 17:00:40 +0200 Subject: [PATCH 36/57] Doc: Describe cleaning up the compiler list in Kit options Change-Id: I98769d60df90bb548d1432598f37f2a9bf347053 Reviewed-by: Christian Kandeler --- doc/images/creator-compilers-custom.png | Bin 8324 -> 10140 bytes doc/images/qtcreator-custom-parser.png | Bin 13080 -> 11909 bytes doc/images/qtcreator-toolchains.png | Bin 38070 -> 26001 bytes .../creator-projects-compilers.qdoc | 25 +++++++++++++++--- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/doc/images/creator-compilers-custom.png b/doc/images/creator-compilers-custom.png index cadbe17afdf994aeb2d40421f1405b86e62ea749..d090b832593b2e01c9406a7d0a089feaaccbb331 100644 GIT binary patch literal 10140 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 V-qDvjuOb;h7P|VmtaD0e0sw-cI2!-} literal 8324 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 diff --git a/doc/images/qtcreator-custom-parser.png b/doc/images/qtcreator-custom-parser.png index 25e38a79afbccef0ce645a45f18679579dfcc2c2..ea300583aaf707c47c132d610c690adb1cbac946 100644 GIT binary patch literal 11909 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�el#wQ%6R6y_vi_| zj!z**Am<-k((*#X_f)Xf<@q~S+IJZ_a$d9%o*y*RXu7~$=Iv?vPX2Rc!n=+et1%*0 zFF4%AH`xXaRZy#3gHd&h|NgqWEB-#NvOjn6RewQ+z0JMG%`Xzd7&H{u?=O7vr*BK| z*UiPuzvrI+61{wHpi{N|ODnm*p&I{h@<(g!|GxQQ?vx`lL>YKy3$1xRYbC#Own>1~ z{c29P#V`8%-vxUzB&?XaA#Ce>-3Mk2;fw8SSK0jV`FZuyjp=RfX;rrUFZ8D_vr%1} ztEytdex>rrZLd$ku6vhPvpp?;v}w+|--kE;+IKOn?o)fh374N4@f8RE7Z#bv)_%?M zvOD=Kz-YRc|H`Kyj@6uG+}12~=Xi8mo#gEw2fWLDw?4D^=To_ow=&z`uH*D(b1wrs z_AC1Pf395gPU@*9-?d|(HifOeogbS0Onp+8*NG2`62_gsEkE}BOv(MR{HoDjmWJGw zEu70mrA!v_`d=$C3!I-PUs;lRrccjKB?N-T5tJZ}5??5`S~{GECtoz>y|;eZ2V~r#sq6E#l$0rqvMO+ zC%-)|wf=>^bN`u=Vh-;^Ken9f&o;5;?J})}Rvs_kk z>vZ9N+20?|I#v5++04*V-{Vsf&e?C9n|Ht9^||}U=I*{FA0&5Aa(d;L+>2!2DIE4CRMrdb2PD94ZTKDtfG<%+Jsu z^a3{R3rUHv9tdcq3M>sb91J`3;)O&hGsA^sm2c1dIF|--!p2fQFKtOG+!UeXb&}=f zQ3l8)&BA~=vu2%}F0>@#@@1t}lfJ|=Ff1_lxH5On91+_m-kb~!6a0}oJIGdn%b}kE z;I%_+CZ!Ra3=9SrN_;q#cb73U9B{a7sLH@_;6k$ymgPZsjRf_HX|8~nJ}}CPrT`{} zk{;>0x99lpmfqLDS6a|9QFzb4$K}UrnUr^z-#0P(wD9#h>7*wtBm>2i`uPgwHz?JxLy{JqhSgzNAAvh$redv?C%=MMtP>Ke-}jW$WEGC1g5 zs;PT%<@1YZ=)rvVM2o&o47?I=8oj1*R}CczVsSuU%$PUGZY#WuJgUXWlGa$gaxZz^1A* zf94EJlP@PSk7*`m{w&E%D|<2VvI{4}gheeomtKCn^yWf$KjSb?@6$^!`S@A>eKS@2 z{JeKAVMVhv7#S{2*-%kcQ?+gNl=(X^eF=IzvwiK<)920B*+iF_Rs7N3wC`I*`Duma zlFM6;E?xREXeD#ayG8Z0&UVj#?K5xr{GCNlXFl~yQC;3C#Gv5Hxm@dXaMJ!_cBY8#qz9$YKYkMWy`#CH|1o$fAsj?>Errr zr*k*{@o}DVp>xd>lRzehB^nP?QZq|dT`{!_&yK6Cij3U+=giY%#-IP~zqLEo+0WRI zv#9ymlPe|FI_u5XtK=zwNlcbHlY0W)owl-O`=c zI!Dcmp+Q7-j)uOSf#qG@X=^Uni%0#eSX=qg_}VY+Y5dcc?XDv;;OFL zb$#<|&z-b$RZsj%d;GFgTjyNq`xjhAvkJXt#A}FmP0rnz!TPSNu-2e^Q(T~V@wBb7 zSKq$PJA8A;oM?AHVO0i)E}_2j)8Fg+l=U7ro87xy>(s0+UC!tC4?Vdv>#E1QG{%@G zCdpF`_6KN)+iWo=Yr}Z= z=49>Oa$LrXp`k?e%-Q?qaS~NeOdd~B*w1cmW@q^2MCKwE29MxFD}PoWS8J04MbI1@ zQ*$dbJE&CPp=NczyT(=^{xQvmM>;1jUYzXQ4~}n@x|fr`i=^{S?XxNQ&YTR*ayegw zZxmkkHQv10U9RRsa!oC%gX~8LuZ-p0MQq z>TSM$|6}J1bp`*aKVQtVT{?5-V|70s!=k3@Z*Oj%R4!pqm|0(aTz%**@rU{$; zI*|DMoM5IM|M$()pR#QJ0V~(Rg)PC7F*XQX8hcFoXWwvdZYk$gks}NY3=E#GelF{r G5}E*obsG}^ literal 13080 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 !^G~PaziD54|KiNw9b1+y`55Hu8u>K9$FDy9 zkN3QwY0QUY%HF)JJ+XHWOK{DGHw-N2Dj6E4rs(WroX;9KZ}--^-)wi-Ym$;J6ddF` zuCGq}leqj-w(QRHk?e=rT}rMUob-ABA#;?@3~)B7M!n&UVZ+$_u?x3%={w@{yi3~Jy9qh&>bnSb|TWAWv|_nfB*R3 zDs$G(>(!J`sxP*?@Z42%!NGP9mtP;;?N%flYj60#xK%-3#NeT`jzGurGn^kB?N%gS zYIkU;2{_onFUS8gK`2Y!?gV>q!0!)=wFmA`;Mbb*RdL?U_D^#oiw!$M*VJm|9h&i7 z@px@P+NX`ttFP9Eo_un4QiZ0+{CoRV&V8D!#TcEsG4|k=>}B5+mw#jQO<44&G)(k# z@Lz^$Q5#?Qu1N}1IbNAw`ceDhq@43xZ|v(mu;{=M7IUSH`=3r^G;nrJ4>w=(%QNV& zwpdkqe$VFC|C4UKc_-jlXnK9STtvghMIW5SO+L){`fBdH*~zxMr>E(@T6bJ)TDiV& zgSDaJyhAcL{rYO+rzZ`I)=l4kR(D0F#U9VJ zO!tdz9`Ck4O)vHuq9&tmTJ;}M@X{|}?(E2lDy563trQ2%P#=dy>@bT8@t4Gc~Zgk0&P*xGYrKo-EF=A@1UX*&1kuGyynScMMt}Nc@z3?9<6_C z&!WHYfJ9sv!=Yq@i!*<^oO}H91Ea~|ss2g%-`A)F{fzkX|7St;GuKCNkEA|()1f9T zZZ!2pwogr~b#s5~=k#WNOP{Ze@pr^$SXtX7KkD{T^Uzi^)8 zsZyl#F!|5=1PA#%rt7I!uU5Q)r zb!I#e4gNYoX4&UAGdx4`tL0@tt2;b#!1t!&vVSo>Vz+}c^J&hV3aR7 zxv$DW`~rLXXTSU>e;=>jw{WswYlGf`{!W+4{TFR-Zuu6$l)Ol_re#%#$+lFBeL~&4 zA5PD#nYuJ+ z9M3tjhd=sBv*C(b3q^SohkkwwJ?9JUd+#d$V)(|#@vCAU>zN-BNv~7BG+x`BBC*+S znu2^k+oz9HnrqJJz5D)g4)3RfDp%}s<~iHRb*kTWKm6IqK-9-1`&X^@hRGtH^O7%@`4@dst6{vfQsesKR`;_%H!S;Nc+2Y14wZsipJxPY zNKZc{`i+@8Zqn_aPnG-hLQk|Wt-0Z>(tiHH+CRy+{(VvW{?OWz`JMfv*NXD73x7tf z-mA&HaQUK#Cwm)Kw=M7G|5N$p#)qq3MZ4=Yzv=$#*rIeGwz^Pc9dCDjk4Y-e{a)KO zzI(R)yLLMoVS_G;Ib%W=P#%(A>B z=drH6W;d4=M^%1o^iRE~JL6C0YBrqz=qzu!_p9Yu&aLi!(+~A7`ebaot7Gv=$<$pP z8}}Z)RDZ+z^MYl41`Xf)r+VaCEQyk4(cj~{b?LNAUP7O|Ryqb4G_VLTNlub%`^_cr zjzLMufJsS2LZVUfiNKQp30C(2ckiox;$eJmUvxxmWxrg!>~1Y*lA?pd!RtHhjnD0? zeZNuuy}Q|l-}kmVJU`pI?AGyRA8Rz8i9TF)HsJW(z7rzX1AiX!el5%2HqD1*^ zW&gyh+G_>YKKad@7nhskukZR^QT)q~U8~182)Pe^4II<`iD>Hf3fI% zzo_*Dt(yV0pE{r0{afQ5Jul^VZpN1h!WGSdFAo<4$v21#JkUH_^m0nP=gSSuMK{wT z+D_kUy0N1{KH(0 zYAZ>JEQ|`tS9IRHmgDP_b2Sla&b(&)U}a{cGTYzsYh)DO<<#W;L7DA7XFjZ@p`OK}Mo(w^jDxn=iCEQ)V(R>6L6`&Y1W3quhQ5`_%qg|O6S7vyJMaf@htvSNuk$3dq0r{n_&a0fA~|-}q+ythTta zICjMu#_#Lam+z6kksEydt^Jj|rB(CSv(Mn@`eD$wBX;sh1NXTMcVnjCeRb@#<4xJH0+y-C`B)+U;2UXIGHxOzt$9%ST^xWf}3#Yk&3l zWc$Lh`JXR^r8L+-5e?Tl<t{ zN}0-;V}$lRJtO^4&v8kAW3;N{_S!X%m@e|@X%#!(lPnJN0JzOvqKL72ut^b^nL|@^)v=o>fj*Wy$u6 z#bsyJL7jtf&o}sr_Gzf{9a3Db3eFKBmW`?~{{`yIC^)~v6Zz%S^>HTJBg3^kI zkBfsdj{;AMwjFurO&?hVTtjkN*XHTKM)%yP8CuAr{%I+JgDmmPz%ym9f1 z3kO7M8LZOS7$5&QaQ^x}xefeTO|=2t;x!qG^6TZ_G)E=KUrEZcTVi+X)~&k^o<1z% z331E&XPj8@d)Y?^&U|Y>>rcOGE+~{dahRm5bNAYVik~Mw=I>j6Idew%!6~%{UlPR_ z**+cgp1O5vjEQ9?|LKN>ix>C*-}}X0_LfMk0nfbefq_%yYibhKpMR-!C*CnF&nD2j z_hZ=;=eRBPb4^TEnzn>X@EfdW`&Z7390maeD7+efAXwf@A;nG%*p>{N=p4k?Y!o^3MpjepnJN5JI&0gTKb5`=-@z$z{+IN&ABKD7 z_)q#R72mt}&#d^!R%Ba;9I|)%Rn+ZL4>AHP#U0!$M&o1bH-FN6fTzXlnvF)>_fSMEHKVNvPDR@?XY#OJ(%XG_kyR>CW zvIXh_FUvo95z(VnSZ~^Fcg20ezp^{!49>Fh@;i$eo~hPkOt$-Q|9Mseq;#FJj$exT zv)09>`{(d)4xJHxvih0+bLaVN2I~dd&Yk{gz&<0KllS)m5#iq#u2oygCx-85O8)r& z0CUfwWs^-eIXfEeDakFO;<9EnS+Iex`oaf@}9=ECZ>{cb%J9x;2(TR-ogbuW_3 zeFNOWjvZ+2I~IFW^WoI9_uZxRyl*Uv2-tdHdCEI?YmxNIl1kV78RjBWCLZIjIDWTz z`r+L*k0rb70_HNVJua#y$zVR z@B<(2)rQ%XEZBHSas~I*8Uasv*O^CT%1i!a#`Cqi?^_h))j#R(RL^PBGes-ED~nH2 zzp4E~`uKdC zd4Cm%7XRQpwe5#xf$H5uF7oDePTiYISEJPThC#rv{Jd!a4nSU$^#sfBpK? ziS(rxPG4WF*f@vfi~Y9Vn7AD;UhE8-$sFT$LtDG0+wMtn;<{J2zx@<9^3y)2w64`- zjl9WJiw*A&G3T`Pz0-TK{xzG!rXL3v+jsSC+Wule)wfHBOYdg1<}Z3~F80OoTX<|7 zyJN`uw~iGTgN^tOnD_E$ty6o``TqS){)@{FwY!Jp$D04tWU3YUGTAQW)T~5#*Z8}+ z?Q3s*ULW$a;$M9&!_I1r?v78%Y0D$LuGdUq|FqH6YHH-m zy8@5u53XPPOl|VbdkZYQCq32iPgRq!x{!Q$=F>gzBmW)uuDY-;WZ8{9JBwVi72G z;Z}jO=?7vrT;ky9>0J}KV&29Xt`X~u7j$2fV)!9?O={skt^>(m5{p}Y$}sQRxNnoC z*j=aT7nV<4%Y0}K+j%pEGYQdbF^!DjDK_#)jboUnaGdFJnU>~uEc^Lo)->zJs(=f} zD+G3)yHi;ASElug$n)0AT76CC(>rT)8tgv&xcbKExoWM%%Y-=1UBbT)d=A`vmc?#b zqWr5SNNIS$ZbfUB{OK#79SwFQa9wyVvC?Xu#OfK2)gMicNteuiX<;Yk^Gx~Dl`DTQ z-&nae?dI2|ryeh!A}pl*@GW*jT;yD2qu^^@SwiuH>={a{Z& zpy6_Q&H)ZyMLWLpsvk^ku3syu6*;qAAaqIo+kBBfAQnaBkUivOKi?Q zY>9o!sb3#`<(ZnkaNYC&ISbxMPnJu}{9~&)Q+fg$!`pu{jM@7rXp8gXM&76yW>p^7raf@AQ<|!EIjk_e;flan_sX-X^Osxk$loi>os_w} zu&zLv{kirduF3w{`rR$c-;S((cb}L0Vv15u>$&W9yNZJ8)k_i+MZY*UhR$$bFs;8S zXJad$@595PHv4zBd&EruV^@nC#spho386 z;@&S-Is3SS{OCE2K`oU*G_vh~YN%GN_3ORS!^#ihm4cg{?J=A`Q`}KJ%!J;|QX>2tf*Oz?F z`Ji%X>jP$yBV8$L0|KQ^tL0wwo$kB!T;$fMxpIkHH9yXtT>MFU4#T5}dpmEJ-@dta zUegod8^=Xzbb`*apWkq%C0uy!hG%Mf&hE4{wmK@xD}JqO_IdL;>qVdMGySmU->sVq z&U73WKhNM2GIMeI{j%QJ@m|93{Hd+X*`%Yo z_HR}6O^@TESMGl3esSa1{0;pxzdZC>78vqFW5e!n<2TMhzjL$XR&eSkNStgyB|O8+gUJU?}q==3Jh9~ek)A)Ewl6KkMPEA%rfEId5dIp%w7m` z8Be!lkWQ_?s=Visq_CaDBJIjwz4MRxX`Efc|L6PhC1)1(v)(xV zg_rz$AG^3qSE@HW+|;a5-rJsVRI0jj-fzE^_oVohIK=`~KR&!MKhorgkkp>=^Ru_d zZn9CzbTsgu@;WaiN1&b_PZ=gf?6>}W@nw*0d0@c$w6$}sW98%8x^H>0>FvCd_x?1;jPf-qPdV-{{g@sX zJ4b%i9oFL|p}!1r3OSo36QZiKjUT;}-!WAv@6qEnqXP%d9?-Hl_hW~lV$7ZALeFQv zc`lSE^!5AXS;uu7!&b1RHAvP)pIHATucXlP#~UZli;ry^Lmej1Sl7SyXcp-)tvcw`y1PyO|PFPrb)Oiox8L>OMdy>U3(_gYn{t?b+3}O32!z!;PQKs@ZAOc zGYVVugHswlHgslO$X#m3cRt%Ky+PCL-1mzcWd2_MHnCn)FgCy;;)%Syw0!ipCxSlD zg%<2M#jxVldagGPQ+oDXHeXtFmyf-be+r|T(Qn0DB?`3#32ZZLJ_WP%d5e9~uF=SH zGdiF$sWR=Edu-vo#@e1c{9VXf4L zFB|8|N4#{HH?Pa+z!A1Q>2Du*=sxx?WPY>o5~#veH9g_JViTK2!hNleD>uLTyZPKI zqkq}Um@lX-dwqBw_ls+8lg^vftNzNF>iG3pLhQ?D{%=^Lm5f&fsBSEK^SgPCd79uc zv0q0{awvcL@>k~2rRI(Wk&AsDBrdNqcYh%qZN?t`qL}qp%**PG=?Od7Gz8aPT6u4e zmwM*s@Dj&MUJE>ZuD54B(QUqM`t2gm)PURUY`-t)g#4~x{~a(n^3z6+^Ve4$*ZCD- zJMRR;48t>B{I;Q=({Fy?C}TW(&AcP+Uz5(PIV5qO{h4WFZGbSO z8_M*1fmqc0eZ92-958_&+von~%rxqIZ1IlC^*P_=IZLBoHMgzoFgk00gO9mT`I+O{ zkWUMII7~0j+I-}|A^Yw(0UUQ-cziBcd9c3}5NT{*WE5-2%xS~Zb>rZ<=6SyI-=ly3 z_RhWk=yO%Vo15Q~H<;&~fB)U4N9@Z2RYl(8;ZrKAR$OT2+30Rmb)ivi%K~=Y7mnOj z7n)$qXU$s@_O^(vQNIKi0?WSn9|4ZoJbX*SKS%Co&k-hnEsMI)EcRsqt8IoOKPK~aI7q2Qyf=5%g-5R&U)O3( zsM5ID%o4-z4sq9m@5&QyUOIKQs5XB?koNPiWye2;W-ObVS0`=Fd+*>+Qz=<}=XD7O z{wOc`*88>lPLbD);YO zswolAFT414_#lA{hkrI*n_R-tP#}{v1*Z)?0o_$56#kaDulCxW*B2F4DV9)QD-}c_^@zR<5 zeztz&u>I0wINNo7{YKjh@vmpimYe@tUT4cKwcBs{t~%Lr+aCHJVLtn;TiWLvb-Vu5 zrPk%0e3&z3UP}Cf*MSFa#YFr4zOdia=E>WK5f;Wp&x@kY9m#TK^lp}WSUuy6+O(US z-=8>l&N@AQj$E!OtHJDV)fub)og=ksuI@(v=(ow?-C|ztU30#(X|IZSA-IxV zf7x-)y2uxT``o#=&tv`?kWeRgYtruB?a|wR&nn;WZOyVt(Txpq3ztUS3E#2PI%rR` z_M|PUd$u^$nf~Kf*fNE!ZsjHQRVRNjTgAM0o^r#vPp+h*>cJlc*?Dq1<~8ymC8K5T zzDZ0+q84Rsci$PMo1zg~fBdBKk?;31+tt1otjK!uDQKhn>;++~h4~d;-dB3##phOd z;z^BH%Q=h4T;D}eBDEsB-Y%-mcAO+*di3Jt?9Z=L3ODUYTDZi=<6loc}Doa83u_4hG#cznWOXr61yrgnjcSoe`10Q zkHn+3%*oXo51hHR>ud63Hn!?B0e9Zs%UyFe_q25Nq`m6Z?gO`{wO0_50hk zR&Uz$DKOUd@4KHNHB4*HojP^u)S6kp3^p6RUd~thX|lSX&;Bo$cCJ%w|9wQ=uJAuI zf7$;Fcirc{VSm3nKeMv()s2r29nQI)%jj6W{`vG54tJEbCiB}=JXqK)&&<&9@5%Bf z{a;T`ULIHR@aQ_l_Q}on>i;+2wJ-S|s4iW7@0390y{tAf#;a;Nl)0m6l z!v1;c|KsodRd12`a#;T7&3Q7r)YYx0%rn1p_4;S;5`}kyQ$7FnFflx+tdN`6{`_Gj z14F}e-sR6v{;oXU#{9KTZr*X*rss?x`M5Wg-lv0ukMHtLT^x3M#TM&GOL3e2YL@fN z3u^EEOl+3b$(R{e9;2;pY_Y$d39i-MJd)qhq4x&9MqQaLR3M-2Hu% z{_WW`b?y7PH$I0&`KzB#l00vm?WZ?8y#3l|o9P+TZT0sVmO84d>T74VWb8J#uaIM4 zm^VE#)>hwt?)N=UW}Ni@x`oTuop<|d<5G?1l~-SHz4f)r|H>rxiZ!(px98?x4XK|0 zW>HwtL$?#hy1wnvnfpVd@WU#~<^ZpCHUG!Ylb++c+ zx8aKy-`_WPx9q)Iac~ec^(O{@nv{OHDeve6_S<_tChyBVZ%~<4b=Ign<8$NmKQ&*= zmNiFin{;=7W%Sn4Ju`04xEy)cAnDyCQ?IuVQ>3foo+Rcm-@B@-n(K9R+qz>HlLEV| zDlUsYE&duJyx8}4c+oudmrFWde=te?d_h%OaP~Kw-}Mq}yaY8juFkaE5gzr%Rk3%~ z?#t6xR0qvH)v*4h)w#o~U%pj{-1GPB5{X`;)8eI<9zCC;IFFrS1HaAtyD{GP_FT@F zww0bF*1E!SVeEMW|77PcXR1uE@GUf3#eRFW+mktKm#y^*n>U$d@$p!-;!N>~P2E+? z-oH%ouAFy!S{j>{wDIldXQtkHmsGm-b-d}J&Byj^$-K}PzyA8{7i#yqpQ~PdxK`wF zi_i0OLMLA>HCR$oTK-Gu>%5S5qk!@tV{Vnt=W6UiGgDcY3KgCbIM2)=QFngz@wH0# z)TXHf?3E9B_42CYdGBpr-0o89>gG|;HtB8KmCd$u-LXGIez_4V^@?R>gs z62DK5PVD;p*o%tSx+E{ZuDlth{xoO(iqqe{0@Z|{#C&^Ed336f*5^rzPgn2eo|is1 zy}c|tbbqe%`EHZ*MtgK**E{CrhCKS<^`|c(-A4b) zhLB}v;!FRTALh+mwQKjq{OroO?M4rBGx+z`PW<-an)7xZP)y_>yRCP`zmxTS@RPDn z^I~o`uB)y)dG~EwF}vKd_rIk-)_P4m{W<*5-)(*VZyu&7pO222HD``i+S97DbHY`* z&a`>t#0J_QJ%4Aa=;rim9hq*IZ=e0Zadp!4o{JeXJRQ$1^*n!>H9ADoExs~n=S$Xv z8$Q=oy=t4X?ww!!qJ5KJC9v5%HmEt3{qz(^r+4weVCxDwh68r9!d>^S{mWnP+P>mi zXZil0_IK7*v$<`ly~OpIbBbKmL)QG`>u&R>n*ZE0>vZu$3!eD>xy9vG4Y-haazkMDs|f)fKVQB3qWa2mrC#cRfAfXo{qw>$ z{0!HhBzv(+c~5zt$iQ%5-^V>`G#8!ZobbK# zdFk|b)$=Y^EO%dPW*CzopdV<%&%p3);&a|#<>x=x?91((b@S@1z&zQ}9cAXepe{_O`pi;0OdCcLP8 zsvU1x_lV^w1B2B1=e;s^N>v*-Y^eD7==25WC0t9C+}!%MysCUGJek4Z%ZdA6(&tr9 zD`H^iz5aQLWM*ArVdc`IPggQuC?$k# z_C)iAB}iVk`rZ$af=jFdm2$3(44SO-%#Evss{E>L@^fmK7~14A|JVPTnXbXkaG}L! z{jObRw#MAH?plj<=b6hD|Mc4%x4+o(?@FhveBFL&MFxWvXY_TB%oAU`U+nJNovwMM zT^tGf1;6Zh_3F!)GYuQReS7!rcJ@)l=C%-*YTNZ;t2%G}cE0W`MeoO%EDRC} zdS~=)zJ4+O>F})p3+@80bVeZNe4^-;yzlj8e+EWIAL zd(Fi8Rg*(pqHXeZo^Ac1U-xBx`TZy(=M>x5Pj`Nf+UB{$fKxiUX7#dd%YXOv>ZwLQ zew)0Q;X<(9ne+Bvzg+(5P}{FxyISn-3eO4=o&Wo%?>@V8D`Q*#gy$!FF4Tx&n>U}d;R}J1?^A4`IEXbnxD(c%Jz1$ zypQg_H#IO`=I7!6Ygsvc!o>U4UYGB)nsxvCR_l{t3@>D#>&H}lTDkmFiXZ!2iEc$JZQ1W&#X*+b>ri|X&`y zskfj0FQ0xwe!JNLyAOMgE`54(Wpb^%>Zff}Gyc8`+gr9bscp&YJP-MK9sQS!i zL@!F7m+t*H?SAFiDP~_8CT#sQZ+RJGL*s`%7h8XP3;WOZPpu%E`3*m$D12oew(fe- zW|o-sKI@LCEmvAmYQE&Z-x8Z3!M7jwEM9E*@&1?Ai%*_6{o4P{;>qfd(^LYE8Y)*` zU(9ykMP^}%2*a<&&(HO3em)8Q>F|7A{r7Wo%g^4n+}kalwAcF7T3&;Y7Tf&7q@qpd zJ52Ild;R+Cb!E|Z8_ECas$7xN&im;`zzvRleQ5UUBr6%dJflv_EbMnEZJ9_DRq7u3f9rByDu!zH0vB=ZpvH zKHErt+;ir+3^z+d?W4+1KV|I1E~(!)JoK4if$u!={j;_gh@5A>@qV8AfX z-x51-&Bfq+e&^@s^D91`JaDb`$6cO{R>mJzZ+|PmAfe?nPksI8zP>)k^Akad%J%=E zZU%!db827SdE9UB2+8>Taux>0*4o82268*Mdx(0tdX#Q?Rk^5(fq`Me{SQ_54l66m z+m~cirMX!#E@<}{5ZTxL!D@Zg?OXn;;7xL`AR zTWO#HF8n~{UGAbyk?Zr|HnGcJDd0Iyh1$ zQ)kWY&Jgp*VlMADe!1rH=@W17(T{uCSs554iq1=07Ckv|u=z~RrRXJGR@Upgg7$8j zG`;NBtFI*{Zp!Do@Az%s?t0ilY3rt0*Y@zXxM?TcQrrG2`<3_hXZ$J8&r09Fuf@s0 zV6bJLdC`xK7e@~rdUUi~-t)n+5FJJH+lmfoAJ`Xk1^)%X* zr@S|qw`TUO)mpRfF$yG3_Y&spIqWfsOC{ReYGN_7oz#))4r*EnPd0K zhJk@Wg75t5b?bc3pK&@rvFiXR9v7^g7aluz-aJW(YxnNmt*y>&Fp7~{$pNb88E(CV zmhk^SZGD?_=J~hlerxXDxVv}bt@D!iw1Wh}scFmQ&tY1jKRLqcH&rEvKY17R>+`K| z-?mr6KC0X*9lCYWwokFXhs`f- zvoAcHywk$Z>Ti1p3n&pWy#2Cg>C>qzlaK$N_{z;!<{a;u+>pLla0%(AI921?R*NDb zqtepd^Nx6y`+u{tyL#Ni^~=iVQ|HCrRQdfQr%ua`fq~)0yyv=ly8eE$uidpK&RJW* zeAaj4i`b1$A#?7q%Whl$<$2~Zh_3%pQBF4HvENjCHh#Un`c5MQ1H)cWF?#ak%6(5j zp5c4xjDFfcGIu$?Eq^4?+POFb&KZJ;Jkmn#2x zW(J0aWw!imtl*UN!3Ii!(;UNjW+?Z@`+4GLr=8iO#Q&5ZP(7yRI_7x=Fb7GR-_T=MTV+MwXdDZt$JXBsJ&duE|uD_4R z)@7B0R#M6nkNV1aHJr|NRciOQUp4v17IkID_DIc54)3o8Sb#<>E@EwY)n3ofUKO{J z|8CcF(Y+JeLCwOFlb@FyFDQNc=*`LC3&l&6mRSAz@_So+|MVdFUA$YL&y3&GJAFyM zxdZ-hCsw_O5jH<=Tm>^^`;nT|j0s z)IO-xp1R7X<63oC{*|))HLt$@`nI+1M5s6{SI?cNZd@f}UAO3a$L*_mA(Q7{-}d@; zcxlD06WcegT9liA-0}AHF!M>G+G%_8b-KgXvaG$*_gxT?rKe2`U)Cr4-u7y5RPN$M z*VgA8o-ws|g=s)oN;g;MBNs)#tiJ`1G!e## zO`oQ|yzlG0Q*OTd=Y`*nC}e)zwo7~JiSuDs)QVmI`+U2#Pf2^@3(pf%*WUWtrN6b# z;-d(x@Of3)?LB#N@ZNM)G1IL<_je_+RxO^Xopwg2_0-o{YhvzhDtqa@MCk)K$*+H| z>*wS5ZQfMSfJ5rmI@MRrdu7%h&knD-_-3lkvrk_=K8Msq-oG{J+McPL`B{HkLRjW) zuev<5Yw4zyP4D*EO*?aD`)0d)FXyPR^Pb}nKFc~c#j|xqWr|8&wTiG*1td7!}tn+rhnF4cHLn`(52JI{u@rMc>OHvL%}f_hn+m(Ujr9+ZQEp0@!juT z&y}4m`j7qM)fq0ho{x@*k(oc^jqT};>z3Lphp)bVFRJhG=6`oypSGG+uG+c1^rp|X zf0;|J@vG0<)bL!AKj-h8lkFu(KVNyQYu#n~cC)_Ux6RD+me0GE$rcu$|Mtu6*-`8^ z{wLctLkm4F?0l@Pa%)xDmQbB_vzY8p>jZ=*1sTor%74;bTlZe0-TQO=&7M;#6_Vw@ ztQZ^gs_y+c^ytP9mM=0ZIc)T+jNZPHI6v=2VRiZOtkM?-JD>0Ud*Ji-nj?j`COU`r zf9ii8mYJV**4$^>r3+`j?%8;hN&M92LWR|jq~6aK>nPl~^6p=+>-T-Dc;CtX{vX$+ z|9D-jI>Uv^^Scf98(5j~*}7{noew^L{cMcz>2tqc&))aVX7%o~f0){%AU5sp2W_x83~J!(4NwW+q|`?9-k7S|^gn`WEbJ^Fgr`yg3W zy9~W*x8OzVQ_DBJlXd_4XL{ksPp!l{417LSFF)Us{nNZ#2^Dca?s4wPf4;Zp_BA_R zhP~hRu=C5zm^s(h*1Wu=Ly8ew6P6%scdaSfHNTTqNUpikop*NIb5ptJ7xT_*e~yaKo_Br0!Yeg@&poe{d+vAs?&Hel z3-iSHlsDb|-m90)AdzyuJLLUC!A!SFa?YSW@X<-z@7w6l6;g`Uzn=fPI>563|CZZ& z0>``JKdhT{H{*Gw!?V8BdAH7HU1N{3h%wJx^trDl=ho*vD@FHM-#GF4&GnrziCe9r zSHHfQ{ZG|4Kj&}SyQz+=t+!U}S!>CstovbAVM%`VyopmHfB&`TTm0ajWbA#P-1GDN zjuuOb$CWY|M9gDvKJ@RC&E~gDg6d@2R`Q*z4nMYl>wHhrJo9O53K`Z}s_w47ceuE3 z>em&k94FrDdiBh}v)VPf%F3kxN9ZO@ypTbd!$W;ti`mgjFRoRx~sw&dln z$&Z`5=BtUl+Tm*6AJ3jhw^W86`tFz4Fmb)_70tch;z}7Bo-@v4XFhVE`a4P8{ofyOVus=)Onq+w-@+RU91&dR_5YPu=6_jknU=;*}l`C;@$ zU?tPaj)@bM&#a#Ge^G{+WS8-JFLh78TM3W&ljXQ<13f_H+`GR?SLbCy%eZR~uH6Z5 zvz_|rT;rvGAGdwWvA&t3v(M6Nmem|n=L?Si6{UE8!)_Th zcjLCbD@zZ2{<0Nm=`acqTOg{To#4TIc%NMA#ruUuf=fiRr zQzx8ddb<;DUlmXIb-i=*Y*=mGwVYNlpEp+H^_y2#US78ASLoNE`?jBJ($>ma^3*Kc zntS>4HuJ4~J;!>zii&OXbDo*&cJV#=UF7+2U-cfXL;IFWpE)Ie@z1fSXJ!AKMa*8B z?kGQ1)1bGzXLs3L28VDPa7$Xo#^3&)S+TB+_3QQ1|I4}E&EWb}^IYNe1MXUG#qT#8 z&R&h_PkgsAeVg1%HC5yGpUI*%(P!S|6@OXrV0AXX>HoW%6S5Y*PkeLd>ik(dc2-{h z{IdJ(S=s!5&i4-oT)cDY)0VE61&dX>?XOC0c*1s5!@~V_RYA7yb$_YZ*M3!m`ZHN51E- z4WIbwZerQ$+4_DrzuCNZkL8a7g$@5%{pg49&OMrTD9!f#{8`&&=JcO@w)Dv7+S@Vz zbnl1GytvjSEY)_{At1n+R{ylf=_VV)kal!w;Y48ULR>b}42|2&{>l4Md zRr8h$pSsLE)lM*Y?}mNX-}MIH`~2zTvp+%4FMPGPu3a5^>3!w9i^cclOrwrEJ#=09 z^Yp?y-*eygKioAhy_W5|&z>jWbGdD|TAu&Bjj{dwMIFig*Pi>uq^|j(YxO;NPhZOK zXlLF)y>ELS>`m@Jw7-4Pd2|x^}-|8p1by{>f5Y(&-2pJ`)5|CUU+p@ zM=pQ$@x&iqyDwTwHKy%MW&ac_t@^|6=Lw?8wrXINk_D%Bxv%+(!!M7A+MRj$Z; zbImMlectt__jSB?_LNGmsTQ=R&=hFSYNw0fzcTPPzJt{-S&H4Q2-fT^&_C&ttI&Ukj&vmrK z7%#jn`D$+XQQfy~&og}QrdRk^9NV|xc`9$$PeaLj-51I`gg&ooc|Z40gV6ms^<^)& zeqY7hFt767rBA1>Yk3(Yob2>+N%4}*tqGB_U%=LGJAzwr_K1fc6H#H zQ*KwJG_*Ilwz?E95>Ve7BNw)K!K%WNS{LiI?-RNXd`>8kn6Yl}w=JQ*Yxbd);(7Va5+D@=sLJlaGsf=;ak+7xP(}g=Op4hf#ab@_VisM*}dMBZ;N^9 zR7h9w*6Yg8+}+8Kg+U!ENb4QB!`k?K>H2lj#(7JGqb)wKDyhjyKHO>FQ>pRAMN#*e z!G_)6yF;s&?Oplv^Zh8xh-B~L$+Ii8mL^P_ysdZp*7Vya)to<`4V-i~_WIU`;=S+Y zHeU;|c)9)Jp6P|l*9$YeSoD0ZeSKm{2~QO$JeSMg_;qtK|I4oDH|H08sBJmW6>M>_ zaP_?D{}tR<8(#xe6&3U5ZS$3$^ee&n#Ln*Lo@UR^XD@!vy5D6uIKHy%PTip6>*|o-tI|4oP);;g_t-rkJU}H`Ea*aFX{o$@R?v*r0 zE(?y$zLZ_?e#%dV*fPoTw^ob|eAS2{z-M=Ueg^ft`DCq3ihdZ(Q}>^KcJ{MyuCiN z&s(}y!86%M`2O~-ajr&onX3G{yRV)VU!GGv@B89)>}%i8tK8TAZ2H=Q^7KOQ#Le@b z`=5>GJ9j)~?fN6T?r%T)^!}&VsgifSQbNO+&u?C3As%<^^P63tV_jXJ&-krX_~1xr zi$=lL<@3b%l{3A+U8(qQIC9&r}mpD~cEx7bNdzJXL z@3;0Ao~n+syE!NRmCUYx>C5xCdi}CJZ(H^5_F}iy5gL0mOzSPD{NA_ruVKvf&uh*< znAJJ`&%WG+%gvrw-ZOjf!E%=B_+1Zxwqf;7_D#J`lymu%B#07+CTIC+0S?OJve*1FYfue?dz)IUfkm>yKla$hY>Wk zvi|P*RV7{>IeTOFuYK?M)aKvi?-Q5`*Zg38uXVGxY#w{cyNI812iDYYDAq81 z&l_8wR|acWly8{${O0=NorkhYw}oBbeEpAi)x8_P&fd{(4r|Z+SP^Z@cR2i3@41T{ zCZ~0+C%nIPV(atLN*T9CMtXZ*F@W80HGS$$fgnwLzQZBx={b#t zD-Ibip7Fd_HCv`3+wUY1Wx8p+XzyWz_Tp*Z_Q^q=Zp+* zvN0OXprR;aIriy0NJCrh{N%JHKU2Xv0`lsYrd~7%5Z=I*HF(Y43rc=ii#_d|D(1TK<`1d6*3ZHd7oAp^{rqMzWb`1fDz3D&swzz( zvbwtb``fLIXZJLRu*_R-e>3IW{p#}c<*VaE^}pUVKA(Q=*2KdH#G`JT{f({;etjV0 z&I%Rt>z|J;+n;&yfy2J_!6NUf4gL#mKC|7*?&-XVS3hhl`5e7+eYOcotNXd_`k=M* zX3TrXn{8gUIj`leboSZz`>K<--t^UVdnXYjSTV2aS?;r05s;#;XV*oMCqJ*bUOSjx z|IX|^mzCeT;|AYv7)SS)OrA9J@Slxb`*hRFwp&((e7L%`eb)bXkp^2Yd^ae2_sZY* z&YeB4e||ao>{*}r|Ap@pS7hX+R^HlJvLkTP(fL`t5k>3LdYA3~^Zmk=z(>u`Hi>6= z@yrcz?2HVbUd{WYPqg~>uc~uQ-BFU>cdZ-Ozq$z@W6+-Z>Z9=Gy@_Ald|ABLU*Ep| zZRPh*v!iGR$% z{F$naGUV{tF!Htb#&_Ryi+^sf2~Ty~E)+TS>VeN|w9d6o|F~z%iqBrt|BGyTu3hl0 zy+nFz%ru>icg*{mk9R4#G_LloLLG&ueNbt%`1r=h>Q&7gVQ<|`e^%!1-d7vizPz_a zdiB1&U*fg5?v|}DRsI`$JL2n7wc}pX-e&(iu~)0>u{y~4Usf)gm;U;s^R2Ho=PzHU zyd^Jr{&Owo^}?9?Var^j~5I4H^CoxvVek%Kv-9^QZHi zRc-XIS8U$=FRFXq^d9~jdv+$9^F5u_I;U{Q&u>Qqj3ZWx-<_3vKHKKp;=A+0pKaX` zX0zVWdF9VvbI*UaIX8D+^~UFwuk!NeJ-57;>VB;_JfHbI_g$nmJ#_YgcPj7V)I3m| zFZ#|pAK7Tn!&&C}*Urq?^sak;&ZlL|%xB)*;8fKZ!ZL6A);JaYW2vv7{>rW8*LwbO ze%Wo-M-d;n?}cuXerv;j;?BlTwPlh0aSsdbF6lgH{b^(7`OnM3KDUuW+OXIrax?$O6>&n$Yj99Vtq;@-EFZb6N=zF&=9EL40c{G^z? z_Vsz!3$PU92?wC9O!GBInjo#r1CL_A>@wdsbJNzXJ|6m@hHlUDSrj;) zX7iVuORwKs&BsvnqOx0f^5ngVPpj6J)kdz3@BEdl@BaGZt*IB{Hf=4dRgH?@7q{Ad z_wPsErw(3ulpDThVs$5|N!@(-K*`(Enn_dMUC5XR8gKbCZ~KNF7Iua=rKcsI_pW!l z7q))yR+;wnzdIvaT24owoVIptN_l*ZsP~i$o3C>0EVh*28SZLmxDzxgbN%|J2orH0 z28a15Bdq+;ss%AC(+HYeaIm(0|K}(7;>F2`mhkN7wiOQ!oO$!+<<6ap7cT}i=|Hm% zAOjdO`k&j{7=8Na+`cS5?c7{@ep{DS4=yZpR&M7vUhif5f9v^U>+4mELs`^c-Z*}+`qD${!(q?>(vP|#Bhb4KtSXcKvXO;iV{J4_!Xy~)qnUN30YdWrVN&evT5=kt+ z`@ZC-c-1L>AU~BubNNq4tG9ZY#*5|I_0lwb$sURm%A@bv)<*;TRV3{YPa^;IH?!f ze>O~4@ts-~ym{XBWqz;n_RSGr_xI1*#8BTtQD%mD>=kk9_s)ObQ~SP_EnR-q`#4WjRnBWNx|^3?dolc$?3X=lM^oi5 zhX43iesR(?o9!!&E_m%RSZy)${ckW5<;+wlvxf-t@<#Nk3d6l94;?TMGPqj5(o767N zb>!9mF@Z9ueF{ZzLZ~^-kr}Ydt*Tt zV}b$d%w$5`)PBp)&qaG;cf78c_wm-hbFt;WOhjMQFFt3@r~Ex?hV&wS@rt!)XFOH8 zpdd2m(ApE9*DTxD_FU-RX&sGZ3HN>ZCh`#{)x*kU+&IsF77MTQX?V}-zTdX`*W$zJ z;$Pk~R$1zo{3?4rw=$b$m0NgW+5QhdSR_);OIy~sd`U`7{P^hTbVysYr$^>twFJY3 z^~@EF2^Vk-#4=`RgtP^TKSzV0n_e9bEL?XkSQ z`>K;oxeF&~92J~(Yw5}>B~NUhIKG{_uX) zP4usM_l;lW=KZ?GvQJ}TVj=}ke!AQ3+B!egNB3jo>K}QE%iGJ&DV=MOIpKHKWAgsT zOZEEK9I+}EWIB*gdCzNU)t@6JhhFvGdIwtXcI;J&Scc%yog1r^WEQTBo#mCw-+u1L zt+Lqp*ROBezW>?}0bSX3nV`l`(s^&Wlae$1rv{m3Ui-XtO~<`u=Tr8^!bJYESJ z9y!1Jz1_@~&-x6KEZf#gPR!4{_J-v#&yksTZd}_ve?}Cx#>WS-np0mzh z4=!6%HShY1i`T_*F+UYPZgT2~%|wku)wk>B9}e+)w3gM2pW*!O_xm92u;e2}S<+V@ z2XB1Q`PVmeaYNUwRo6Ek$d3N{>)O?fY}Yv%zoTaLDczp+PD$~0cz4j|ZEn}5E_rbO z^hpQPqRlDdwPKp#+l3vCiy|h-t6!MBqqr|{j>_59w=*9-1+_M$D&y9b9>25X&D-6# z9xC;MSV|?4`@=zb!v45n5;;OEK^)fUY9xUg5HAlhE4uyQ{9R3qK=}d^a}m_1CxB!Nu={_9sMg>_PL=cI*1V`qhc(>$;3`HFc@T@*8y zdf)%pwN&xv%WCHH0#nvJ58VI!`DdGI@y9P%-&VeBT*JO$va>StuGV7}*%yj+l2?aX zB=Tp+#GLzGcJPpX$i^kk*K!YQKdtPI;#$}!u={PL)sgB}lRc{#69jC*W$b(Yj5t_z3AHO=zWQ?tRB3Gf ze#-p%$*{G-JIi*+KflFs_DgK$Y1zBW+xGe0*mQJinm+Fr(YgqZNz1(Uu8cgN9jyM< zuEtWoM(|mCMnt&B$Ej=#%&);MIpN6@pLNbS@_MrH#Dg*MeTVgqE1uq@rMPJxYuwFM z>brH0TdV(8JL0)!#_zO`#x*OKKG~e&Hf?H6lPBAx4=H9LSS;+U?)5h9e zHvRQ4uUS7UCYw8E+q!8no!5R?>BX_{|K0ol_T7CgWxwUi?DUC-F+5*xKl}Rndhf)A z59Mx@Rm|(k_x;(l|COkg`8e8anuB)Th=kL>} ze|(mbHfQ*|E7|$F$Nw#v^?lp6l9toas}AO;#^j5op8Vz;`0-5b^j@>Wi>_Q+>vm%9 zX}2dUf^T#Qq#v;1{@oLH&nRemuypqzKA)<* zH|H+fwD<3P;%1z_rW?qyM=#94YjGfd_`%hIKlg50=_&Kw%ilP&#Iy8y@7tOump+AD z`~2tV*PXZT`*NS1=XW&xN7%Ye6X*F&&(7Gh_WEa=Q2xZGtpWT0E_;6HbF3ooIuiy7 zpYyZhBV?rKH-rg3++DnLstBm-lpN4xo7i=GrzConX7~NAL%jBa^7Zo4$+5kOGC%iS ztVzh*;{LNxLe=Jcbj;7`A8Yk3e!abUSzgv|_k#M*MRDD$p3k&Dzw?7rc*nj=AwD+z z2^==>5B)jx;)cbW-s>fwWB;DZUaP7q+W4H&L7x8sD`?{8^K<=tjzw6|V?AdJhFQC*oGV``#SiV=+?A8Acm%h7l>{|IA_AY;exOe;P zp1l#hwd&B-$cpY2i91b$H#7!G)z_;3vdx;BYoOAXKd(b;az?g{?*9DL;Q2d>7d-Q~ z^vm6Bbfx~Ob^UwrY;PR*3isb)Gv9Ei1P?ue_`oyMcA7$oy{21xM#ipR?O;#Yf|>dvvzObkr``yCV18`}TglJJygv z$fEA)UsduxZ`LwXDdl+o(5f=4uT*rld&TO!C)ywOEMVNSIOx+%6TZ6#KKHQM%r#8S zFSN2Q|D0DGHW$EL4j0`sXANEYEp4)WR&uxFY5|>wb*}Hd7cKS5)&kopew>%BJ7UOh~Y4Fi)iSs6|b!Uy9`f<(uEjIbZ#m6;eEH9s0 zHnC%7aqNc1B%M&rZ8oN#_AHSJsVSa3>DJkp)z8oUdOefl8GlH{se{H^dA3jQY3?g$ z01q=h?Nfg)Yr5U{P~9B&{uOU5)3rN}e-7#RU!Yq(Z*58C$rF1YJ$rKh^SybSO;2sB zTX^<^jdfa~rHRh5Pg5sNUfwqE`FhQ}6*Eu8TzWIhdROIwN5On^FMg=Fo)`Ri+xD5!kMH^1 z?SJ`l``M#8$3CywV|wv<_BVa=Z#Hue|IsebRPs7{ZF1JB*WNFK`Q}ax{O$a=C@vjl zQ|F=SueE2F)^GOxJTKkMrS)E1)qj;m*CSzowklV5TB^R7Z@Dw1aN{BfK|@3p4onr{ZL zBU5dzue~y-P~zTU)7O=9r5?X?S09_fyuUI1R)+2>fLbzJE_|NlflJ?SZwj30+W%Q+ z+1E8j&qF`TtZR*oIwNNiyrIbK+1J?*tlzUn%bwrN7QG{Xzi9tqj;grCrB7zP=*j%B z>2is4N!wh`$euau_ZIr_ht!<UaT+Nq|xpIl0{TBac zmGXbklvsE0axw?Q9cys!fcam?r*j_cFfIcFXl;kNogL#{#`DY!4USI_II|}{IPjS* zmhqzv1H*ym2hP{Z|1#(^y>Q4}W8U+=w5by+8d6MtMuxYgFflN+ZU1kRpOYiA%duD=(G$^3tUP zKfhgDWu7qadWP!vhvAQlBWgA>Ff5Rsbp3=h-+=_hdF5YTXnbK=|G{*174!4TjoV$B zjksFYC&)4|SY1ti-F26lU#_9i&F1}4@qQ=sPVxS?ts(g@Z1n$a_;prm9y`MY_j%Ke zZT6eka4;Wdx2w3%t-pukuFCrw%iEt<#qHsl`h4ZikXNNP{0s~JtLUqj@!M3`^B6s< zJa7M>sYLktPp=jCCRE;YG(E<2o|)mr-sd~prWd#Vmj9u_qhtTMk>Bq7o#zX4}M%ua)L4m-=}o%+~uWsO)_)rdLfW{_aJ z&3ohdKi907C$$tbxZ<$gR$s34Bg4Gohc0oRul{!Pe9gDb=U=MXe*Mb>(r5LqvZ`k- z&-o*tBOUoIwg`SX(3VfzA&-@X69=eno*{|YNl9{wEhZQGwG>h?Qp ze}A+7_-Xh4-@EI-m)Bo^%5$Qy{>x(doezaHW`BEA>2G(l^!(*j;eMZZK6-ue zP1|4j-+Y#3!j#*$_^nq8Kizcq&7~)q|7tf(va0^XdOH5!)A)Y}<^MFkxI6#v&H0{o z`@ZjeUuwzxsQCYf@VcWxw)qbjD&_@&HWYM)--(U(&C!2e@7X=~)%o0GpQYY#GceeG z+cW>>uOIB&_-cRO|C{w!{r|H=`~Uvo{u;dh^Wyuzo9F+z_(Xng^>h8YzyAME{}289 zFWlw*y!G>|-o>A9x&8UuGjrYQxXs(XNN>HBZ{o9Us`K`bJ-0%bCMqwh`fmPy|9$O? z#?$WqIeTB^`Rjj$x~sDTKUKY{td@}w+`jkb``exijP`rn;)vnvU$x6+ z|67KNxFwbE|M&hXm#>UVkCOPl$HRNxmgj%3#{UiV?^}0wUFk__pYz=@zWv8eaK_j? zNc#NDZ>Qd^oHcnL_c1VBs6PMuNWSgofBpNvZ~gUOBPj z{d>DGL+fyM>?gJppxp}RPusk2y+8Z!!TNuf&;Ngzz5oC9>d!Whb$7fux+!2mRAIbB zx9jnnS1sr4oOJBdzSik4=W151dp^~2`h)2Djdqrue>RA%uk2sCy~_K*Z1eh?Vsook zmCEh)>$|r!wYYfm@BC+=ZP^a{bFbvDw#omt*Y)Eb;r;cAzt7ia|F-{g?eYKP6~*(? z_X&vQchprde~tUOHu1Ef^p}|PpKr}xT)A_x>8Cvpc1rXn-eYrGe0A*(U%i`An^?NK zH}05iW|v|2|8CyJ$%{`m^vv_VSND25D?>xAJ>O&hy085IzxB`iz4zts{hwc2*Z=eX z|9$_zX6OB1zv%z}7+wEoa{cc=@6XocJfA6kPv4eraq+zAu9x#dFMYm~cyQOx)s>)a zC)4bd%d^F8{NKN|4EyeO_Y{k^?esl=&G?uZ7`|C%*r=P>%WIzWv2!wyN(x@Le`pd+gXDyZeu}^VH_f zoTn%s_G|7}8_QeO@AqC8J}Jv>2FPquZlBaEV8mK`t$j#R(&xe1KY9B5fKp|_AHvV zXLg4y1E>;ddd@rhdFuT2tPBh`{jIF$rH#%%Znc4O7TfYOFnq8P6SL|64o;-Wi3dMd zd6#ZJR}l?WB7F|ApW-}7`iC4F1H*$#9i0kr#rO7ujTh&Fy*|F6^w;p55p+lZNS*;A z4O#dJ<}^HiJ2hil%Ck^LQ2X@5o`;|IRD7}lO>Z9n4V&+)W&`b{V3>FP|2%QiXSrcr zIu~}Ef;K3C%(!kpFZ_!W$VRXo&e!Ip*L^gLo3!sPXk!FuSoNO6-udp;;MJxL&w1Zf z+=g#f02#lhai0D8H@&Is!W}dGrd-7po+eHS*RuHz6pZV(EJicG|d~W>jt?~9>I{hD2)_yrA zqVM%}mjzUHa=w`M%F{_3M95vX81ev}V!GO|z=xruWQ|{rm29a%O^!gF#(# zjm?f^1;5nGpBMdn@hkSR?w3OC){L7mx?FEsu6?=ic~{W0+;4kqpG%%+W@vc$*(UR_ zvGnI{+qcXA{Ib~b{AK^h*WJ%$zuU~*t5}7HyJkjFFy`5>t&nGaL*zs)ALx-B?b0U zW$EL&0vSp37DU=@%yl__chAnr)_+x^r1DxM-d2Wr9(%YxU+rX??!wqR+H0h^!H{J`(A#jJ5fZhzMheR?c`^>k0<^A-dg|n*4x|L`QlyJvm+!thv+I5C5>LBBDN<9Xsf$k98L~t8rm(tTA5-qvl*KLy=a|m^ zajCq}-Y2*C*Fwpy#!IzNJ%8mEJw-<8d8MD{EZc-;39O4Bc+He$Dfn@jI{hhJ^`-?7I4U z#W&mEq2B#@PbSCh|G_9?-r(BHSNZ;9_jGCXY`ZPD+c)JbDRg>&O!T{)*o(!dnzIkj z`~KmP`kP6D_ZFy3J!|sICUceV!n!kg(|69cUA<$E;@k7a^OmpQxvE(7Q6&RtEa_6u z_Kh1q&aK!e_4(Ad+hVf=Bv*512LE}tXT7Y4={od-cAxjr=JBS!dy9S6M8?1PIW_CiGo>rL?$@4Ij$vR} zu=ue-Utgc*`OQ+Fr7GvW^EKXe)y8)AyRi8EYnM-TE$2$#n;#~h`pt%G`(=@%ANOfL z({TO#*ud+{ZL=>ncPGz&y`A@adH>q`KJzwLPBna_k}lqLbF$I*)bks6omusnIrY}e zbQ}Gg(r;dOCGJg{mSf$vi-F;Q^W2%?uD^2cS3a-bB=uP?%V51%oZ1|{ou`&r^C{oW zYFXi4BzCiK@f*%ZlIIs%vv5mg9x6OEw;_zXRdU7s;O}g^ScN3o1wYv2f8V}c_|D~j z;rxE7iw;fRxNhN$y_&_=)%UJh+iG{&#%%AcJofoaTGrQ1DHA`4u3=_ysIQFczPP~F zK)y(R^LZQn%qhn{Gcd4S`ds(!xt$i@b%9Q^fY!;I>|s0H{U}@*l*w)Q8O}ehmH-`vf?Vc-iatR#R{Dt-0j4p>rC{q?j4lajOgI(q9v{N`EN9y!5zD)ZDy zP~vNN{#Ja6e{ts9rzv=*wWp2GF&#o+mS*9xy(?dQI>A8E-XCo0q+Q8MOOjk;sl; zWx3zqriwniWk2zQ^>wS+?3QOIJP%!URrvDd+y~jWf0?|#9iQz#E8D!RJb%qLWlc+8 zP>1Wop1)5kKWnc}KAvuM{L-<2}Tff@x(W~7~ zyy`8_HW&N4|Jt=a#pRNpY-Scex$#kW?Z#b!x9>)5J-k|am!k1KtxI9MH%{F4tCREC z#dR;!4rsVMve+FGeKxLTjv6F|{QI=$^XaLJkNcH$Wj!h8-gzLq{MGIF-b3ZeCs)sV z@!%rw6BFlo+qdj7Dt%Mo9b%sK_3dg_!F74vM~+^66&-$g!Y#L_GdPl@gbH)Lmn%lzT+7<3cT;?RReid0=FFQ; z;mgbY=eu3G^`O#Q+kJUodDp39ySMhX#w5I{6pCA4o2^_lxAmOtT?aqoCzajarzZy= zk6I*j^G27sO|@}h^3k4U*Vf9O{ZYt#e`>&~v&zds{Y{2>+xOeNzw_u*_vGVN$FAP~ zddob#XTsDQf3EDGd|Ygu``O63XB?X5q+R$dHeF49dDP=qVSCF!TV9neO=DYkWY@BP zb9q``IA{xMr>s8#OCS2@t1}BlW3l1W*(jMy zCv7;2W+k4Fo-<=k&cvs$1E-^Ii>+F{Mp{w$~l-FkYl{p)LbYd3-l5r%o&-`nITe*F3INbym_;QXG$hLVR>ruGzC2J^!XdNeBGCm zzwLiNx^m{t%g@iBpNp69dUE9ni~X;e;&z{2OwQx1`O?U4SNGz=mosN}etzCAVR_KG zo$v1d1I(a3*bgdycktW(nqpGoIsch}vigguHb?({w^!hey|mo&$O+DA6Tt)7A8Z;H zvVw{ZP^o(uTo5ozXq>Npr3uQRyB1Yd$T?iMeg87)Ja?oFI3vg%NT|5?`8=qRbD{8j zwP*D_g?Z-I)kRfRZ0DI@On7el`%QY%`RapT_B`^71{o6d$>#2o_UDWx=RVJ?v--5> z`MlqAD(-bJ0v|k3QlioJy3*LVLe8Px=Dj3H{jOJ)@3cYog2!)8+N^()05<2F%~r2< zp8V&TUu<|@8)oAlcMjy<1>W=0&0cz5*PX|Hf%E+2gWDceW(A3Y%&~f18Fqc`f?aw3 zn|baQfrgb#Z(N&Y>oUyEyL3A3;^gC(o;+D%Q~e}Rg86n?pMab9}AynW%D8y`=e)U51~@a4O>$ZB>% zgTU2>cM4wVN>%C}-t#=><(=ua&UN=LyS42JxDRrp{lw=JF1KV^GTSQtbgIi$|0#TU zx!>;BOaJ;`6W!%3g^GWi5PVU;jH$bVtz>e=&oxSM^CnNTnYgDQ8SG-&&o#gRIp9|hkkLlaVNF&&VWPZ?5gQE;_hq^S3Jbtd>|(w za314bmo7P4e%0<2xQcrn7LJeiYaRQn){JWNwgOcclE9@2b3{HTP6@zPw-1oT?_+LnY zWIzX=fn5SxK?Pbp09viW0IJv-L1_>?mJ8-S1ScYfd7!h?z#8YVgQ*9V;Cu~QbRx$9 zYB@l;Aa&qva`W1szpXxRUG(I{a=Wi9`!{a@0iHuj=hrCr+cZ6YSXmLLdD6P(#|L2@ zFlgQ^(20CMERO5SPWaTSGib^C-TR!>p@8OuG7o%uoK_g7!5 z^XGZi&8z%;Z?F0Dwkw}?u513&eEsE_Gi~8CZjzrgKOfCs0UZ}-J9brekz*suZANuC#e=<~eFXP4IAxP9lF&C-UbyHA$KbtbvZ){m^+$Nai-k=iO%&#k&I zIlN|*zku+U2S*pLcZqZ0}b!%{TK` z^B%sWpK849=T5gpt#0OrBG+a-+ZXlt)SmgvgUh6!pV@x%%-UU^=c~UwIwRu3H?{fI zo@?8l>mI(asC3(&=ND%jhbEu6$@9d&U%giqd^`GI?_Q?!(k`WtWfyKPsd)|Km#4`lL`gAYC|319itKUK*-yX1G)-HYpY z%zS@!rqa{0f4lx}OI>n-C$L%ljzyZJowP)IV%F-+_VdqBr^s(4dn0tn%5G2b2@VZ1_Le*z~u80PA^X8~*dji6C(BGsF4U+;(4A`hPs$1d>dB zAXZriDoW;EZ&2>HDf;mt@n0M`i}GA3deULDPYx2pEw5xPmHvl+DFmB7%`xK1%uof$ z(T$7@3_QBvLmU~AiW?k-5o7=d)K`JA80TG2J-4Uw{k_@6b35)#W?=*k9=*^$e|l%% zQoEh=)9>vlf8VRWuX26d`ukO`@9SQM?R|IalD3eP?)Q5($!)hM#$LXp$U6Ji!O!Pf zPCMpaTK<08!{s3tu>T^Vwyaw8i918CZJ!LKu}jOkPMzPz^5J2OE=DgV~)m|aU=?gRK>OxqQS1u|GGyW{M7ivv|gUhCmUW<&@zu?%|l%iYnOfRiI<(kaYj=tC0 z%jVBqS$X^OniF|;yw^LWPsW6HNlV9noR_mrGt<6%tA3}9>BgO`Pc_@Ux6k<(yq%}J z^-a&}p32%Um2$n6pn#dz{@nCsWoM!Xcks0%OLLDI*lX{*d1#91xtpM@t5tOJ`{ylM zH+zdu8J*>M5*N2SMODbET-*5JiGxKRMxVSKCE2oEzW*_MTxs%*5mJv`-}C(F-wo^c zRQmUep7`aw_ga!v=ViypxV5J$=3P8Ay?_3#xWg_{-}V$(KIu{lZ`)b^!)elUiQ+`l zi!<06z^UY3oQ=P!FY7NW?zx9^Q@DP6T?@_n89eiZ+xGWsUCO^`=l%Ttif3YxRedce zSALlJ$3paOa`rL9(*`Ddhp$}QqH?!TqVZk6)Mrq#vf)2pYsz1|dDaXp z{2}ZwlLpGMiJ6y``b8r@*c|v=rC&M!=b3adF>(EUe?W)AL{B*0WfLP;|H%`S0^>gY zc_9yUEcX!l`{asIvC-=D?ESH~^g zRh3k=OohAK+v(?zyU(w@G}ixr==t{zi{FHs3<_kG(_UApzo zu8@TMcU|UbmAA8JBT`*bC46_CBNR8)J$v(WZ|dRMJM@%7 z6;#h}Oq}}i&=)z^xtqRoUE%cd`K&bY${7>sxDRu8SB3I*bD!EXZOyA-(YI;$tgJji&n%k=#`B^}j4cmG%i&)J@qKTS+u;(LGp*XK*smx?%TYI*Khzy0}C z!?kUNv#xG^x9$H)Uya50`(^DH?l9Q@;i!IH-1!Hy5)mDt@ZVqOG2*Q@Q!e71Q8P z0;!8$PM-A0)H~wa)Z~={JM+G7U9~PTf0K~=wpp3ec0Q;slH9%geOSE4=d=Z-g4+y} zQ{QQ7&wXTacWqin_3_fpOEpkTfm`)Up1p^FQ*vgxp;x2;9_q zU8UbTv(HKPL{EKUU0i->@~5kxJ?l*?Y+_$Cit>|bBd^O`>TR3Zt-W`-sey4kv^ys9UAj1W{r&3y%g8bWLHUFK+y(?1n+1l_wf46A~nr~8fyg5O} zYLe5`1yg5Uv+c`wO>Mx>mEm6mOV|07Y|@%#C;quW%jK#2;&UgoShjZCiPv&` zUOuyaYHq$@WaZ_DpVr^oyW`89GrNywU+dVJC%VSV@!H;_L329RNomJ0?HACDJ-S9# z^!V%r)v6H>e=S*atMKy0#%H^}e^GUu+qX{PJ?nejn(sk69NYbFu8Gm^lZ*_XP_0|J z`uyz5)km&u{Id7)TE5q_zQ?V;cl+|*AA8FiOD9*IK3**uQJ-?fbLD08{?vQ!_c&N* z>i^iB5cf9Eaz?%ARe6W^d!OwUIsJcaardFWj~9C{`w@}*{K?7S@b#{%)c>E_W!`5K z^T9@9$+tb0?|+xw6TO?VJUL1;Lw&Q-Zq8fQ_jWx=Teh|CHsol?LtoCE+`6?pYcGSS z@4vr?#P=-;sGhky`nAyUyIHd5yaMt|!<}}TPBsk=_F&nYRQT@@>%l*o7fViDx^(K! z%*~sWPM+H3b^Ofc?^DhOPuQz6OC{;4L5Wq~%gCAE-8hyeEJ})c8aZK8-^;a9+?I}= z3%X83XTR%g=TZsT@JmPK!Wxe3yVbcn1ox;16}*hn<~@A6C89E5=9TGlL=Q&SF0{UK zH@vP*Pw4Zk?_pktvlXU%PSbB_l6G9{{p*#~6ASm7y|az@ z5Wex|{?dDw%m4rI*zvP{-I@Cz$_%SNJ<Q+<9|Em9IHEvqWxAB_l&CA8+si7XmGWBXYN1q|bkV6a(b=Jyu^;Z8zErJg z#-lHslo}d3p|tkZW%JeRf8>SkKB2ifEA+(q3$BmiK406{C{vrTq{j_EB(tj^i%%a?HW$sT@S|IcLrBs0TuH;-kP&AHPC$Z z<4Vu_tCKT5Q_LOn_pg0jsr%*jtX8$9AAg>&zo>CJ_2>5^osyhW>d$_d9%rRroG|OC zw%{3on@_*Iw4A!k%Uyj@(yWhXOFQ%PO2hZG7f-$_c_I3%@47`VeTB}R+Bq|NZl4x= z=`Sr!*+uKu8M!Vg*7*NQMr``L*_GQX)_yX1ebFZPb4f^0+NtG!a}Cd*Sfys}vUIUg zLg+NF<626wrmJ$+vfQ0~sa5mgz1J6{@1I>5EtM7jp7p)hK2ToL*KjV6H)ejd{Hw{O z<(XmeFY-*w4fPGaUXGT%W}5%(!rsum*Bu@t2I z_y69Bd)&8sGUL?K&fU#kzjA+RUSP%lA1(h>z8wyhJm1VXGkoa*NN@7ahEDI79G%tM z^DN(1uD@f{mKal{{9EWt-{FkK&?UYZaaQH;#O?mGww{SpRW!1RyY@6*_W6~Um$j#c z&SbuPCs1jIVwQgEJ@0l8AMJfI-tt%OyjoYmzufuEk7o~6T>eifHYpF8eTDN>*OTDq z*Sy@tn^a!3t&o)#n`qu{6z){`GID0Qa>eP()yu+av{P#tS9EEtkm}Xr-Rw}pc8BHb z)CbqLmIm!IP+eA;`s&WEk7qMhxv3OxmkF80D!#|htVB~RX3;gx*{W%8UtgPY>($v+ zk+lnVZ+-A7c0-NxP&QUj zi-*}}{r7q5n+tmTdd*M&`Sa+?M&YyXl!A9@e=9iR7rZh|wY~aA;4GaCj?a}7v*Y#S;uhD8|0wrJK=(wltDIiH?LP}pV{rZKFLL!U|E9k- z01wxA&lam(^Tq2Ec>IHzfk7e)#yaqs0W`J>>KlQMq{HBX)Pc@TJq#K^;0LjoZPv%m zfsFXDsejz5anjhoT;pt-k<1y-_O309O~HM)FZVvj?F_wsdTscv2fTAPu+M#VPe|X+ z{pKpBwMV+^=2bqvx7U2%k7s*pnx;Ro(DKtb`zZKAHK>gZ>P+ZX-HTDt+OC&6Ytq{9 z(`~mrs8l^?cxkmaudV;iyOO6f^6#Evz2{xdx#VU;i9To?6*Ro%dj9m0qg8*F=fQHoHiJUht&_OToqAyB^-FJmwXC#K$n(sZ8y{yrS#a@v`M$YolaBWDKe3+3_IyTb z{I1j|_G=s?_rKEKzG$k&p`|7UUQf>Eh%5WnHbq*VNnM&ar{kV>;l7gB`l=^ysXq2q z(f+oj@M4&!^-YJjt3Oq$<}J3FtZib=2kKp4sGnE9{$1`JqZ;pBf?qG&);&_!J{9sM z+3w!UpmU#lmTAi7ar7SF9-?&Ac2$~^mUOSp`?wXYXKttp?r@v8{PX1Rhkp3XwR^2| z_KQPc#z}7agxeKDRBkym&x$1c*GpN`3W%~2GMY9jydQq8r zOuj;R<@5OF?6aTqroM{yIUZ{A!6tB5b^e}D&usm*7ymY!H#tr6y!MHclFL)>xb!SL zc+A=1RKH-Sb@g|HCJC@>R~Jg`tGnGcZ+Uf5@!xGf<8HOhOIQ2UbMd02(8@V!tf}Yh z`3~Pyebx1M>9Kjsd(>|j&f?#A>CDvhh=|92iSg{KqmAad#O-_;0_ zSH}I2`MkSh@1JLDtHazkFE8Kp;jM}G5ijGElkehQ?k>O9z_~kRPv?xuCq%?5o-LU9 zeCOO}ZC784Ye@5ag&gr)JMYQ1FZaI&swX7)O_p17bJ?7hw8zY#!G>?m&#%^=uKT*@ z$KBn=wG-2{Eq9i53kre4@&V|0(+1GFY2cw=>|D@r4+D5fJ<0$v+K3IbCkr0f0c9Y> z$TQkNG>khBJQ4i>J}3n0b%M^4$2Beu8vp`1ryO)h8!m;=0qpJPZQlQ9Z!i8Yw5#CC Q5zry^p00i_>zopr04_Xo4FCWD literal 38070 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 qZY)xF{K41n%*3#t?fneVfBzK}He6Z46 \uicontrol Options > + \uicontrol Kits > \uicontrol Compilers: + + \image qtcreator-toolchains.png + + You can add the following compilers to build applications by using other compilers or by using additional versions of the automatically detected compilers: @@ -94,6 +99,20 @@ \endlist + \section1 Redetecting Compilers + + When \QC finds an x86_64 GCC compiler, it sets up an instance for the native + x86_64 target. If you plan to create also 32-bit x86 binaries without using + a dedicated cross-compiler, select \uicontrol {Auto-detection Settings} > + \uicontrol {Detect x86_64 GCC compilers as x86_64 and x86}. Then select + \uicontrol Re-detect to refresh the list of automatically detected + compilers. + + To remove manually added compilers, select \uicontrol Remove or + \uicontrol {Remove All}. + + \section1 Specifying Compiler Settings + To build an application using GCC, MinGW, Clang, or QCC, specify the path to the directory where the compiler is located and select the application binary interface (ABI) version from the list of available @@ -118,8 +137,6 @@ then select a compiler in the list, and then select \uicontrol C or \uicontrol C++ to add a C or C++ compiler. - \image qtcreator-toolchains.png - To clone the selected compiler, select \uicontrol Clone. \li In the \uicontrol Name field, enter a name for the compiler to From 5636686aa0bbdde50e8fa8034628153abf699d34 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 7 Jun 2019 15:12:01 +0200 Subject: [PATCH 37/57] Fix warnings in qbs build on macOS Amends fc04ec1c3e. Change-Id: I17f41ad1dc02727da8431b55cb3b14d4594fe1af Reviewed-by: Alexandru Croitor --- src/app/app.qbs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/app/app.qbs b/src/app/app.qbs index 3ed4eb8fdef..a866a2ecdb5 100644 --- a/src/app/app.qbs +++ b/src/app/app.qbs @@ -26,8 +26,14 @@ QtcProduct { property bool qtcRunnable: true bundle.identifier: qtc.ide_bundle_identifier + + // Some of these are in here only to override the entries added to app-Info.plist with other + // build systems in mind. bundle.infoPlist: ({ - "NSHumanReadableCopyright": qtc.qtcreator_copyright_string + "NSHumanReadableCopyright": qtc.qtcreator_copyright_string, + "CFBundleExecutable": qtc.ide_app_target, + "CFBundleIdentifier": qtc.ide_bundle_identifier, + "CFBundleVersion": version }) cpp.rpaths: qbs.targetOS.contains("macos") ? ["@executable_path/../Frameworks"] From 11093f1ed7820adc48cbe7b70049dbee139bfc14 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 7 Jun 2019 15:40:31 +0200 Subject: [PATCH 38/57] QmlDesigner ColorEditor Labels replacement Change-Id: Ic437540c8f5047f303b627dd9579e8eead3791e1 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ColorEditor.qml | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index cafd439c07b..39fb95fce14 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -639,7 +639,8 @@ Column { spacing: 2 Column { spacing: 5 - Text { + Label { + width: parent.width text: qsTr("Original") color: "#eee" } @@ -664,7 +665,8 @@ Column { Column { spacing: 5 - Text { + Label { + width: parent.width text: qsTr("New") color: "#eee" } @@ -682,7 +684,8 @@ Column { Column { spacing: 5 - Text { + Label { + width: parent.width text: qsTr("Recent") color: "#eee" elide: Text.ElideRight From 6d55273fd99e584b97b50f47dd9ff9b147177cb6 Mon Sep 17 00:00:00 2001 From: Henning Gruendl Date: Fri, 7 Jun 2019 16:14:11 +0200 Subject: [PATCH 39/57] QmlDesigner: Fix design studio crash Change-Id: Id88dbbf7a8526e1d616c4ca31d56863103713f1d Reviewed-by: Thomas Hartmann --- .../components/propertyeditor/propertyeditorview.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index bb02da3527a..fd8c7f0fafb 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -659,6 +659,9 @@ void PropertyEditorView::instanceInformationsChanged(const QMultiHash informationNameList = informationChangedHash.values(m_selectedNode); if (informationNameList.contains(Anchor) From f3c2fcef1aff0835b8e7887c59d54c48e1346ef8 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 7 Jun 2019 16:17:33 +0200 Subject: [PATCH 40/57] QmlDesigner ColorButton Labels replacement Change-Id: I2b0af3e1f77fda44d738202986071b9c8f50cb4f Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ColorButton.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml index 62ca268e14b..5449f85eb6c 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorButton.qml @@ -293,7 +293,7 @@ Item { Row { z: 2 spacing: 1 - Controls.Label { + Label { text: "G" width: 16 color: "#eee" @@ -322,7 +322,7 @@ Item { Row { z: 1 spacing: 1 - Controls.Label { + Label { text: "B" width: 16 color: "#eee" @@ -350,7 +350,7 @@ Item { Row { z: 0 spacing: 1 - Controls.Label { + Label { text: "A" width: 16 color: "#eee" @@ -399,7 +399,7 @@ Item { Row { z: 2 spacing: 1 - Controls.Label { + Label { text: "S" width: 16 color: "#eee" @@ -422,7 +422,7 @@ Item { Row { z: 1 spacing: 1 - Controls.Label { + Label { text: "L" width: 16 color: "#eee" From 469647db3dd091c5a617e15b0bb676a911102038 Mon Sep 17 00:00:00 2001 From: Aleksei German Date: Fri, 7 Jun 2019 16:31:46 +0200 Subject: [PATCH 41/57] QmlDesigner ColorPalette StudioControls usage Change-Id: Ia1c2daa693e9c2c2a2808cf6fab65a2b60014456 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/SimpleColorPalette.qml | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml index c6b6acf2429..9cc787bd235 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/SimpleColorPalette.qml @@ -25,6 +25,7 @@ import QtQuick 2.1 import QtQuick.Controls 2.5 +import StudioControls 1.0 as StudioControls import HelperWidgets 2.0 import QtQuick.Controls.Private 1.0 // showing a ToolTip @@ -79,11 +80,9 @@ Item { contextMenu.popup() } } - Menu { + StudioControls.Menu { id: contextMenu - modal: true - closePolicy: Popup.CloseOnPressOutside | Popup.CloseOnEscape - MenuItem { + StudioControls.MenuItem { text: (backgroundColor.favorite ? qsTr("Remove from Favorites") : qsTr("Add to Favorites")) @@ -91,10 +90,6 @@ Item { paletteModel.toggleFavorite(index) } } - - Overlay.modal: Rectangle { - color: "transparent" - } } } } From 6f8f149761938ae7b132351024d180a3da1d02ef Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Jun 2019 13:33:45 +0200 Subject: [PATCH 42/57] QmlDesigner: Reload property page on start This is requires to work around QTBUG-75847. Change-Id: Ib95fed12cc332e4d231d5bfee3c20dff5f2f19c3 Reviewed-by: Tim Jenssen --- .../components/propertyeditor/propertyeditorview.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp index fd8c7f0fafb..9dd0a2da24b 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/propertyeditorview.cpp @@ -553,10 +553,11 @@ void PropertyEditorView::modelAttached(Model *model) m_locked = true; if (!m_setupCompleted) { - m_singleShotTimer->setSingleShot(true); - m_singleShotTimer->setInterval(100); - connect(m_singleShotTimer, &QTimer::timeout, this, &PropertyEditorView::setupPanes); - m_singleShotTimer->start(); + QTimer::singleShot(50, this, [this]{ + PropertyEditorView::setupPanes(); + /* workaround for QTBUG-75847 */ + reloadQml(); + }); } m_locked = false; From c839830b3eb9e1abb2098bcf04f3acff3c811df8 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 7 Jun 2019 16:40:21 +0200 Subject: [PATCH 43/57] QmlDesigner: Fix delete shortcut QtQuick Controls 2 seem to define all shortcuts globally. Task-number: QDS-803 Change-Id: I6d29f659261c12bdd66473e2c680044b486891ec Reviewed-by: Thomas Hartmann --- .../imports/StudioControls/ContextMenu.qml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ContextMenu.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ContextMenu.qml index ba5fec19e2a..3365751ab61 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ContextMenu.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ContextMenu.qml @@ -51,32 +51,32 @@ Menu { text: "Copy" enabled: myTextEdit.selectedText !== "" onTriggered: myTextEdit.copy() - shortcut: StandardKey.Copy + /* shortcut: StandardKey.Copy Shortcuts in QQC2 seem to override global shortcuts */ } Controls2.Action { text: "Cut" enabled: myTextEdit.selectedText !== "" && !myTextEdit.readOnly onTriggered: myTextEdit.cut() - shortcut: StandardKey.Cut + /* shortcut: StandardKey.Cut Shortcuts in QQC2 seem to override global shortcuts */ } Controls2.Action { text: "Paste" enabled: myTextEdit.canPaste onTriggered: myTextEdit.paste() - shortcut: StandardKey.Paste + /* shortcut: StandardKey.Paste Shortcuts in QQC2 seem to override global shortcuts */ } Controls2.Action { text: "Delete" enabled: myTextEdit.selectedText !== "" onTriggered: myTextEdit.remove(myTextEdit.selectionStart, myTextEdit.selectionEnd) - shortcut: StandardKey.Delete + /* shortcut: StandardKey.Delete Shortcuts in QQC2 seem to override global shortcuts */ } Controls2.Action { text: "Clear" enabled: myTextEdit.text !== "" onTriggered: myTextEdit.clear() - shortcut: StandardKey.DeleteCompleteLine + /* shortcut: StandardKey.DeleteCompleteLine Shortcuts in QQC2 seem to override global shortcuts */ } MenuSeparator { From 518f49fb8d9439092d084a3498e328d26858e037 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 7 Jun 2019 15:55:58 +0200 Subject: [PATCH 44/57] Doc: Describe parsing existing compile output Task-number: QTCREATORBUG-16017 Change-Id: Ic2fba193a98d191570c226478b58b5443b1fdedf Reviewed-by: Christian Kandeler --- doc/images/qtcreator-parse-build-output.png | Bin 0 -> 8706 bytes doc/src/howto/creator-ui.qdoc | 32 ++++++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 doc/images/qtcreator-parse-build-output.png diff --git a/doc/images/qtcreator-parse-build-output.png b/doc/images/qtcreator-parse-build-output.png new file mode 100644 index 0000000000000000000000000000000000000000..56d9724ea6668bd2028ae9df6cebf67b32868416 GIT binary patch literal 8706 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 HP6 \uicontrol {Parse Build Output}. + \image qtcreator-parse-build-output.png + \li Paste the build output in the \uicontrol {Build Output} field, or + select \uicontrol {Load from File} to load it from a file. + \li Deselect the \uicontrol {Output went to stderr} check box if the + parser expects issues on \c stdout. + \li In the \uicontrol {Use parsers from kit} field, select the kit to + use for parsing the output. Select \uicontrol Manage to view + and modify kit settings. + \li The parser displays the parsed output in the \uicontrol Issues + pane. By default, the pane is cleared before adding the new output. + Deselect the \uicontrol {Clear existing tasks} check box to append + the new output to the old output. + \li Select \uicontrol OK to start parsing. + \endlist + \if defined(qtcreator) \section1 To-Do Entries From 5f26fe6298577cd75c77bddc67586f19c33da43d Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 11 Jun 2019 07:37:41 +0200 Subject: [PATCH 45/57] Debugger: Robustify DebuggerRunTool::showMessage() Seems to be possible to trigger in a failing MinGW start on Windows. Change-Id: Ica93c29ad677c24688a8cf2c5a0f1018471ffe51 Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerruncontrol.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 245f3a15dad..f68d637e1f2 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -1011,6 +1011,8 @@ void DebuggerRunTool::showMessage(const QString &msg, int channel, int timeout) if (channel == ConsoleOutput) debuggerConsole()->printItem(ConsoleItem::DefaultType, msg); + QTC_ASSERT(m_engine, qDebug() << msg; return); + m_engine->showMessage(msg, channel, timeout); if (m_engine2) m_engine->showMessage(msg, channel, timeout); From 69cd74f25d28b0fda0db6a958dd34f8c7daab5ca Mon Sep 17 00:00:00 2001 From: Uladzislau Paulovich Date: Sun, 9 Jun 2019 02:31:28 +0300 Subject: [PATCH 46/57] qml | Fix let/const variables formatting Change-Id: Ia2a4ee482e84a6c24abea7ea6fe05925eee11d1d Reviewed-by: Thomas Hartmann --- src/libs/qmljs/qmljsreformatter.cpp | 3 ++- tests/auto/qml/reformatter/jssyntax.js | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index e95ff2f3394..3d838651e24 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -914,7 +914,8 @@ protected: bool visit(VariableStatement *ast) override { - out("var ", ast->declarationKindToken); + out(ast->declarationKindToken); + out(" "); accept(ast->declarations); return false; } diff --git a/tests/auto/qml/reformatter/jssyntax.js b/tests/auto/qml/reformatter/jssyntax.js index 5ef1a2adcd6..9fd8b38a563 100644 --- a/tests/auto/qml/reformatter/jssyntax.js +++ b/tests/auto/qml/reformatter/jssyntax.js @@ -1,6 +1,10 @@ var x var y = 12 +var a_var = 1 +let a_let = 2 +const a_const = 3 + function foo(a, b) { x = 15 x += 4 From ab87bdf4ea400c9c3f643fcd4a0aea500be31398 Mon Sep 17 00:00:00 2001 From: Uladzislau Paulovich Date: Sun, 9 Jun 2019 03:31:20 +0300 Subject: [PATCH 47/57] qml | Add support for enums formatting Change-Id: Id7e435a7c556c7fc469b9055ca772a7850e16676 Reviewed-by: Thomas Hartmann --- src/libs/qmljs/qmljsreformatter.cpp | 31 +++++++++++++++++++++++++++++ tests/auto/qml/reformatter/enum.qml | 14 +++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tests/auto/qml/reformatter/enum.qml diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index 3d838651e24..94898532472 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -534,6 +534,37 @@ protected: return false; } + bool visit(UiEnumDeclaration *ast) override + { + out(ast->enumToken); + out(" "); + out(ast->name.toString()); + out(" "); + out("{"); // TODO: out(ast->lbraceToken); + newLine(); + + accept(ast->members); + + out(ast->rbraceToken); + return false; + } + + bool visit(UiEnumMemberList *list) override + { + for (UiEnumMemberList *it = list; it; it = it->next) { + out(it->memberToken); + if (it->valueToken.isValid()) { + out(" = "); + out(it->valueToken); + } + if (it->next) { + out(","); + } + newLine(); + } + return false; + } + bool visit(UiImport *ast) override { out("import ", ast->importToken); diff --git a/tests/auto/qml/reformatter/enum.qml b/tests/auto/qml/reformatter/enum.qml new file mode 100644 index 00000000000..769386494d0 --- /dev/null +++ b/tests/auto/qml/reformatter/enum.qml @@ -0,0 +1,14 @@ +import QtQuick 2.0 + +Item { + enum Test { + A, + B + } + + enum TestWithValues { + A = 11.1, + B, + C = 3 + } +} From e32fcbfbd181e555b02e09af3c031be70112afb0 Mon Sep 17 00:00:00 2001 From: Nikolai Kosjar Date: Tue, 11 Jun 2019 09:55:26 +0200 Subject: [PATCH 48/57] CppTools: Add logging to built-in indexer This might help to identify problematic files. Change-Id: I76848e6ca12a654c8426cf0d73b50612273d48c3 Reviewed-by: Cristian Adam Reviewed-by: Orgad Shaneh --- src/plugins/cpptools/builtinindexingsupport.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp index ddde5699a18..3677cefc295 100644 --- a/src/plugins/cpptools/builtinindexingsupport.cpp +++ b/src/plugins/cpptools/builtinindexingsupport.cpp @@ -52,6 +52,7 @@ using namespace CppTools; using namespace CppTools::Internal; static const bool FindErrorsIndexing = qgetenv("QTC_FIND_ERRORS_INDEXING") == "1"; +static Q_LOGGING_CATEGORY(indexerLog, "qtc.cpptools.indexer", QtWarningMsg) namespace { @@ -205,6 +206,8 @@ void index(QFutureInterface &indexingFuture, const ProjectExplorer::HeaderPaths fallbackHeaderPaths = cmm->headerPaths(); const CPlusPlus::LanguageFeatures defaultFeatures = CPlusPlus::LanguageFeatures::defaultFeatures(); + + qCDebug(indexerLog) << "About to index" << files.size() << "files."; for (int i = 0; i < files.size(); ++i) { if (indexingFuture.isCanceled() || superFuture.isCanceled()) break; @@ -225,6 +228,7 @@ void index(QFutureInterface &indexingFuture, processingHeaders = true; } + qCDebug(indexerLog) << " Indexing" << i + 1 << "of" << files.size() << ":" << fileName; ProjectExplorer::HeaderPaths headerPaths = parts.isEmpty() ? fallbackHeaderPaths : parts.first()->headerPaths; @@ -236,6 +240,7 @@ void index(QFutureInterface &indexingFuture, if (isSourceFile) sourceProcessor->resetEnvironment(); } + qCDebug(indexerLog) << "Indexing finished."; } void parse(QFutureInterface &indexingFuture, From 4d3bb1c85859be07001a76fad24de457811a7d63 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 7 May 2019 11:28:50 +0200 Subject: [PATCH 49/57] ClangFormat: Provide an error message for Clang Format If an patch is not applied to libFormat in Clang we do nothing. It would be better to provide feedback if the plugin is loaded. Change-Id: Iea9900cf7683b521497cc6403638498a9ca5e2e9 Fixes: QTCREATORBUG-22404 Reviewed-by: Leena Miettinen Reviewed-by: Tim Jenssen --- src/plugins/clangformat/clangformatplugin.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/plugins/clangformat/clangformatplugin.cpp b/src/plugins/clangformat/clangformatplugin.cpp index e82802ab303..49f4fe049f0 100644 --- a/src/plugins/clangformat/clangformatplugin.cpp +++ b/src/plugins/clangformat/clangformatplugin.cpp @@ -152,8 +152,13 @@ bool ClangFormatPlugin::initialize(const QStringList &arguments, QString *errorS openClangFormatConfigAction->setData(doc->filePath().toString()); }); } -#endif return true; +#else + *errorString = "Disabling ClangFormat plugin as it is not built against a suitable version of " + "Clang's libFormat. For more information, see the Qt Creator README at " + "https://code.qt.io/cgit/qt-creator/qt-creator.git/tree/README.md"; + return false; +#endif } } // namespace ClangFormat From 32afe831084d09acf447f129282e371fa0c892f7 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 7 Jun 2019 16:45:47 +0200 Subject: [PATCH 50/57] SSH: Fix autotest - Consider the case of connection sharing being disabled. - Adapt to slower environments. Change-Id: I088622034c26ea343eb78161b24c43b3286b0512 Reviewed-by: Christian Stenger --- src/libs/ssh/sshconnection.cpp | 2 +- tests/auto/ssh/tst_ssh.cpp | 16 ++++++++++------ 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/src/libs/ssh/sshconnection.cpp b/src/libs/ssh/sshconnection.cpp index 88509d5b62c..b368ccc8efe 100644 --- a/src/libs/ssh/sshconnection.cpp +++ b/src/libs/ssh/sshconnection.cpp @@ -231,7 +231,7 @@ void SshConnection::disconnectFromHost() case Connecting: case Connected: if (!d->sharingEnabled) { - emitDisconnected(); + QTimer::singleShot(0, this, &SshConnection::emitDisconnected); return; } d->state = Disconnecting; diff --git a/tests/auto/ssh/tst_ssh.cpp b/tests/auto/ssh/tst_ssh.cpp index 5ce94b74623..72260c2c9af 100644 --- a/tests/auto/ssh/tst_ssh.cpp +++ b/tests/auto/ssh/tst_ssh.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include @@ -171,8 +172,10 @@ void tst_Ssh::errorHandling() connection.connectToHost(); loop.exec(); QVERIFY(timer.isActive()); - QCOMPARE(connection.state(), SshConnection::Unconnected); - QVERIFY(!connection.errorString().isEmpty()); + const bool expectConnected = !SshSettings::connectionSharingEnabled(); + QCOMPARE(connection.state(), expectConnected ? SshConnection::Connected + : SshConnection::Unconnected); + QCOMPARE(connection.errorString().isEmpty(), expectConnected); QVERIFY(!disconnected); QVERIFY2(dataReceived.isEmpty(), qPrintable(dataReceived)); } @@ -374,7 +377,7 @@ void tst_Ssh::sftp() }; FilesToTransfer filesToUpload; std::srand(QDateTime::currentDateTime().toSecsSinceEpoch()); - for (int i = 0; i < 1000; ++i) { + for (int i = 0; i < 100; ++i) { const QString fileName = "sftptestfile" + QString::number(i + 1); QFile file(dirForFilesToUpload.path() + '/' + fileName); QVERIFY2(file.open(QIODevice::WriteOnly), qPrintable(file.errorString())); @@ -413,7 +416,7 @@ void tst_Ssh::sftp() QTimer timer; QObject::connect(&timer, &QTimer::timeout, &loop, &QEventLoop::quit); timer.setSingleShot(true); - timer.setInterval((params.timeout + 5) * 1000); + timer.setInterval(30 * 1000); timer.start(); upload->start(); loop.exec(); @@ -453,7 +456,7 @@ void tst_Ssh::sftp() // Download the uploaded files to a different location const QStringList allUploadedFileNames = QDir(dirForFilesToUpload.path()).entryList(QDir::Files); - QCOMPARE(allUploadedFileNames.size(), 1001); + QCOMPARE(allUploadedFileNames.size(), 101); for (const QString &fileName : allUploadedFileNames) { const QString localFilePath = dirForFilesToUpload.path() + '/' + fileName; const QString remoteFilePath = getRemoteFilePath(fileName); @@ -462,7 +465,7 @@ void tst_Ssh::sftp() QVERIFY(downloadJob != SftpInvalidJob); jobs << downloadJob; } - QCOMPARE(jobs.size(), 1001); + QCOMPARE(jobs.size(), 101); loop.exec(); QVERIFY(!invalidFinishedSignal); QVERIFY2(jobError.isEmpty(), qPrintable(jobError)); @@ -490,6 +493,7 @@ void tst_Ssh::sftp() } // Remove the uploaded files on the remote system + timer.setInterval((params.timeout + 5) * 1000); for (const QString &fileName : allUploadedFileNames) { const QString remoteFilePath = getRemoteFilePath(fileName); const SftpJobId removeJob = sftpChannel->removeFile(remoteFilePath); From df6bbdd191361972ec3d9f70e8cd0f282759bc7d Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 6 Jun 2019 14:08:37 +0200 Subject: [PATCH 51/57] Output panes: Fix filtering newly added content MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit For output panes without a formatter, filtering was only applied to the content that was already there. Newly added content was always shown, regardless of whether it matched or not. Change-Id: I63424a95c0ff4747ef804b62ebde2253782c8a39 Reviewed-by: André Hartmann Reviewed-by: hjk --- src/plugins/coreplugin/outputwindow.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/plugins/coreplugin/outputwindow.cpp b/src/plugins/coreplugin/outputwindow.cpp index 2b5de1b2b6f..0ed7542ee16 100644 --- a/src/plugins/coreplugin/outputwindow.cpp +++ b/src/plugins/coreplugin/outputwindow.cpp @@ -119,6 +119,7 @@ OutputWindow::OutputWindow(Context context, const QString &settingsKey, QWidget connect(copyAction, &QAction::triggered, this, &QPlainTextEdit::copy); connect(pasteAction, &QAction::triggered, this, &QPlainTextEdit::paste); connect(selectAllAction, &QAction::triggered, this, &QPlainTextEdit::selectAll); + connect(this, &QPlainTextEdit::blockCountChanged, this, &OutputWindow::filterNewContent); connect(this, &QPlainTextEdit::undoAvailable, undoAction, &QAction::setEnabled); connect(this, &QPlainTextEdit::redoAvailable, redoAction, &QAction::setEnabled); @@ -216,10 +217,8 @@ OutputFormatter *OutputWindow::formatter() const void OutputWindow::setFormatter(OutputFormatter *formatter) { d->formatter = formatter; - if (d->formatter) { + if (d->formatter) d->formatter->setPlainTextEdit(this); - connect(d->formatter, &OutputFormatter::contentChanged, this, &OutputWindow::filterNewContent); - } } void OutputWindow::showEvent(QShowEvent *e) From 25ecadcaf3bbb68755d82e681bcac53779ac76eb Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 29 May 2019 12:22:17 +0200 Subject: [PATCH 52/57] Add changes file for 4.10 Change-Id: Idc8dd41e3f70326043b32d920122702bd4ccaa61 Reviewed-by: Leena Miettinen --- dist/changes-4.10.0.md | 217 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 dist/changes-4.10.0.md diff --git a/dist/changes-4.10.0.md b/dist/changes-4.10.0.md new file mode 100644 index 00000000000..f97a83a472d --- /dev/null +++ b/dist/changes-4.10.0.md @@ -0,0 +1,217 @@ +# Qt Creator 4.10 + +Qt Creator version 4.10 contains bug fixes and new features. + +The most important changes are listed in this document. For a complete +list of changes, see the Git log for the Qt Creator sources that +you can check out from the public Git repository. For example: + + git clone git://code.qt.io/qt-creator/qt-creator.git + git log --cherry-pick --pretty=oneline origin/4.9..v4.10.0 + +## Editing + +* Removed support for KDE code paster after removal of official API +* Added option for pinning files so they stay open when closing all files (QTCREATORBUG-21899) + +### Language Client + +* Added option for starting server when needed +* Added option for starting one server per project +* Added support for `workspace/workspaceFolders` server request +* Added Locator filter for current document (`.`) +* Added Locator filters for symbols in workspace (`:`, `c`, and `m`) (QTCREATORBUG-21915) +* Added hover information +* Made client settings expand variables for executable and arguments +* Improved completion item tooltip (QTCREATORBUG-22429) + +## Help + +* Added option for scroll wheel zooming (QTCREATORBUG-14154) + +## All Projects + +* Added option for hiding kit settings (QTCREATORBUG-9134) +* Added support for drag & drop in Projects tree (QTCREATORBUG-6446) +* Added option for closing files of project when closing project (QTCREATORBUG-22198) +* Added filtering to `Application Output`, `Compile Output`, and `General Messages` + (QTCREATORBUG-16356) +* Added `Re-detect` and `Remove All` to compiler settings +* Added Locator filter for all files in all project directory trees (`a`) (QTCREATORBUG-19122) +* Added `CurrentRun:WorkingDir` Qt Creator variable +* Added `Tools` > `Parse Build Output` (QTCREATORBUG-16017) +* Added option for not clearing `Issues` pane on build (QTCREATORBUG-22478) +* Moved `Application Output` and `Build Output` options to separate tabs in the + `Build & Run` options +* Improved search for files from `Issues` pane (QTCREATORBUG-13623) + +### Wizards + +* Added build system choice to `Qt Widgets Application` and `C++ Library` wizards +* Added `value('variablename')` to JavaScript context in JSON wizards, adding support for + lists and dictionaries as values +* Fixed that file names were always lower-cased by file wizards (QTCREATORBUG-14711) + +## QMake Projects + +* Added option for adding existing project as sub-project (QTCREATORBUG-5837) +* Added option for running `qmake` on every build (QTCREATORBUG-20888) +* Added completion of paths in project files (QTCREATORBUG-5915) +* Added forced `qmake` run on rebuild +* Fixed building sub-project in case of additional custom make steps (QTCREATORBUG-15794) + +## CMake Projects + +* Removed `Default` from build types (QTCREATORBUG-22013) +* Added support for Android targets +* Added support for building single file (QTCREATORBUG-18898) +* Added completion of paths in project files (QTCREATORBUG-5915) +* Improved text in `Configuration has changed on disk` dialog (QTCREATORBUG-22059) + +## Qbs Projects + +* Added support for Android targets +* Fixed `Build product` for files in groups + +## Python Projects + +* Added support for adding and removing files from project +* Improved wizards + +## Compilation Database Projects + +* Added setting for project header path (QTCREATORBUG-22031) +* Added custom build steps and run configuration (QTCREATORBUG-21727) +* Added option for specifying additional files in `compile_database.json.files` +* Fixed handling of relative paths (QTCREATORBUG-22338) +* Fixed handling of `--sysroot` (QTCREATORBUG-22339) + +## Qt Support + +* Added handling of QtTest messages in compile output (QTCREATORBUG-8091) + +## C++ Support + +* Improved auto-insertion of closing curly brace (QTCREATORBUG-18872) +* Fixed that snippet completion could get in the way (QTCREATORBUG-21767) + +### Clang Format + +* Improved configuration UI +* Fixed that clang format was triggered on save when Beautifier already was as well + +## QML Support + +## Debugging + +* Added pretty printer for `QMargin` + +### CDB + +* Fixed loading of custom debugging helpers (QTCREATORBUG-20481) + +## Perf Profiler + +* Changed format of saved traces +* Added support for multiple attributes per sample +* Added CPU ID for events + +## Qt Quick Designer + +* Added support for `ShapeGradient` (QDS-359) +* Added gradient picker that allows loading and saving of presets +* Updated properties of `Flickable` + +## Version Control Systems + +* Added zoom buttons to `Version Control` output pane + +### Git + +* Added support for different reset types in `Branches` view +* Added choice of build system to `Git Clone` wizard if cloned project supports multiple + build systems (QTCREATORBUG-17828) + +## Test Integration + +* Added basic support for Boost tests +* Added wizard for Boost tests (QTCREATORBUG-21169) +* Added option for automatically opening test results pane +* Improved handling of unexpected test output (QTCREATORBUG-22354) + +## Platform Specific + +### Windows + +* Added `Clone` for MSVC toolchains (QTCREATORBUG-22163) +* Fixed that `mingw32-make`'s warnings were categorized as errors (QTCREATORBUG-22171) +* Fixed bitness detection for MinGW (QTCREATORBUG-22160) + +### Linux + +* Improved auto-detection of toolchains (QTCREATORBUG-19179, QTCREATORBUG-20044, QTCREATORBUG-22081) + +### macOS + +### Android + +* Removed support for MIPS64 + +### Remote Linux + +* Added deployment method that deploys everything that is installed by the build system + in its install step (QTCREATORBUG-21855) +* Added support for opening remote terminal with run environment +* Added option for `rsync` flags for deployment (QTCREATORBUG-22352) + +### Boot to Qt + +### Bare Metal + +* Added include path detection and output parsers for `IAR`, `KEIL` and `SDCC` toolchains + +## Credits for these changes go to: +Aleksei German +Alessandro Ambrosano +Alessandro Portale +Andre Hartmann +André Pönitz +Anton Danielsson +Antonio Di Monaco +Asit Dhal +BogDan Vatra +Christian Gagneraud +Christian Kandeler +Christian Stenger +Cristian Adam +Cristián Maureira-Fredes +Daniel Teske +David Schulz +Denis Shienkov +Denis Vygovskiy +Eike Ziller +Friedemann Kleint +Haxor Leet +illiteratecoder +Ivan Donchevskii +Ivan Komissarov +Joel Smith +Jörg Bornemann +Kavindra Palaraja +Luca Carlon +Marco Bubke +Martin Haase +Mitch Curtis +Nikolai Kosjar +Oliver Wolff +Orgad Shaneh +Przemyslaw Gorszkowski +Robert Löhning +Thomas Hartmann +Thomas Otto +Tim Henning +Tim Jenssen +Tobias Hunger +Tor Arne Vestbø +Ulf Hermann +Ville Nummela From be967e1cd96fb7a03ce266967ffc7e3b262b8d09 Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Tue, 11 Jun 2019 14:12:26 +0200 Subject: [PATCH 53/57] CMake build: Add qmlpreviewplugin Change-Id: I43283f393dead6098b6a2309a69338f78fb01b80 Reviewed-by: Cristian Adam Reviewed-by: Eike Ziller --- src/plugins/qmldesigner/CMakeLists.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index ebbce08bc4e..31b26645835 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -51,6 +51,18 @@ add_qtc_plugin(componentsplugin SKIP_DEBUG_CMAKE_FILE_CHECK ) +add_qtc_plugin(qmlpreviewplugin + CONDITION TARGET QmlDesigner + DEPENDS Core ProjectExplorer QmlDesigner Utils Qt5::Qml + INCLUDES ${CMAKE_CURRENT_LIST_DIR}/designercore/include + SOURCES + qmlpreviewplugin/qmlpreviewactions.cpp qmlpreviewplugin/qmlpreviewactions.h + qmlpreviewplugin/qmlpreviewplugin.cpp qmlpreviewplugin/qmlpreviewplugin.h + qmlpreviewplugin/qmlpreviewplugin.qrc + PLUGIN_PATH ${QmlDesignerPluginInstallPrefix} + SKIP_DEBUG_CMAKE_FILE_CHECK +) + add_qtc_plugin(qtquickplugin CONDITION TARGET QmlDesigner DEPENDS Core QmlDesigner Utils Qt5::Qml @@ -283,6 +295,9 @@ extend_qtc_plugin(QmlDesigner propertyeditorvalue.cpp propertyeditorvalue.h propertyeditorview.cpp propertyeditorview.h propertyeditorwidget.cpp propertyeditorwidget.h + simplecolorpalette.cpp simplecolorpalette.h + simplecolorpalettemodel.cpp simplecolorpalettemodel.h + simplecolorpalettesingleton.cpp simplecolorpalettesingleton.h qmlanchorbindingproxy.cpp qmlanchorbindingproxy.h qmlmodelnodeproxy.cpp qmlmodelnodeproxy.h quick2propertyeditorview.cpp quick2propertyeditorview.h @@ -305,6 +320,7 @@ extend_qtc_plugin(QmlDesigner extend_qtc_plugin(QmlDesigner SOURCES_PREFIX components/texteditor SOURCES + texteditor.qrc texteditorstatusbar.cpp texteditorstatusbar.h texteditorview.cpp texteditorview.h texteditorwidget.cpp texteditorwidget.h From 8dc16d55c26af46101365434f0f29847c3959cc7 Mon Sep 17 00:00:00 2001 From: Uladzislau Paulovich Date: Sun, 9 Jun 2019 02:46:14 +0300 Subject: [PATCH 54/57] qml | Fix empty objects formatting Change-Id: I760f3420fef9ca83c2a28586575a72d580658d0f Reviewed-by: Tim Jenssen --- src/libs/qmljs/qmljsreformatter.cpp | 11 +++++++---- tests/auto/qml/reformatter/objectliteral.js | 2 ++ tests/auto/qml/reformatter/qmlsingleton.qml | 3 +-- tests/auto/qml/reformatter/qmlsyntax.qml | 2 ++ 4 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index 94898532472..deea5d94048 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -594,9 +594,10 @@ protected: bool visit(UiObjectInitializer *ast) override { out(ast->lbraceToken); - if (ast->members) + if (ast->members) { lnAcceptIndented(ast->members); - newLine(); + newLine(); + } out(ast->rbraceToken); return false; } @@ -708,8 +709,10 @@ protected: bool visit(ObjectPattern *ast) override { out(ast->lbraceToken); - lnAcceptIndented(ast->properties); - newLine(); + if (ast->properties) { + lnAcceptIndented(ast->properties); + newLine(); + } out(ast->rbraceToken); return false; } diff --git a/tests/auto/qml/reformatter/objectliteral.js b/tests/auto/qml/reformatter/objectliteral.js index 37f68633746..d260712166d 100644 --- a/tests/auto/qml/reformatter/objectliteral.js +++ b/tests/auto/qml/reformatter/objectliteral.js @@ -10,3 +10,5 @@ var x = { }, "z": 12 } + +var empty_object = {} diff --git a/tests/auto/qml/reformatter/qmlsingleton.qml b/tests/auto/qml/reformatter/qmlsingleton.qml index d64f554097c..05a08e7de40 100644 --- a/tests/auto/qml/reformatter/qmlsingleton.qml +++ b/tests/auto/qml/reformatter/qmlsingleton.qml @@ -2,5 +2,4 @@ pragma Singleton import QtQuick 2.0 -Item { -} +Item {} diff --git a/tests/auto/qml/reformatter/qmlsyntax.qml b/tests/auto/qml/reformatter/qmlsyntax.qml index ded863106a7..8717aba35d5 100644 --- a/tests/auto/qml/reformatter/qmlsyntax.qml +++ b/tests/auto/qml/reformatter/qmlsyntax.qml @@ -45,4 +45,6 @@ Text { function foo(a, b) { x = a + 12 * b } + + value: Rectangle {} } From 8f7cbd6416debf2214977a43edeb5f90b5cee702 Mon Sep 17 00:00:00 2001 From: Uladzislau Paulovich Date: Sun, 9 Jun 2019 02:27:01 +0300 Subject: [PATCH 55/57] qml | Fix trailing comments formatting Change-Id: I0461c4616cff15b7010e3844850d32e9f07469ea Reviewed-by: Tim Jenssen --- src/libs/qmljs/qmljsreformatter.cpp | 6 ++++++ tests/auto/qml/reformatter/comments.qml | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index deea5d94048..6ac55b2ccec 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -96,6 +96,7 @@ class Rewriter : protected Visitor int _lastNewlineOffset = -1; bool _hadEmptyLine = false; int _binaryExpDepth = 0; + bool _hasOpenComment = false; public: Rewriter(Document::Ptr doc) @@ -201,6 +202,9 @@ protected: void out(const QString &str, const SourceLocation &lastLoc = SourceLocation()) { + if (_hasOpenComment) { + newLine(); + } if (lastLoc.isValid()) { QList comments = _doc->engine()->comments(); for (; _nextComment < comments.size(); ++_nextComment) { @@ -371,6 +375,7 @@ protected: { // if preceded by a newline, it's an empty line! _hadEmptyLine = _line.trimmed().isEmpty(); + _hasOpenComment = false; // if the preceding line wasn't empty, reindent etc. if (!_hadEmptyLine) { @@ -524,6 +529,7 @@ protected: out(" "); out(toString(nextCommentLoc)); + _hasOpenComment = true; } } } diff --git a/tests/auto/qml/reformatter/comments.qml b/tests/auto/qml/reformatter/comments.qml index 4ced7eb0e89..d2caa1b555e 100644 --- a/tests/auto/qml/reformatter/comments.qml +++ b/tests/auto/qml/reformatter/comments.qml @@ -21,5 +21,13 @@ Item { { console.log("test") } + + var a = 1 + if (a > 0) { + console.log("positive") + } // Final condition + else { + console.log("negative or zero") + } } } From 70fecd518eb198fa5038efa03f450bcf6ab2cba8 Mon Sep 17 00:00:00 2001 From: Uladzislau Paulovich Date: Sun, 9 Jun 2019 01:22:17 +0300 Subject: [PATCH 56/57] qml | Fix functions and loops formatting Bugs fixed in this change: 1. Incorrect function arguments formatting: function(a, b, c) -> function(abc) 2. Incorrect foreach loop formatting: for (var a in b) -> for (a in b) 3. Incorrect for loop formatting: for (var a = 1; a < 100; ++a) -> for(; a < 100; ++a) Change-Id: I8afef6e5f2485a2225931b7ecb7210506e06dc6c Reviewed-by: Tim Jenssen --- src/libs/qmljs/qmljsreformatter.cpp | 20 ++++++++++++++++++-- tests/auto/qml/reformatter/jssyntax.js | 6 ++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/libs/qmljs/qmljsreformatter.cpp b/src/libs/qmljs/qmljsreformatter.cpp index 6ac55b2ccec..5a5254fe264 100644 --- a/src/libs/qmljs/qmljsreformatter.cpp +++ b/src/libs/qmljs/qmljsreformatter.cpp @@ -962,7 +962,15 @@ protected: bool visit(PatternElement *ast) override { - + if (ast->isForDeclaration) { + if (ast->scope == VariableScope::Var) { + out("var "); + } else if (ast->scope == VariableScope::Let) { + out("let "); + } else if (ast->scope == VariableScope::Const) { + out("const "); + } + } out(ast->identifierToken); if (ast->initializer) { if (ast->isVariableDeclaration()) @@ -1026,7 +1034,12 @@ protected: out(ast->forToken); out(" "); out(ast->lparenToken); - accept(ast->initialiser); + if (ast->initialiser) { + accept(ast->initialiser); + } else if (ast->declarations) { + out("var "); + accept(ast->declarations); + } out("; ", ast->firstSemicolonToken); accept(ast->condition); out("; ", ast->secondSemicolonToken); @@ -1314,6 +1327,9 @@ protected: { for (FormalParameterList *it = ast; it; it = it->next) { out(it->element->bindingIdentifier.toString()); // TODO + if (it->next) { + out(", "); + } } return false; } diff --git a/tests/auto/qml/reformatter/jssyntax.js b/tests/auto/qml/reformatter/jssyntax.js index 9fd8b38a563..d651cd7822c 100644 --- a/tests/auto/qml/reformatter/jssyntax.js +++ b/tests/auto/qml/reformatter/jssyntax.js @@ -32,6 +32,12 @@ while (true) { for (var x in a) { print(a[x]) } + for (let x in a) { + print(a[x]) + } + for (const x in a) { + print(a[x]) + } do { a = x From c978afb42eb41be1e4f805801ec822c92fe1b9f7 Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 3 Jun 2019 16:03:53 +0200 Subject: [PATCH 57/57] Debugger: Use the new hint to determine why settings should be saved Change-Id: I5f8e2caceaa9769fc99e91bf1e29470fa17320bb Reviewed-by: Eike Ziller --- src/plugins/debugger/debuggermainwindow.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/plugins/debugger/debuggermainwindow.cpp b/src/plugins/debugger/debuggermainwindow.cpp index ca206d6e178..82bb009cc2d 100644 --- a/src/plugins/debugger/debuggermainwindow.cpp +++ b/src/plugins/debugger/debuggermainwindow.cpp @@ -288,13 +288,12 @@ DebuggerMainWindow::DebuggerMainWindow() cmd->setAttribute(Command::CA_Hide); viewsMenu->addAction(cmd, Core::Constants::G_DEFAULT_THREE); - connect(ICore::instance(), &ICore::saveSettingsRequested, this, [this] { + connect(ICore::instance(), &ICore::saveSettingsRequested, this, + [this](ICore::SaveSettingsReason reason) { // There's one saveSettings triggered after plugin loading intentionally. // We do not want to save anything at that time. - static bool firstOne = true; - if (firstOne) { + if (reason == ICore::InitializationDone) { qCDebug(perspectivesLog) << "FIRST SAVE SETTINGS REQUEST IGNORED"; - firstOne = false; } else { qCDebug(perspectivesLog) << "SAVING SETTINGS"; savePersistentSettings();