From 7483ad1f1d760d024919ad2001170a46bed6ef7d Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Wed, 20 Mar 2019 09:48:43 +0100 Subject: [PATCH 01/18] Squish: Fix helper function for small resolutions Depending on the screen size the context menu may be oriented differently depending on the point where the context menu had been triggered. Change-Id: Iae3834283e8e34ed44e57237561f1367cdaae108 Reviewed-by: Robert Loehning --- tests/system/shared/editor_utils.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tests/system/shared/editor_utils.py b/tests/system/shared/editor_utils.py index d59280f161b..b1ea1bb1bd9 100644 --- a/tests/system/shared/editor_utils.py +++ b/tests/system/shared/editor_utils.py @@ -78,7 +78,10 @@ def menuVisibleAtEditor(editor, menuInList): return True return False menu = waitForObject("{type='QMenu' unnamed='1' visible='1'}", 500) - success = menu.visible and widgetContainsPoint(editor, menu.mapToGlobal(QPoint(0, 0))) + topLeft = menu.mapToGlobal(QPoint(0, 0)) + bottomLeft = menu.mapToGlobal(QPoint(0, menu.height)) + success = menu.visible and (widgetContainsPoint(editor, topLeft) + or widgetContainsPoint(editor, bottomLeft)) if success: menuInList[0] = menu return success From fa0a2d97e9f05e40e0bf856cf68aee51ab452ae9 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Thu, 21 Mar 2019 11:02:09 +0100 Subject: [PATCH 02/18] Doc: Add info about copy and ignore actions in syntax check tooltips Users can select buttons for copying and ignoring diagnostics in tooltip popups displayed by the Clang code model. They can also click a link to move to the line annotation options. Change-Id: Ie98a8f853a22d902e89a1764a0aff28f8e180797 Reviewed-by: Marco Bubke --- doc/images/qtcreator-typo-clang.png | Bin 0 -> 52930 bytes doc/src/editors/creator-code-syntax.qdoc | 25 +++++++++++++++++------ 2 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 doc/images/qtcreator-typo-clang.png diff --git a/doc/images/qtcreator-typo-clang.png b/doc/images/qtcreator-typo-clang.png new file mode 100644 index 0000000000000000000000000000000000000000..3e3ad7daeafcf7f9b86c524e9ac9e5fb2f93e92f GIT binary patch literal 52930 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
    }NGuipy{GGYs6O(@)tKPBI{=$I+2d-x* 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 \uicontrol Options > \uicontrol {Text Editor} > \uicontrol Display > \uicontrol {Line annotations}, and then select From 6ff0f947683552a3556d49b1078b00bfc95ebcd2 Mon Sep 17 00:00:00 2001 From: Vikas Pachdha Date: Wed, 13 Mar 2019 14:38:18 +0100 Subject: [PATCH 03/18] Android: Fix process id parsing for API 22 Task-number: QTCREATORBUG-22098 Change-Id: I8aeed9179538689083aacf9487ae0dca8feaed97 Reviewed-by: Christian Stenger --- src/plugins/android/androidrunnerworker.cpp | 26 +++++++++------------ 1 file changed, 11 insertions(+), 15 deletions(-) diff --git a/src/plugins/android/androidrunnerworker.cpp b/src/plugins/android/androidrunnerworker.cpp index aed4e60d7ef..4a4386740b4 100644 --- a/src/plugins/android/androidrunnerworker.cpp +++ b/src/plugins/android/androidrunnerworker.cpp @@ -95,14 +95,14 @@ static bool isTimedOut(const chrono::high_resolution_clock::time_point &start, return timedOut; } -static qint64 extractPID(const QString &output, const QString &packageName) +static qint64 extractPID(const QByteArray &output, const QString &packageName) { qint64 pid = -1; foreach (auto tuple, output.split('\n')) { tuple = tuple.simplified(); if (!tuple.isEmpty()) { auto parts = tuple.split(':'); - QString commandName = parts.first(); + QString commandName = QString::fromLocal8Bit(parts.first()); if (parts.length() == 2 && commandName == packageName) { pid = parts.last().toLongLong(); break; @@ -121,18 +121,17 @@ static void findProcessPID(QFutureInterface &fi, QStringList selector, qint64 processPID = -1; chrono::high_resolution_clock::time_point start = chrono::high_resolution_clock::now(); - - selector.append("shell"); - selector.append(preNougat ? pidScriptPreNougat : pidScript.arg(packageName)); - do { QThread::msleep(200); - SdkToolResult result = AndroidManager::runAdbCommand(selector); + QString adbPath = AndroidConfigurations::currentConfig().adbToolPath().toString(); + selector.append("shell"); + selector.append(preNougat ? pidScriptPreNougat : pidScript.arg(packageName)); + const auto out = Utils::SynchronousProcess().runBlocking(adbPath, selector).allRawOutput(); if (preNougat) { - processPID = extractPID(result.stdOut(), packageName); + processPID = extractPID(out, packageName); } else { - if (!result.stdOut().isEmpty()) - processPID = result.stdOut().trimmed().toLongLong(); + if (!out.isEmpty()) + processPID = out.trimmed().toLongLong(); } } while (processPID == -1 && !isTimedOut(start) && !fi.isCanceled()); @@ -321,11 +320,8 @@ void AndroidRunnerWorker::forceStop() runAdb({"shell", "am", "force-stop", m_packageName}); // try killing it via kill -9 - QString out; - runAdb({"shell", pidScriptPreNougat}, &out); - qint64 pid = extractPID(out.simplified(), m_packageName); - if (pid != -1) - adbKill(pid); + if (m_processPID != -1) + adbKill(m_processPID); } void AndroidRunnerWorker::logcatReadStandardError() From 58cb148d264e07316853a456298cbc2d8dc5deeb Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 21 Mar 2019 15:31:43 +0100 Subject: [PATCH 04/18] QmlDesigner: Add missing QML files This adds support for ShapeGradient in the property editor. * LinearGradient * RadialGradient * ConicalGradient Change-Id: I6a9cad3674b21174a12ac399cac88cb9dd972bd5 Reviewed-by: Thomas Hartmann --- .../imports/HelperWidgets/ColorEditor.qml | 291 +++++++++++++++++- .../HelperWidgets/GradientDialogPopup.qml | 135 ++++++++ .../imports/HelperWidgets/GradientLine.qml | 1 + .../HelperWidgets/GradientPopupIndicator.qml | 51 +++ .../HelperWidgets/GradientPropertySpinBox.qml | 42 +++ .../images/icon_color_conical_gradient.png | Bin 0 -> 670 bytes .../images/icon_color_radial_gradient.png | Bin 0 -> 677 bytes 7 files changed, 503 insertions(+), 17 deletions(-) create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientDialogPopup.qml create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPopupIndicator.qml create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/images/icon_color_conical_gradient.png create mode 100644 share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/images/icon_color_radial_gradient.png diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml index 583c324ac23..d10f302f6ab 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/ColorEditor.qml @@ -26,7 +26,8 @@ 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 Column { id: colorEditor @@ -45,19 +46,17 @@ Column { property alias gradientPropertyName: gradientLine.gradientPropertyName + property bool shapeGradients: false + property alias transparent: transparentButton.checked function isNotInGradientMode() { - return (buttonRow.checkedIndex !== 1) + return (buttonRow.checkedIndex !== 1) } - onValueChanged: { - colorEditor.color = colorEditor.value - } + onValueChanged: colorEditor.color = colorEditor.value - onBackendValueChanged: { - colorEditor.color = colorEditor.value - } + onBackendValueChanged: colorEditor.color = colorEditor.value Timer { id: colorEditorTimer @@ -87,7 +86,13 @@ Column { GradientLine { property bool isInValidState: false - visible: buttonRow.checkedIndex === 1 + visible: { + if (colorEditor.shapeGradients) { + return buttonRow.checkedIndex > 0 && buttonRow.checkedIndex < 4 + } else { + return buttonRow.checkedIndex === 1 + } + } id: gradientLine width: parent.width @@ -98,11 +103,26 @@ Column { } onHasGradientChanged: { - if (!supportGradient) - return + if (!supportGradient) + return if (gradientLine.hasGradient) { - buttonRow.initalChecked = 1 + if (colorEditor.shapeGradients) { + switch (gradientLine.gradientTypeName) { + case "LinearGradient": + buttonRow.initalChecked = 1 + break; + case "RadialGradient": + buttonRow.initalChecked = 2 + break; + case "ConicalGradient": + buttonRow.initalChecked = 3 + break; + default: + buttonRow.initalChecked = 1 + } + } + colorEditor.color = gradientLine.currentColor } else { buttonRow.initalChecked = 0 @@ -155,6 +175,11 @@ Column { SecondColumnLayout { + ColorCheckButton { + id: checkButton + color: colorEditor.color + } + LineEdit { enabled: !colorEditor.transparent id: textField @@ -181,10 +206,6 @@ Column { Layout.fillWidth: true } - ColorCheckButton { - id: checkButton - color: colorEditor.color - } ButtonRow { @@ -193,6 +214,7 @@ Column { ButtonRowButton { iconSource: "images/icon_color_solid.png" + onClicked: { gradientLine.deleteGradient() textField.text = colorEditor.color @@ -205,10 +227,245 @@ Column { iconSource: "images/icon_color_gradient.png" onClicked: { colorEditor.backendValue.resetValue() + if (colorEditor.shapeGradients) { + gradientLine.deleteGradient() + gradientLine.gradientTypeName = "LinearGradient" + } gradientLine.addGradient() } - tooltip: qsTr("Gradient") + tooltip: qsTr("Linear Gradient") + + GradientPopupIndicator { + + onClicked: gradientDialogPopupLinear.toggle() + + GradientDialogPopup { + id: gradientDialogPopupLinear + + dialogHeight: 80 + content: GridLayout { + rowSpacing: 4 + anchors.fill: parent + height: 40 + + columns: 4 + rows: 2 + + anchors.leftMargin: 12 + anchors.rightMargin: 6 + + anchors.topMargin: 24 + anchors.bottomMargin: 6 + + Label { + text: "X1" + width: 16 + tooltip: qsTr("Defines the start point for color interpolation.") + } + + GradientPropertySpinBox { + propertyName: "x1" + } + + Label { + text: "X2" + width: 16 + tooltip: qsTr("Defines the end point for color interpolation.") + } + + GradientPropertySpinBox { + propertyName: "x2" + } + + Label { + text: "y1" + width: 16 + tooltip: qsTr("Defines the start point for color interpolation.") + } + + GradientPropertySpinBox { + propertyName: "y1" + } + + Label { + text: "Y2" + width: 16 + tooltip: qsTr("Defines the end point for color interpolation.") + } + + GradientPropertySpinBox { + propertyName: "y2" + } + } + } + } + } + ButtonRowButton { + visible: supportGradient && colorEditor.shapeGradients + iconSource: "images/icon_color_radial_gradient.png" + onClicked: { + colorEditor.backendValue.resetValue() + if (colorEditor.shapeGradients) { + gradientLine.deleteGradient() + gradientLine.gradientTypeName = "RadialGradient" + } + gradientLine.addGradient() + } + + tooltip: qsTr("Radial Gradient") + + GradientPopupIndicator { + onClicked: gradientDialogPopupRadial.toggle() + + GradientDialogPopup { + id: gradientDialogPopupRadial + dialogHeight: 140 + dialogWidth: 340 + content: GridLayout { + rowSpacing: 4 + anchors.fill: parent + height: 40 + + columns: 4 + rows: 3 + + anchors.leftMargin: 12 + anchors.rightMargin: 6 + + anchors.topMargin: 24 + anchors.bottomMargin: 6 + + Label { + text: "CenterX" + width: 54 + tooltip: qsTr("Defines the center point.") + } + + GradientPropertySpinBox { + propertyName: "centerX" + } + + Label { + text: "CenterY" + width: 54 + tooltip: qsTr("Defines the center point.") + } + + GradientPropertySpinBox { + propertyName: "centerY" + } + + Label { + text: "FocalX" + width: 54 + tooltip: qsTr("Defines the focal point.") + } + + GradientPropertySpinBox { + propertyName: "focalX" + } + + Label { + text: "FocalY" + width: 54 + tooltip: qsTr("Defines the focal point.") + } + + GradientPropertySpinBox { + propertyName: "focalY" + } + + Label { + text: "Center Radius" + width: 54 + tooltip: qsTr("Defines the center point.") + } + + GradientPropertySpinBox { + propertyName: "centerRadius" + } + + Label { + text: "Focal Radius" + width: 54 + tooltip: qsTr("Defines the focal radius. Set to 0 for simple radial gradients.") + } + + GradientPropertySpinBox { + propertyName: "focalRadius" + } + } + } + } + } + ButtonRowButton { + visible: supportGradient && colorEditor.shapeGradients + iconSource: "images/icon_color_conical_gradient.png" + onClicked: { + colorEditor.backendValue.resetValue() + if (colorEditor.shapeGradients) { + gradientLine.deleteGradient() + gradientLine.gradientTypeName = "ConicalGradient" + } + gradientLine.addGradient() + } + + tooltip: qsTr("Concial Gradient") + + GradientPopupIndicator { + + onClicked: gradientDialogPopupConical.toggle() + + GradientDialogPopup { + id: gradientDialogPopupConical + dialogHeight: 80 + content: GridLayout { + rowSpacing: 4 + anchors.fill: parent + height: 40 + + columns: 4 + rows: 2 + + anchors.leftMargin: 12 + anchors.rightMargin: 6 + + anchors.topMargin: 24 + anchors.bottomMargin: 6 + + Label { + text: "CenterX" + width: 32 + tooltip: qsTr("Defines the center point.") + } + + GradientPropertySpinBox { + propertyName: "centerX" + } + + Label { + text: "CenterY" + width: 32 + tooltip: qsTr("Defines the center point.") + } + + GradientPropertySpinBox { + propertyName: "centerY" + } + + Label { + text: "Angle" + width: 32 + tooltip: qsTr("Defines the start angle for the conical gradient. The value is in degrees (0-360).") + } + + GradientPropertySpinBox { + propertyName: "angle" + } + } + } + } } ButtonRowButton { id: transparentButton diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientDialogPopup.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientDialogPopup.qml new file mode 100644 index 00000000000..e0a12de911e --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientDialogPopup.qml @@ -0,0 +1,135 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 as Controls +import QtQuickDesignerTheme 1.0 +import QtQuick.Controls.Styles 1.1 + +Loader { + id: gradientDialogLoader + parent: itemPane + anchors.fill: parent + + visible: false + active: visible + + function toggle() { + gradientDialogLoader.visible = !gradientDialogLoader.visible + } + + property Component content + + property int dialogHeight: 240 + property int dialogWidth: 280 + + sourceComponent: Component { + FocusScope { + id: popup + + Keys.onEscapePressed: { + event.accepted = true + gradientDialogLoader.visible = false + } + + Component.onCompleted: { + popup.forceActiveFocus() + } + + Rectangle { + anchors.fill: parent + color: Theme.qmlDesignerBackgroundColorDarker() + opacity: 0.6 + } + + MouseArea { + anchors.fill: parent + onClicked: gradientDialogLoader.visible = false + } + Rectangle { + id: background + + property int xOffset: itemPane.width - gradientDialogLoader.dialogWidth + x: 4 + xOffset + Component.onCompleted: { + var pos = itemPane.mapFromItem(buttonRow.parent, 0, 0) + y = pos.y + 32 + } + + width: parent.width - 8 - xOffset + height: gradientDialogLoader.dialogHeight + + radius: 2 + color: Theme.qmlDesignerBackgroundColorDarkAlternate() + border.color: Theme.qmlDesignerBorderColor() + + Label { + x: 8 + y: 6 + font.bold: true + text: qsTr("Gradient Properties") + } + + Button { + width: 16 + height: 16 + style: ButtonStyle { + background: Item { + Image { + width: 16 + height: 16 + source: "image://icons/error" + opacity: { + if (control.pressed) + return 0.8 + return 1.0 + } + Rectangle { + z: -1 + anchors.fill: parent + color: control.pressed + || control.hovered ? Theme.qmlDesignerBackgroundColorDarker() : Theme.qmlDesignerButtonColor() + border.color: Theme.qmlDesignerBorderColor() + radius: 2 + } + } + } + } + onClicked: gradientDialogLoader.visible = false + + anchors.right: parent.right + anchors.top: parent.top + anchors.margins: 4 + } + + Loader { + anchors.fill: parent + sourceComponent: gradientDialogLoader.content + } + } + } + } +} diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientLine.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientLine.qml index dd00c9d0a1d..0f0c8b85864 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientLine.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientLine.qml @@ -38,6 +38,7 @@ Item { property alias gradientPropertyName: gradientModel.gradientPropertyName + property alias gradientTypeName: gradientModel.gradientTypeName onHasGradientChanged: { colorLine.invalidate() diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPopupIndicator.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPopupIndicator.qml new file mode 100644 index 00000000000..f39486c78fa --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPopupIndicator.qml @@ -0,0 +1,51 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 as Controls + +Image { + id: root + signal clicked + visible: colorEditor.shapeGradients && parent.checked + width: 8 + height: 4 + source: "image://icons/down-arrow" + anchors.horizontalCenter: parent.horizontalCenter + anchors.top: parent.bottom + anchors.topMargin: 2 + opacity: popupRegion.containsMouse ? 1 : 0.8 + + ToolTipArea { + id: popupRegion + + onClicked: root.clicked() + hoverEnabled: true + anchors.fill: parent + anchors.margins: -2 + tooltip: qsTr("Edit Gradient Properties") + } +} diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml new file mode 100644 index 00000000000..fc4f2db38f1 --- /dev/null +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/GradientPropertySpinBox.qml @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.1 +import QtQuick.Layouts 1.0 +import QtQuick.Controls 1.0 as Controls +import QtQuickDesignerTheme 1.0 +import QtQuick.Controls.Styles 1.1 + +DoubleSpinBox { + id: spinBox + + property string propertyName + + minimumValue: -9999 + maximumValue: 9999 + Component.onCompleted: spinBox.value = gradientLine.model.readGradientProperty(propertyName) + onValueChanged: gradientLine.model.setGradientProperty(propertyName, spinBox.value) + stepSize: 1 +} diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/images/icon_color_conical_gradient.png b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/images/icon_color_conical_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..160ca12db881d4c5ca424b61afd39d723b847a4d GIT binary patch literal 670 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>lLV0FMhJw4NZ$OG(Dmw!M6O*TlV~EA+rIW3TqzwgFr6v9_&P+@3TBN6- zJ#}5e?-Hwa|7Q(;9%3ht{(F!Rs#Ls~OY(y0)%>3A zU*{BIO3vFCS6 znV#D?$FKam!N#O5v1Ci;vWpkIl6w-?9IUM=`^F~F8YCaBgDovMJVHn)8M188y?NWhTkAsd7HQ@&3CEzx%VZK6*31R-LW-J9UcD zz3Mev!yWu)UQ4@WW9%pFEO}z-hTDIazSj1?t$X{e@Y0ky#T^_S_f9XGVA>HNiiYLEc P1tk+tS3j3^P6AFv literal 0 HcmV?d00001 diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/images/icon_color_radial_gradient.png b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/HelperWidgets/images/icon_color_radial_gradient.png new file mode 100644 index 0000000000000000000000000000000000000000..d3d95e5766a0023a02267feb58099195cbbf740b GIT binary patch literal 677 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!s7*pj^6T^Rm@;DWu&Co?cG za29w(7Bet#3xhBt!>lYRezr<9ElOq~AYDW^nRWUSZ{<2YSfetpUA-GzHzzms=QWd%Qs>mS!U5NL67_nYL?PK+xUZzwa&n Zv&kNi+;hU1_X{Ysc)I$ztaD0e0sxHYBPIX< literal 0 HcmV?d00001 From fc1f8cb464e3efcdcaf3485199b3130b9fff7598 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 21 Mar 2019 16:15:51 +0100 Subject: [PATCH 05/18] QmlDesigner: Fix crash The gradient can be an expression. Change-Id: Ib48661f87862f63e5234bbd92ca2117457a0c84c Reviewed-by: Tim Jenssen --- .../qmldesigner/components/propertyeditor/gradientmodel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index b2e25fa6d66..31cce3dc313 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -322,7 +322,7 @@ void GradientModel::setAnchorBackend(const QVariant &anchorBackend) m_itemNode = backendCasted->getItemNode(); if (m_itemNode.isValid() - && m_itemNode.modelNode().hasProperty(gradientPropertyName().toUtf8())) + && m_itemNode.modelNode().hasNodeProperty(gradientPropertyName().toUtf8())) m_gradientTypeName = m_itemNode.modelNode().nodeProperty(gradientPropertyName().toUtf8()).modelNode().simplifiedTypeName(); setupModel(); From c9fec22e1e3d87e667c0ea0295e8746cc45cadf2 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Thu, 21 Mar 2019 15:22:52 +0100 Subject: [PATCH 06/18] PerfProfiler: Avoid connection on nullptr process Change-Id: I858a63e5a555c20f8b0a4a0eced1ec44e3e69a4e Reviewed-by: Ulf Hermann --- src/plugins/perfprofiler/perfconfigwidget.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/perfprofiler/perfconfigwidget.cpp b/src/plugins/perfprofiler/perfconfigwidget.cpp index c6049cc451c..356948bb869 100644 --- a/src/plugins/perfprofiler/perfconfigwidget.cpp +++ b/src/plugins/perfprofiler/perfconfigwidget.cpp @@ -159,6 +159,10 @@ void PerfConfigWidget::setTarget(ProjectExplorer::Target *target) QTC_CHECK(!m_process || m_process->state() == QProcess::NotRunning); m_process.reset(device->createProcess(nullptr)); + if (!m_process) { + m_ui->useTracePointsButton->setEnabled(false); + return; + } connect(m_process.get(), &ProjectExplorer::DeviceProcess::finished, this, &PerfConfigWidget::handleProcessFinished); From 55a7e75360110b6c872572946baa9327f5cb7f5e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 21 Mar 2019 17:55:05 +0100 Subject: [PATCH 07/18] QmlDesigner: Crash Fix We have to add the import outside of the transaction to update the metainfo before we add nodes. Change-Id: Ie6efe9f90027a27a75c037fe41c4214720f4fbaa Reviewed-by: Tim Jenssen --- .../qmldesigner/components/propertyeditor/gradientmodel.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index 31cce3dc313..3eea9138a5d 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -151,6 +151,9 @@ void GradientModel::addGradient() if (!color.isValid()) color = QColor(Qt::white); + if (m_gradientTypeName != "Gradient") + ensureShapesImport(); + QmlDesigner::RewriterTransaction transaction = view()->beginRewriterTransaction(QByteArrayLiteral("GradientModel::addGradient")); QmlDesigner::ModelNode gradientNode = createGradientNode(); @@ -446,7 +449,6 @@ QmlDesigner::ModelNode GradientModel::createGradientNode() fullTypeName.prepend("QtQuick."); } else { fullTypeName.prepend("QtQuick.Shapes."); - ensureShapesImport(); } auto metaInfo = model()->metaInfo(fullTypeName); From f7fb3f540011aee54363a301715a31597450a7c3 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Thu, 21 Mar 2019 17:55:32 +0100 Subject: [PATCH 08/18] QmlDesigner: Enforce puppet reset when adding a gradient Change-Id: Iee2cc59f33b329a6073b4f3615485fa32d5d5870 Reviewed-by: Tim Jenssen --- .../qmldesigner/components/propertyeditor/gradientmodel.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index 3eea9138a5d..b973da132bd 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -38,6 +38,8 @@ #include +#include + GradientModel::GradientModel(QObject *parent) : QAbstractListModel(parent), m_locked(false) ,m_gradientTypeName("Gradient") @@ -177,6 +179,8 @@ void GradientModel::addGradient() } setupModel(); + if (m_gradientTypeName != "Gradient") + QTimer::singleShot(100, [this](){ view()->resetPuppet(); }); /*Unfortunately required */ emit hasGradientChanged(); emit gradientTypeChanged(); } From 706dcd9da25e70adffffea5365e9a2b00464c50e Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 21 Mar 2019 19:00:50 +0100 Subject: [PATCH 09/18] QmlDesigner: Fix warning about initialization order Change-Id: I7c2a77656cb8d46a53944cf09375d3dd654da395 Reviewed-by: Tim Jenssen Reviewed-by: Thomas Hartmann --- .../qmldesigner/components/propertyeditor/gradientmodel.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp index b973da132bd..6bb3153bea1 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/gradientmodel.cpp @@ -41,8 +41,7 @@ #include GradientModel::GradientModel(QObject *parent) : - QAbstractListModel(parent), m_locked(false) - ,m_gradientTypeName("Gradient") + QAbstractListModel(parent), m_gradientTypeName("Gradient"), m_locked(false) { } From ec0565b26ff576eb807de28bf69a0b5fc88f1c5a Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 22 Mar 2019 10:07:20 +0100 Subject: [PATCH 10/18] Doc: Rename "Debugger Console" as "QML Debugger Console" Change-Id: I9b1fa57b12210f3839998015075a9dbb3d392ea5 Reviewed-by: hjk --- doc/images/qml-script-console.png | Bin 8057 -> 5334 bytes .../debugger/qtquick-debugger-example.qdoc | 2 +- doc/src/debugger/qtquick-debugging.qdoc | 10 +++++----- doc/src/howto/creator-only/creator-ui.qdoc | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/images/qml-script-console.png b/doc/images/qml-script-console.png index b1fc61b36d694f85fb402b3d842520157dfa6005..08679a60b22b5ab9c5591b79027601ee259786cf 100644 GIT binary patch literal 5334 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 literal 8057 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 - \uicontrol {Output Panes} > \uicontrol {Debugger Console}. + \uicontrol {Output Panes} > \uicontrol {QML Debugger Console}. - \image qml-script-console.png "Debugger Console" + \image qml-script-console.png "QML Debugger Console" You can change property values temporarily, without editing the source, and view the results in the running application. You can change the property @@ -239,7 +239,7 @@ \section1 Applying QML Changes at Runtime - When you change property values in the \uicontrol {Debugger Console} or in - the \uicontrol Locals or \uicontrol Expression view, they are immediately + When you change property values in the \uicontrol {QML Debugger Console} or + in the \uicontrol Locals or \uicontrol Expression view, they are immediately updated in the running application, but not in the source code. */ diff --git a/doc/src/howto/creator-only/creator-ui.qdoc b/doc/src/howto/creator-only/creator-ui.qdoc index 6b80944189d..153c9ed34f7 100644 --- a/doc/src/howto/creator-only/creator-ui.qdoc +++ b/doc/src/howto/creator-only/creator-ui.qdoc @@ -137,7 +137,7 @@ \li \uicontrol{Compile Output} - \li \uicontrol {Debugger Console} + \li \uicontrol {QML Debugger Console} \li \uicontrol {To-Do Entries} @@ -164,7 +164,7 @@ \uicontrol {Window > Output Panes}. To display the \uicontrol {To-Do Entries} pane, enable the Todo plugin. - For more information about the \uicontrol {Debugger Console} view, see + For more information about the \uicontrol {QML Debugger Console} view, see \l{Executing JavaScript Expressions}. \section2 Issues From 29c13a8a2575a791c58664d9d825b0a44ff34a28 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Fri, 22 Mar 2019 10:35:41 +0100 Subject: [PATCH 11/18] QmlDesigner: Fix metainfo We have to check the propertyToken, because the default token is most likely invalid. e.g.: [default] property alias: something Change-Id: Ieedb1f3907c78d52f4e4406e2a2bf4d93bf1f636 Reviewed-by: Thomas Hartmann --- src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 7f2279ce4c7..821841e2187 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -85,7 +85,7 @@ static TypeName resolveTypeName(const ASTPropertyReference *ref, const ContextPt { TypeName type = "unknown"; - if (ref->ast()->defaultToken.isValid()) { + if (ref->ast()->propertyToken.isValid()) { type = ref->ast()->memberType->name.toUtf8(); if (type == "alias") { From 3a71aaef96e80ed1b2eba5d501c79e4b66b04020 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 22 Mar 2019 12:01:49 +0100 Subject: [PATCH 12/18] Doc: Fix changed debug command name "Start Debugging" is now "Start Debugging of Startup Project". The debug button also now has this longer name. Change-Id: I6c53b9647cafde1d6056efd8d0408daaf1d7f0d7 Reviewed-by: hjk --- doc/images/qtcreator-debug-button.png | Bin 0 -> 235 bytes .../creator-only/creator-debugger-example.qdoc | 2 +- .../creator-only/creator-debugger.qdoc | 17 +++++++++-------- doc/src/debugger/qtquick-debugger-example.qdoc | 3 ++- doc/src/debugger/qtquick-debugging.qdoc | 7 ++++--- 5 files changed, 16 insertions(+), 13 deletions(-) create mode 100644 doc/images/qtcreator-debug-button.png diff --git a/doc/images/qtcreator-debug-button.png b/doc/images/qtcreator-debug-button.png new file mode 100644 index 0000000000000000000000000000000000000000..c27b11f2dd5824e839a5e6a2b0d8e22bc6d25a66 GIT binary patch literal 235 zcmeAS@N?(olHy`uVBq!ia0y~yU=Rdh4h9AW201nfH3kNTO`a}}Arj%qKjJTZmS;8i zqo1x}+p86H_<(}o56;LXvluyI%ocSU7`Uu=5>HHs|H9+9xkBx2i_Y+Em zua{+L>~HD(kn-%Cexix9(eV$DcJ_bWw^F;#x2f}k?3syABA=aFRmr3#v~h1oW8y|d z=F8?Q^k?`z)igBFF-lC}jNlYmnP4#g^H(>Hh?d6}ycc+c37lv%VQW)uUwFFuxvX \uicontrol {Start Debugging} > - \uicontrol {Start Debugging} or press \key F5. + \uicontrol {Start Debugging of Startup Project} or press \key F5. \li To view information about the breakpoint, go to the \uicontrol Breakpoints view. diff --git a/doc/src/debugger/creator-only/creator-debugger.qdoc b/doc/src/debugger/creator-only/creator-debugger.qdoc index cca7b5773b5..e2fd19ce527 100644 --- a/doc/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/src/debugger/creator-only/creator-debugger.qdoc @@ -54,10 +54,10 @@ \li \l{Launching the Debugger} To start an application from an open project under the control - of a debugger, press the Debug button in the lower left corner - of the main view, or press \key F5. Other, less common start - options are available in the \uicontrol Debug > - \uicontrol {Start Debugging} menu. + of a debugger, select the \inlineimage qtcreator-debug-button.png + (\uicontrol {Start Debugging of Startup Project}) button or press + \key F5. Other, less common start options are available in the + \uicontrol Debug > \uicontrol {Start Debugging} menu. \li \l{Interacting with the Debugger} @@ -106,8 +106,8 @@ \title Launching the Debugger To start an application from an open project under the control of a - debugger, press the \uicontrol Debug button in the lower left corner - of the main view, or press \key F5. + debugger, select the \inlineimage qtcreator-debug-button.png + (\uicontrol {Start Debugging of Startup Project}) button or press \key F5. \QC checks whether the compiled program is up-to-date, and rebuilds and deploys it if the \uicontrol {Always build project before deploying it} and @@ -127,7 +127,8 @@ depending on where and how the debugged process is started and run. Some of the modes are only available for a particular operating system or platform. - In general, the \key F5 and the \uicontrol Debug button are set up in a + In general, \key F5 and the \uicontrol {Start Debugging of Startup Project} + button are set up in a way to start the operating mode that is commonly used in a given context. So if the current project is set up as a C++ application using the MinGW toolchain targeting desktop Windows, the GDB engine will be started in Start @@ -137,7 +138,7 @@ Change the run configuration parameters (such as \uicontrol {Run in Terminal}) in the run settings of the project, or select - options from the \uicontrol Debug > \uicontrol {Start Debugging} menu to + options from the \uicontrol Debug > \uicontrol {Start Debugging} menu to select other modes of operation. The debugger can run in the following modes: diff --git a/doc/src/debugger/qtquick-debugger-example.qdoc b/doc/src/debugger/qtquick-debugger-example.qdoc index e749f9c1a27..51789173c5c 100644 --- a/doc/src/debugger/qtquick-debugger-example.qdoc +++ b/doc/src/debugger/qtquick-debugger-example.qdoc @@ -65,7 +65,8 @@ The red circle indicates that a breakpoint is now set on that line number. - \li Select \uicontrol {Debug > Start Debugging > Start Debugging} or press + \li Select \uicontrol Debug > \uicontrol {Start Debugging} > + \uicontrol {Start Debugging of Startup Project} or press \key{F5}. \li Once the Same Game application starts, select \uicontrol {Puzzle} diff --git a/doc/src/debugger/qtquick-debugging.qdoc b/doc/src/debugger/qtquick-debugging.qdoc index a383df6f348..4f2dc30e93b 100644 --- a/doc/src/debugger/qtquick-debugging.qdoc +++ b/doc/src/debugger/qtquick-debugging.qdoc @@ -101,9 +101,10 @@ \section1 Starting QML Debugging - To start the application, choose \uicontrol {Debug > Start Debugging > - Start Debugging} or press \key F5. Once the application starts running, it - behaves and performs as usual. You can then perform the following tasks: + To start the application, choose \uicontrol Debug > \uicontrol {Start Debugging} + > \uicontrol {Start Debugging of Startup Project} or press \key F5. Once the + application starts running, it behaves and performs as usual. You can then + perform the following tasks: \list From d7e3954f242b8656310da86fb6e59c47ab036ca6 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 15 Mar 2019 11:05:13 +0100 Subject: [PATCH 13/18] Doc: List services provided by the language server Add links to more information about the services. Rewrite the section about the Outline sidebar view to better match other languages beside QML. Change-Id: If9bc710c034c938fc49d67252f14fc3237feedcb Reviewed-by: David Schulz --- dist/changes-4.9.0.md | 3 ++- .../creator-only/creator-clang-codemodel.qdoc | 3 ++- .../creator-only/creator-language-server.qdoc | 18 ++++++++++++++---- doc/src/howto/creator-sidebar-views.qdocinc | 9 +++++---- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/dist/changes-4.9.0.md b/dist/changes-4.9.0.md index 8feed6ec314..a5db399027b 100644 --- a/dist/changes-4.9.0.md +++ b/dist/changes-4.9.0.md @@ -20,7 +20,8 @@ Editing * Language Client * Added support for document outline (QTCREATORBUG-21573) - * Added support for `Find Usages` (QTCREATORBUG-21577) + * Added support for `Find References to Symbol Under Cursor` + (QTCREATORBUG-21577) * Added support for code actions * Highlighter * Replaced custom highlighting file parser with `KSyntaxHighlighting` diff --git a/doc/src/editors/creator-only/creator-clang-codemodel.qdoc b/doc/src/editors/creator-only/creator-clang-codemodel.qdoc index 7fd7791209b..f8e2b890c15 100644 --- a/doc/src/editors/creator-only/creator-clang-codemodel.qdoc +++ b/doc/src/editors/creator-only/creator-clang-codemodel.qdoc @@ -52,7 +52,8 @@ {following symbols}, and so on \li Inspecting code by using the \l{Browsing Project Contents} - {class browser}, the \l{Viewing QML Types}{outline}, and so on + {class browser}, the \l{Viewing Defined Types and Symbols} + {outline}, and so on \li Diagnostics diff --git a/doc/src/editors/creator-only/creator-language-server.qdoc b/doc/src/editors/creator-only/creator-language-server.qdoc index 7bf030f1b0f..4b75aae16e1 100644 --- a/doc/src/editors/creator-only/creator-language-server.qdoc +++ b/doc/src/editors/creator-only/creator-language-server.qdoc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -34,9 +34,19 @@ For several programming languages, a \e {language server} is available that provides information about the code to IDEs as long as they support communication via the language server protocol (LSP). This enables the - IDE to provide code completion, highlighting of the symbol under cursor, - and jumping to the symbol definition, as well as to integrate diagnostics - from the language server. + IDE to provide the following services: + + \list + \li \l{Completing Code}{Code completion} + \li Highlighting the symbol under cursor + \li \l{Moving to Symbol Definition or Declaration} + {Moving to the symbol definition} + \li Inspecting code by viewing the document + \l{Viewing Defined Types and Symbols}{outline} + \li \l{Finding Symbols}{Finding references to symbols} + \li Code actions + \li Integrating diagnostics from the language server + \endlist By providing a client for the language server protocol, \QC can support the above features for several other programming languages besides C++. diff --git a/doc/src/howto/creator-sidebar-views.qdocinc b/doc/src/howto/creator-sidebar-views.qdocinc index 5269e5f0ee2..bb4daaa72b0 100644 --- a/doc/src/howto/creator-sidebar-views.qdocinc +++ b/doc/src/howto/creator-sidebar-views.qdocinc @@ -1,6 +1,6 @@ /**************************************************************************** ** -** Copyright (C) 2018 The Qt Company Ltd. +** Copyright (C) 2019 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the Qt Creator documentation. @@ -268,14 +268,15 @@ //! [outline view] - \section2 Viewing QML Types + \section2 Viewing Defined Types and Symbols - The \uicontrol Outline view shows the type hierarchy in a QML file. + The \uicontrol Outline view shows an overview of defined types and other + symbols, as well as their properties and hierarchy in a source file. \list \li To see a complete list of all bindings, select \uicontrol {Filter Tree} > \uicontrol {Show All Bindings}. - \li To stop the synchronization with the QML type selected in the + \li To stop the synchronization with the type or symbol selected in the editor, deselect \uicontrol {Synchronize with Editor}. \endlist From 0466875740f9247a2d93d25c30b84a1e192a7fa3 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 22 Mar 2019 14:37:52 +0100 Subject: [PATCH 14/18] Doc: Describe the Start Debugging Without Deployment option Change-Id: I71fc00b1672bda910a1313335d7651680d257750 Reviewed-by: hjk --- doc/src/debugger/creator-only/creator-debugger.qdoc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/doc/src/debugger/creator-only/creator-debugger.qdoc b/doc/src/debugger/creator-only/creator-debugger.qdoc index e2fd19ce527..7be1ab1f980 100644 --- a/doc/src/debugger/creator-only/creator-debugger.qdoc +++ b/doc/src/debugger/creator-only/creator-debugger.qdoc @@ -112,7 +112,9 @@ \QC checks whether the compiled program is up-to-date, and rebuilds and deploys it if the \uicontrol {Always build project before deploying it} and \uicontrol {Always deploy before running} options are selected in the - \uicontrol {Build and Run} options. + \uicontrol {Build and Run} options. To debug the program without deploying + it, select \uicontrol Debug > \uicontrol {Start Debugging} > + \uicontrol {Start Debugging Without Deployment}. The debugger then takes over and starts the program with suitable parameters. From 4e67ba7f099c38a10528c58aeaa0be445c36c406 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 21 Mar 2019 19:04:18 +0100 Subject: [PATCH 15/18] Clang: Fix compiler warning "warning: local variable 'filePaths' will be copied despite being returned by name [-Wreturn-std-move]" "note: call 'std::move' explicitly to avoid copying" Change-Id: Ib34fcae4401b65a6d5c4bb2fb79bbf12c1e84f35 Reviewed-by: hjk --- src/tools/clangbackend/source/clangfilesystemwatcher.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/clangbackend/source/clangfilesystemwatcher.cpp b/src/tools/clangbackend/source/clangfilesystemwatcher.cpp index a51676abe0f..bcd03fac61e 100644 --- a/src/tools/clangbackend/source/clangfilesystemwatcher.cpp +++ b/src/tools/clangbackend/source/clangfilesystemwatcher.cpp @@ -60,7 +60,7 @@ QStringList filterExistingFiles(QStringList &&filePaths) filePaths.erase(startOfNonExistingFilePaths, filePaths.end()); - return filePaths; + return std::move(filePaths); } } From 70199aa4f4a161624b84d2e12728d8ffd0b3edf3 Mon Sep 17 00:00:00 2001 From: hjk Date: Fri, 22 Mar 2019 14:58:28 +0100 Subject: [PATCH 16/18] Debugger: Hide hint label in dialogs that cannot use override ports Change-Id: I4de5b8bca1084f89987c3656e7b46a62a0905051 Reviewed-by: Leena Miettinen Reviewed-by: Christian Stenger --- src/plugins/debugger/debuggerdialogs.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/plugins/debugger/debuggerdialogs.cpp b/src/plugins/debugger/debuggerdialogs.cpp index db5731a5aa8..0e274e439d9 100644 --- a/src/plugins/debugger/debuggerdialogs.cpp +++ b/src/plugins/debugger/debuggerdialogs.cpp @@ -73,6 +73,7 @@ class StartApplicationDialogPrivate public: KitChooser *kitChooser; QLabel *serverPortLabel; + QLabel *channelOverrideHintLabel; QLabel *channelOverrideLabel; QLineEdit *channelOverrideEdit; QSpinBox *serverPortSpinBox; @@ -237,6 +238,12 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent) d->serverPortSpinBox = new QSpinBox(this); d->serverPortSpinBox->setRange(1, 65535); + d->channelOverrideHintLabel = + new QLabel(tr("Normally, the running server is identified by the IP of the " + "device in the kit and the server port selected above.\n" + "You can choose another communication channel here, such as " + "a serial line or custom ip:port.")); + d->channelOverrideLabel = new QLabel(tr("Override server channel:"), this); d->channelOverrideEdit = new QLineEdit(this); //: "For example, /dev/ttyS0, COM1, 127.0.0.1:1234" @@ -304,10 +311,7 @@ StartApplicationDialog::StartApplicationDialog(QWidget *parent) formLayout->addRow(tr("Break at \"&main\":"), d->breakAtMainCheckBox); formLayout->addRow(d->serverStartScriptLabel, d->serverStartScriptPathChooser); formLayout->addRow(tr("Debug &information:"), d->debuginfoPathChooser); - formLayout->addRow(new QLabel(tr("Normally, the running server is identified by the IP of the " - "device in the kit and the server port selected above.\n" - "You can choose another communication channel here, such as " - "a serial line or custom ip:port."))); + formLayout->addRow(d->channelOverrideHintLabel); formLayout->addRow(d->channelOverrideLabel, d->channelOverrideEdit); formLayout->addRow(line2); formLayout->addRow(tr("&Recent:"), d->historyComboBox); @@ -396,6 +400,7 @@ void StartApplicationDialog::run(bool attachRemote) dialog.d->serverStartScriptLabel->setVisible(false); dialog.d->serverPortSpinBox->setVisible(false); dialog.d->serverPortLabel->setVisible(false); + dialog.d->channelOverrideHintLabel->setVisible(false); dialog.d->channelOverrideLabel->setVisible(false); dialog.d->channelOverrideEdit->setVisible(false); } From 4e8a3678d5d7704c0f9a1ae618821a8bea2d79c4 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Fri, 22 Mar 2019 16:06:17 +0100 Subject: [PATCH 17/18] Update change log for 4.9 Change-Id: Iab69b60aba9a6a1ecf19396bf5c63407342dbd9b Reviewed-by: Leena Miettinen --- dist/changes-4.9.0.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/dist/changes-4.9.0.md b/dist/changes-4.9.0.md index a5db399027b..f8ab948f9d5 100644 --- a/dist/changes-4.9.0.md +++ b/dist/changes-4.9.0.md @@ -76,6 +76,11 @@ Generic Projects files (QTCREATORBUG-19668) * Fixed `Apply Filter` when editing file list (QTCREATORBUG-16237) +Compilation Database Projects + +* Fixed that project tree was not updated when database changes on disk + (QTCREATORBUG-21733) + C++ Support * Added code snippet for range-based `for` loops @@ -86,8 +91,11 @@ C++ Support * Fixed issue with high memory consumption (QTCREATORBUG-19543) * Fixed inconsistency between `Follow Symbol` and `Ctrl + Click` (QTCREATORBUG-21637) + * Fixed that global completion was shown after comma (QTCREATORBUG-21624) * Clang Format * Added option to format code instead of only indenting code + * Added `Open Used .clang-format Configuration File` to editor's + context menu QML Support @@ -109,6 +117,8 @@ Debugging * Fixed that debugger toolbar could force large minimum window size (QTCREATORBUG-21885) * Added pretty printing of `QSizePolicy` +* Fixed pretty printing of standard maps and sets from `libc++` + (QTCREATORBUG-18536) * GDB * Added support for rvalue references in function arguments * LLDB @@ -131,6 +141,7 @@ Perf Profiler Qt Quick Designer * Made QML Live Preview integration opensource +* Added support for `Dialog` (QTCREATORBUG-22120) Version Control Systems @@ -179,6 +190,8 @@ Windows * Changed toolchain detection to use `vswhere` by default, which is recommended by Microsoft * Fixed issue with UNC paths in `.pro` files (QTCREATORBUG-21881) +* Fixed language version detections with MSVC and precompiled headers + (QTCREATORBUG-21860) Linux @@ -190,6 +203,7 @@ Android * Removed separate `QmakeAndroidSupport` plugin and merged functionality into other plugins +* Fixed debugging for API level 22 (QTCREATORBUG-22098) Remote Linux From 7a0ee1009b84fd4e6ef8852cc5112a144f3fa50e Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 6 Mar 2019 08:53:56 +0100 Subject: [PATCH 18/18] Fix soft assert when opening widget designer form Creating a designer form adds it to design mode's editor tool bar, which is correct. But this should not try to switch the drop down to this new document, which has only just been created and is not registered anywhere. It is not even officially the current document yet. Switching the drop down is done when it becomes the current document anyhow. Change-Id: If7fa8273600d83eda2cd1fa4731924007f8ca1f5 Fixes: QTCREATORBUG-20270 Reviewed-by: Friedemann Kleint --- src/plugins/coreplugin/editortoolbar.cpp | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/plugins/coreplugin/editortoolbar.cpp b/src/plugins/coreplugin/editortoolbar.cpp index 55430f1a422..28ed8a9acc3 100644 --- a/src/plugins/coreplugin/editortoolbar.cpp +++ b/src/plugins/coreplugin/editortoolbar.cpp @@ -272,8 +272,6 @@ void EditorToolBar::addEditor(IEditor *editor) if (toolBar && !d->m_isStandalone) addCenterToolBar(toolBar); - - updateDocumentStatus(editor->document()); } void EditorToolBar::addCenterToolBar(QWidget *toolBar) @@ -408,10 +406,6 @@ void EditorToolBar::updateDocumentStatus(IDocument *document) return; } - const Utils::optional index = DocumentModel::rowOfDocument(document); - if (QTC_GUARD(index)) - d->m_editorList->setCurrentIndex(*index); - if (document->filePath().isEmpty()) { d->m_lockButton->setIcon(QIcon()); d->m_lockButton->setEnabled(false);