diff --git a/cmake/QtCreatorAPI.cmake b/cmake/QtCreatorAPI.cmake index 35ba699ee09..27e6cfd7abb 100644 --- a/cmake/QtCreatorAPI.cmake +++ b/cmake/QtCreatorAPI.cmake @@ -38,7 +38,7 @@ if (APPLE) set(_IDE_PLUGIN_PATH "${_IDE_OUTPUT_PATH}/PlugIns") set(_IDE_LIBRARY_BASE_PATH "Frameworks") set(_IDE_LIBRARY_PATH "${_IDE_OUTPUT_PATH}/Frameworks") - set(_IDE_LIBEXEC_PATH "${_IDE_OUTPUT_PATH}/Resources") + set(_IDE_LIBEXEC_PATH "${_IDE_OUTPUT_PATH}/Resources/libexec") set(_IDE_DATA_PATH "${_IDE_OUTPUT_PATH}/Resources") set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc") set(_IDE_BIN_PATH "${_IDE_OUTPUT_PATH}/MacOS") @@ -178,8 +178,12 @@ function(separate_object_libraries libraries REGULAR_LIBS OBJECT_LIBS OBJECT_LIB endfunction(separate_object_libraries) function(set_explicit_moc target_name file) + unset(file_dependencies) + if (file MATCHES "^.*plugin.h$") + set(file_dependencies DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/${target_name}.json") + endif() set_property(SOURCE "${file}" PROPERTY SKIP_AUTOMOC ON) - qt5_wrap_cpp(file_moc "${file}") + qt5_wrap_cpp(file_moc "${file}" ${file_dependencies}) target_sources(${target_name} PRIVATE "${file_moc}") endfunction() diff --git a/dist/installer/mac/ios_qt.conf b/dist/installer/mac/ios_qt.conf index 9e239d6193d..249df1d74cc 100644 --- a/dist/installer/mac/ios_qt.conf +++ b/dist/installer/mac/ios_qt.conf @@ -1,2 +1,2 @@ [Paths] -Plugins = ../../PlugIns +Plugins = ../../../PlugIns diff --git a/dist/installer/mac/libexec_qt.conf b/dist/installer/mac/libexec_qt.conf new file mode 100644 index 00000000000..7004d4bec38 --- /dev/null +++ b/dist/installer/mac/libexec_qt.conf @@ -0,0 +1,5 @@ +[Paths] +Prefix = ../.. +Imports = Imports/qtquick1 +Qml2Imports = Imports/qtquick2 +Plugins = PlugIns diff --git a/dist/installer/mac/qmldesigner_qt.conf b/dist/installer/mac/qmldesigner_qt.conf index c10c195bdd6..8d80be2292f 100644 --- a/dist/installer/mac/qmldesigner_qt.conf +++ b/dist/installer/mac/qmldesigner_qt.conf @@ -1,4 +1,5 @@ [Paths] -Imports = ../../Imports/qtquick1 -Qml2Imports = ../../Imports/qtquick2 -Plugins = ../../PlugIns +Prefix = ../../.. +Imports = Imports/qtquick1 +Qml2Imports = Imports/qtquick2 +Plugins = PlugIns diff --git a/qbs/modules/qtc/qtc.qbs b/qbs/modules/qtc/qtc.qbs index d41a98f5629..3c6c30f8c75 100644 --- a/qbs/modules/qtc/qtc.qbs +++ b/qbs/modules/qtc/qtc.qbs @@ -48,7 +48,7 @@ Module { ? ide_app_target + ".app/Contents/Resources" : "share/qtcreator" property string ide_libexec_path: qbs.targetOS.contains("macos") - ? ide_data_path : qbs.targetOS.contains("windows") + ? ide_data_path + "/libexec" : qbs.targetOS.contains("windows") ? ide_app_path : "libexec/qtcreator" property string ide_bin_path: qbs.targetOS.contains("macos") diff --git a/qtcreator.pri b/qtcreator.pri index 9a61746ddbe..cc0a0b658cb 100644 --- a/qtcreator.pri +++ b/qtcreator.pri @@ -107,7 +107,7 @@ osx { IDE_LIBRARY_PATH = $$IDE_OUTPUT_PATH/Frameworks IDE_PLUGIN_PATH = $$IDE_OUTPUT_PATH/PlugIns - IDE_LIBEXEC_PATH = $$IDE_OUTPUT_PATH/Resources + IDE_LIBEXEC_PATH = $$IDE_OUTPUT_PATH/Resources/libexec IDE_DATA_PATH = $$IDE_OUTPUT_PATH/Resources IDE_DOC_PATH = $$IDE_DATA_PATH/doc IDE_BIN_PATH = $$IDE_OUTPUT_PATH/MacOS @@ -118,7 +118,7 @@ osx { INSTALL_LIBRARY_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Frameworks INSTALL_PLUGIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/PlugIns - INSTALL_LIBEXEC_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources + INSTALL_LIBEXEC_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources/libexec INSTALL_DATA_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources INSTALL_DOC_PATH = $$INSTALL_DATA_PATH/doc INSTALL_BIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/MacOS diff --git a/scripts/deployqtHelper_mac.sh b/scripts/deployqtHelper_mac.sh index 47c76130024..8844f8502d9 100755 --- a/scripts/deployqtHelper_mac.sh +++ b/scripts/deployqtHelper_mac.sh @@ -30,6 +30,7 @@ app_path="$1" resource_path="$app_path/Contents/Resources" +libexec_path="$app_path/Contents/Resources/libexec" bin_src="$2" translation_src="$3" plugin_src="$4" @@ -76,6 +77,7 @@ if [ -d "$quick1_src" ]; then echo "- Copying Qt Quick 1 imports" mkdir -p "$importsDir" cp -R "$quick1_src"/ "$importsDir"/ + find "$importsDir" -path "*.dylib.dSYM*" -delete fi fi @@ -86,6 +88,7 @@ if [ -d "$quick2_src" ]; then echo "- Copying Qt Quick 2 imports" mkdir -p "$imports2Dir" cp -R "$quick2_src"/ "$imports2Dir"/ + find "$imports2Dir" -path "*.dylib.dSYM*" -delete fi fi @@ -95,16 +98,22 @@ if [ ! -f "$resource_path/qt.conf" ]; then cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qt.conf" "$resource_path/qt.conf" || exit 1 fi +# copy libexec tools' qt.conf +if [ ! -f "$libexec_path/qt.conf" ]; then + echo "- Copying libexec/qt.conf" + cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/libexec_qt.conf" "$libexec_path/qt.conf" || exit 1 +fi + # copy ios tools' qt.conf -if [ ! -f "$resource_path/ios/qt.conf" ]; then - echo "- Copying ios/qt.conf" - cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/ios_qt.conf" "$resource_path/ios/qt.conf" || exit 1 +if [ ! -f "$libexec_path/ios/qt.conf" ]; then + echo "- Copying libexec/ios/qt.conf" + cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/ios_qt.conf" "$libexec_path/ios/qt.conf" || exit 1 fi # copy qml2puppet's qt.conf -if [ ! -f "$resource_path/qmldesigner/qt.conf" ]; then - echo "- Copying qmldesigner/qt.conf" - cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qmldesigner_qt.conf" "$resource_path/qmldesigner/qt.conf" || exit 1 +if [ ! -f "$libexec_path/qmldesigner/qt.conf" ]; then + echo "- Copying libexec/qmldesigner/qt.conf" + cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qmldesigner_qt.conf" "$libexec_path/qmldesigner/qt.conf" || exit 1 fi # copy Qt translations @@ -120,50 +129,40 @@ if [ $LLVM_INSTALL_DIR ]; then echo "- Copying libclang" mkdir -p "$app_path/Contents/Frameworks" || exit 1 # use recursive copy to make it copy symlinks as symlinks - mkdir -p "$resource_path/clang/bin" - mkdir -p "$resource_path/clang/lib" + mkdir -p "$libexec_path/clang/bin" + mkdir -p "$libexec_path/clang/lib" cp -Rf "$LLVM_INSTALL_DIR"/lib/libclang.*dylib "$app_path/Contents/Frameworks/" || exit 1 - cp -Rf "$LLVM_INSTALL_DIR"/lib/clang "$resource_path/clang/lib/" || exit 1 + cp -Rf "$LLVM_INSTALL_DIR"/lib/clang "$libexec_path/clang/lib/" || exit 1 clangsource="$LLVM_INSTALL_DIR"/bin/clang clanglinktarget="$(readlink "$clangsource")" - cp -Rf "$clangsource" "$resource_path/clang/bin/" || exit 1 + cp -Rf "$clangsource" "$libexec_path/clang/bin/" || exit 1 if [ $clanglinktarget ]; then - cp -Rf "$(dirname "$clangsource")/$clanglinktarget" "$resource_path/clang/bin/$clanglinktarget" || exit 1 + cp -Rf "$(dirname "$clangsource")/$clanglinktarget" "$libexec_path/clang/bin/$clanglinktarget" || exit 1 fi clangdsource="$LLVM_INSTALL_DIR"/bin/clangd - cp -Rf "$clangdsource" "$resource_path/clang/bin/" || exit 1 + cp -Rf "$clangdsource" "$libexec_path/clang/bin/" || exit 1 clangtidysource="$LLVM_INSTALL_DIR"/bin/clang-tidy - cp -Rf "$clangtidysource" "$resource_path/clang/bin/" || exit 1 + cp -Rf "$clangtidysource" "$libexec_path/clang/bin/" || exit 1 clazysource="$LLVM_INSTALL_DIR"/bin/clazy-standalone - cp -Rf "$clazysource" "$resource_path/clang/bin/" || exit 1 + cp -Rf "$clazysource" "$libexec_path/clang/bin/" || exit 1 fi - clangbackendArgument="-executable=$resource_path/clangbackend" - clangpchmanagerArgument="-executable=$resource_path/clangpchmanagerbackend" - clangrefactoringArgument="-executable=$resource_path/clangrefactoringbackend" + clangbackendArgument="-executable=$libexec_path/clangbackend" + clangpchmanagerArgument="-executable=$libexec_path/clangpchmanagerbackend" + clangrefactoringArgument="-executable=$libexec_path/clangrefactoringbackend" fi #### macdeployqt if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then - qml2puppetapp="$resource_path/qmldesigner/qml2puppet" + qml2puppetapp="$libexec_path/qmldesigner/qml2puppet" if [ -f "$qml2puppetapp" ]; then qml2puppetArgument="-executable=$qml2puppetapp" fi qbsapp="$app_path/Contents/MacOS/qbs" - - echo "- Running macdeployqt ($bin_src/macdeployqt)" - - "$bin_src/macdeployqt" "$app_path" \ - "-executable=$app_path/Contents/MacOS/qtdiag" \ - "-executable=$resource_path/qtpromaker" \ - "-executable=$resource_path/sdktool" \ - "-executable=$resource_path/ios/iostool" \ - "-executable=$resource_path/buildoutputparser" \ - "-executable=$resource_path/cpaster" \ - "-executable=$resource_path/qbs_processlauncher" \ - "-executable=$qbsapp" \ + if [ -f "$qbsapp" ]; then + qbsArguments=("-executable=$qbsapp" \ "-executable=$qbsapp-config" \ "-executable=$qbsapp-config-ui" \ "-executable=$qbsapp-qmltypes" \ @@ -171,6 +170,19 @@ if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then "-executable=$qbsapp-setup-qt" \ "-executable=$qbsapp-setup-toolchains" \ "-executable=$qbsapp-create-project" \ + "-executable=$libexec_path/qbs_processlauncher") + fi + + echo "- Running macdeployqt ($bin_src/macdeployqt)" + + "$bin_src/macdeployqt" "$app_path" \ + "-executable=$app_path/Contents/MacOS/qtdiag" \ + "-executable=$libexec_path/qtpromaker" \ + "-executable=$libexec_path/sdktool" \ + "-executable=$libexec_path/ios/iostool" \ + "-executable=$libexec_path/buildoutputparser" \ + "-executable=$libexec_path/cpaster" \ + "${qbsArguments[@]}" \ "$qml2puppetArgument" \ "$clangbackendArgument" "$clangpchmanagerArgument" "$clangrefactoringArgument" || exit 1 diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml index 0176a55dfaf..67ae4c7b295 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/Arrow.qml @@ -27,104 +27,29 @@ import QtQuick 2.0 import QtQuick3D 1.0 import MouseArea3D 1.0 -Model { +DirectionalDraggable { id: arrow - rotationOrder: Node.XYZr source: "meshes/arrow.mesh" - property View3D view3D - property alias color: material.emissiveColor - property Node targetNode: null - property bool dragging: false - - readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering - - property var _pointerPosPressed - property var _targetStartPos - signal positionCommit() signal positionMove() - materials: DefaultMaterial { - id: material - emissiveColor: "white" - lighting: DefaultMaterial.NoLighting - } - - function handlePressed(mouseArea, pointerPosition) + function localPos(sceneRelativeDistance) { - if (!targetNode) - return; - - var maskedPosition = Qt.vector3d(pointerPosition.x, 0, 0); - _pointerPosPressed = mouseArea.mapPositionToScene(maskedPosition); - var sp = targetNode.scenePosition; - _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); - dragging = true; - } - - function posInParent(mouseArea, pointerPosition) - { - var maskedPosition = Qt.vector3d(pointerPosition.x, 0, 0); - var scenePointerPos = mouseArea.mapPositionToScene(maskedPosition); - var sceneRelativeDistance = Qt.vector3d( - scenePointerPos.x - _pointerPosPressed.x, - scenePointerPos.y - _pointerPosPressed.y, - scenePointerPos.z - _pointerPosPressed.z); - var newScenePos = Qt.vector3d( _targetStartPos.x + sceneRelativeDistance.x, _targetStartPos.y + sceneRelativeDistance.y, _targetStartPos.z + sceneRelativeDistance.z); - return targetNode.parent.mapPositionFromScene(newScenePos); } - function handleDragged(mouseArea, pointerPosition) - { - if (!targetNode) - return; - - targetNode.position = posInParent(mouseArea, pointerPosition); - arrow.positionMove(); + onDragged: { + targetNode.position = localPos(sceneRelativeDistance); + positionMove(); } - function handleReleased(mouseArea, pointerPosition) - { - if (!targetNode) - return; - - targetNode.position = posInParent(mouseArea, pointerPosition); - dragging = false; - arrow.positionCommit(); - } - - MouseArea3D { - id: mouseAreaYZ - view3D: arrow.view3D - x: 0 - y: -1.5 - width: 12 - height: 3 - rotation: Qt.vector3d(0, 0, 90) - grabsMouse: targetNode - onPressed: arrow.handlePressed(mouseAreaYZ, pointerPosition) - onDragged: arrow.handleDragged(mouseAreaYZ, pointerPosition) - onReleased: arrow.handleReleased(mouseAreaYZ, pointerPosition) - } - - MouseArea3D { - id: mouseAreaXZ - view3D: arrow.view3D - x: 0 - y: -1.5 - width: 12 - height: 3 - rotation: Qt.vector3d(0, 90, 90) - grabsMouse: targetNode - onPressed: arrow.handlePressed(mouseAreaXZ, pointerPosition) - onDragged: arrow.handleDragged(mouseAreaXZ, pointerPosition) - onReleased: arrow.handleReleased(mouseAreaXZ, pointerPosition) + onReleased: { + targetNode.position = localPos(sceneRelativeDistance); + positionCommit(); } } - diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml index 14e45951ae3..6a2a7b3a763 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/CameraGizmo.qml @@ -25,17 +25,27 @@ import QtQuick 2.0 import QtQuick3D 1.0 +import CameraGeometry 1.0 IconGizmo { id: cameraGizmo iconSource: "qrc:///qtquickplugin/mockfiles/images/camera-pick-icon.png" - gizmoModel.source: "#Cube" + gizmoModel.geometry: cameraGeometry + property alias geometryName: cameraGeometry.name // Name must be unique for each geometry + property alias viewPortRect: cameraGeometry.viewPortRect + + CameraGeometry { + id: cameraGeometry + camera: cameraGizmo.targetNode + } + gizmoModel.materials: [ DefaultMaterial { id: defaultMaterial emissiveColor: "blue" lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling } ] } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml new file mode 100644 index 00000000000..243744210ee --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/DirectionalDraggable.qml @@ -0,0 +1,124 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +Model { + id: rootModel + rotationOrder: Node.XYZr + + property View3D view3D + property alias color: material.emissiveColor + property Node targetNode: null + property bool dragging: false + property bool active: false + + readonly property bool hovering: mouseAreaYZ.hovering || mouseAreaXZ.hovering + + property var _pointerPosPressed + property var _targetStartPos + + signal pressed(var mouseArea) + signal dragged(var mouseArea, vector3d sceneRelativeDistance) + signal released(var mouseArea, vector3d sceneRelativeDistance) + + materials: DefaultMaterial { + id: material + emissiveColor: "white" + lighting: DefaultMaterial.NoLighting + } + + function handlePressed(mouseArea, scenePos) + { + if (!targetNode) + return; + + var maskedPosition = Qt.vector3d(scenePos.x, 0, 0); + _pointerPosPressed = mouseArea.mapPositionToScene(maskedPosition); + var sp = targetNode.scenePosition; + _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); + dragging = true; + pressed(mouseArea); + } + + function calcRelativeDistance(mouseArea, scenePos) + { + var maskedPosition = Qt.vector3d(scenePos.x, 0, 0); + var scenePointerPos = mouseArea.mapPositionToScene(maskedPosition); + return Qt.vector3d(scenePointerPos.x - _pointerPosPressed.x, + scenePointerPos.y - _pointerPosPressed.y, + scenePointerPos.z - _pointerPosPressed.z); + } + + function handleDragged(mouseArea, scenePos) + { + if (!targetNode) + return; + + dragged(mouseArea, calcRelativeDistance(mouseArea, scenePos)); + } + + function handleReleased(mouseArea, scenePos) + { + if (!targetNode) + return; + + released(mouseArea, calcRelativeDistance(mouseArea, scenePos)); + dragging = false; + } + + MouseArea3D { + id: mouseAreaYZ + view3D: rootModel.view3D + x: 0 + y: -1.5 + width: 12 + height: 3 + rotation: Qt.vector3d(0, 0, 90) + grabsMouse: targetNode + active: rootModel.active + onPressed: rootModel.handlePressed(mouseAreaYZ, scenePos) + onDragged: rootModel.handleDragged(mouseAreaYZ, scenePos) + onReleased: rootModel.handleReleased(mouseAreaYZ, scenePos) + } + + MouseArea3D { + id: mouseAreaXZ + view3D: rootModel.view3D + x: 0 + y: -1.5 + width: 12 + height: 3 + rotation: Qt.vector3d(0, 90, 90) + grabsMouse: targetNode + active: rootModel.active + onPressed: rootModel.handlePressed(mouseAreaXZ, scenePos) + onDragged: rootModel.handleDragged(mouseAreaXZ, scenePos) + onReleased: rootModel.handleReleased(mouseAreaXZ, scenePos) + } +} + diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml index e19e75acb8d..e82391f8bce 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/EditView3D.qml @@ -38,7 +38,7 @@ Window { title: "3D" flags: Qt.WindowStaysOnTopHint | Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint - property alias scene: editView.scene + property alias scene: editView.importScene property alias showEditLight: editLightCheckbox.checked property alias usePerspective: usePerspectiveCheckbox.checked @@ -46,10 +46,11 @@ Window { property var lightGizmos: [] property var cameraGizmos: [] + property rect viewPortRect: Qt.rect(0, 0, 1000, 1000) signal objectClicked(var object) - signal commitObjectPosition(var object) - signal moveObjectPosition(var object) + signal commitObjectProperty(var object, var propName) + signal changeObjectProperty(var object, var propName) function selectObject(object) { selectedNode = object; @@ -75,10 +76,14 @@ Window { { var component = Qt.createComponent("CameraGizmo.qml"); if (component.status === Component.Ready) { - var gizmo = component.createObject(overlayScene, - {"view3D": overlayView, "targetNode": obj}); + var geometryName = designStudioNativeCameraControlHelper.generateUniqueName("CameraGeometry"); + var gizmo = component.createObject( + overlayScene, + {"view3D": overlayView, "targetNode": obj, "geometryName": geometryName, + "viewPortRect": viewPortRect}); cameraGizmos[cameraGizmos.length] = gizmo; gizmo.selected.connect(emitObjectClicked); + gizmo.viewPortRect = Qt.binding(function() {return viewPortRect;}); } } @@ -113,11 +118,26 @@ Window { position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition : Qt.vector3d(0, 0, 0) globalOrientation: globalControl.checked - visible: selectedNode + visible: selectedNode && moveToolControl.checked view3D: overlayView - onPositionCommit: viewWindow.commitObjectPosition(selectedNode) - onPositionMove: viewWindow.moveObjectPosition(selectedNode) + onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position") + onPositionMove: viewWindow.changeObjectProperty(selectedNode, "position") + } + + ScaleGizmo { + id: scaleGizmo + scale: autoScale.getScale(Qt.vector3d(5, 5, 5)) + highlightOnHover: true + targetNode: viewWindow.selectedNode + position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition + : Qt.vector3d(0, 0, 0) + globalOrientation: globalControl.checked + visible: selectedNode && scaleToolControl.checked + view3D: overlayView + + onScaleCommit: viewWindow.commitObjectProperty(selectedNode, "scale") + onScaleChange: viewWindow.changeObjectProperty(selectedNode, "scale") } AutoScaleHelper { @@ -156,10 +176,12 @@ Window { } PointLight { - id: pointLight + id: editLight visible: showEditLight position: usePerspective ? editPerspectiveCamera.position : editOrthoCamera.position + quadraticFade: 0 + linearFade: 0 } PerspectiveCamera { @@ -181,16 +203,16 @@ Window { id: overlayView anchors.fill: parent camera: usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera - scene: overlayScene + importScene: overlayScene } Overlay2D { id: gizmoLabel - targetNode: moveGizmo + targetNode: moveGizmo.visible ? moveGizmo : scaleGizmo targetView: overlayView offsetX: 0 offsetY: 45 - visible: moveGizmo.dragging + visible: targetNode.dragging Rectangle { color: "white" @@ -203,11 +225,18 @@ Window { id: gizmoLabelText text: { var l = Qt.locale(); - selectedNode - ? qsTr("x:") + Number(selectedNode.position.x).toLocaleString(l, 'f', 1) - + qsTr(" y:") + Number(selectedNode.position.y).toLocaleString(l, 'f', 1) - + qsTr(" z:") + Number(selectedNode.position.z).toLocaleString(l, 'f', 1) - : ""; + var targetProperty; + if (viewWindow.selectedNode) { + if (gizmoLabel.targetNode === moveGizmo) + targetProperty = viewWindow.selectedNode.position; + else + targetProperty = viewWindow.selectedNode.scale; + return qsTr("x:") + Number(targetProperty.x).toLocaleString(l, 'f', 1) + + qsTr(" y:") + Number(targetProperty.y).toLocaleString(l, 'f', 1) + + qsTr(" z:") + Number(targetProperty.z).toLocaleString(l, 'f', 1); + } else { + return ""; + } } anchors.centerIn: parent } @@ -252,6 +281,19 @@ Window { text: qsTr("Use Global Orientation") onCheckedChanged: cameraControl.forceActiveFocus() } + Column { + x: 8 + RadioButton { + id: moveToolControl + checked: true + text: qsTr("Move Tool") + } + RadioButton { + id: scaleToolControl + checked: false + text: qsTr("Scale Tool") + } + } } Text { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml index 56bec4ae0c9..6fbf17367e0 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/IconGizmo.qml @@ -45,7 +45,6 @@ Node { Model { id: gizmoModel - scale: Qt.vector3d(0.05, 0.05, 0.05) visible: iconGizmo.visible } Overlay2D { diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml index d3a5932b392..888b2fce5cd 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/LightGizmo.qml @@ -31,6 +31,7 @@ IconGizmo { iconSource: "qrc:///qtquickplugin/mockfiles/images/light-pick-icon.png" gizmoModel.source: "#Sphere" + gizmoModel.scale: Qt.vector3d(0.10, 0.10, 0.10) gizmoModel.materials: [ DefaultMaterial { id: defaultMaterial diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml index 7ad5a2a0113..b8e6cdafb94 100644 --- a/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/MoveGizmo.qml @@ -35,7 +35,8 @@ Node { property Node targetNode: null property bool globalOrientation: true readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging - || centerMouseArea.dragging + || planeX.dragging || planeY.dragging || planeZ.dragging + || centerBall.dragging signal positionCommit() signal positionMove() @@ -45,12 +46,12 @@ Node { Arrow { id: arrowX - objectName: "Arrow X" rotation: Qt.vector3d(0, 0, -90) targetNode: moveGizmo.targetNode color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) - : Qt.rgba(1, 0, 0, 1) + : Qt.rgba(1, 0, 0, 1) view3D: moveGizmo.view3D + active: moveGizmo.visible onPositionCommit: moveGizmo.positionCommit() onPositionMove: moveGizmo.positionMove() @@ -58,12 +59,12 @@ Node { Arrow { id: arrowY - objectName: "Arrow Y" rotation: Qt.vector3d(0, 0, 0) targetNode: moveGizmo.targetNode - color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) - : Qt.rgba(0, 0, 1, 1) + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) view3D: moveGizmo.view3D + active: moveGizmo.visible onPositionCommit: moveGizmo.positionCommit() onPositionMove: moveGizmo.positionMove() @@ -71,85 +72,83 @@ Node { Arrow { id: arrowZ - objectName: "Arrow Z" rotation: Qt.vector3d(90, 0, 0) targetNode: moveGizmo.targetNode - color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) - : Qt.rgba(0, 0.6, 0, 1) + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) view3D: moveGizmo.view3D + active: moveGizmo.visible onPositionCommit: moveGizmo.positionCommit() onPositionMove: moveGizmo.positionMove() } + PlanarMoveHandle { + id: planeX + + y: 10 + z: 10 + + rotation: Qt.vector3d(0, 90, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + PlanarMoveHandle { + id: planeY + + x: 10 + z: 10 + + rotation: Qt.vector3d(90, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } + + PlanarMoveHandle { + id: planeZ + + x: 10 + y: 10 + + rotation: Qt.vector3d(0, 0, 0) + targetNode: moveGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: moveGizmo.view3D + active: moveGizmo.visible + + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() + } } - Model { + PlanarMoveHandle { id: centerBall source: "#Sphere" - scale: Qt.vector3d(0.024, 0.024, 0.024) - materials: DefaultMaterial { - id: material - emissiveColor: highlightOnHover - && (centerMouseArea.hovering || centerMouseArea.dragging) - ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) - : Qt.rgba(0.5, 0.5, 0.5, 1) - lighting: DefaultMaterial.NoLighting - } + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + rotation: view3D.camera.rotation + priority: 1 + targetNode: moveGizmo.targetNode - MouseArea3D { - id: centerMouseArea - view3D: moveGizmo.view3D - x: -60 - y: -60 - width: 120 - height: 120 - rotation: view3D.camera.rotation - grabsMouse: moveGizmo.targetNode - priority: 1 + view3D: moveGizmo.view3D + active: moveGizmo.visible - property var _pointerPosPressed - property var _targetStartPos - - function posInParent(pointerPosition) - { - var scenePointerPos = mapPositionToScene(pointerPosition); - var sceneRelativeDistance = Qt.vector3d( - scenePointerPos.x - _pointerPosPressed.x, - scenePointerPos.y - _pointerPosPressed.y, - scenePointerPos.z - _pointerPosPressed.z); - - var newScenePos = Qt.vector3d( - _targetStartPos.x + sceneRelativeDistance.x, - _targetStartPos.y + sceneRelativeDistance.y, - _targetStartPos.z + sceneRelativeDistance.z); - - return moveGizmo.targetNode.parent.mapPositionFromScene(newScenePos); - } - - onPressed: { - if (!moveGizmo.targetNode) - return; - - _pointerPosPressed = mapPositionToScene(pointerPosition); - var sp = moveGizmo.targetNode.scenePosition; - _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); - } - onDragged: { - if (!moveGizmo.targetNode) - return; - - moveGizmo.targetNode.position = posInParent(pointerPosition); - moveGizmo.positionMove(); - } - onReleased: { - if (!moveGizmo.targetNode) - return; - - moveGizmo.targetNode.position = posInParent(pointerPosition); - moveGizmo.positionCommit(); - } - } + onPositionCommit: moveGizmo.positionCommit() + onPositionMove: moveGizmo.positionMove() } } diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml new file mode 100644 index 00000000000..7bb1085e65c --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarDraggable.qml @@ -0,0 +1,111 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +Model { + id: rootModel + + property View3D view3D + property alias color: gizmoMaterial.emissiveColor + property alias priority: mouseArea.priority + property Node targetNode: null + property bool dragging: false + property bool active: false + + readonly property bool hovering: mouseArea.hovering + + property var _pointerPosPressed + property var _targetStartPos + + signal pressed(var mouseArea) + signal dragged(var mouseArea, vector3d sceneRelativeDistance) + signal released(var mouseArea, vector3d sceneRelativeDistance) + + rotationOrder: Node.XYZr + source: "#Rectangle" + + DefaultMaterial { + id: gizmoMaterial + emissiveColor: "white" + lighting: DefaultMaterial.NoLighting + cullingMode: Material.DisableCulling + } + materials: gizmoMaterial + + function handlePressed(mouseArea, scenePos) + { + if (!targetNode) + return; + + _pointerPosPressed = mouseArea.mapPositionToScene(scenePos); + var sp = targetNode.scenePosition; + _targetStartPos = Qt.vector3d(sp.x, sp.y, sp.z); + dragging = true; + pressed(mouseArea); + } + + function calcRelativeDistance(mouseArea, scenePos) + { + var scenePointerPos = mouseArea.mapPositionToScene(scenePos); + return Qt.vector3d(scenePointerPos.x - _pointerPosPressed.x, + scenePointerPos.y - _pointerPosPressed.y, + scenePointerPos.z - _pointerPosPressed.z); + } + + function handleDragged(mouseArea, scenePos) + { + if (!targetNode) + return; + + dragged(mouseArea, calcRelativeDistance(mouseArea, scenePos)); + } + + function handleReleased(mouseArea, scenePos) + { + if (!targetNode) + return; + + released(mouseArea, calcRelativeDistance(mouseArea, scenePos)); + dragging = false; + } + + MouseArea3D { + id: mouseArea + view3D: rootModel.view3D + x: -60 + y: -60 + width: 120 + height: 120 + grabsMouse: targetNode + active: rootModel.active + onPressed: rootModel.handlePressed(mouseArea, scenePos) + onDragged: rootModel.handleDragged(mouseArea, scenePos) + onReleased: rootModel.handleReleased(mouseArea, scenePos) + } +} + diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml new file mode 100644 index 00000000000..f79ae6e248e --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarMoveHandle.qml @@ -0,0 +1,55 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +PlanarDraggable { + id: planarHandle + scale: Qt.vector3d(0.024, 0.024, 0.024) + + signal positionCommit() + signal positionMove() + + function localPos(sceneRelativeDistance) + { + var newScenePos = Qt.vector3d( + _targetStartPos.x + sceneRelativeDistance.x, + _targetStartPos.y + sceneRelativeDistance.y, + _targetStartPos.z + sceneRelativeDistance.z); + return targetNode.parent.mapPositionFromScene(newScenePos); + } + + onDragged: { + targetNode.position = localPos(sceneRelativeDistance); + positionMove(); + } + + onReleased: { + targetNode.position = localPos(sceneRelativeDistance); + positionCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarScaleHandle.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarScaleHandle.qml new file mode 100644 index 00000000000..dfdfb7c1969 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/PlanarScaleHandle.qml @@ -0,0 +1,61 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +PlanarDraggable { + id: planarHandle + scale: Qt.vector3d(0.024, 0.024, 0.024) + + property bool globalOrientation: false + + signal scaleCommit() + signal scaleChange() + + property var _startScale + + onPressed: { + // Recreate vector so we don't follow the changes in targetNode.sceneScale + _startScale = Qt.vector3d(targetNode.sceneScale.x, + targetNode.sceneScale.y, + targetNode.sceneScale.z); + } + + onDragged: { + targetNode.scale = mouseArea.getNewScale(targetNode, _startScale, + _pointerPosPressed, sceneRelativeDistance, + globalOrientation); + scaleChange(); + } + + onReleased: { + targetNode.scale = mouseArea.getNewScale(targetNode, _startScale, + _pointerPosPressed, sceneRelativeDistance, + globalOrientation); + scaleCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml new file mode 100644 index 00000000000..8a55812e71a --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleGizmo.qml @@ -0,0 +1,214 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +Node { + id: scaleGizmo + + property View3D view3D + property bool highlightOnHover: false + property Node targetNode: null + property bool globalOrientation: true + readonly property bool dragging: scaleRodX.dragging || scaleRodY.dragging || scaleRodZ.dragging + || planeX.dragging || planeY.dragging || planeZ.dragging + || centerMouseArea.dragging + + signal scaleCommit() + signal scaleChange() + + Node { + rotation: globalOrientation || !targetNode ? Qt.vector3d(0, 0, 0) : targetNode.sceneRotation + + ScaleRod { + id: scaleRodX + rotation: Qt.vector3d(0, 0, -90) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + globalOrientation: scaleGizmo.globalOrientation + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + ScaleRod { + id: scaleRodY + rotation: Qt.vector3d(0, 0, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + globalOrientation: scaleGizmo.globalOrientation + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + ScaleRod { + id: scaleRodZ + rotation: Qt.vector3d(90, 0, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + globalOrientation: scaleGizmo.globalOrientation + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + PlanarScaleHandle { + id: planeX + + y: 10 + z: 10 + + rotation: Qt.vector3d(0, 90, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) + : Qt.rgba(1, 0, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + globalOrientation: scaleGizmo.globalOrientation + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + PlanarScaleHandle { + id: planeY + + x: 10 + z: 10 + + rotation: Qt.vector3d(90, 0, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) + : Qt.rgba(0, 0.6, 0, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + globalOrientation: scaleGizmo.globalOrientation + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + + PlanarScaleHandle { + id: planeZ + + x: 10 + y: 10 + + rotation: Qt.vector3d(0, 0, 0) + targetNode: scaleGizmo.targetNode + color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) + : Qt.rgba(0, 0, 1, 1) + view3D: scaleGizmo.view3D + active: scaleGizmo.visible + globalOrientation: scaleGizmo.globalOrientation + + onScaleCommit: scaleGizmo.scaleCommit() + onScaleChange: scaleGizmo.scaleChange() + } + } + + Model { + id: centerCube + + source: "#Cube" + scale: Qt.vector3d(0.024, 0.024, 0.024) + materials: DefaultMaterial { + id: material + emissiveColor: highlightOnHover + && (centerMouseArea.hovering || centerMouseArea.dragging) + ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1)) + : Qt.rgba(0.5, 0.5, 0.5, 1) + lighting: DefaultMaterial.NoLighting + } + + MouseArea3D { + id: centerMouseArea + view3D: scaleGizmo.view3D + x: -60 + y: -60 + width: 120 + height: 120 + rotation: view3D.camera.rotation + grabsMouse: scaleGizmo.targetNode + priority: 1 + active: scaleGizmo.visible + + property var _startScale + property var _startScreenPos + + function localScale(screenPos) + { + var yDelta = screenPos.y - _startScreenPos.y; + if (yDelta === 0) + return; + var scaler = 1.0 + (yDelta * 0.025); + if (scaler === 0) + scaler = 0.0001; + if (scaler < 0) + scaler = -scaler; + return Qt.vector3d(scaler * _startScale.x, + scaler * _startScale.y, + scaler * _startScale.z); + } + + onPressed: { + if (!scaleGizmo.targetNode) + return; + + // Recreate vector so we don't follow the changes in targetNode.scale + _startScale = Qt.vector3d(scaleGizmo.targetNode.scale.x, + scaleGizmo.targetNode.scale.y, + scaleGizmo.targetNode.scale.z); + _startScreenPos = screenPos; + } + onDragged: { + if (!scaleGizmo.targetNode) + return; + + scaleGizmo.targetNode.scale = localScale(screenPos); + scaleGizmo.scaleChange(); + } + onReleased: { + if (!scaleGizmo.targetNode) + return; + + scaleGizmo.targetNode.scale = localScale(screenPos); + scaleGizmo.scaleCommit(); + } + } + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml new file mode 100644 index 00000000000..85fc39f900e --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/mockfiles/ScaleRod.qml @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +import QtQuick 2.0 +import QtQuick3D 1.0 +import MouseArea3D 1.0 + +DirectionalDraggable { + id: scaleRod + source: "meshes/scalerod.mesh" + + property bool globalOrientation: false + + signal scaleCommit() + signal scaleChange() + + property var _startScale + + Model { + source: "#Cube" + y: 10 + scale: Qt.vector3d(0.020, 0.020, 0.020) + materials: DefaultMaterial { + id: material + emissiveColor: scaleRod.color + lighting: DefaultMaterial.NoLighting + } + } + + onPressed: { + // Recreate vector so we don't follow the changes in targetNode.sceneScale + _startScale = Qt.vector3d(targetNode.sceneScale.x, + targetNode.sceneScale.y, + targetNode.sceneScale.z); + } + + onDragged: { + targetNode.scale = mouseArea.getNewScale(targetNode, _startScale, + _pointerPosPressed, sceneRelativeDistance, + globalOrientation); + scaleChange(); + } + + onReleased: { + targetNode.scale = mouseArea.getNewScale(targetNode, _startScale, + _pointerPosPressed, sceneRelativeDistance, + globalOrientation); + scaleCommit(); + } +} diff --git a/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/scalerod.mesh b/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/scalerod.mesh new file mode 100644 index 00000000000..b3c1bd883f9 Binary files /dev/null and b/share/qtcreator/qml/qmlpuppet/mockfiles/meshes/scalerod.mesh differ diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.cpp index d681e106988..1091e45911b 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "cameracontrolhelper.h" +#include + namespace QmlDesigner { namespace Internal { @@ -65,5 +67,12 @@ void CameraControlHelper::requestOverlayUpdate() m_overlayUpdateTimer.start(); } +QString CameraControlHelper::generateUniqueName(const QString &nameRoot) +{ + static QHash counters; + int count = counters[nameRoot]++; + return QStringLiteral("%1_%2").arg(nameRoot).arg(count); +} + } } diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.h index be00596ce8d..ae171960441 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/cameracontrolhelper.h @@ -42,6 +42,7 @@ public: void setEnabled(bool enabled); Q_INVOKABLE void requestOverlayUpdate(); + Q_INVOKABLE QString generateUniqueName(const QString &nameRoot); public slots: void handleUpdateTimer(); diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp new file mode 100644 index 00000000000..605a3dd08f6 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.cpp @@ -0,0 +1,211 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#ifdef QUICK3D_MODULE + +#include "camerageometry.h" + +#include +#include +#include +#include +#include +#include + +#include + +namespace QmlDesigner { +namespace Internal { + +CameraGeometry::CameraGeometry() + : QQuick3DGeometry() +{ +} + +CameraGeometry::~CameraGeometry() +{ +} + +QQuick3DCamera *CameraGeometry::camera() const +{ + return m_camera; +} + +QRectF CameraGeometry::viewPortRect() const +{ + return m_viewPortRect; +} + +void CameraGeometry::setCamera(QQuick3DCamera *camera) +{ + if (m_camera == camera) + return; + + if (m_camera) + m_camera->disconnect(this); + m_camera = camera; + if (auto perspectiveCamera = qobject_cast(m_camera)) { + QObject::connect(perspectiveCamera, &QQuick3DPerspectiveCamera::clipNearChanged, + this, &CameraGeometry::update); + QObject::connect(perspectiveCamera, &QQuick3DPerspectiveCamera::clipFarChanged, + this, &CameraGeometry::update); + QObject::connect(perspectiveCamera, &QQuick3DPerspectiveCamera::fieldOfViewChanged, + this, &CameraGeometry::update); + QObject::connect(perspectiveCamera, &QQuick3DPerspectiveCamera::fieldOfViewOrientationChanged, + this, &CameraGeometry::update); + if (auto frustumCamera = qobject_cast(m_camera)) { + QObject::connect(frustumCamera, &QQuick3DFrustumCamera::topChanged, + this, &CameraGeometry::update); + QObject::connect(frustumCamera, &QQuick3DFrustumCamera::bottomChanged, + this, &CameraGeometry::update); + QObject::connect(frustumCamera, &QQuick3DFrustumCamera::rightChanged, + this, &CameraGeometry::update); + QObject::connect(frustumCamera, &QQuick3DFrustumCamera::leftChanged, + this, &CameraGeometry::update); + } + } else if (auto orthoCamera = qobject_cast(m_camera)) { + QObject::connect(orthoCamera, &QQuick3DOrthographicCamera::clipNearChanged, + this, &CameraGeometry::update); + QObject::connect(orthoCamera, &QQuick3DOrthographicCamera::clipFarChanged, + this, &CameraGeometry::update); + } else if (auto customCamera = qobject_cast(m_camera)) { + QObject::connect(customCamera, &QQuick3DCustomCamera::projectionChanged, + this, &CameraGeometry::update); + } + emit cameraChanged(); + update(); +} + +void CameraGeometry::setViewPortRect(const QRectF &rect) +{ + if (m_viewPortRect == rect) + return; + + m_viewPortRect = rect; + emit viewPortRectChanged(); + update(); +} + +QSSGRenderGraphObject *CameraGeometry::updateSpatialNode(QSSGRenderGraphObject *node) +{ + if (!m_camera) + return node; + + node = QQuick3DGeometry::updateSpatialNode(node); + QSSGRenderGeometry *geometry = static_cast(node); + + geometry->clear(); + + QByteArray vertexData; + QByteArray indexData; + QVector3D minBounds; + QVector3D maxBounds; + fillVertexData(vertexData, indexData, minBounds, maxBounds); + + geometry->addAttribute(QSSGRenderGeometry::Attribute::PositionSemantic, 0, + QSSGRenderGeometry::Attribute::ComponentType::F32Type); + geometry->addAttribute(QSSGRenderGeometry::Attribute::IndexSemantic, 0, + QSSGRenderGeometry::Attribute::ComponentType::U16Type); + geometry->setStride(12); + geometry->setVertexData(vertexData); + geometry->setIndexData(indexData); + geometry->setPrimitiveType(QSSGRenderGeometry::Lines); + geometry->setBounds(minBounds, maxBounds); + + return node; +} + +void CameraGeometry::fillVertexData(QByteArray &vertexData, QByteArray &indexData, + QVector3D &minBounds, QVector3D &maxBounds) +{ + const int vertexSize = int(sizeof(float)) * 8 * 3; // 8 vertices, 3 floats/vert + vertexData.resize(vertexSize); + const int indexSize = int(sizeof(quint16)) * 12 * 2; // 16 lines, 2 vert/line + indexData.resize(indexSize); + + auto dataPtr = reinterpret_cast(vertexData.data()); + auto indexPtr = reinterpret_cast(indexData.data()); + + QSSGRenderCamera *camera = m_camera->cameraNode(); + if (qobject_cast(m_camera)) { + // For some reason ortho cameras show double what projection suggests, + // so give them doubled viewport to match visualization to actual camera view + camera->calculateProjection(QRectF(0, 0, m_viewPortRect.width() * 2.0, + m_viewPortRect.height() * 2.0)); + } else { + camera->calculateProjection(m_viewPortRect); + } + const QMatrix4x4 m = camera->projection.inverted(); + + const QVector3D farTopLeft = m * QVector3D(1.f, -1.f, 1.f); + const QVector3D farBottomRight = m * QVector3D(-1.f, 1.f, 1.f); + const QVector3D nearTopLeft = m * QVector3D(1.f, -1.f, -1.f); + const QVector3D nearBottomRight = m * QVector3D(-1.f, 1.f, -1.f); + + *dataPtr++ = nearTopLeft.x(); *dataPtr++ = nearBottomRight.y(); *dataPtr++ = nearTopLeft.z(); + *dataPtr++ = nearTopLeft.x(); *dataPtr++ = nearTopLeft.y(); *dataPtr++ = nearTopLeft.z(); + *dataPtr++ = nearBottomRight.x(); *dataPtr++ = nearTopLeft.y(); *dataPtr++ = nearTopLeft.z(); + *dataPtr++ = nearBottomRight.x(); *dataPtr++ = nearBottomRight.y(); *dataPtr++ = nearTopLeft.z(); + *dataPtr++ = farTopLeft.x(); *dataPtr++ = farBottomRight.y(); *dataPtr++ = farTopLeft.z(); + *dataPtr++ = farTopLeft.x(); *dataPtr++ = farTopLeft.y(); *dataPtr++ = farTopLeft.z(); + *dataPtr++ = farBottomRight.x(); *dataPtr++ = farTopLeft.y(); *dataPtr++ = farTopLeft.z(); + *dataPtr++ = farBottomRight.x(); *dataPtr++ = farBottomRight.y(); *dataPtr++ = farTopLeft.z(); + + // near rect + *indexPtr++ = 0; *indexPtr++ = 1; + *indexPtr++ = 1; *indexPtr++ = 2; + *indexPtr++ = 2; *indexPtr++ = 3; + *indexPtr++ = 3; *indexPtr++ = 0; + // near to far + *indexPtr++ = 0; *indexPtr++ = 4; + *indexPtr++ = 1; *indexPtr++ = 5; + *indexPtr++ = 2; *indexPtr++ = 6; + *indexPtr++ = 3; *indexPtr++ = 7; + // far rect + *indexPtr++ = 4; *indexPtr++ = 5; + *indexPtr++ = 5; *indexPtr++ = 6; + *indexPtr++ = 6; *indexPtr++ = 7; + *indexPtr++ = 7; *indexPtr++ = 4; + + static const float floatMin = std::numeric_limits::lowest(); + static const float floatMax = std::numeric_limits::max(); + auto vertexPtr = reinterpret_cast(vertexData.data()); + minBounds = QVector3D(floatMax, floatMax, floatMax); + maxBounds = QVector3D(floatMin, floatMin, floatMin); + for (int i = 0; i < vertexSize / 12; ++i) { + minBounds[0] = qMin((*vertexPtr)[0], minBounds[0]); + minBounds[1] = qMin((*vertexPtr)[1], minBounds[1]); + minBounds[2] = qMin((*vertexPtr)[2], minBounds[2]); + maxBounds[0] = qMax((*vertexPtr)[0], maxBounds[0]); + maxBounds[1] = qMax((*vertexPtr)[1], maxBounds[1]); + maxBounds[2] = qMax((*vertexPtr)[2], maxBounds[2]); + ++vertexPtr; + } +} + +} +} + +#endif // QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h new file mode 100644 index 00000000000..9c0f5e1e3c4 --- /dev/null +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/camerageometry.h @@ -0,0 +1,72 @@ +/**************************************************************************** +** +** Copyright (C) 2019 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +#ifdef QUICK3D_MODULE + +#include +#include + +namespace QmlDesigner { +namespace Internal { + +class CameraGeometry : public QQuick3DGeometry +{ + Q_OBJECT + Q_PROPERTY(QQuick3DCamera *camera READ camera WRITE setCamera NOTIFY cameraChanged) + Q_PROPERTY(QRectF viewPortRect READ viewPortRect WRITE setViewPortRect NOTIFY viewPortRectChanged) + +public: + CameraGeometry(); + ~CameraGeometry() override; + + QQuick3DCamera *camera() const; + QRectF viewPortRect() const; + +public Q_SLOTS: + void setCamera(QQuick3DCamera *camera); + void setViewPortRect(const QRectF &rect); + +Q_SIGNALS: + void cameraChanged(); + void viewPortRectChanged(); + +protected: + QSSGRenderGraphObject *updateSpatialNode(QSSGRenderGraphObject *node) override; + +private: + void fillVertexData(QByteArray &vertexData, QByteArray &indexData, + QVector3D &minBounds, QVector3D &maxBounds); + QQuick3DCamera *m_camera = nullptr; + QRectF m_viewPortRect; +}; + +} +} + +QML_DECLARE_TYPE(QmlDesigner::Internal::CameraGeometry) + +#endif // QUICK3D_MODULE diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri index a052b7285c9..4e39a4cba9a 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/editor3d.pri @@ -1,5 +1,7 @@ HEADERS += $$PWD/cameracontrolhelper.h \ - $$PWD/mousearea3d.h + $$PWD/mousearea3d.h \ + $$PWD/camerageometry.h SOURCES += $$PWD/cameracontrolhelper.cpp \ - $$PWD/mousearea3d.cpp + $$PWD/mousearea3d.cpp \ + $$PWD/camerageometry.cpp diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp index 4c1fdcc78e6..d4135de9732 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.cpp @@ -60,6 +60,11 @@ bool MouseArea3D::grabsMouse() const return m_grabsMouse; } +bool MouseArea3D::active() const +{ + return m_active; +} + qreal MouseArea3D::x() const { return m_x; @@ -103,6 +108,15 @@ void MouseArea3D::setGrabsMouse(bool grabsMouse) emit grabsMouseChanged(grabsMouse); } +void MouseArea3D::setActive(bool active) +{ + if (m_active == active) + return; + + m_active = active; + emit activeChanged(active); +} + void MouseArea3D::setX(qreal x) { if (qFuzzyCompare(m_x, x)) @@ -190,6 +204,80 @@ QVector3D MouseArea3D::rayIntersectsPlane(const QVector3D &rayPos0, return rayPos0 + distanceFromRayPos0ToPlane * rayDirection; } +// Get a new scale based on a relative scene distance along a drag axis. +// This function never returns a negative scaling. +// Note that scaling a rotated object in global coordinate space can't be meaningfully done without +// distorting the object beyond what current scale property can represent, so global scaling is +// effectively same as local scaling. +QVector3D MouseArea3D::getNewScale(QQuick3DNode *node, const QVector3D &startScale, + const QVector3D &pressPos, + const QVector3D &sceneRelativeDistance, bool global) +{ + if (node) { + // Note: This only returns correct scale when scale is positive + auto getScale = [&](const QMatrix4x4 &m) -> QVector3D { + return QVector3D(m.column(0).length(), m.column(1).length(), m.column(2).length()); + }; + const float nonZeroValue = 0.0001f; + + const QVector3D scenePos = node->scenePosition(); + const QMatrix4x4 parentTransform = node->parentNode()->sceneTransform(); + QMatrix4x4 newTransform = node->sceneTransform(); + const QVector3D nodeToPressPos = pressPos - scenePos; + const QVector3D nodeToRelPos = nodeToPressPos + sceneRelativeDistance; + const float sceneToPressLen = nodeToPressPos.length(); + QVector3D scaleDirVector = nodeToRelPos; + float magnitude = (scaleDirVector.length() / sceneToPressLen); + scaleDirVector.normalize(); + + // Reset everything but rotation to ensure translation and scale don't affect rotation below + newTransform(0, 3) = 0; + newTransform(1, 3) = 0; + newTransform(2, 3) = 0; + QVector3D curScale = getScale(newTransform); + if (qFuzzyIsNull(curScale.x())) + curScale.setX(nonZeroValue); + if (qFuzzyIsNull(curScale.y())) + curScale.setY(nonZeroValue); + if (qFuzzyIsNull(curScale.z())) + curScale.setZ(nonZeroValue); + newTransform.scale({1.f / curScale.x(), 1.f / curScale.y(), 1.f / curScale.z()}); + + // Rotate the local scale vector so that scale axes are parallel to global axes for easier + // scale vector manipulation + if (!global) + scaleDirVector = newTransform.inverted().map(scaleDirVector).normalized(); + + // Ensure scaling is always positive/negative according to direction + scaleDirVector.setX(qAbs(scaleDirVector.x())); + scaleDirVector.setY(qAbs(scaleDirVector.y())); + scaleDirVector.setZ(qAbs(scaleDirVector.z())); + + // Make sure the longest scale vec axis is equal to 1 before applying magnitude to avoid + // initial jump in size when planar drag starts + float maxDir = qMax(qMax(scaleDirVector.x(), scaleDirVector.y()), scaleDirVector.z()); + QVector3D scaleVec = scaleDirVector / maxDir; + scaleVec *= magnitude; + + // Zero axes on scale vector indicate directions we don't want scaling to affect + if (qFuzzyIsNull(scaleVec.x())) + scaleVec.setX(1.f); + if (qFuzzyIsNull(scaleVec.y())) + scaleVec.setY(1.f); + if (qFuzzyIsNull(scaleVec.z())) + scaleVec.setZ(1.f); + scaleVec *= startScale; + + newTransform = parentTransform; + newTransform.scale(scaleVec); + + const QMatrix4x4 localTransform = parentTransform.inverted() * newTransform; + return getScale(localTransform); + } + + return startScale; +} + QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const { const QVector3D mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0); @@ -207,8 +295,8 @@ QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const bool MouseArea3D::eventFilter(QObject *, QEvent *event) { - if (m_grabsMouse && s_mouseGrab && s_mouseGrab != this - && (m_priority <= s_mouseGrab->m_priority || s_mouseGrab->m_dragging)) { + if (!m_active || (m_grabsMouse && s_mouseGrab && s_mouseGrab != this + && (m_priority <= s_mouseGrab->m_priority || s_mouseGrab->m_dragging))) { return false; } @@ -227,7 +315,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos()); if (mouseOnTopOfMouseArea(m_mousePosInPlane)) { setDragging(true); - emit pressed(m_mousePosInPlane); + emit pressed(m_mousePosInPlane, mouseEvent->globalPos()); if (m_grabsMouse) { if (s_mouseGrab && s_mouseGrab != this) { s_mouseGrab->setDragging(false); @@ -250,7 +338,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) if (qFuzzyCompare(mousePosInPlane.z(), -1)) mousePosInPlane = m_mousePosInPlane; setDragging(false); - emit released(mousePosInPlane); + emit released(mousePosInPlane, mouseEvent->globalPos()); if (m_grabsMouse) { if (s_mouseGrab && s_mouseGrab != this) { s_mouseGrab->setDragging(false); @@ -290,7 +378,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event) if (m_dragging && !qFuzzyCompare(mousePosInPlane.z(), -1)) { m_mousePosInPlane = mousePosInPlane; - emit dragged(mousePosInPlane); + emit dragged(mousePosInPlane, mouseEvent->globalPos()); } break; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h index 99a34be353d..af465576829 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/editor3d/mousearea3d.h @@ -49,6 +49,7 @@ class MouseArea3D : public QQuick3DNode Q_PROPERTY(bool hovering READ hovering NOTIFY hoveringChanged) Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged) Q_PROPERTY(int priority READ priority WRITE setPriority NOTIFY priorityChanged) + Q_PROPERTY(int active READ active WRITE setActive NOTIFY activeChanged) Q_INTERFACES(QQmlParserStatus) @@ -66,10 +67,12 @@ public: bool hovering() const; bool dragging() const; bool grabsMouse() const; + bool active() const; public slots: void setView3D(QQuick3DViewport *view3D); void setGrabsMouse(bool grabsMouse); + void setActive(bool active); void setX(qreal x); void setY(qreal y); @@ -82,6 +85,10 @@ public slots: const QVector3D &planePos, const QVector3D &planeNormal) const; + Q_INVOKABLE QVector3D getNewScale(QQuick3DNode *node, const QVector3D &startScale, + const QVector3D &pressPos, + const QVector3D &sceneRelativeDistance, bool global); + signals: void view3DChanged(); @@ -93,9 +100,10 @@ signals: void hoveringChanged(); void draggingChanged(); - void pressed(const QVector3D &pointerPosition); - void released(const QVector3D &pointerPosition); - void dragged(const QVector3D &pointerPosition); + void activeChanged(bool active); + void pressed(const QVector3D &scenePos, const QPoint &screenPos); + void released(const QVector3D &scenePos, const QPoint &screenPos); + void dragged(const QVector3D &scenePos, const QPoint &screenPos); void grabsMouseChanged(bool grabsMouse); protected: @@ -118,6 +126,7 @@ private: bool m_hovering = false; bool m_dragging = false; + bool m_active = false; QVector3D getMousePosInPlane(const QPointF &mousePosInView) const; diff --git a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp index d97cc2d5038..a0783eff577 100644 --- a/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp +++ b/share/qtcreator/qml/qmlpuppet/qml2puppet/instances/qt5informationnodeinstanceserver.cpp @@ -61,6 +61,7 @@ #include "dummycontextobject.h" #include "../editor3d/cameracontrolhelper.h" #include "../editor3d/mousearea3d.h" +#include "../editor3d/camerageometry.h" #include @@ -85,6 +86,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) #ifdef QUICK3D_MODULE qmlRegisterType("MouseArea3D", 1, 0, "MouseArea3D"); + qmlRegisterType("CameraGeometry", 1, 0, "CameraGeometry"); #endif QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml")); @@ -97,12 +99,12 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine) } QObject::connect(window, SIGNAL(objectClicked(QVariant)), this, SLOT(objectClicked(QVariant))); - QObject::connect(window, SIGNAL(commitObjectPosition(QVariant)), - this, SLOT(handleObjectPositionCommit(QVariant))); - QObject::connect(window, SIGNAL(moveObjectPosition(QVariant)), - this, SLOT(handleObjectPositionMove(QVariant))); - QObject::connect(&m_moveTimer, &QTimer::timeout, - this, &Qt5InformationNodeInstanceServer::handleObjectPositionMoveTimeout); + QObject::connect(window, SIGNAL(commitObjectProperty(QVariant, QVariant)), + this, SLOT(handleObjectPropertyCommit(QVariant, QVariant))); + QObject::connect(window, SIGNAL(changeObjectProperty(QVariant, QVariant)), + this, SLOT(handleObjectPropertyChange(QVariant, QVariant))); + QObject::connect(&m_propertyChangeTimer, &QTimer::timeout, + this, &Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout); //For macOS we have to use the 4.1 core profile QSurfaceFormat surfaceFormat = window->requestedFormat(); @@ -188,28 +190,44 @@ void Qt5InformationNodeInstanceServer::modifyVariantValue( } } -void Qt5InformationNodeInstanceServer::handleObjectPositionCommit(const QVariant &object) +void Qt5InformationNodeInstanceServer::handleObjectPropertyCommit(const QVariant &object, + const QVariant &propName) { - modifyVariantValue(object, "position", ValuesModifiedCommand::TransactionOption::End); - m_movedNode = {}; - m_moveTimer.stop(); + modifyVariantValue(object, propName.toByteArray(), + ValuesModifiedCommand::TransactionOption::End); + m_changedNode = {}; + m_changedProperty = {}; + m_propertyChangeTimer.stop(); } -void Qt5InformationNodeInstanceServer::handleObjectPositionMove(const QVariant &object) +void Qt5InformationNodeInstanceServer::handleObjectPropertyChange(const QVariant &object, + const QVariant &propName) { - if (m_movedNode.isNull()) { - modifyVariantValue(object, "position", ValuesModifiedCommand::TransactionOption::Start); - } else { - if (!m_moveTimer.isActive()) - m_moveTimer.start(); + PropertyName propertyName(propName.toByteArray()); + if (m_changedProperty != propertyName || m_changedNode != object) { + if (!m_changedNode.isNull()) + handleObjectPropertyCommit(m_changedNode, m_changedProperty); + modifyVariantValue(object, propertyName, + ValuesModifiedCommand::TransactionOption::Start); + } else if (!m_propertyChangeTimer.isActive()) { + m_propertyChangeTimer.start(); } - m_movedNode = object; + m_changedNode = object; + m_changedProperty = propertyName; +} + +void Qt5InformationNodeInstanceServer::updateViewPortRect() +{ + QRectF viewPortrect(0, 0, m_viewPortInstance.internalObject()->property("width").toDouble(), + m_viewPortInstance.internalObject()->property("height").toDouble()); + QQmlProperty viewPortProperty(m_editView3D, "viewPortRect", context()); + viewPortProperty.write(viewPortrect); } Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) : Qt5NodeInstanceServer(nodeInstanceClient) { - m_moveTimer.setInterval(100); + m_propertyChangeTimer.setInterval(100); } void Qt5InformationNodeInstanceServer::sendTokenBack() @@ -282,9 +300,10 @@ void Qt5InformationNodeInstanceServer::modifyProperties( nodeInstanceClient()->valuesModified(createValuesModifiedCommand(properties)); } -void Qt5InformationNodeInstanceServer::handleObjectPositionMoveTimeout() +void Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout() { - modifyVariantValue(m_movedNode, "position", ValuesModifiedCommand::TransactionOption::None); + modifyVariantValue(m_changedNode, m_changedProperty, + ValuesModifiedCommand::TransactionOption::None); } QObject *Qt5InformationNodeInstanceServer::findRootNodeOf3DViewport( @@ -307,7 +326,6 @@ void Qt5InformationNodeInstanceServer::findCamerasAndLights( const QList &instanceList, QObjectList &cameras, QObjectList &lights) const { - QObjectList objList; for (const ServerNodeInstance &instance : instanceList) { if (instance.isSubclassOf("QQuick3DCamera")) cameras << instance.internalObject(); @@ -316,6 +334,16 @@ void Qt5InformationNodeInstanceServer::findCamerasAndLights( } } +ServerNodeInstance Qt5InformationNodeInstanceServer::findViewPort( + const QList &instanceList) +{ + for (const ServerNodeInstance &instance : instanceList) { + if (instance.isSubclassOf("QQuick3DViewport")) + return instance; + } + return ServerNodeInstance(); +} + void Qt5InformationNodeInstanceServer::setup3DEditView(const QList &instanceList) { ServerNodeInstance root = rootNodeInstance(); @@ -341,8 +369,17 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList &properties); private: - void handleObjectPositionMoveTimeout(); + void handleObjectPropertyChangeTimeout(); QObject *createEditView3D(QQmlEngine *engine); void setup3DEditView(const QList &instanceList); QObject *findRootNodeOf3DViewport(const QList &instanceList) const; void findCamerasAndLights( const QList &instanceList, QObjectList &cameras, QObjectList &lights) const; + ServerNodeInstance findViewPort(const QList &instanceList); QVector vectorToPropertyValue(const ServerNodeInstance &instance, const PropertyName &propertyName, const QVariant &variant); @@ -81,8 +83,10 @@ private: QSet m_parentChangedSet; QList m_completedComponentList; QList m_tokenList; - QTimer m_moveTimer; - QVariant m_movedNode; + QTimer m_propertyChangeTimer; + QVariant m_changedNode; + PropertyName m_changedProperty; + ServerNodeInstance m_viewPortInstance; }; } // namespace QmlDesigner diff --git a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc index 4bbd30e8fcb..fd17d551d8a 100644 --- a/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc +++ b/share/qtcreator/qml/qmlpuppet/qmlpuppet.qrc @@ -15,7 +15,14 @@ mockfiles/LightGizmo.qml mockfiles/IconGizmo.qml mockfiles/Overlay2D.qml + mockfiles/DirectionalDraggable.qml + mockfiles/PlanarDraggable.qml + mockfiles/PlanarMoveHandle.qml + mockfiles/PlanarScaleHandle.qml + mockfiles/ScaleRod.qml + mockfiles/ScaleGizmo.qml mockfiles/meshes/arrow.mesh + mockfiles/meshes/scalerod.mesh mockfiles/images/camera-pick-icon.png mockfiles/images/camera-pick-icon@2x.png mockfiles/images/light-pick-icon.png diff --git a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml index 2b73c2fac4d..f8865e62cf9 100644 --- a/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml +++ b/share/qtcreator/qmldesigner/propertyEditorQmlSources/imports/StudioControls/ComboBox.qml @@ -44,6 +44,8 @@ T.ComboBox { property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth property real __actionIndicatorHeight: StudioTheme.Values.height + property alias textInput: comboBoxInput + signal compressedActivated(int index) width: StudioTheme.Values.squareComponentWidth * 5 diff --git a/share/qtcreator/scripts/openTerminal.py b/share/qtcreator/scripts/openTerminal.py index e931c6bb265..420e936d787 100755 --- a/share/qtcreator/scripts/openTerminal.py +++ b/share/qtcreator/scripts/openTerminal.py @@ -54,10 +54,10 @@ while read -r line; do done < <(env) ''' -def system_login_script(): +def system_login_script_bash(): return 'if [ -f /etc/profile ]; then source /etc/profile; fi\n' -def login_script(): +def login_script_bash(): return ''' if [ -f $HOME/.bash_profile ]; then source $HOME/.bash_profile @@ -68,6 +68,16 @@ elif [ -f $HOME/.profile ]; then fi ''' +def system_login_script_zsh(): + return '[ -r /etc/profile ] && source /etc/profile\n' + +def login_script_zsh(): + return ''' +[ -r $HOME/.zprofile ] && source $HOME/.zprofile +[ -r $HOME/.zshrc ] && source $HOME/.zshrc +[ -r $HOME/.zlogin ] && source $HOME/.zlogin +''' + def environment_script(): return ''.join(['export ' + quote_shell(key + '=' + os.environ[key]) + '\n' for key in os.environ]) @@ -98,6 +108,10 @@ end tell def main(): # create temporary file to be sourced into bash that deletes itself with NamedTemporaryFile(delete=False) as shell_script: + shell = os.environ.get('SHELL') + shell_is_zsh = shell is not None and shell.endswith('/zsh') + system_login_script = system_login_script_zsh if shell_is_zsh else system_login_script_bash + login_script = login_script_zsh if shell_is_zsh else login_script_bash quoted_shell_script = quote_shell(shell_script.name) commands = (clean_environment_script() + system_login_script() + # /etc/profile by default resets the path, so do first @@ -106,7 +120,7 @@ def main(): 'cd ' + quote_shell(os.getcwd()) + '\n' + ' '.join([quote_shell(arg) for arg in sys.argv[1:]]) + '\n' + 'rm ' + quoted_shell_script + '\n' + - 'exit\n' if len(sys.argv) > 1 else '' + ('exit\n' if len(sys.argv) > 1 else '') ) shell_script.write(commands) shell_script.flush() diff --git a/src/libs/3rdparty/cplusplus/AST.h b/src/libs/3rdparty/cplusplus/AST.h index dbc79f37e04..f3eb70aa4ac 100644 --- a/src/libs/3rdparty/cplusplus/AST.h +++ b/src/libs/3rdparty/cplusplus/AST.h @@ -2415,7 +2415,7 @@ class CPLUSPLUS_EXPORT AlignofExpressionAST: public ExpressionAST public: int alignof_token = 0; int lparen_token = 0; - TypeIdAST *typeId; + TypeIdAST *typeId = nullptr; int rparen_token = 0; public: diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl index 33cc7511aa8..f7b7570cf43 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.xml.tpl @@ -9,7 +9,7 @@ Copyright 2004 Alexander Neundorf (neundorf@kde.org) Copyright 2005 Dominik Haumann (dhdev@gmx.de) Copyright 2007,2008,2013,2014 Matthew Woehlke (mw_triad@users.sourceforge.net) - Copyright 2013-2015,2017-2018 Alex Turbov (i.zaufi@gmail.com) + Copyright 2013-2015,2017-2019 Alex Turbov (i.zaufi@gmail.com) ********************************************************************** * This library is free software; you can redistribute it and/or * @@ -31,7 +31,7 @@ + + {%- for var in environment_variables.kw %} + {{var}} + {%- endfor %} + + {%- for kind in properties.kinds %} {%- for prop in properties[kind].kw %} @@ -197,11 +203,27 @@ - + + + + + + + + + + + {%- for var in environment_variables.re %} + + {%- endfor %} + + + + @@ -300,10 +322,12 @@ + - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml index 1174c35215d..f3fa77756f0 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/cmake.yaml @@ -7,6 +7,7 @@ global-properties: - AUTORCC_SOURCE_GROUP - CMAKE_C_KNOWN_FEATURES - CMAKE_CXX_KNOWN_FEATURES + - CMAKE_ROLE # Since 3.14 - DEBUG_CONFIGURATIONS - DISABLED_FEATURES - ENABLED_FEATURES @@ -42,6 +43,7 @@ global-properties: - FeatureSummary__DESCRIPTION directory-properties: + - ADDITIONAL_CLEAN_FILES # Since 3.15 - ADDITIONAL_MAKE_CLEAN_FILES - BINARY_DIR - BUILDSYSTEM_TARGETS @@ -78,6 +80,7 @@ directory-properties: # NOTE Copy-n-pasting this list from official docs may contain a redudant item `Example`! Check it! target-properties: + - ADDITIONAL_CLEAN_FILES # Since 3.15 - ALIASED_TARGET - ANDROID_ANT_ADDITIONAL_OPTIONS - ANDROID_API @@ -101,17 +104,24 @@ target-properties: - ARCHIVE_OUTPUT_NAME_ - ARCHIVE_OUTPUT_NAME - AUTOGEN_BUILD_DIR + - AUTOGEN_ORIGIN_DEPENDS # Since 3.14 - AUTOGEN_TARGET_DEPENDS + - AUTOMOC_COMPILER_PREDEFINES # Since ??? - AUTOMOC_DEPEND_FILTERS - - AUTOMOC_MOC_OPTIONS + - AUTOMOC_EXECUTABLE # Since 3.14 + - AUTOMOC_MACRO_NAMES + - AUTOMOC_MOC_OPTIONS # Since ??? - AUTOMOC - AUTOUIC + - AUTOUIC_EXECUTABLE # Since 3.14 - AUTOUIC_OPTIONS - AUTOUIC_SEARCH_PATHS - AUTORCC + - AUTORCC_EXECUTABLE # Since 3.14 - AUTORCC_OPTIONS - BINARY_DIR - BUILD_RPATH + - BUILD_RPATH_USE_ORIGIN # Since 3.14 - BUILD_WITH_INSTALL_NAME_DIR - BUILD_WITH_INSTALL_RPATH - BUNDLE_EXTENSION @@ -246,6 +256,7 @@ target-properties: - MACOSX_RPATH - MANUALLY_ADDED_DEPENDENCIES - MAP_IMPORTED_CONFIG_ + - MSVC_RUNTIME_LIBRARY # Since 3.15 - NAME - NO_SONAME - NO_SYSTEM_FROM_IMPORTED @@ -278,6 +289,9 @@ target-properties: - STATIC_LIBRARY_FLAGS - STATIC_LIBRARY_OPTIONS # Since 3.13 - SUFFIX + - Swift_DEPENDENCIES_FILE # Since 3.15 + - Swift_MODULE_DIRECTORY # Since 3.15 + - Swift_MODULE_NAME # Since 3.15 - TYPE - VERSION - VISIBILITY_INLINES_HIDDEN @@ -298,8 +312,13 @@ target-properties: - VS_GLOBAL_ - VS_IOT_EXTENSIONS_VERSION - VS_IOT_STARTUP_TASK + - VS_JUST_MY_CODE_DEBUGGING # Since 3.15 - VS_KEYWORD - VS_MOBILE_EXTENSIONS_VERSION + - VS_NO_SOLUTION_DEPLOY # Since 3.15 + - VS_PACKAGE_REFERENCES # Since 3.15 + - VS_PROJECT_IMPORT # Since 3.15 + - VS_PACKAGE_REFERENCES - VS_SCC_AUXPATH - VS_SCC_LOCALPATH - VS_SCC_PROJECTNAME @@ -314,9 +333,12 @@ target-properties: - WINDOWS_EXPORT_ALL_SYMBOLS - XCODE_ATTRIBUTE_ - XCODE_EXPLICIT_FILE_TYPE + - XCODE_GENERATE_SCHEME # Since 3.15 - XCODE_PRODUCT_TYPE - XCODE_SCHEME_ADDRESS_SANITIZER # Since 3.13 - XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN # Since 3.13 + - XCODE_SCHEME_ARGUMENTS # Since 3.13 + - XCODE_SCHEME_DEBUG_AS_ROOT # Since 3.15 - XCODE_SCHEME_THREAD_SANITIZER # Since 3.13 - XCODE_SCHEME_THREAD_SANITIZER_STOP # Since 3.13 - XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER # Since 3.13 @@ -331,7 +353,6 @@ target-properties: - XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE # Since 3.13 - XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS # Since 3.13 - XCODE_SCHEME_EXECUTABLE # Since 3.13 - - XCODE_SCHEME_ARGUMENTS # Since 3.13 - XCODE_SCHEME_ENVIRONMENT # Since 3.13 - XCTEST @@ -383,6 +404,8 @@ source-properties: - SKIP_AUTOMOC - SKIP_AUTORCC - SKIP_AUTOUIC + - Swift_DEPENDENCIES_FILE # Since 3.15 + - Swift_DIAGNOSTICS_FILE # Since 3.15 - SYMBOLIC - VS_COPY_TO_OUT_DIR - VS_CSHARP_ @@ -423,69 +446,95 @@ install-properties: - CPACK_WIX_ACL generator-expressions: + # Boolean Generator Expressions + # * Logical Operators - 0 - 1 - - AND - - ANGLE-R - BOOL - - BUILD_INTERFACE - - COMMA - - COMPILE_FEATURES - - COMPILE_LANGUAGE - - CONFIG - - CXX_COMPILER_ID - - CXX_COMPILER_VERSION - - C_COMPILER_ID - - C_COMPILER_VERSION - - EQUAL - - GENEX_EVAL # Since 3.12 - - IF - - INSTALL_INTERFACE - - INSTALL_PREFIX - - IN_LIST # Since 3.12 - - JOIN - - LINK_ONLY - - LOWER_CASE - - MAKE_C_IDENTIFIER - - NOT + - AND - OR - - PLATFORM_ID - - SEMICOLON - - SHELL_PATH + - NOT + # * String Comparisons - STREQUAL - - TARGET_BUNDLE_CONTENT_DIR - - TARGET_BUNDLE_DIR - - TARGET_EXISTS # Since 3.12 - - TARGET_FILE - - TARGET_FILE_DIR - - TARGET_FILE_NAME - - TARGET_GENEX_EVAL # Since 3.12 - - TARGET_LINKER_FILE - - TARGET_LINKER_FILE_DIR - - TARGET_LINKER_FILE_NAME - - TARGET_NAME - - TARGET_NAME_IF_EXISTS # Since 3.12 - - TARGET_OBJECTS - - TARGET_PDB_FILE - - TARGET_PDB_FILE_DIR - - TARGET_PDB_FILE_NAME - - TARGET_POLICY - - TARGET_PROPERTY - - TARGET_SONAME_FILE - - TARGET_SONAME_FILE_DIR - - TARGET_SONAME_FILE_NAME - - UPPER_CASE - - VERSION_EQUAL - - VERSION_GREATER - - VERSION_GREATER_EQUAL + - EQUAL + - IN_LIST # Since 3.12 - VERSION_LESS + - VERSION_GREATER + - VERSION_EQUAL - VERSION_LESS_EQUAL + - VERSION_GREATER_EQUAL + # * Variable Queries + - TARGET_EXISTS # Since 3.12 + - CONFIG + - PLATFORM_ID + - C_COMPILER_ID + - CXX_COMPILER_ID + - CUDA_COMPILER_ID # Since 3.15 + - Fortran_COMPILER_ID + - C_COMPILER_VERSION + - CXX_COMPILER_VERSION + - CUDA_COMPILER_VERSION # Since 3.15 + - Fortran_COMPILER_VERSION + - TARGET_POLICY + - COMPILE_FEATURES + - COMPILE_LANG_AND_ID # Since 3.15 + - COMPILE_LANGUAGE + # String-Valued Generator Expressions + # * Escaped Characters + - ANGLE-R + - COMMA + - SEMICOLON + # * Conditional Expressions + - IF + # * String Transformations + - JOIN + - REMOVE_DUPLICATES # Since 3.15 + - FILTER # Since 3.15 + - LOWER_CASE + - UPPER_CASE + - GENEX_EVAL # Since 3.12 + - TARGET_GENEX_EVAL # Since 3.12 + # * Variable Queries (NOTE Already included above) + # * Target-Dependent Queries + - TARGET_NAME_IF_EXISTS # Since 3.12 + - TARGET_FILE + - TARGET_FILE_BASE_NAME # Since 3.15 + - TARGET_FILE_PREFIX # Since 3.15 + - TARGET_FILE_SUFFIX # Since 3.15 + - TARGET_FILE_NAME + - TARGET_FILE_DIR + - TARGET_LINKER_FILE + - TARGET_LINKER_FILE_BASE_NAME # Since 3.15 + - TARGET_LINKER_FILE_PREFIX # Since 3.15 + - TARGET_LINKER_FILE_SUFFIX # Since 3.15 + - TARGET_LINKER_FILE_NAME + - TARGET_LINKER_FILE_DIR + - TARGET_SONAME_FILE + - TARGET_SONAME_FILE + - TARGET_SONAME_FILE_NAME + - TARGET_SONAME_FILE_DIR + - TARGET_PDB_FILE + - TARGET_PDB_FILE_BASE_NAME # Since 3.15 + - TARGET_PDB_FILE_NAME + - TARGET_PDB_FILE_DIR + - TARGET_BUNDLE_DIR + - TARGET_BUNDLE_CONTENT_DIR + - TARGET_PROPERTY + - INSTALL_PREFIX + # Output-Related Expressions + - TARGET_NAME + - LINK_ONLY + - INSTALL_INTERFACE + - BUILD_INTERFACE + - MAKE_C_IDENTIFIER + - TARGET_OBJECTS + - SHELL_PATH variables: # Variables that Provide Information - CMAKE_AR - CMAKE_ARGC - - CMAKE_ARGV0 + - CMAKE_ARGV - CMAKE_BINARY_DIR - CMAKE_BUILD_TOOL - CMAKE_CACHEFILE_DIR @@ -558,6 +607,7 @@ variables: - CMAKE_SOURCE_DIR - CMAKE_STATIC_LIBRARY_PREFIX - CMAKE_STATIC_LIBRARY_SUFFIX + - CMAKE_Swift_MODULE_DIRECTORY # Since 3.15 - CMAKE_TOOLCHAIN_FILE - CMAKE_TWEAK_VERSION - CMAKE_VERBOSE_MAKEFILE @@ -611,7 +661,9 @@ variables: - CMAKE_ECLIPSE_VERSION - CMAKE_ERROR_DEPRECATED - CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION + - CMAKE_EXECUTE_PROCESS_COMMAND_ECHO # Since 3.15 - CMAKE_EXPORT_COMPILE_COMMANDS + - CMAKE_EXPORT_PACKAGE_REGISTRY # Since 3.15 - CMAKE_EXPORT_NO_PACKAGE_REGISTRY - CMAKE_FIND_APPBUNDLE - CMAKE_FIND_FRAMEWORK @@ -621,6 +673,8 @@ variables: - CMAKE_FIND_NO_INSTALL_PREFIX - CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY - CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY + - CMAKE_FIND_PACKAGE_PREFER_CONFIG # Since 3.15 + - CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS # Since 3.14 - CMAKE_FIND_PACKAGE_WARN_NO_MODULE - CMAKE_FIND_ROOT_PATH - CMAKE_FIND_ROOT_PATH_MODE_INCLUDE @@ -639,6 +693,7 @@ variables: - CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT - CMAKE_LIBRARY_PATH - CMAKE_LINK_DIRECTORIES_BEFORE # Since 3.13 + - CMAKE_MAXIMUM_RECURSION_DEPTH # Since 3.14 - CMAKE_MFC_FLAG - CMAKE_MODULE_PATH - CMAKE_NOT_USING_CONFIG_FLAGS @@ -646,6 +701,8 @@ variables: - CMAKE_POLICY_WARNING_CMP - CMAKE_PREFIX_PATH - CMAKE_PROGRAM_PATH + - CMAKE_PROJECT_INCLUDE # Since 3.15 + - CMAKE_PROJECT_INCLUDE_BEFORE # Since 3.15 - CMAKE_PROJECT__INCLUDE - CMAKE_SKIP_INSTALL_ALL_DEPENDENCY - CMAKE_STAGING_PREFIX @@ -757,6 +814,7 @@ variables: - CMAKE_ANDROID_STL_TYPE - CMAKE_ARCHIVE_OUTPUT_DIRECTORY - CMAKE_ARCHIVE_OUTPUT_DIRECTORY_ + - CMAKE_AUTOGEN_ORIGIN_DEPENDS # Since 3.14 - CMAKE_AUTOGEN_PARALLEL - CMAKE_AUTOGEN_VERBOSE # Since 3.13 - CMAKE_AUTOMOC @@ -768,6 +826,7 @@ variables: - CMAKE_AUTOUIC_OPTIONS - CMAKE_AUTOUIC_SEARCH_PATHS - CMAKE_BUILD_RPATH + - CMAKE_BUILD_RPATH_USE_ORIGIN # Since 3.14 - CMAKE_BUILD_WITH_INSTALL_NAME_DIR - CMAKE_BUILD_WITH_INSTALL_RPATH - CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY @@ -781,8 +840,13 @@ variables: - CMAKE_EXE_LINKER_FLAGS__INIT - CMAKE_EXE_LINKER_FLAGS_INIT - CMAKE_FOLDER # Since 3.12 + - CMAKE_FRAMEWORK # Since 3.15 - CMAKE_Fortran_FORMAT - CMAKE_Fortran_MODULE_DIRECTORY + - CMAKE_GLOBAL_AUTOGEN_TARGET # Since 3.14 + - CMAKE_GLOBAL_AUTOGEN_TARGET_NAME # Since 3.14 + - CMAKE_GLOBAL_AUTORCC_TARGET # Since 3.14 + - CMAKE_GLOBAL_AUTORCC_TARGET_NAME # Since 3.14 - CMAKE_GNUtoMS - CMAKE_INCLUDE_CURRENT_DIR - CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE @@ -814,6 +878,8 @@ variables: - CMAKE_MODULE_LINKER_FLAGS_ - CMAKE_MODULE_LINKER_FLAGS__INIT - CMAKE_MODULE_LINKER_FLAGS_INIT + - CMAKE_MSVCIDE_RUN_PATH # Since 3.15 + - CMAKE_MSVC_RUNTIME_LIBRARY # Since 3.15 - CMAKE_NINJA_OUTPUT_PATH_PREFIX - CMAKE_NO_BUILTIN_CHRPATH - CMAKE_NO_SYSTEM_FROM_IMPORTED @@ -843,6 +909,7 @@ variables: - CMAKE_VS_GLOBALS # Since 3.13 - CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD - CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD + - CMAKE_VS_JUST_MY_CODE_DEBUGGING # Since 3.15 - CMAKE_VS_SDK_EXCLUDE_DIRECTORIES # Since 3.12 - CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES # Since 3.12 - CMAKE_VS_SDK_INCLUDE_DIRECTORIES # Since 3.12 @@ -986,6 +1053,7 @@ variables: - CTEST_P4_UPDATE_OPTIONS - CTEST_SCP_COMMAND - CTEST_SITE + - CTEST_SUBMIT_URL # Since 3.14 - CTEST_SOURCE_DIRECTORY - CTEST_SVN_COMMAND - CTEST_SVN_OPTIONS @@ -996,6 +1064,7 @@ variables: - CTEST_UPDATE_COMMAND - CTEST_UPDATE_OPTIONS - CTEST_UPDATE_VERSION_ONLY + - CTEST_UPDATE_VERSION_OVERRIDE # Since 3.15 - CTEST_USE_LAUNCHERS # Variables for CPack - CPACK_ABSOLUTE_DESTINATION_FILES @@ -1064,6 +1133,7 @@ variables: - CMAKE_REQUIRED_DEFINITIONS - CMAKE_REQUIRED_FLAGS - CMAKE_REQUIRED_INCLUDES + - CMAKE_REQUIRED_LINK_OPTIONS # Since 3.14 - CMAKE_REQUIRED_LIBRARIES - CMAKE_REQUIRED_QUIET # - CheckTypeSize @@ -1198,6 +1268,7 @@ variables: - CPACK_IFW_PACKAGE_BANNER - CPACK_IFW_PACKAGE_BACKGROUND - CPACK_IFW_PACKAGE_WIZARD_STYLE + - CPACK_IFW_PACKAGE_STYLE_SHEET # Since 3.15 - CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH - CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT - CPACK_IFW_PACKAGE_TITLE_COLOR @@ -1546,7 +1617,59 @@ variables: # - UseSWIG - CMAKE_SWIG_FLAGS - CMAKE_SWIG_OUTDIR + - SWIG_OUTFILE_DIR - SWIG_MODULE__EXTRA_DEPS + - SWIG_SOURCE_FILE_EXTENSIONS # Since 3.14 + +# https://cmake.org/cmake/help/latest/manual/cmake-env-variables.7.html +# NOTE Added to syntax file version 14 at 3.15.0 version of CMake +environment-variables: + # Environment Variables that Control the Build + - CMAKE_BUILD_PARALLEL_LEVEL + - CMAKE_CONFIG_TYPE + - CMAKE_GENERATOR + - CMAKE_GENERATOR_INSTANCE + - CMAKE_GENERATOR_PLATFORM + - CMAKE_GENERATOR_TOOLSET + - CMAKE_MSVCIDE_RUN_PATH + - CMAKE_NO_VERBOSE + - CMAKE_OSX_ARCHITECTURES + - DESTDIR + - LDFLAGS + - MACOSX_DEPLOYMENT_TARGET + - _ROOT + - VERBOSE + # Environment Variables for Languages + - ASM + - ASMFLAGS + - CC + - CFLAGS + - CSFLAGS + - CUDACXX + - CUDAFLAGS + - CUDAHOSTCXX + - CXX + - CXXFLAGS + - FC + - FFLAGS + - RC + - RCFLAGS + - SWIFTC + # Environment Variables for CTest + - CMAKE_CONFIG_TYPE + - CTEST_INTERACTIVE_DEBUG_MODE + - CTEST_OUTPUT_ON_FAILURE + - CTEST_PARALLEL_LEVEL + - CTEST_PROGRESS_OUTPUT + - CTEST_USE_LAUNCHERS_DEFAULT + - DASHBOARD_TEST_FROM_CTEST + # Here are the `find_package` specific variables described at the + # https://cmake.org/cmake/help/latest/command/find_package.html + - _DIR + - CMAKE_PREFIX_PATH + - CMAKE_FRAMEWORK_PATH + - CMAKE_APPBUNDLE_PATH + - PATH scripting-commands: - @@ -1670,11 +1793,21 @@ scripting-commands: , ERROR_FILE , OUTPUT_QUIET , ERROR_QUIET + , COMMAND_ECHO # Since 3.15 , OUTPUT_STRIP_TRAILING_WHITESPACE , ERROR_STRIP_TRAILING_WHITESPACE , ENCODING ] - special-args: [NONE, AUTO, ANSI, OEM, UTF8] + special-args: [ + NONE + , AUTO + , ANSI + , OEM + , UTF8 + , STDERR # Since 3.15: the value for `COMMAND_ECHO` + , STDOUT # Since 3.15: the value for `COMMAND_ECHO` + ] + nested-parentheses?: true - name: file named-args: [ @@ -1746,6 +1879,7 @@ scripting-commands: , DIRECTORY_PERMISSIONS , NO_SOURCE_PERMISSIONS , USE_SOURCE_PERMISSIONS + , FOLLOW_SYMLINK_CHAIN # Since 3.15 , FILES_MATCHING , PATTERN , REGEX @@ -1760,6 +1894,9 @@ scripting-commands: # Sub-options of UPLOAD/DOWNLOAD since 3.11 , NETRC , NETRC_FILE + # New sub-options since 3.14 + , READ_SYMLINK + , SIZE ] special-args: [ UTF-8 @@ -1871,7 +2008,21 @@ scripting-commands: property-args: &get_directory_property [directory-properties] - name: get_filename_component - named-args: [DIRECTORY, NAME, EXT, NAME_WE, PATH, CACHE, BASE_DIR, ABSOLUTE, REALPATH, PROGRAM, PROGRAM_ARGS] + named-args: [ + DIRECTORY + , NAME + , EXT + , NAME_WE + , PATH + , CACHE + , BASE_DIR + , ABSOLUTE + , REALPATH + , PROGRAM + , PROGRAM_ARGS + , LAST_EXT # Since 3.14 + , NAME_WLE # Since 3.14 + ] - name: get_property named-args: [GLOBAL, DIRECTORY, TARGET, SOURCE, INSTALL, TEST, CACHE, VARIABLE, PROPERTY, SET, DEFINED, BRIEF_DOCS, FULL_DOCS] @@ -1933,6 +2084,10 @@ scripting-commands: , FOR # NOTE Another `REGEX` named arg has already added , OUTPUT_VARIABLE + # Since 3.15 + # NOTE Another `PREPEND` named arg has already added + , POP_FRONT + , POP_BACK ] # Since 3.13 special-args: [STRING, FILE_BASENAME, SENSITIVE, INSENSITIVE, ASCENDING, DESCENDING] @@ -1951,7 +2106,19 @@ scripting-commands: special-args: [DECIMAL, HEXADECIMAL] - name: message - named-args: [STATUS, WARNING, AUTHOR_WARNING, SEND_ERROR, FATAL_ERROR, DEPRECATION] + named-args: [ + STATUS + , WARNING + , AUTHOR_WARNING + , SEND_ERROR + , FATAL_ERROR + , DEPRECATION + # Since 3.15 + , NOTICE + , VERBOSE + , DEBUG + , TRACE + ] - name: option - @@ -1993,6 +2160,7 @@ scripting-commands: , SUBSTRING , STRIP , GENEX_STRIP + , REPEAT # Since 3.15 , COMPARE , LESS , GREATER @@ -2055,6 +2223,7 @@ project-commands: , WORKING_DIRECTORY , COMMENT , DEPFILE + , JOB_POOL # Since 3.15 , VERBATIM , APPEND , USES_TERMINAL @@ -2064,6 +2233,7 @@ project-commands: , PRE_LINK , POST_BUILD ] + nested-parentheses?: true - name: add_custom_target named-args: [ @@ -2075,12 +2245,14 @@ project-commands: , WORKING_DIRECTORY , COMMENT , DEPFILE + , JOB_POOL # Since 3.15 , VERBATIM , APPEND , USES_TERMINAL , COMMAND_EXPAND_LISTS , SOURCES ] + nested-parentheses?: true - name: add_definitions - @@ -2099,6 +2271,7 @@ project-commands: - name: add_test named-args: [NAME, COMMAND, CONFIGURATIONS, WORKING_DIRECTORY] + nested-parentheses?: true - name: aux_source_directory - @@ -2347,6 +2520,7 @@ project-commands: , SOURCES , COMPILE_DEFINITIONS , LINK_LIBRARIES + , LINK_OPTIONS # Since 3.14 , COPY_FILE , COPY_FILE_ERROR , _STANDARD @@ -2361,6 +2535,7 @@ project-commands: , CMAKE_FLAGS , COMPILE_DEFINITIONS , LINK_LIBRARIES + , LINK_OPTIONS # Since 3.14 , COMPILE_OUTPUT_VARIABLE , RUN_OUTPUT_VARIABLE , OUTPUT_VARIABLE @@ -2414,7 +2589,19 @@ ctest-commands: named-args: [TRACK, APPEND, QUIET] - name: ctest_submit - named-args: [PARTS, FILES, HTTPHEADER, RETRY_COUNT, RETRY_DELAY, RETURN_VALUE, QUIET, CDASH_UPLOAD, CDASH_UPLOAD_TYPE] + named-args: [ + PARTS + , FILES + , BUILD_ID # Since 3.15 + , SUBMIT_URL # Since 3.14 + , HTTPHEADER + , RETRY_COUNT + , RETRY_DELAY + , RETURN_VALUE + , QUIET + , CDASH_UPLOAD + , CDASH_UPLOAD_TYPE + ] - name: ctest_test named-args: [ diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py index 61f60a682d6..ff94189b811 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-cmake-syntax.py @@ -3,7 +3,7 @@ # # Generate Kate syntax file for CMake # -# Copyright (c) 2017, Alex Turbov +# Copyright (c) 2017-2019 Alex Turbov # # To install prerequisites: # @@ -33,6 +33,7 @@ _PROPERTY_KEYS = [ , 'install-properties' ] _KW_RE_LIST = ['kw', 're'] +_VAR_KIND_LIST = ['variables', 'environment-variables'] def try_transform_placeholder_string_to_regex(name): @@ -44,6 +45,9 @@ def try_transform_placeholder_string_to_regex(name): if 'CMAKE_MATCH_' in m: return '\\bCMAKE_MATCH_[0-9]+\\b' + if 'CMAKE_ARGV' in m: + return '\\bCMAKE_ARGV[0-9]+\\b' + return '\\b{}\\b'.format('&id_re;'.join(list(m))) if 1 < len(m) else name @@ -109,11 +113,20 @@ def cmd_is_nulary(cmd): def cli(input_yaml, template): data = yaml.load(input_yaml) - # Partition `variables` list into "pure" words and regexes to match - data['variables'] = { - k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [*partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data['variables'])]) - } - data['variables']['re'] = [*map(lambda x: try_transform_placeholder_string_to_regex(x), data['variables']['re'])] + # Partition `variables` and `environment-variables` lists into "pure" (key)words and regexes to match + for var_key in _VAR_KIND_LIST: + data[var_key] = { + k: sorted(set(v)) for k, v in zip( + _KW_RE_LIST + , [*partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data[var_key])] + ) + } + data[var_key]['re'] = [ + *map( + lambda x: try_transform_placeholder_string_to_regex(x) + , data[var_key]['re'] + ) + ] # Transform properties and make all-properties list data['properties'] = {} @@ -122,17 +135,27 @@ def cli(input_yaml, template): props, props_re = partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data[prop]) del data[prop] - data['properties'][python_prop_list_name] = {k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [props, props_re])} - data['properties'][python_prop_list_name]['re'] = [*map(lambda x: try_transform_placeholder_string_to_regex(x), props_re)] - + data['properties'][python_prop_list_name] = { + k: sorted(set(v)) for k, v in zip(_KW_RE_LIST, [props, props_re]) + } + data['properties'][python_prop_list_name]['re'] = [ + *map(lambda x: try_transform_placeholder_string_to_regex(x), props_re) + ] data['properties']['kinds'] = [*map(lambda name: name.replace('-', '_'), _PROPERTY_KEYS)] # Make all commands list - data['commands'] = [*map(lambda cmd: transform_command(cmd), data['scripting-commands'] + data['project-commands'] + data['ctest-commands'])] + data['commands'] = [ + *map( + lambda cmd: transform_command(cmd) + , data['scripting-commands'] + data['project-commands'] + data['ctest-commands']) + ] + # Fix node names to be accessible from Jinja template data['generator_expressions'] = data['generator-expressions'] - + data['environment_variables'] = data['environment-variables'] + del data['generator-expressions'] + del data['environment-variables'] env = jinja2.Environment( keep_trailing_newline=True diff --git a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl index c8274aab582..f034bcada72 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl +++ b/src/libs/3rdparty/syntax-highlighting/data/generators/generate-php.pl @@ -42,7 +42,14 @@ if ($root == 1) } else { - $file =~ s/]+)name="([^"]*)"/\n"; $file =~ s/]*)context="([^"#]*)##(?!Alerts|Doxygen|Modelines)([^"]+)"/]*>)/$1\n/g; +$file =~ s/(]*[^>\/]>)/$1\n/g; +$file =~ s/(]*[^>\/])\s*\/>/$1>\n\n<\/context>/g; $file =~ s/(?=<\/contexts\s*>)/$findphp/; print $file; diff --git a/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd b/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd index 6f05aad7b51..9a03ef2b780 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd +++ b/src/libs/3rdparty/syntax-highlighting/data/schema/language.xsd @@ -279,9 +279,10 @@ --> - - - + + + + @@ -290,6 +291,11 @@ contains string used in --> + + @@ -305,6 +311,7 @@ lineEndContext: Next context if end of line is encountered lineEmptyContext: Next context if an empty line is encountered [optional] fallthrough: Use a fallthrough context [optional] + deprecated since 5.62 but preserved to maintain compatibility in older versions of KF5 fallthroughContext: Fall through to this context [optional] dynamic: Dynamic context [boolean, optional] noIndentationBasedFolding: Python uses indentation based folding. However, Python has parts where @@ -314,7 +321,6 @@ TODO: - Explain fallthrough. - - Do we need fallthrough at all? It could be true, if fallthroughContext is set, false otherwise. - Make lineEndContext optional, defaults to '#stay'. Reasonable? --> @@ -344,7 +350,15 @@ - + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml index 6d170e4eaaa..def91cc4ddd 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/cmake.xml @@ -9,7 +9,7 @@ Copyright 2004 Alexander Neundorf (neundorf@kde.org) Copyright 2005 Dominik Haumann (dhdev@gmx.de) Copyright 2007,2008,2013,2014 Matthew Woehlke (mw_triad@users.sourceforge.net) - Copyright 2013-2015,2017-2018 Alex Turbov (i.zaufi@gmail.com) + Copyright 2013-2015,2017-2019 Alex Turbov (i.zaufi@gmail.com) ********************************************************************** * This library is free software; you can redistribute it and/or * @@ -31,7 +31,7 @@ COMMAND + COMMAND_ECHO ENCODING ERROR_FILE ERROR_QUIET @@ -268,6 +269,8 @@ AUTO NONE OEM + STDERR + STDOUT UTF8 @@ -287,6 +290,7 @@ FILES_MATCHING FILE_PERMISSIONS FOLLOW_SYMLINKS + FOLLOW_SYMLINK_CHAIN GENERATE GLOB GLOB_RECURSE @@ -567,6 +571,8 @@ LENGTH ORDER OUTPUT_VARIABLE + POP_BACK + POP_FRONT PREPEND REGEX REMOVE_AT @@ -602,10 +608,14 @@ AUTHOR_WARNING + DEBUG DEPRECATION FATAL_ERROR + NOTICE SEND_ERROR STATUS + TRACE + VERBOSE WARNING @@ -671,6 +681,7 @@ RANDOM RANDOM_SEED REGEX + REPEAT REPLACE REVERSE SHA1 @@ -737,6 +748,7 @@ DEPENDS DEPFILE IMPLICIT_DEPENDS + JOB_POOL MAIN_DEPENDENCY OUTPUT POST_BUILD @@ -757,6 +769,7 @@ DEPENDS DEPFILE IMPLICIT_DEPENDS + JOB_POOL SOURCES USES_TERMINAL VERBATIM @@ -1135,6 +1148,7 @@ TRACK + BUILD_ID CDASH_UPLOAD CDASH_UPLOAD_TYPE FILES @@ -1144,6 +1158,7 @@ RETRY_COUNT RETRY_DELAY RETURN_VALUE + SUBMIT_URL APPEND @@ -1214,7 +1229,6 @@ CMAKE_AR CMAKE_ARCHIVE_OUTPUT_DIRECTORY CMAKE_ARGC - CMAKE_ARGV0 CMAKE_AUTOGEN_ORIGIN_DEPENDS CMAKE_AUTOGEN_PARALLEL CMAKE_AUTOGEN_VERBOSE @@ -1288,10 +1302,12 @@ CMAKE_ERROR_DEPRECATED CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION CMAKE_EXECUTABLE_SUFFIX + CMAKE_EXECUTE_PROCESS_COMMAND_ECHO CMAKE_EXE_LINKER_FLAGS CMAKE_EXE_LINKER_FLAGS_INIT CMAKE_EXPORT_COMPILE_COMMANDS CMAKE_EXPORT_NO_PACKAGE_REGISTRY + CMAKE_EXPORT_PACKAGE_REGISTRY CMAKE_EXTRA_GENERATOR CMAKE_EXTRA_INCLUDE_FILES CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES @@ -1305,6 +1321,7 @@ CMAKE_FIND_PACKAGE_NAME CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY + CMAKE_FIND_PACKAGE_PREFER_CONFIG CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS CMAKE_FIND_PACKAGE_SORT_DIRECTION CMAKE_FIND_PACKAGE_SORT_ORDER @@ -1315,6 +1332,7 @@ CMAKE_FIND_ROOT_PATH_MODE_PACKAGE CMAKE_FIND_ROOT_PATH_MODE_PROGRAM CMAKE_FOLDER + CMAKE_FRAMEWORK CMAKE_FRAMEWORK_PATH CMAKE_Fortran_FORMAT CMAKE_Fortran_MODDIR_DEFAULT @@ -1432,6 +1450,8 @@ CMAKE_MODULE_LINKER_FLAGS CMAKE_MODULE_LINKER_FLAGS_INIT CMAKE_MODULE_PATH + CMAKE_MSVCIDE_RUN_PATH + CMAKE_MSVC_RUNTIME_LIBRARY CMAKE_NETRC CMAKE_NETRC_FILE CMAKE_NINJA_OUTPUT_PATH_PREFIX @@ -1454,6 +1474,8 @@ CMAKE_PROGRAM_PATH CMAKE_PROJECT_DESCRIPTION CMAKE_PROJECT_HOMEPAGE_URL + CMAKE_PROJECT_INCLUDE + CMAKE_PROJECT_INCLUDE_BEFORE CMAKE_PROJECT_NAME CMAKE_PROJECT_VERSION CMAKE_PROJECT_VERSION_MAJOR @@ -1465,6 +1487,7 @@ CMAKE_REQUIRED_FLAGS CMAKE_REQUIRED_INCLUDES CMAKE_REQUIRED_LIBRARIES + CMAKE_REQUIRED_LINK_OPTIONS CMAKE_REQUIRED_QUIET CMAKE_ROOT CMAKE_RUNTIME_OUTPUT_DIRECTORY @@ -1509,6 +1532,7 @@ CMAKE_SYSTEM_PROGRAM_PATH CMAKE_SYSTEM_VERSION CMAKE_Swift_LANGUAGE_VERSION + CMAKE_Swift_MODULE_DIRECTORY CMAKE_THREAD_LIBS_INIT CMAKE_THREAD_PREFER_PTHREAD CMAKE_TOOLCHAIN_FILE @@ -1529,6 +1553,7 @@ CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD CMAKE_VS_INTEL_Fortran_PROJECT_VERSION + CMAKE_VS_JUST_MY_CODE_DEBUGGING CMAKE_VS_MSBUILD_COMMAND CMAKE_VS_NsightTegra_VERSION CMAKE_VS_PLATFORM_NAME @@ -1658,6 +1683,7 @@ CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR CPACK_IFW_PACKAGE_RESOURCES CPACK_IFW_PACKAGE_START_MENU_DIRECTORY + CPACK_IFW_PACKAGE_STYLE_SHEET CPACK_IFW_PACKAGE_TITLE CPACK_IFW_PACKAGE_TITLE_COLOR CPACK_IFW_PACKAGE_WATERMARK @@ -1908,6 +1934,7 @@ CTEST_UPDATE_COMMAND CTEST_UPDATE_OPTIONS CTEST_UPDATE_VERSION_ONLY + CTEST_UPDATE_VERSION_OVERRIDE CTEST_USE_LAUNCHERS CYGWIN EXECUTABLE_OUTPUT_PATH @@ -1990,6 +2017,45 @@ XCODE XCODE_VERSION + + + CC + CFLAGS + CMAKE_APPBUNDLE_PATH + CMAKE_BUILD_PARALLEL_LEVEL + CMAKE_CONFIG_TYPE + CMAKE_FRAMEWORK_PATH + CMAKE_GENERATOR + CMAKE_GENERATOR_INSTANCE + CMAKE_GENERATOR_PLATFORM + CMAKE_GENERATOR_TOOLSET + CMAKE_MSVCIDE_RUN_PATH + CMAKE_NO_VERBOSE + CMAKE_OSX_ARCHITECTURES + CMAKE_PREFIX_PATH + CSFLAGS + CTEST_INTERACTIVE_DEBUG_MODE + CTEST_OUTPUT_ON_FAILURE + CTEST_PARALLEL_LEVEL + CTEST_PROGRESS_OUTPUT + CTEST_USE_LAUNCHERS_DEFAULT + CUDACXX + CUDAFLAGS + CUDAHOSTCXX + CXX + CXXFLAGS + DASHBOARD_TEST_FROM_CTEST + DESTDIR + FC + FFLAGS + LDFLAGS + MACOSX_DEPLOYMENT_TARGET + PATH + RC + RCFLAGS + SWIFTC + VERBOSE + ALLOW_DUPLICATE_CUSTOM_TARGETS AUTOGEN_SOURCE_GROUP @@ -2032,6 +2098,7 @@ XCODE_EMIT_EFFECTIVE_PLATFORM_NAME + ADDITIONAL_CLEAN_FILES ADDITIONAL_MAKE_CLEAN_FILES BINARY_DIR BUILDSYSTEM_TARGETS @@ -2064,6 +2131,7 @@ VS_STARTUP_PROJECT + ADDITIONAL_CLEAN_FILES ALIASED_TARGET ANDROID_ANT_ADDITIONAL_OPTIONS ANDROID_API @@ -2207,6 +2275,7 @@ MACOSX_FRAMEWORK_INFO_PLIST MACOSX_RPATH MANUALLY_ADDED_DEPENDENCIES + MSVC_RUNTIME_LIBRARY NAME NO_SONAME NO_SYSTEM_FROM_IMPORTED @@ -2232,6 +2301,9 @@ STATIC_LIBRARY_FLAGS STATIC_LIBRARY_OPTIONS SUFFIX + Swift_DEPENDENCIES_FILE + Swift_MODULE_DIRECTORY + Swift_MODULE_NAME TYPE VERSION VISIBILITY_INLINES_HIDDEN @@ -2249,8 +2321,12 @@ VS_GLOBAL_ROOTNAMESPACE VS_IOT_EXTENSIONS_VERSION VS_IOT_STARTUP_TASK + VS_JUST_MY_CODE_DEBUGGING VS_KEYWORD VS_MOBILE_EXTENSIONS_VERSION + VS_NO_SOLUTION_DEPLOY + VS_PACKAGE_REFERENCES + VS_PROJECT_IMPORT VS_SCC_AUXPATH VS_SCC_LOCALPATH VS_SCC_PROJECTNAME @@ -2264,10 +2340,12 @@ WIN32_EXECUTABLE WINDOWS_EXPORT_ALL_SYMBOLS XCODE_EXPLICIT_FILE_TYPE + XCODE_GENERATE_SCHEME XCODE_PRODUCT_TYPE XCODE_SCHEME_ADDRESS_SANITIZER XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN XCODE_SCHEME_ARGUMENTS + XCODE_SCHEME_DEBUG_AS_ROOT XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE @@ -2309,6 +2387,8 @@ SKIP_AUTORCC SKIP_AUTOUIC SYMBOLIC + Swift_DEPENDENCIES_FILE + Swift_DIAGNOSTICS_FILE VS_COPY_TO_OUT_DIR VS_DEPLOYMENT_CONTENT VS_DEPLOYMENT_LOCATION @@ -2375,61 +2455,76 @@ 0 1 - AND - ANGLE-R BOOL - BUILD_INTERFACE - COMMA - COMPILE_FEATURES - COMPILE_LANGUAGE - CONFIG - CXX_COMPILER_ID - CXX_COMPILER_VERSION - C_COMPILER_ID - C_COMPILER_VERSION - EQUAL - GENEX_EVAL - IF - INSTALL_INTERFACE - INSTALL_PREFIX - IN_LIST - JOIN - LINK_ONLY - LOWER_CASE - MAKE_C_IDENTIFIER - NOT + AND OR - PLATFORM_ID - SEMICOLON - SHELL_PATH + NOT STREQUAL - TARGET_BUNDLE_CONTENT_DIR - TARGET_BUNDLE_DIR - TARGET_EXISTS - TARGET_FILE - TARGET_FILE_DIR - TARGET_FILE_NAME - TARGET_GENEX_EVAL - TARGET_LINKER_FILE - TARGET_LINKER_FILE_DIR - TARGET_LINKER_FILE_NAME - TARGET_NAME - TARGET_NAME_IF_EXISTS - TARGET_OBJECTS - TARGET_PDB_FILE - TARGET_PDB_FILE_DIR - TARGET_PDB_FILE_NAME - TARGET_POLICY - TARGET_PROPERTY - TARGET_SONAME_FILE - TARGET_SONAME_FILE_DIR - TARGET_SONAME_FILE_NAME - UPPER_CASE - VERSION_EQUAL - VERSION_GREATER - VERSION_GREATER_EQUAL + EQUAL + IN_LIST VERSION_LESS + VERSION_GREATER + VERSION_EQUAL VERSION_LESS_EQUAL + VERSION_GREATER_EQUAL + TARGET_EXISTS + CONFIG + PLATFORM_ID + C_COMPILER_ID + CXX_COMPILER_ID + CUDA_COMPILER_ID + Fortran_COMPILER_ID + C_COMPILER_VERSION + CXX_COMPILER_VERSION + CUDA_COMPILER_VERSION + Fortran_COMPILER_VERSION + TARGET_POLICY + COMPILE_FEATURES + COMPILE_LANG_AND_ID + COMPILE_LANGUAGE + ANGLE-R + COMMA + SEMICOLON + IF + JOIN + REMOVE_DUPLICATES + FILTER + LOWER_CASE + UPPER_CASE + GENEX_EVAL + TARGET_GENEX_EVAL + TARGET_NAME_IF_EXISTS + TARGET_FILE + TARGET_FILE_BASE_NAME + TARGET_FILE_PREFIX + TARGET_FILE_SUFFIX + TARGET_FILE_NAME + TARGET_FILE_DIR + TARGET_LINKER_FILE + TARGET_LINKER_FILE_BASE_NAME + TARGET_LINKER_FILE_PREFIX + TARGET_LINKER_FILE_SUFFIX + TARGET_LINKER_FILE_NAME + TARGET_LINKER_FILE_DIR + TARGET_SONAME_FILE + TARGET_SONAME_FILE + TARGET_SONAME_FILE_NAME + TARGET_SONAME_FILE_DIR + TARGET_PDB_FILE + TARGET_PDB_FILE_BASE_NAME + TARGET_PDB_FILE_NAME + TARGET_PDB_FILE_DIR + TARGET_BUNDLE_DIR + TARGET_BUNDLE_CONTENT_DIR + TARGET_PROPERTY + INSTALL_PREFIX + TARGET_NAME + LINK_ONLY + INSTALL_INTERFACE + BUILD_INTERFACE + MAKE_C_IDENTIFIER + TARGET_OBJECTS + SHELL_PATH @@ -2662,11 +2757,18 @@ + + + + + + + @@ -2978,18 +3080,30 @@ + + + + + + + + + + + + @@ -3039,10 +3153,16 @@ + + + + + + @@ -3619,6 +3739,7 @@ + @@ -3727,11 +3848,28 @@ - + + + + + + + + + + + + + + + + + + @@ -3830,10 +3968,12 @@ + - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml index 25a614e826f..228bb45b854 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/css.xml @@ -38,7 +38,8 @@ Changelog: --> - + + @@ -1258,8 +1259,9 @@ Changelog: selection - + not + matches @@ -1383,8 +1385,8 @@ Changelog: - - + + @@ -1393,7 +1395,8 @@ Changelog: - + + @@ -1548,7 +1551,7 @@ Changelog: - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml index 107e1067da8..7f0d52b353c 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/html.xml @@ -5,7 +5,7 @@ ]> - + @@ -20,8 +20,19 @@ + + + + + + + + + + + @@ -54,8 +65,6 @@ - - @@ -230,7 +239,7 @@ - + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml index 28ad8e8a33d..e9f80a534ea 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/json.xml @@ -12,7 +12,7 @@ ** http://tools.ietf.org/html/rfc4627 *************************************************************************** --> - + null diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml index f88848729fb..7d11b34e6b6 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/markdown.xml @@ -6,6 +6,7 @@ Dual-Licensed under both GPL and BSD licenses. Extended 2009 Claes Holmerson. http://github.com/claes/kate-markdown/ + Extended 2019 Nibaldo González S. (changes under MIT license). --> - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + ]> - + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + - - + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + + - - + + + + + + - - + + + + + + - - + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + - - + + - - + + - - + + + + + + + + + + + + + + - - + + + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml index 0d1931649c5..c2d366d1f30 100644 --- a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl.xml @@ -39,7 +39,7 @@ Enhance tr/// and y/// support. --> - + if diff --git a/src/libs/3rdparty/syntax-highlighting/data/syntax/perl6.xml b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl6.xml new file mode 100644 index 00000000000..71ea0a80e81 --- /dev/null +++ b/src/libs/3rdparty/syntax-highlighting/data/syntax/perl6.xml @@ -0,0 +1,1785 @@ + + + + + + + + + + + + + + + + + ]+|[&podfmt;](<(?:<*(?=<))|(?![<«])))+"> + + ]+|[&podfmt;](?![<«])|>(?!>)|<(?!<))+"> + + + 」\]}a-zA-Z0-9]|$))"> + + + + + + + + + «»"> + + + + ][+=]|[-&+.<>|^]|cont|elem)\))"> + ]+|&bracehyperoperator;)[«»]"> + + + + + + + ]|&extrasymboloperators;)[&symboloperators;]*|\(&innerbraceoperator;\)|\[&innerbraceoperator;\]|<[&safesymboloperators;'"]+>)"> + + + +]> + + + + + begin + end + finish + for + podtypename + + + + pod + podtypename + + + + True + False + + + + head1 + head2 + head3 + head4 + head5 + head6 + item + item1 + item2 + item3 + item4 + item5 + item6 + para + code + defn + comment + table + input + output + + + + exec + words + quotewords + scalar + array + hash + function + closure + backslash + heredoc + val + + + + macro + sub + submethod + method + multi + proto + only + category + + + + rule + token + regex + + + + podvalue + self + + + + let + my + our + state + temp + has + constant + + + + + if + else + elsif + unless + + for + loop + repeat + while + until + gather + given + + take + do + when + next + last + redo + return + contend + maybe + defer + default + exit + make + continue + break + goto + leave + async + lift + + die + fail + try + warn + + + + + no + use + require + + is + as + but + trusts + of + returns + handles + where + augment + supersede + + module + class + role + package + enum + grammar + slang + subset + + BEGIN + CHECK + INIT + START + FIRST + ENTER + LEAVE + KEEP + UNDO + NEXT + LAST + PRE + POST + END + CATCH + CONTROL + TEMP + + + + prec + irs + ofs + ors + export + deep + binary + unary + reparsed + rw + parsed + cached + readonly + defequiv + will + ref + copy + inline + tighter + looser + equiv + assoc + required + + + + property + signature + context + also + shape + + + + NaN + Inf + + + + Object + Any + Junction + Whatever + Capture + Match + Signature + Proxy + Matcher + Package + Module + Class + Grammar + Scalar + Array + Hash + KeyHash + KeySet + KeyBag + Pair + List + Seq + Range + Set + Bag + Mapping + Void + Undef + Failure + Exception + Code + Block + Routine + Sub + Macro + Method + Submethod + Regex + Str + Blob + Char + Byte + Codepoint + Grapheme + StrPos + StrLen + Version + Num + Complex + num + complex + Bit + bit + bool + True + False + Increasing + Decreasing + Ordered + Callable + AnyChar + Positional + Associative + Ordering + KeyExtractor + Comparator + OrderingPair + IO + KitchenSink + Role + Int + int + int1 + int2 + int4 + int8 + int16 + int32 + int64 + Rat + rat + rat1 + rat2 + rat4 + rat8 + rat16 + rat32 + rat64 + Buf + buf + buf1 + buf2 + buf4 + buf8 + buf16 + buf32 + buf64 + UInt + uint + uint1 + uint2 + uint4 + uint8 + uint16 + uint32 + uint64 + Abstraction + utf8 + utf16 + utf32 + + + + X + gcd + ge + gt + lcm + le + leg + let + lt + map + max + min + minmax + mod + ne + not + notandthen + o + or + orelse + print + push + say + so + substr + temp + unicmp + x + xor + xx + Xeqv + Z + and + andthen + any + but + cmp + coll + die + div + does + eq + eqv + ff + fff + + + + L Letter + LC Cased_Letter + Lu Uppercase_Letter + Ll Lowercase_Letter + Lt Titlecase_Letter + Lm Modifier_Letter + Lo Other_Letter + M Mark + Mn Nonspacing_Mark + Mc Spacing_Mark + Me Enclosing_Mark + N Number + Nd Decimal_Number digit + Nl Letter_Number + No Other_Number + P Punctuation punct + Pc Connector_Punctuation + Pd Dash_Punctuation + Ps Open_Punctuation + Pe Close_Punctuation + Pi Initial_Punctuation + Pf Final_Punctuation + Po Other_Punctuation + S Symbol + Sm Math_Symbol + Sc Currency_Symbol + Sk Modifier_Symbol + So Other_Symbol + Z Separator + Zs Space_Separator + Zl Line_Separator + Zp Paragraph_Separator + C Other + Cc Control cntrl + Cf Format + Cs Surrogate + Co Private_Use + Cn Unassigned + + + + before + after + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp index 8334dd32e9d..92df89dc46e 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/cli/kate-syntax-highlighter.cpp @@ -32,7 +32,6 @@ #include #include #include -#include #include diff --git a/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp b/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp index 3534cfde904..2a2ea0081ec 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/indexer/katehighlightingindexer.cpp @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include @@ -59,6 +58,7 @@ QStringList readListing(const QString &fileName) if (xml.hasError()) { qWarning() << "XML error while reading" << fileName << " - " << qPrintable(xml.errorString()) << "@ offset" << xml.characterOffset(); + listing.clear(); } return listing; @@ -69,7 +69,7 @@ QStringList readListing(const QString &fileName) * @param extensions extensions string to check * @return valid? */ -bool checkExtensions(QString extensions) +bool checkExtensions(const QString &extensions) { // get list of extensions const QStringList extensionParts = extensions.split(QLatin1Char(';'), QString::SkipEmptyParts); @@ -163,6 +163,7 @@ bool checkSingleChars(const QString &hlFilename, QXmlStreamReader &xml) const QString c = xml.attributes().value(QLatin1String("char")).toString(); if (c.size() != 1) { qWarning() << hlFilename << "line" << xml.lineNumber() << "'char' must contain exactly one char:" << c; + return false; } } @@ -170,6 +171,7 @@ bool checkSingleChars(const QString &hlFilename, QXmlStreamReader &xml) const QString c = xml.attributes().value(QLatin1String("char1")).toString(); if (c.size() != 1) { qWarning() << hlFilename << "line" << xml.lineNumber() << "'char1' must contain exactly one char:" << c; + return false; } } @@ -285,6 +287,7 @@ public: const QString name = xml.attributes().value(QLatin1String("name")).toString(); if (m_existingNames.contains(name)) { qWarning() << m_filename << "list duplicate:" << name; + m_success = false; } m_existingNames.insert(name); } else if (xml.name() == QLatin1String("keyword")) { @@ -296,7 +299,7 @@ public: bool check() const { - bool success = true; + bool success = m_success; const auto invalidNames = m_usedNames - m_existingNames; if (!invalidNames.isEmpty()) { qWarning() << m_filename << "Reference of non-existing keyword list:" << invalidNames; @@ -306,6 +309,7 @@ public: const auto unusedNames = m_existingNames - m_usedNames; if (!unusedNames.isEmpty()) { qWarning() << m_filename << "Unused keyword lists:" << unusedNames; + success = false; } return success; @@ -315,14 +319,27 @@ private: QString m_filename; QSet m_usedNames; QSet m_existingNames; + bool m_success = true; }; /** - * Helper class to search for non-existing contexts + * Helper class to search for non-existing contexts and invalid version */ class ContextChecker { public: + void setKateVersion(const QStringRef &verStr, const QString &hlFilename, const QString &hlName) + { + const auto idx = verStr.indexOf(QLatin1Char('.')); + if (idx <= 0) { + qWarning() << hlFilename << "invalid kateversion" << verStr; + m_success = false; + } else { + auto &language = m_contextMap[hlName]; + language.version = {verStr.left(idx).toInt(), verStr.mid(idx + 1).toInt()}; + } + } + void processElement(const QString &hlFilename, const QString &hlName, QXmlStreamReader &xml) { if (xml.name() == QLatin1String("context")) { @@ -336,22 +353,28 @@ public: if (language.existingContextNames.contains(name)) { qWarning() << hlFilename << "Duplicate context:" << name; + m_success = false; } else { language.existingContextNames.insert(name); } if (xml.attributes().value(QLatin1String("fallthroughContext")).toString() == QLatin1String("#stay")) { qWarning() << hlFilename << "possible infinite loop due to fallthroughContext=\"#stay\" in context " << name; + m_success = false; } processContext(hlName, xml.attributes().value(QLatin1String("lineEndContext")).toString()); processContext(hlName, xml.attributes().value(QLatin1String("lineEmptyContext")).toString()); processContext(hlName, xml.attributes().value(QLatin1String("fallthroughContext")).toString()); + } else if (xml.name() == QLatin1String("include")) { + // tag inside + processVersion(hlFilename, hlName, xml, {5, 53}, QLatin1String("")); } else { if (xml.attributes().hasAttribute(QLatin1String("context"))) { const QString context = xml.attributes().value(QLatin1String("context")).toString(); if (context.isEmpty()) { qWarning() << hlFilename << "Missing context name in line" << xml.lineNumber(); + m_success = false; } else { processContext(hlName, context); } @@ -361,7 +384,30 @@ public: bool check() const { - bool success = true; + bool success = m_success; + + // recursive search for the required miximal version + struct GetRequiredVersion + { + QHash versionMap; + + Version operator()(const QHash &contextMap, const Language &language) + { + auto& version = versionMap[&language]; + if (version < language.version) { + version = language.version; + for (auto &languageName : language.usedLanguageName) { + auto it = contextMap.find(languageName); + if (it != contextMap.end()) { + version = std::max(operator()(contextMap, *it), version); + } + } + } + return version; + }; + }; + GetRequiredVersion getRequiredVersion; + for (auto &language : m_contextMap) { const auto invalidContextNames = language.usedContextNames - language.existingContextNames; if (!invalidContextNames.isEmpty()) { @@ -374,6 +420,12 @@ public: qWarning() << language.hlFilename << "Unused contexts:" << unusedNames; success = false; } + + auto requiredVersion = getRequiredVersion(m_contextMap, language); + if (language.version < requiredVersion) { + qWarning().nospace() << language.hlFilename << " depends on a language in version " << requiredVersion.majorRevision << "." << requiredVersion.minorRevision << ". Please, increase kateversion."; + success = false; + } } return success; @@ -405,6 +457,7 @@ private: } else if (list.size() == 2) { // specific context of other language, e.g. Comment##ISO C++ m_contextMap[list[1]].usedContextNames.insert(list[0]); + m_contextMap[language].usedLanguageName.insert(list[1]); } return; } @@ -418,6 +471,34 @@ private: } private: + struct Version + { + int majorRevision; + int minorRevision; + + Version(int majorRevision = 0, int minorRevision = 0) + : majorRevision(majorRevision) + , minorRevision(minorRevision) + {} + + bool operator<(const Version &version) const + { + return majorRevision < version.majorRevision || (majorRevision == version.majorRevision && minorRevision < version.minorRevision); + } + }; + + void processVersion(const QString &hlFilename, const QString &hlName, QXmlStreamReader &xml, Version const& requiredVersion, QLatin1String item) + { + auto &language = m_contextMap[hlName]; + + if (language.version < requiredVersion) { + qWarning().nospace() << hlFilename << " " << item << " in line " << xml.lineNumber() << " is only available since version " << requiredVersion.majorRevision << "." << requiredVersion.minorRevision << ". Please, increase kateversion."; + // update the version to cancel future warnings + language.version = requiredVersion; + m_success = false; + } + } + class Language { public: @@ -435,6 +516,12 @@ private: // holds all existing context names QSet existingContextNames; + + // holds all existing language names + QSet usedLanguageName; + + // kateversion language attribute + Version version; }; /** @@ -442,6 +529,7 @@ private: * Example key: "Doxygen" */ QHash m_contextMap; + bool m_success = true; }; /** @@ -461,6 +549,7 @@ public: if (!name.isEmpty()) { if (m_existingAttributeNames.contains(name)) { qWarning() << m_filename << "itemData duplicate:" << name; + m_success = false; } else { m_existingAttributeNames.insert(name); } @@ -469,6 +558,7 @@ public: const QString name = xml.attributes().value(QLatin1String("attribute")).toString(); if (name.isEmpty()) { qWarning() << m_filename << "specified attribute is empty:" << xml.name(); + m_success = false; } else { m_usedAttributeNames.insert(name); } @@ -477,7 +567,7 @@ public: bool check() const { - bool success = true; + bool success = m_success; const auto invalidNames = m_usedAttributeNames - m_existingAttributeNames; if (!invalidNames.isEmpty()) { qWarning() << m_filename << "Reference of non-existing itemData attributes:" << invalidNames; @@ -487,6 +577,7 @@ public: auto unusedNames = m_existingAttributeNames - m_usedAttributeNames; if (!unusedNames.isEmpty()) { qWarning() << m_filename << "Unused itemData:" << unusedNames; + success = false; } return success; @@ -496,6 +587,7 @@ private: QString m_filename; QSet m_usedAttributeNames; QSet m_existingAttributeNames; + bool m_success = true; }; } @@ -594,8 +686,11 @@ int main(int argc, char *argv[]) AttributeChecker attributeChecker(hlFilename); KeywordChecker keywordChecker(hlFilename); + const QString hlName = hl[QStringLiteral("name")].toString(); + contextChecker.setKateVersion(xml.attributes().value(QStringLiteral("kateversion")), hlFilename, hlName); + // scan for broken regex or keywords with spaces while (!xml.atEnd()) { xml.readNext(); diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt b/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt index 95bf4c349e5..9e95772f6e3 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/CMakeLists.txt @@ -69,6 +69,8 @@ if(BUILD_QCH) LINK_QCHS Qt5Core_QCH Qt5Gui_QCH + INCLUDE_DIRS + ${CMAKE_CURRENT_BINARY_DIR} BLANK_MACROS KSYNTAXHIGHLIGHTING_EXPORT KSYNTAXHIGHLIGHTING_DEPRECATED diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp index 9887b959d0c..9d5597e7d28 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/context.cpp @@ -61,10 +61,8 @@ void Context::load(QXmlStreamReader& reader) m_attribute = reader.attributes().value(QStringLiteral("attribute")).toString(); m_lineEndContext.parse(reader.attributes().value(QStringLiteral("lineEndContext"))); m_lineEmptyContext.parse(reader.attributes().value(QStringLiteral("lineEmptyContext"))); - m_fallthrough = Xml::attrToBool(reader.attributes().value(QStringLiteral("fallthrough"))); m_fallthroughContext.parse(reader.attributes().value(QStringLiteral("fallthroughContext"))); - if (m_fallthroughContext.isStay()) - m_fallthrough = false; + m_fallthrough = !m_fallthroughContext.isStay(); m_noIndentationBasedFolding = Xml::attrToBool(reader.attributes().value(QStringLiteral("noIndentationBasedFolding"))); reader.readNext(); diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp index ae95a6b235f..6a204dc3ac0 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.cpp @@ -39,7 +39,6 @@ #include "xml_p.h" #include -#include #include #include #include @@ -234,6 +233,19 @@ QStringList Definition::keywordList(const QString& name) const return list ? list->keywords() : QStringList(); } +bool Definition::setKeywordList(const QString& name, const QStringList& content) +{ + d->load(DefinitionData::OnlyKeywords(true)); + KeywordList* list = d->keywordList(name); + if (list) + { + list->setKeywordList(content); + return true; + } + else + return false; +} + QVector Definition::formats() const { d->load(); diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h index 6f0dba9a454..3ba5be9a7a2 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definition.h @@ -26,9 +26,8 @@ #include "ksyntaxhighlighting_export.h" -#include #include - +#include #include QT_BEGIN_NAMESPACE @@ -329,10 +328,28 @@ public: /** * Returns the list of keywords for the keyword list @p name. * @since 5.49 - * @see keywordLists() + * @see keywordLists(), setKeywordList() */ QStringList keywordList(const QString& name) const; + /** + * Set the contents of the keyword list @p name to @p content. + * Only existing keywordLists() can be changed. For non-existent keyword lists, + * false is returned. + * + * Whenever you change a keyword list, make sure to trigger a rehighlight of + * your documents. In case you are using QSyntaxHighlighter via SyntaxHighlighter, + * this can be done by calling SyntaxHighlighter::rehighlight(). + * + * @note In general, changing keyword lists via setKeywordList() is discouraged, + * since if a keyword list name in the syntax highlighting definition + * file changes, the call setKeywordList() may suddenly fail. + * + * @see keywordList(), keywordLists() + * @since 5.62 + */ + bool setKeywordList(const QString& name, const QStringList& content); + /** * Returns a list of all Format items used by this definition. * The order of the Format items equals the order of the itemDatas in the xml file. diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h index 9bbf59691c1..c73ca86eb95 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definition_p.h @@ -101,7 +101,7 @@ public: QVector> characterEncodings; QString fileName; - QString name = QStringLiteral(QT_TRANSLATE_NOOP("Syntax highlighting", "None")); + QString name = QStringLiteral(QT_TRANSLATE_NOOP("Language", "None")); QString section; QString style; QString indenter; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp index 4c3e5f5f1e4..89a5952a3e4 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/definitiondownloader.cpp @@ -27,7 +27,6 @@ #include "ksyntaxhighlighting_logging.h" #include "ksyntaxhighlighting_version.h" -#include #include #include #include diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp index d1808cafefc..3407fee9f3e 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/format.cpp @@ -30,7 +30,6 @@ #include "xml_p.h" #include -#include #include #include @@ -207,6 +206,46 @@ bool Format::spellCheck() const return d->spellCheck; } +bool Format::hasBoldOverride() const +{ + return d->style.hasBold; +} + +bool Format::hasItalicOverride() const +{ + return d->style.hasItalic; +} + +bool Format::hasUnderlineOverride() const +{ + return d->style.hasUnderline; +} + +bool Format::hasStrikeThroughOverride() const +{ + return d->style.hasStrikeThrough; +} + +bool Format::hasTextColorOverride() const +{ + return d->style.textColor; +} + +bool Format::hasBackgroundColorOverride() const +{ + return d->style.backgroundColor; +} + +bool Format::hasSelectedTextColorOverride() const +{ + return d->style.selectedTextColor; +} + +bool Format::hasSelectedBackgroundColorOverride() const +{ + return d->style.selectedBackgroundColor; +} + void FormatPrivate::load(QXmlStreamReader& reader) { diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/format.h b/src/libs/3rdparty/syntax-highlighting/src/lib/format.h index 24c58e73f65..7c1b9602bab 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/format.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/format.h @@ -28,7 +28,6 @@ #include "theme.h" #include -#include QT_BEGIN_NAMESPACE class QColor; @@ -139,6 +138,70 @@ public: */ bool spellCheck() const; + /** Returns @c true if the syntax definition file sets a value for the bold text + * attribute and, therefore, overrides the theme and the default formatting + * style. If the return is @p true, this value is obtained by isBold(). + * @see isBold() + * @since 5.62 + */ + bool hasBoldOverride() const; + + /** Returns @c true if the syntax definition file sets a value for the italic text + * attribute and, therefore, overrides the theme and the default formatting style. + * If the return is @p true, this value is obtained by isItalic(). + * @see isItalic() + * @since 5.62 + */ + bool hasItalicOverride() const; + + /** Returns @c true if the syntax definition file sets a value for the underlined + * text attribute and, therefore, overrides the theme and the default formatting + * style. If the return is @p true, this value is obtained by isUnderline(). + * @see isUnderline() + * @since 5.62 + */ + bool hasUnderlineOverride() const; + + /** Returns @c true if the syntax definition file specifies a value for the + * struck through text attribute. If the return is @p true, this value + * is obtained by isStrikeThrough(). + * @see isStrikeThrough() + * @since 5.62 + */ + bool hasStrikeThroughOverride() const; + + /** Returns @c true if the syntax definition file sets a value for the foreground + * text color attribute and, therefore, overrides the theme and the default formatting + * style. If the return is @p true, this value is obtained by textColor(). + * @see textColor(), hasTextColor() + * @since 5.62 + */ + bool hasTextColorOverride() const; + + /** Returns @c true if the syntax definition file sets a value for the background + * color attribute and, therefore, overrides the theme and the default formatting + * style. If the return is @p true, this value is obtained by backgroundColor(). + * @see backgroundColor(), hasBackgroundColor() + * @since 5.62 + */ + bool hasBackgroundColorOverride() const; + + /** Returns @c true if the syntax definition file specifies a value for the + * selected text color attribute. If the return is @p true, this value is + * obtained by selectedTextColor(). + * @see selectedTextColor() + * @since 5.62 + */ + bool hasSelectedTextColorOverride() const; + + /** Returns @c true if the syntax definition file specifies a value for the + * selected background color attribute. If the return is @p true, this + * value is obtained by selectedBackgroundColor(). + * @see selectedBackgroundColor() + * @since 5.62 + */ + bool hasSelectedBackgroundColorOverride() const; + private: friend class FormatPrivate; QExplicitlySharedDataPointer d; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp index 4ebd465b779..224fb72c34d 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/htmlhighlighter.cpp @@ -29,7 +29,6 @@ #include "theme.h" #include "ksyntaxhighlighting_logging.h" -#include #include #include #include diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp index f042baac27d..144ced2c00c 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist.cpp @@ -26,7 +26,6 @@ #include "definition_p.h" #include "ksyntaxhighlighting_logging.h" -#include #include #include diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist_p.h index 25d0022dbef..f99a027823e 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/keywordlist_p.h @@ -24,9 +24,8 @@ #ifndef KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H #define KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H -#include #include -#include +#include #include @@ -60,6 +59,14 @@ public: return m_keywords; } + void setKeywordList(const QStringList& keywords) + { + m_keywords = keywords; + m_keywordsSortedCaseSensitive.clear(); + m_keywordsSortedCaseInsensitive.clear(); + initLookupForCaseSensitivity(m_caseSensitive); + } + /** Checks if @p str is a keyword in this list. */ bool contains(const QStringRef &str) const { diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp index aaba9616dcf..c4e4889fa29 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/repository.cpp @@ -30,7 +30,6 @@ #include "ksyntaxhighlighting_logging.h" #include "wildcardmatcher_p.h" -#include #include #include #include diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp index d9cf5eb2116..79b110d70a3 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/rule.cpp @@ -101,9 +101,6 @@ Definition Rule::definition() const void Rule::setDefinition(const Definition &def) { m_def = def; - - // cache for DefinitionData::wordDelimiters, is accessed VERY often - m_wordDelimiter = &DefinitionData::get(m_def.definition())->wordDelimiters; } bool Rule::load(QXmlStreamReader &reader) @@ -140,6 +137,9 @@ bool Rule::load(QXmlStreamReader &reader) void Rule::resolveContext() { m_context.resolve(m_def.definition()); + + // cache for DefinitionData::wordDelimiters, is accessed VERY often + m_wordDelimiter = &DefinitionData::get(m_def.definition())->wordDelimiters; } void Rule::resolveAttributeFormat(Context *lookupContext) @@ -612,8 +612,10 @@ MatchResult RegExpr::doMatch(const QString& text, int offset, const QStringList /** * no match + * the pattern of a dynamic regex depends on the previous contexts + * so that skipOffset cannot be computed */ - return MatchResult(offset, result.capturedStart()); + return MatchResult(offset, m_dynamic ? 0 : result.capturedStart()); } @@ -650,13 +652,17 @@ MatchResult WordDetect::doMatch(const QString& text, int offset, const QStringLi if (text.size() - offset < m_word.size()) return offset; - if (offset > 0 && !isWordDelimiter(text.at(offset - 1))) + /** + * detect delimiter characters on the inner and outer boundaries of the string + * NOTE: m_word isn't empty + */ + if (offset > 0 && !isWordDelimiter(text.at(offset - 1)) && !isWordDelimiter(text.at(offset))) return offset; if (text.midRef(offset, m_word.size()).compare(m_word, m_caseSensitivity) != 0) return offset; - if (text.size() == offset + m_word.size() || isWordDelimiter(text.at(offset + m_word.size()))) + if (text.size() == offset + m_word.size() || isWordDelimiter(text.at(offset + m_word.size())) || isWordDelimiter(text.at(offset + m_word.size() - 1))) return offset + m_word.size(); return offset; diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h index 538fdeda8a9..4ddee3cbfd9 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/rule_p.h @@ -34,7 +34,6 @@ #include #include -#include #include diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/state.h b/src/libs/3rdparty/syntax-highlighting/src/lib/state.h index fce4bc71e8c..865589f28e6 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/state.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/state.h @@ -27,7 +27,6 @@ #include "ksyntaxhighlighting_export.h" #include -#include namespace KSyntaxHighlighting { diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp index 4987dc95f08..89663d8af31 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/syntaxhighlighter.cpp @@ -29,7 +29,6 @@ #include "state.h" #include "theme.h" -#include Q_DECLARE_METATYPE(QTextBlock) diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/textstyledata_p.h b/src/libs/3rdparty/syntax-highlighting/src/lib/textstyledata_p.h index 40c5ef679ed..50980e0aa02 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/textstyledata_p.h +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/textstyledata_p.h @@ -24,7 +24,6 @@ #ifndef KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H #define KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H -#include namespace KSyntaxHighlighting { diff --git a/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp b/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp index eac9a92264a..9e9f7b913c0 100644 --- a/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp +++ b/src/libs/3rdparty/syntax-highlighting/src/lib/themedata.cpp @@ -32,7 +32,6 @@ #include #include -#include using namespace KSyntaxHighlighting; diff --git a/src/plugins/boot2qt/qdbdevice.cpp b/src/plugins/boot2qt/qdbdevice.cpp index e8b8186b505..2f1ae79b00e 100644 --- a/src/plugins/boot2qt/qdbdevice.cpp +++ b/src/plugins/boot2qt/qdbdevice.cpp @@ -251,7 +251,7 @@ public: QdbDeviceWizard(QWidget *parent) : QWizard(parent) { - setWindowTitle(QdbDeviceWizard::tr("Boot2Qt Network Device Setup")); + setWindowTitle(QdbDevice::tr("Boot2Qt Network Device Setup")); settingsPage.setCommitPage(true); enum { SettingsPageId }; diff --git a/src/plugins/boot2qt/qdbdevice.h b/src/plugins/boot2qt/qdbdevice.h index a0f6f9338f3..214db74a524 100644 --- a/src/plugins/boot2qt/qdbdevice.h +++ b/src/plugins/boot2qt/qdbdevice.h @@ -34,6 +34,8 @@ namespace Internal { class QdbDevice : public RemoteLinux::LinuxDevice { + Q_DECLARE_TR_FUNCTIONS(Qdb::Internal::QdbDevice) + public: typedef QSharedPointer Ptr; typedef QSharedPointer ConstPtr; diff --git a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp index 72d55615567..c7e7d645aa8 100644 --- a/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp +++ b/src/plugins/cmakeprojectmanager/configmodelitemdelegate.cpp @@ -106,7 +106,7 @@ void ConfigModelItemDelegate::setModelData(QWidget *editor, QAbstractItemModel * if (data.type == ConfigModel::DataItem::FILE || data.type == ConfigModel::DataItem::DIRECTORY) { auto edit = static_cast(editor); if (edit->rawPath() != data.value) - model->setData(index, edit->fileName().toUserOutput(), Qt::EditRole); + model->setData(index, edit->fileName().toString(), Qt::EditRole); return; } else if (!data.values.isEmpty()) { auto edit = static_cast(editor); diff --git a/src/plugins/ctfvisualizer/ctfstatisticsmodel.h b/src/plugins/ctfvisualizer/ctfstatisticsmodel.h index 434d7c9c96b..32ae272173e 100644 --- a/src/plugins/ctfvisualizer/ctfstatisticsmodel.h +++ b/src/plugins/ctfvisualizer/ctfstatisticsmodel.h @@ -39,6 +39,7 @@ namespace Internal { class CtfStatisticsModel : public QAbstractTableModel { + Q_OBJECT public: enum Role { diff --git a/src/plugins/ctfvisualizer/ctftracemanager.cpp b/src/plugins/ctfvisualizer/ctftracemanager.cpp index 52859e08b14..157c565a32f 100644 --- a/src/plugins/ctfvisualizer/ctftracemanager.cpp +++ b/src/plugins/ctfvisualizer/ctftracemanager.cpp @@ -153,7 +153,7 @@ void CtfTraceManager::addEvent(const json &event) } } -void CtfVisualizer::Internal::CtfTraceManager::load(const QString &filename) +void CtfTraceManager::load(const QString &filename) { clearAll(); diff --git a/src/plugins/genericprojectmanager/genericprojectplugin.cpp b/src/plugins/genericprojectmanager/genericprojectplugin.cpp index b585980c3bc..983f0363f9c 100644 --- a/src/plugins/genericprojectmanager/genericprojectplugin.cpp +++ b/src/plugins/genericprojectmanager/genericprojectplugin.cpp @@ -99,8 +99,7 @@ GenericProjectPluginPrivate::GenericProjectPluginPrivate() genericProject->editFilesTriggered(); }); - - const auto removeDirAction = new QAction(tr("Remove Directory"), this); + const auto removeDirAction = new QAction(GenericProjectPlugin::tr("Remove Directory"), this); Command * const cmd = ActionManager::registerAction(removeDirAction, "GenericProject.RemoveDir", Context(PEC::C_PROJECT_TREE)); ActionManager::actionContainer(PEC::M_FOLDERCONTEXT)->addAction(cmd, PEC::G_FOLDER_OTHER); diff --git a/src/plugins/help/qlitehtml/container_qpainter.cpp b/src/plugins/help/qlitehtml/container_qpainter.cpp index 0e621648ddc..ebf6c095f41 100644 --- a/src/plugins/help/qlitehtml/container_qpainter.cpp +++ b/src/plugins/help/qlitehtml/container_qpainter.cpp @@ -1165,7 +1165,7 @@ void DocumentContainer::findText(const QString &text, return Selection::Element{e.element, e.index, fm.size(0, text.left(e.index)).width()}; }; - QString term = text; + QString term = QRegularExpression::escape(text); if (flags & QTextDocument::FindWholeWords) term = QString("\\b%1\\b").arg(term); const QRegularExpression::PatternOptions patternOptions diff --git a/src/plugins/ios/iosbuildstep.cpp b/src/plugins/ios/iosbuildstep.cpp index 2ca3db27437..bbcc3937f6c 100644 --- a/src/plugins/ios/iosbuildstep.cpp +++ b/src/plugins/ios/iosbuildstep.cpp @@ -79,14 +79,14 @@ public: : BuildStepConfigWidget(buildStep), m_buildStep(buildStep) { auto buildArgumentsLabel = new QLabel(this); - buildArgumentsLabel->setText(tr("Base arguments:")); + buildArgumentsLabel->setText(IosBuildStep::tr("Base arguments:")); m_buildArgumentsTextEdit = new QPlainTextEdit(this); m_buildArgumentsTextEdit->setPlainText(QtcProcess::joinArgs(m_buildStep->baseArguments())); m_resetDefaultsButton = new QPushButton(this); m_resetDefaultsButton->setLayoutDirection(Qt::RightToLeft); - m_resetDefaultsButton->setText(tr("Reset Defaults")); + m_resetDefaultsButton->setText(IosBuildStep::tr("Reset Defaults")); m_resetDefaultsButton->setEnabled(!m_buildStep->m_useDefaultArguments); auto extraArgumentsLabel = new QLabel(this); @@ -101,9 +101,9 @@ public: gridLayout->addWidget(extraArgumentsLabel, 2, 0, 1, 1); gridLayout->addWidget(m_extraArgumentsLineEdit, 2, 1, 1, 1); - extraArgumentsLabel->setText(tr("Extra arguments:")); + extraArgumentsLabel->setText(IosBuildStep::tr("Extra arguments:")); - setDisplayName(tr("iOS build", "iOS BuildStep display name.")); + setDisplayName(IosBuildStep::tr("iOS build", "iOS BuildStep display name.")); updateDetails(); diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 3757800a070..c036646c59e 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -377,7 +377,7 @@ void Client::activateDocument(TextEditor::TextDocument *document) for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) { updateEditorToolBar(editor); if (auto textEditor = qobject_cast(editor)) - textEditor->editorWidget()->addHoverHandler(hoverHandler()); + textEditor->editorWidget()->addHoverHandler(&m_hoverHandler); } } @@ -387,6 +387,10 @@ void Client::deactivateDocument(TextEditor::TextDocument *document) resetAssistProviders(document); if (TextEditor::SyntaxHighlighter *highlighter = document->syntaxHighlighter()) highlighter->clearAllExtraFormats(); + for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) { + if (auto textEditor = qobject_cast(editor)) + textEditor->editorWidget()->removeHoverHandler(&m_hoverHandler); + } } bool Client::documentOpen(TextEditor::TextDocument *document) const diff --git a/src/plugins/mcusupport/mcusupportconstants.h b/src/plugins/mcusupport/mcusupportconstants.h index 2cc5bee41a1..4643ed34758 100644 --- a/src/plugins/mcusupport/mcusupportconstants.h +++ b/src/plugins/mcusupport/mcusupportconstants.h @@ -34,6 +34,7 @@ const char DEVICE_ID[] = "McuSupport.Device"; const char MCUSUPPORT_QT_VERSION[] = "Qt4ProjectManager.QtVersion.McuSupport"; const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration"; const char SETTINGS_ID[] = "CC.McuSupport.Configuration"; +const char KIT_BOARD_VENDOR_KEY[] = "McuSupport.BoardVendor"; const char KIT_BOARD_MODEL_KEY[] = "McuSupport.BoardModel"; const char ENVVAR_ARMGCC_DIR[] = "ARMGCC_DIR"; diff --git a/src/plugins/mcusupport/mcusupportoptions.cpp b/src/plugins/mcusupport/mcusupportoptions.cpp index 9cbd8a5a834..4352f49f1fd 100644 --- a/src/plugins/mcusupport/mcusupportoptions.cpp +++ b/src/plugins/mcusupport/mcusupportoptions.cpp @@ -198,10 +198,13 @@ void PackageOptions::updateStatus() m_statusLabel->setText(statusText); } -BoardOptions::BoardOptions(const QString &model, const QString &toolChainFileName, +BoardOptions::BoardOptions(const QString &vendor, const QString &model, + const QString &toolChainFileName, const QString &qulPlatform, const QVector &packages) - : m_model(model) + : m_vendor(vendor) + , m_model(model) , m_toolChainFile(toolChainFileName) + , m_qulPlatform(qulPlatform) , m_packages(packages) { } @@ -216,11 +219,21 @@ QString BoardOptions::toolChainFile() const return m_toolChainFile; } +QString BoardOptions::qulPlatform() const +{ + return m_qulPlatform; +} + QVector BoardOptions::packages() const { return m_packages; } +QString BoardOptions::vendor() const +{ + return m_vendor; +} + static PackageOptions *createQulPackage() { auto result = new PackageOptions( @@ -313,7 +326,8 @@ static PackageOptions *createSeggerJLinkPackage() { const QString defaultPath = Utils::HostOsInfo::isWindowsHost() ? - QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles")) + "/SEGGER/JLink" + QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles(x86)")) + + "/SEGGER/JLink" : QString("%{Env:SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH}"); auto result = new PackageOptions( PackageOptions::tr("SEGGER JLink"), @@ -342,15 +356,21 @@ McuSupportOptions::McuSupportOptions(QObject *parent) qulPackage}; auto nxpPackages = {armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage}; + auto desktopPackages = {qulPackage}; packages = {armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage}; - boards.append(new BoardOptions( - "stm32f7508", "CMake/stm32f7508-discovery.cmake", stmPackages)); - boards.append(new BoardOptions( - "stm32f769i", "CMake/stm32f769i-discovery.cmake", stmPackages)); - boards.append(new BoardOptions( - "evkbimxrt1050", "CMake/evkbimxrt1050-toolchain.cmake", nxpPackages)); + const QString vendorStm = "STM"; + const QString vendorNxp = "NXP"; + const QString vendorQt = "Qt"; + boards.append(new BoardOptions(vendorStm, + "stm32f7508", "CMake/stm32f7508-discovery.cmake", "", stmPackages)); + boards.append(new BoardOptions(vendorStm, + "stm32f769i", "CMake/stm32f769i-discovery.cmake", "", stmPackages)); + boards.append(new BoardOptions(vendorNxp, + "evkbimxrt1050", "CMake/evkbimxrt1050-toolchain.cmake", "", nxpPackages)); + boards.append(new BoardOptions(vendorQt, + "Desktop", "", "Qt", desktopPackages)); for (auto package : packages) connect(package, &PackageOptions::changed, [this](){ @@ -400,17 +420,24 @@ static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path, return toolChain; } +static bool isDesktop(const BoardOptions* board) +{ + return board->qulPlatform() == "Qt"; +} + static void setKitProperties(ProjectExplorer::Kit *k, const BoardOptions* board) { using namespace ProjectExplorer; - k->setUnexpandedDisplayName("Qt MCU - " + board->model()); + k->setUnexpandedDisplayName("QtMCU - " + board->model()); + k->setValue(Constants::KIT_BOARD_VENDOR_KEY, board->vendor()); k->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model()); k->setAutoDetected(false); - k->setIrrelevantAspects({ - SysRootKitAspect::id(), - "QtSupport.QtInformation" // QtKitAspect::id() - }); + if (!isDesktop(board)) { + k->setIrrelevantAspects({SysRootKitAspect::id(), + "QtSupport.QtInformation" // QtKitAspect::id() + }); + } } static void setKitToolchains(ProjectExplorer::Kit *k, const QString &armGccPath) @@ -483,9 +510,18 @@ static void setKitCMakeOptions(ProjectExplorer::Kit *k, const BoardOptions* boar using namespace CMakeProjectManager; CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); - config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", - ("%{CurrentBuild:Env:Qul_DIR}/" + - board->toolChainFile()).toUtf8())); + if (!board->toolChainFile().isEmpty()) + config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", + ("%{CurrentBuild:Env:Qul_DIR}/" + + board->toolChainFile()).toUtf8())); + if (!board->qulPlatform().isEmpty()) + config.append(CMakeConfigItem("QUL_PLATFORM", + board->qulPlatform().toUtf8())); + if (isDesktop(board)) { + config.append(CMakeConfigItem("CMAKE_PREFIX_PATH", "%{Qt:QT_INSTALL_PREFIX}")); + // TODO: Hack! Implement color depth variants of all targets + config.append(CMakeConfigItem("QUL_COLOR_DEPTH", "32")); + } CMakeConfigurationKitAspect::setConfiguration(k, config); if (Utils::HostOsInfo::isWindowsHost()) CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM"); @@ -504,9 +540,11 @@ ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board) KitGuard kitGuard(k); setKitProperties(k, board); - setKitToolchains(k, armGccPath); - setKitDebugger(k, armGccPath); - setKitDevice(k); + if (!isDesktop(board)) { + setKitToolchains(k, armGccPath); + setKitDebugger(k, armGccPath); + setKitDevice(k); + } setKitEnvironment(k, board); setKitCMakeOptions(k, board); diff --git a/src/plugins/mcusupport/mcusupportoptions.h b/src/plugins/mcusupport/mcusupportoptions.h index 3df2d065aba..f7f2d84b390 100644 --- a/src/plugins/mcusupport/mcusupportoptions.h +++ b/src/plugins/mcusupport/mcusupportoptions.h @@ -101,16 +101,20 @@ class BoardOptions : public QObject Q_OBJECT public: - BoardOptions(const QString &model, const QString &toolChainFile, - const QVector &packages); + BoardOptions(const QString &vendor, const QString &model, const QString &toolChainFile, + const QString &qulPlatform, const QVector &packages); + QString vendor() const; QString model() const; QString toolChainFile() const; + QString qulPlatform() const; QVector packages() const; private: + const QString m_vendor; const QString m_model; const QString m_toolChainFile; + const QString m_qulPlatform; const QVector m_packages; }; diff --git a/src/plugins/mcusupport/mcusupportoptionspage.cpp b/src/plugins/mcusupport/mcusupportoptionspage.cpp index 9057e2a054b..02c2044cf40 100644 --- a/src/plugins/mcusupport/mcusupportoptionspage.cpp +++ b/src/plugins/mcusupport/mcusupportoptionspage.cpp @@ -108,14 +108,14 @@ void McuSupportOptionsWidget::updateStatus() { const QVector validBoards = m_options->validBoards(); m_statusLabel->setText(validBoards.isEmpty() - ? McuSupportOptionsPage::tr("No devices and kits can currently be generated. " - "Select a board and provide the package paths. " - "Afterwards, press Apply to generate device and kit for " + ? McuSupportOptionsPage::tr("No kits can currently be generated. " + "Select a target and provide the package paths. " + "Afterwards, press Apply to generate a kit for " "your board.") - : McuSupportOptionsPage::tr("Devices and kits for the following boards can be generated: " + : McuSupportOptionsPage::tr("Kits for the following targets can be generated: " "%1 " - "Press Apply to generate device and kit for " - "your board.").arg(ulOfBoardModels(validBoards))); + "Press Apply to generate a kit for " + "your target.").arg(ulOfBoardModels(validBoards))); } void McuSupportOptionsWidget::showBoardPackages(int boardIndex) diff --git a/src/plugins/mcusupport/mcusupportrunconfiguration.cpp b/src/plugins/mcusupport/mcusupportrunconfiguration.cpp index 4ec72227e16..83acc2035bf 100644 --- a/src/plugins/mcusupport/mcusupportrunconfiguration.cpp +++ b/src/plugins/mcusupport/mcusupportrunconfiguration.cpp @@ -49,37 +49,39 @@ static CommandLine flashAndRunCommand(Target *target) const CMakeProjectManager::CMakeTool *tool = CMakeProjectManager::CMakeKitAspect::cmakeTool(target->kit()); + // TODO: Hack! Implement flash target name handling, properly + const QString targetName = + target->kit()->value(Constants::KIT_BOARD_VENDOR_KEY).toString() == "NXP" + ? QString("flash_%1").arg(projectName) + : QString("flash_%1_and_bootloader").arg(projectName); + return CommandLine(tool->filePath(), { "--build", ".", "--target", - QString("flash_%1_and_bootloader").arg(projectName) + targetName }); } -class FlashAndRunConfiguration : public ProjectExplorer::RunConfiguration +FlashAndRunConfiguration::FlashAndRunConfiguration(Target *target, Core::Id id) + : RunConfiguration(target, id) { -public: - FlashAndRunConfiguration(Target *target, Core::Id id) - : RunConfiguration(target, id) - { - auto effectiveFlashAndRunCall = addAspect(); - effectiveFlashAndRunCall->setLabelText(tr("Effective flash and run call:")); - effectiveFlashAndRunCall->setDisplayStyle(BaseStringAspect::TextEditDisplay); - effectiveFlashAndRunCall->setReadOnly(true); + auto effectiveFlashAndRunCall = addAspect(); + effectiveFlashAndRunCall->setLabelText(tr("Effective flash and run call:")); + effectiveFlashAndRunCall->setDisplayStyle(BaseStringAspect::TextEditDisplay); - auto updateConfiguration = [target, effectiveFlashAndRunCall] { - effectiveFlashAndRunCall->setValue(flashAndRunCommand(target).toUserOutput()); - }; + auto updateConfiguration = [target, effectiveFlashAndRunCall] { + effectiveFlashAndRunCall->setValue(flashAndRunCommand(target).toUserOutput()); + }; - updateConfiguration(); + updateConfiguration(); - connect(target->activeBuildConfiguration(), &BuildConfiguration::buildDirectoryChanged, - this, updateConfiguration); - connect(target->project(), &Project::displayNameChanged, - this, updateConfiguration); - } -}; + connect(target->activeBuildConfiguration(), + &BuildConfiguration::buildDirectoryChanged, + this, + updateConfiguration); + connect(target->project(), &Project::displayNameChanged, this, updateConfiguration); +} class FlashAndRunWorker : public SimpleTargetRunner { diff --git a/src/plugins/mcusupport/mcusupportrunconfiguration.h b/src/plugins/mcusupport/mcusupportrunconfiguration.h index 2ab9c65380a..b53eea03a4a 100644 --- a/src/plugins/mcusupport/mcusupportrunconfiguration.h +++ b/src/plugins/mcusupport/mcusupportrunconfiguration.h @@ -37,6 +37,14 @@ public: EmrunRunConfigurationFactory(); }; +class FlashAndRunConfiguration : public ProjectExplorer::RunConfiguration +{ + Q_OBJECT + +public: + FlashAndRunConfiguration(ProjectExplorer::Target *target, Core::Id id); +}; + ProjectExplorer::RunWorkerFactory::WorkerCreator makeFlashAndRunWorker(); } // namespace Internal diff --git a/src/plugins/projectexplorer/environmentaspect.cpp b/src/plugins/projectexplorer/environmentaspect.cpp index a3c2cb4b23d..d34b32170fc 100644 --- a/src/plugins/projectexplorer/environmentaspect.cpp +++ b/src/plugins/projectexplorer/environmentaspect.cpp @@ -73,12 +73,20 @@ void EnvironmentAspect::setUserEnvironmentChanges(const Utils::EnvironmentItems Utils::Environment EnvironmentAspect::environment() const { - QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment()); - Environment env = baseEnvironment(); + Environment env = modifiedBaseEnvironment(); env.modify(m_userChanges); return env; } +Environment EnvironmentAspect::modifiedBaseEnvironment() const +{ + QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment()); + Environment env = m_baseEnvironments.at(m_base).unmodifiedBaseEnvironment(); + for (const EnvironmentModifier &modifier : m_modifiers) + modifier(env); + return env; +} + const QStringList EnvironmentAspect::displayNames() const { return Utils::transform(m_baseEnvironments, &BaseEnvironment::displayName); @@ -122,15 +130,6 @@ void EnvironmentAspect::toMap(QVariantMap &data) const data.insert(QLatin1String(CHANGES_KEY), Utils::EnvironmentItem::toStringList(m_userChanges)); } -Environment EnvironmentAspect::baseEnvironment() const -{ - QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment()); - Environment env = m_baseEnvironments.at(m_base).unmodifiedBaseEnvironment(); - for (const EnvironmentModifier &modifier : m_modifiers) - modifier(env); - return env; -} - QString EnvironmentAspect::currentDisplayName() const { QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return {}); diff --git a/src/plugins/projectexplorer/environmentaspect.h b/src/plugins/projectexplorer/environmentaspect.h index 5b73f93e631..f79f9e29738 100644 --- a/src/plugins/projectexplorer/environmentaspect.h +++ b/src/plugins/projectexplorer/environmentaspect.h @@ -46,6 +46,9 @@ public: // The environment including the user's modifications. Utils::Environment environment() const; + // Environment including modifiers, but without explicit user changes. + Utils::Environment modifiedBaseEnvironment() const; + int baseEnvironmentBase() const; void setBaseEnvironmentBase(int base); @@ -57,8 +60,6 @@ public: void addPreferredBaseEnvironment(const QString &displayName, const std::function &getter); - // The environment the user chose as base for his modifications. - Utils::Environment baseEnvironment() const; QString currentDisplayName() const; const QStringList displayNames() const; diff --git a/src/plugins/projectexplorer/environmentaspectwidget.cpp b/src/plugins/projectexplorer/environmentaspectwidget.cpp index d287f3b771f..280cc5ac9da 100644 --- a/src/plugins/projectexplorer/environmentaspectwidget.cpp +++ b/src/plugins/projectexplorer/environmentaspectwidget.cpp @@ -75,7 +75,7 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect, QWid const EnvironmentWidget::Type widgetType = aspect->isLocal() ? EnvironmentWidget::TypeLocal : EnvironmentWidget::TypeRemote; m_environmentWidget = new EnvironmentWidget(this, widgetType, baseEnvironmentWidget); - m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); + m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment()); m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName()); m_environmentWidget->setUserChanges(m_aspect->userEnvironmentChanges()); m_environmentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); @@ -106,7 +106,7 @@ void EnvironmentAspectWidget::baseEnvironmentSelected(int idx) { m_ignoreChange = true; m_aspect->setBaseEnvironmentBase(idx); - m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); + m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment()); m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName()); m_ignoreChange = false; } @@ -122,7 +122,7 @@ void EnvironmentAspectWidget::changeBaseEnvironment() m_baseEnvironmentComboBox->setCurrentIndex(i); } m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName()); - m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); + m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment()); } void EnvironmentAspectWidget::userChangesEdited() @@ -143,7 +143,7 @@ void EnvironmentAspectWidget::environmentChanged() { if (m_ignoreChange) return; - m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); + m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment()); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectwelcomepage.cpp b/src/plugins/projectexplorer/projectwelcomepage.cpp index 8d74b3f6484..37e1a97168d 100644 --- a/src/plugins/projectexplorer/projectwelcomepage.cpp +++ b/src/plugins/projectexplorer/projectwelcomepage.cpp @@ -499,9 +499,10 @@ public: class TreeView : public QTreeView { public: - TreeView(QWidget *parent) + TreeView(QWidget *parent, const QString &name) : QTreeView(parent) { + setObjectName(name); header()->hide(); setMouseTracking(true); // To enable hover. setIndentation(0); @@ -559,13 +560,13 @@ public: recentProjectsLabel->setFont(sizedFont(16, this)); recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects")); - auto sessionsList = new TreeView(this); + auto sessionsList = new TreeView(this, "Sessions"); sessionsList->setModel(projectWelcomePage->m_sessionModel); sessionsList->header()->setSectionHidden(1, true); // The "last modified" column. sessionsList->setItemDelegate(&m_sessionDelegate); sessionsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - auto projectsList = new TreeView(this); + auto projectsList = new TreeView(this, "Recent Projects"); projectsList->setUniformRowHeights(true); projectsList->setModel(projectWelcomePage->m_projectModel); projectsList->setItemDelegate(&m_projectDelegate); diff --git a/src/plugins/projectexplorer/target.cpp b/src/plugins/projectexplorer/target.cpp index 938b6decc59..f8a0da25e71 100644 --- a/src/plugins/projectexplorer/target.cpp +++ b/src/plugins/projectexplorer/target.cpp @@ -408,9 +408,13 @@ void Target::addRunConfiguration(RunConfiguration *rc) // Check that we don't have a configuration with the same displayName QString configurationDisplayName = rc->displayName(); - QStringList displayNames = Utils::transform(d->m_runConfigurations, &RunConfiguration::displayName); - configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName, displayNames); - rc->setDisplayName(configurationDisplayName); + if (!configurationDisplayName.isEmpty()) { + QStringList displayNames = Utils::transform(d->m_runConfigurations, + &RunConfiguration::displayName); + configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName, + displayNames); + rc->setDisplayName(configurationDisplayName); + } d->m_runConfigurations.push_back(rc); diff --git a/src/plugins/python/python.qbs b/src/plugins/python/python.qbs index 9fd37a47777..6d14917bc3d 100644 --- a/src/plugins/python/python.qbs +++ b/src/plugins/python/python.qbs @@ -10,6 +10,7 @@ QtcPlugin { Depends { name: "TextEditor" } Depends { name: "ProjectExplorer" } Depends { name: "LanguageClient" } + Depends { name: "LanguageServerProtocol" } Group { name: "General" diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index ab5f024765c..567d7735118 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -62,9 +62,9 @@ public: , m_executable(new Utils::PathChooser()) { auto mainLayout = new QGridLayout(); - mainLayout->addWidget(new QLabel(tr("Name:")), 0, 0); + mainLayout->addWidget(new QLabel(PythonSettings::tr("Name:")), 0, 0); mainLayout->addWidget(m_name, 0, 1); - mainLayout->addWidget(new QLabel(tr("Executable")), 1, 0); + mainLayout->addWidget(new QLabel(PythonSettings::tr("Executable")), 1, 0); mainLayout->addWidget(m_executable, 1, 1); m_executable->setExpectedKind(Utils::PathChooser::ExistingCommand); setLayout(mainLayout); @@ -138,12 +138,12 @@ InterpreterOptionsWidget::InterpreterOptionsWidget(const QList &int this, &InterpreterOptionsWidget::currentChanged); auto buttonLayout = new QVBoxLayout(); - auto addButton = new QPushButton(InterpreterOptionsWidget::tr("&Add")); + auto addButton = new QPushButton(PythonSettings::tr("&Add")); connect(addButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::addItem); - m_deleteButton = new QPushButton(InterpreterOptionsWidget::tr("&Delete")); + m_deleteButton = new QPushButton(PythonSettings::tr("&Delete")); m_deleteButton->setEnabled(false); connect(m_deleteButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::deleteItem); - m_makeDefaultButton = new QPushButton(InterpreterOptionsWidget::tr("&Make Default")); + m_makeDefaultButton = new QPushButton(PythonSettings::tr("&Make Default")); m_makeDefaultButton->setEnabled(false); connect(m_makeDefaultButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::makeDefault); mainLayout->addLayout(layout); @@ -230,9 +230,9 @@ private: InterpreterOptionsPage::InterpreterOptionsPage() { setId(Constants::C_PYTHONOPTIONS_PAGE_ID); - setDisplayName(tr("Interpreters")); + setDisplayName(PythonSettings::tr("Interpreters")); setCategory(Constants::C_PYTHON_SETTINGS_CATEGORY); - setDisplayCategory(tr("Python")); + setDisplayCategory(PythonSettings::tr("Python")); setCategoryIcon(Utils::Icon({{":/python/images/settingscategory_python.png", Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint)); } @@ -385,7 +385,7 @@ static void addPythonsFromRegistry(QList &pythons) const FilePath &executable = FilePath::fromUserInput(regVal.toString()); if (executable.exists() && !alreadyRegistered(pythons, executable)) { pythons << Interpreter{QUuid::createUuid().toString(), - name + InterpreterOptionsPage::tr(" (Windowed)"), + name + PythonSettings::tr(" (Windowed)"), FilePath::fromUserInput(regVal.toString())}; } } diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index d0ea258853a..648d4c3e8ee 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -355,7 +355,7 @@ void QbsInstallStepConfigWidget::updateState() m_commandLineTextEdit->setPlainText(command); - setSummaryText(tr("Qbs: %1").arg(command)); + setSummaryText(QbsInstallStep::tr("Qbs: %1").arg(command)); } // -------------------------------------------------------------------- diff --git a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp index 8a935970c04..7cc1d9d7124 100644 --- a/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp +++ b/src/plugins/qmldesigner/components/componentcore/findimplementation.cpp @@ -84,7 +84,7 @@ protected: bool visit(AST::UiPublicMember *node) override { - if (node->memberType->name == m_typeName){ + if (node->memberType && node->memberType->name == m_typeName){ const ObjectValue * objectValue = m_context->lookupType(m_document.data(), QStringList(m_typeName)); if (objectValue == m_typeValue) m_implemenations.append(node->typeToken); diff --git a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp index d6ef557388c..297e815b956 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp +++ b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.cpp @@ -109,7 +109,7 @@ void AlignDistribute::setModelNodeBackend(const QVariant &modelNodeBackend) // The purpose of this function is to suppress the following warning: // Warning: Property declaration modelNodeBackendProperty has no READ accessor // function or associated MEMBER variable. The property will be invalid. -QVariant AlignDistribute::getModelNodeBackend() const +QVariant AlignDistribute::modelNodeBackend() const { return {}; } diff --git a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.h b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.h index 1b2714f7503..9fbbab4b068 100644 --- a/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.h +++ b/src/plugins/qmldesigner/components/propertyeditor/aligndistribute.h @@ -44,7 +44,7 @@ class AlignDistribute : public QObject Q_PROPERTY(bool selectionContainsRootItem READ selectionContainsRootItem NOTIFY modelNodeBackendChanged) - Q_PROPERTY(QVariant modelNodeBackendProperty READ getModelNodeBackend WRITE setModelNodeBackend + Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend NOTIFY modelNodeBackendChanged) public: @@ -68,7 +68,6 @@ public: bool selectionContainsRootItem() const; void setModelNodeBackend(const QVariant &modelNodeBackend); - QVariant getModelNodeBackend() const; static void registerDeclarativeType(); @@ -83,6 +82,9 @@ public: signals: void modelNodeBackendChanged(); +private: + QVariant modelNodeBackend() const; + private: using CompareFunction = std::function; diff --git a/src/plugins/qmldesigner/designercore/include/abstractview.h b/src/plugins/qmldesigner/designercore/include/abstractview.h index 5a8de860c2f..2e549b52b1e 100644 --- a/src/plugins/qmldesigner/designercore/include/abstractview.h +++ b/src/plugins/qmldesigner/designercore/include/abstractview.h @@ -164,6 +164,7 @@ public: bool hasModelNodeForInternalId(qint32 internalId) const; QList allModelNodes() const; + QList allModelNodesOfType(const TypeName &typeName) const; void emitDocumentMessage(const QList &errors, const QList &warnings = QList()); void emitDocumentMessage(const QString &error); diff --git a/src/plugins/qmldesigner/designercore/include/modelnode.h b/src/plugins/qmldesigner/designercore/include/modelnode.h index 9dd636be625..7f943dddd1c 100644 --- a/src/plugins/qmldesigner/designercore/include/modelnode.h +++ b/src/plugins/qmldesigner/designercore/include/modelnode.h @@ -107,6 +107,8 @@ public: bool hasParentProperty() const; const QList directSubModelNodes() const; + const QList directSubModelNodesOfType(const TypeName &typeName) const; + const QList allSubModelNodes() const; const QList allSubModelNodesAndThisNode() const; bool hasAnySubModelNodes() const; diff --git a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h index 0c6693f5059..c075483c2c8 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlitemnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlitemnode.h @@ -57,14 +57,7 @@ public: const QPointF &position, QmlItemNode parentQmlItemNode); - static QmlObjectNode createQmlObjectNode(AbstractView *view, - const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, - QmlItemNode parentQmlItemNode); - static QmlObjectNode createQmlObjectNode(AbstractView *view, - const ItemLibraryEntry &itemLibraryEntry, - const QPointF &position, - NodeAbstractProperty parentproperty); + static QmlItemNode createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, diff --git a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h index 49785d0398b..3150ad61e23 100644 --- a/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h +++ b/src/plugins/qmldesigner/designercore/include/qmlvisualnode.h @@ -33,6 +33,7 @@ #include #include #include +#include namespace QmlDesigner { @@ -44,6 +45,26 @@ class QMLDESIGNERCORE_EXPORT QmlVisualNode : public QmlObjectNode { friend class QmlAnchors; public: + + class Position + { + friend class QmlVisualNode; + public: + Position() {} + Position(const QPointF &position) : + m_2dPos(position) + {} + Position(const QVector3D &position) : + m_3dPos(position) + {} + + QList> propertyPairList() const; + + private: + QPointF m_2dPos; + QVector3D m_3dPos; + }; + QmlVisualNode() : QmlObjectNode() {} QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {} bool isValid() const override; @@ -64,7 +85,31 @@ public: void setVisibilityOverride(bool visible); bool visibilityOverride() const; + void initializePosition(const Position &position); + static bool isItemOr3DNode(const ModelNode &modelNode); + + static QmlObjectNode createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const Position &position, + QmlVisualNode parentQmlItemNode); + + + + + static QmlObjectNode createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const Position &position, + NodeAbstractProperty parentproperty); + + static QmlVisualNode createQmlVisualNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QVector3D &position); + + static NodeListProperty findSceneNodeProperty(AbstractView *view); + +private: + void setDoubleProperty(const PropertyName &name, double value); }; QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node); diff --git a/src/plugins/qmldesigner/designercore/model/abstractview.cpp b/src/plugins/qmldesigner/designercore/model/abstractview.cpp index eb7ed16b9ab..f5e07d9f834 100644 --- a/src/plugins/qmldesigner/designercore/model/abstractview.cpp +++ b/src/plugins/qmldesigner/designercore/model/abstractview.cpp @@ -39,6 +39,7 @@ #include #include +#include #include @@ -635,6 +636,13 @@ QList AbstractView::allModelNodes() const return toModelNodeList(model()->d->allNodes()); } +QList AbstractView::allModelNodesOfType(const TypeName &typeName) const +{ + return Utils::filtered(allModelNodes(), [typeName](const ModelNode &node){ + return node.metaInfo().isValid() && node.metaInfo().isSubclassOf(typeName); + }); +} + void AbstractView::emitDocumentMessage(const QString &error) { emitDocumentMessage({DocumentMessage(error)}); diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index 14ca4a67bfe..1fdc29aaa03 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -42,6 +42,8 @@ #include "nodeproperty.h" #include +#include + #include #include #include @@ -775,6 +777,13 @@ const QList ModelNode::directSubModelNodes() const return toModelNodeList(internalNode()->allDirectSubNodes(), view()); } +const QList ModelNode::directSubModelNodesOfType(const TypeName &typeName) const +{ + return Utils::filtered(directSubModelNodes(), [typeName](const ModelNode &node){ + return node.metaInfo().isValid() && node.metaInfo().isSubclassOf(typeName); + }); +} + /*! \brief returns all ModelNodes that are direct or indirect children of this ModelNode diff --git a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp index 2fc530ff10d..c65a57d34f0 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlitemnode.cpp @@ -93,75 +93,6 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view, return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode)); } -QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, QmlItemNode parentQmlItemNode) -{ - if (!parentQmlItemNode.isValid()) - parentQmlItemNode = QmlItemNode(view->rootModelNode()); - - Q_ASSERT(parentQmlItemNode.isValid()); - - NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty(); - - return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty); -} - -QmlObjectNode QmlItemNode::createQmlObjectNode(AbstractView *view, const ItemLibraryEntry &itemLibraryEntry, const QPointF &position, NodeAbstractProperty parentproperty) -{ - QmlObjectNode newQmlObjectNode; - - view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){ - NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); - - int minorVersion = metaInfo.minorVersion(); - int majorVersion = metaInfo.majorVersion(); - - using PropertyBindingEntry = QPair; - QList propertyBindingList; - QList propertyEnumList; - if (itemLibraryEntry.qmlSource().isEmpty()) { - QList > propertyPairList; - if (!position.isNull()) { - propertyPairList.append({PropertyName("x"), QVariant(qRound(position.x()))}); - propertyPairList.append({PropertyName("y"), QVariant(qRound(position.y()))}); - } - - for (const auto &property : itemLibraryEntry.properties()) { - if (property.type() == QStringLiteral("binding")) { - propertyBindingList.append(PropertyBindingEntry(property.name(), property.value().toString())); - } else if (property.type() == QStringLiteral("enum")) { - propertyEnumList.append(PropertyBindingEntry(property.name(), property.value().toString())); - } else { - propertyPairList.append({property.name(), property.value()}); - } - } - - newQmlObjectNode = QmlItemNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); - } else { - newQmlObjectNode = createQmlItemNodeFromSource(view, itemLibraryEntry.qmlSource(), position); - } - - if (parentproperty.isValid()) - parentproperty.reparentHere(newQmlObjectNode); - - if (!newQmlObjectNode.isValid()) - return; - - newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name())); - - for (const auto &propertyBindingEntry : propertyBindingList) - newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second); - - for (const auto &propertyBindingEntry : propertyEnumList) - newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); - - Q_ASSERT(newQmlObjectNode.isValid()); - }); - - Q_ASSERT(newQmlObjectNode.isValid()); - - return newQmlObjectNode; -} - QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, QmlItemNode parentQmlItemNode) { if (!parentQmlItemNode.isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp index d0598e844ed..e9977d5c98c 100644 --- a/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/qmlvisualnode.cpp @@ -39,6 +39,8 @@ #include "modelmerger.h" #include "rewritingexception.h" +#include + #include #include #include @@ -74,7 +76,6 @@ bool QmlVisualNode::isRootNode() const return modelNode().isValid() && modelNode().isRootNode(); } - QList QmlVisualNode::children() const { QList childrenList; @@ -166,6 +167,23 @@ bool QmlVisualNode::visibilityOverride() const return false; } +void QmlVisualNode::setDoubleProperty(const PropertyName &name, double value) +{ + modelNode().variantProperty(name).setValue(value); +} + +void QmlVisualNode::initializePosition(const QmlVisualNode::Position &position) +{ + if (!position.m_2dPos.isNull()) { + setDoubleProperty("x", qRound(position.m_2dPos.x())); + setDoubleProperty("y", qRound(position.m_2dPos.y())); + } else if (!position.m_3dPos.isNull()) { + setDoubleProperty("x", position.m_3dPos.x()); + setDoubleProperty("y", position.m_3dPos.y()); + setDoubleProperty("z", position.m_3dPos.z()); + } +} + QmlModelStateGroup QmlVisualNode::states() const { if (isValid()) @@ -174,6 +192,131 @@ QmlModelStateGroup QmlVisualNode::states() const return QmlModelStateGroup(); } +QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const Position &position, + QmlVisualNode parentQmlItemNode) +{ + if (!parentQmlItemNode.isValid()) + parentQmlItemNode = QmlVisualNode(view->rootModelNode()); + + Q_ASSERT(parentQmlItemNode.isValid()); + + NodeAbstractProperty parentProperty = parentQmlItemNode.defaultNodeAbstractProperty(); + + return QmlItemNode::createQmlObjectNode(view, itemLibraryEntry, position, parentProperty); +} + + +static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view, + const QString &source, + const QmlVisualNode::Position &position) +{ + QScopedPointer inputModel(Model::create("QtQuick.Item", 1, 0, view->model())); + inputModel->setFileUrl(view->model()->fileUrl()); + QPlainTextEdit textEdit; + + textEdit.setPlainText(source); + NotIndentingTextEditModifier modifier(&textEdit); + + QScopedPointer rewriterView(new RewriterView(RewriterView::Amend, nullptr)); + rewriterView->setCheckSemanticErrors(false); + rewriterView->setTextModifier(&modifier); + inputModel->setRewriterView(rewriterView.data()); + + if (rewriterView->errors().isEmpty() && rewriterView->rootModelNode().isValid()) { + ModelNode rootModelNode = rewriterView->rootModelNode(); + inputModel->detachView(rewriterView.data()); + QmlVisualNode(rootModelNode).initializePosition(position); + ModelMerger merger(view); + return merger.insertModel(rootModelNode); + } + + return {}; +} + +QmlObjectNode QmlVisualNode::createQmlObjectNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const Position &position, + NodeAbstractProperty parentproperty) +{ + QmlObjectNode newQmlObjectNode; + + view->executeInTransaction("QmlItemNode::createQmlItemNode", [=, &newQmlObjectNode, &parentproperty](){ + NodeMetaInfo metaInfo = view->model()->metaInfo(itemLibraryEntry.typeName()); + + int minorVersion = metaInfo.minorVersion(); + int majorVersion = metaInfo.majorVersion(); + + using PropertyBindingEntry = QPair; + QList propertyBindingList; + QList propertyEnumList; + if (itemLibraryEntry.qmlSource().isEmpty()) { + QList > propertyPairList = position.propertyPairList(); + + for (const auto &property : itemLibraryEntry.properties()) { + if (property.type() == "binding") { + propertyBindingList.append(PropertyBindingEntry(property.name(), property.value().toString())); + } else if (property.type() == "enum") { + propertyEnumList.append(PropertyBindingEntry(property.name(), property.value().toString())); + } else { + propertyPairList.append({property.name(), property.value()}); + } + } + + newQmlObjectNode = QmlObjectNode(view->createModelNode(itemLibraryEntry.typeName(), majorVersion, minorVersion, propertyPairList)); + } else { + newQmlObjectNode = createQmlObjectNodeFromSource(view, itemLibraryEntry.qmlSource(), position); + } + + if (parentproperty.isValid()) + parentproperty.reparentHere(newQmlObjectNode); + + if (!newQmlObjectNode.isValid()) + return; + + newQmlObjectNode.setId(view->generateNewId(itemLibraryEntry.name())); + + for (const auto &propertyBindingEntry : propertyBindingList) + newQmlObjectNode.modelNode().bindingProperty(propertyBindingEntry.first).setExpression(propertyBindingEntry.second); + + for (const auto &propertyBindingEntry : propertyEnumList) + newQmlObjectNode.modelNode().variantProperty(propertyBindingEntry.first).setEnumeration(propertyBindingEntry.second.toUtf8()); + + Q_ASSERT(newQmlObjectNode.isValid()); + }); + + Q_ASSERT(newQmlObjectNode.isValid()); + + return newQmlObjectNode; +} + +QmlVisualNode QmlVisualNode::createQmlVisualNode(AbstractView *view, + const ItemLibraryEntry &itemLibraryEntry, + const QVector3D &position) +{ + NodeAbstractProperty sceneNodeProperty = findSceneNodeProperty(view); + QTC_ASSERT(sceneNodeProperty.isValid(), return {}); + ModelNode node = createQmlObjectNode(view, itemLibraryEntry, position, sceneNodeProperty).modelNode(); + + return node; +} + +NodeListProperty QmlVisualNode::findSceneNodeProperty(AbstractView *view) +{ + QTC_ASSERT(view, return {}); + + QList quickViews = view->allModelNodesOfType("QtQuick3D.View3D"); + QTC_ASSERT(!quickViews.isEmpty(), return {}); + const ModelNode quickView = quickViews.first(); + + QList nodes = quickView.directSubModelNodesOfType("QtQuick3D.Node"); + QTC_ASSERT(!nodes.isEmpty(), return {}); + const ModelNode node = nodes.first(); + + return node.defaultNodeListProperty(); +} + QList toModelNodeList(const QList &qmlVisualNodeList) { QList modelNodeList; @@ -263,4 +406,20 @@ QmlModelState QmlModelStateGroup::state(const QString &name) const return QmlModelState(); } +QList > QmlVisualNode::Position::propertyPairList() const +{ + QList > propertyPairList; + + if (!m_2dPos.isNull()) { + propertyPairList.append({"x", QVariant(qRound(m_2dPos.x()))}); + propertyPairList.append({"y", QVariant(qRound(m_2dPos.y()))}); + } else if (!m_3dPos.isNull()) { + propertyPairList.append({"x", QVariant(m_3dPos.x())}); + propertyPairList.append({"y", QVariant(m_3dPos.y())}); + propertyPairList.append({"z", QVariant(m_3dPos.z())}); + } + + return propertyPairList; +} + } //QmlDesigner diff --git a/src/plugins/qmlpreview/qmlpreviewplugin.cpp b/src/plugins/qmlpreview/qmlpreviewplugin.cpp index 876cdb962a5..a5fd38fd2e4 100644 --- a/src/plugins/qmlpreview/qmlpreviewplugin.cpp +++ b/src/plugins/qmlpreview/qmlpreviewplugin.cpp @@ -200,7 +200,7 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent) Core::Context projectTreeContext(Constants::C_PROJECT_TREE); menu = Core::ActionManager::actionContainer(Constants::M_FILECONTEXT); - action = new QAction(tr("Preview File"), this); + action = new QAction(QmlPreviewPlugin::tr("Preview File"), this); action->setEnabled(false); connect(q, &QmlPreviewPlugin::runningPreviewsChanged, action, [action](const QmlPreviewRunControlList &previews) { diff --git a/src/plugins/qnx/qnxanalyzesupport.h b/src/plugins/qnx/qnxanalyzesupport.h index bcf92ae0a0c..3c992141977 100644 --- a/src/plugins/qnx/qnxanalyzesupport.h +++ b/src/plugins/qnx/qnxanalyzesupport.h @@ -32,6 +32,8 @@ namespace Internal { class QnxQmlProfilerSupport : public ProjectExplorer::SimpleTargetRunner { + Q_DECLARE_TR_FUNCTIONS(Qnx::Internal::QnxQmlProfilerSupport) + public: explicit QnxQmlProfilerSupport(ProjectExplorer::RunControl *runControl); }; diff --git a/src/plugins/texteditor/behaviorsettingspage.cpp b/src/plugins/texteditor/behaviorsettingspage.cpp index 833620ef977..8fda3634e8a 100644 --- a/src/plugins/texteditor/behaviorsettingspage.cpp +++ b/src/plugins/texteditor/behaviorsettingspage.cpp @@ -195,7 +195,7 @@ void BehaviorSettingsPage::apply() if (s) { s->setValue(QLatin1String(Core::Constants::SETTINGS_DEFAULTTEXTENCODING), - d->m_page->behaviorWidget->assignedCodec()->name()); + d->m_page->behaviorWidget->assignedCodecName()); } } diff --git a/src/plugins/texteditor/behaviorsettingswidget.cpp b/src/plugins/texteditor/behaviorsettingswidget.cpp index e528a23812a..85f9e222810 100644 --- a/src/plugins/texteditor/behaviorsettingswidget.cpp +++ b/src/plugins/texteditor/behaviorsettingswidget.cpp @@ -28,6 +28,9 @@ #include "tabsettingswidget.h" +#include +#include + #include #include #include @@ -132,17 +135,30 @@ void BehaviorSettingsWidget::setActive(bool active) void BehaviorSettingsWidget::setAssignedCodec(QTextCodec *codec) { + const QString codecName = Core::ICore::settings()->value( + Core::Constants::SETTINGS_DEFAULTTEXTENCODING).toString(); + + int rememberedSystemPosition = -1; for (int i = 0; i < d->m_codecs.size(); ++i) { if (codec == d->m_codecs.at(i)) { - d->m_ui.encodingBox->setCurrentIndex(i); - break; + if (d->m_ui.encodingBox->itemText(i) == codecName) { + d->m_ui.encodingBox->setCurrentIndex(i); + return; + } else { // we've got System matching encoding - but have explicitly set the codec + rememberedSystemPosition = i; + } } } + if (rememberedSystemPosition != -1) + d->m_ui.encodingBox->setCurrentIndex(rememberedSystemPosition); } -QTextCodec *BehaviorSettingsWidget::assignedCodec() const +QByteArray BehaviorSettingsWidget::assignedCodecName() const { - return d->m_codecs.at(d->m_ui.encodingBox->currentIndex()); + return d->m_ui.encodingBox->currentIndex() == 0 + ? QByteArray("System") // we prepend System to the available codecs + : d->m_codecs.at(d->m_ui.encodingBox->currentIndex())->name(); + } void BehaviorSettingsWidget::setCodeStyle(ICodeStylePreferences *preferences) diff --git a/src/plugins/texteditor/behaviorsettingswidget.h b/src/plugins/texteditor/behaviorsettingswidget.h index 9bdfec5bc18..4cbb7709f34 100644 --- a/src/plugins/texteditor/behaviorsettingswidget.h +++ b/src/plugins/texteditor/behaviorsettingswidget.h @@ -55,7 +55,7 @@ public: void setActive(bool active); void setAssignedCodec(QTextCodec *codec); - QTextCodec *assignedCodec() const; + QByteArray assignedCodecName() const; void setCodeStyle(ICodeStylePreferences *preferences); diff --git a/src/plugins/texteditor/highlighter.cpp b/src/plugins/texteditor/highlighter.cpp index 09f9b88ff91..19f0656a152 100644 --- a/src/plugins/texteditor/highlighter.cpp +++ b/src/plugins/texteditor/highlighter.cpp @@ -260,6 +260,7 @@ void Highlighter::downloadDefinitions(std::function callback) { Core::MessageManager::write(tr("Highlighter updates: done"), Core::MessageManager::ModeSwitch); downloader->deleteLater(); + reload(); if (callback) callback(); }); diff --git a/src/plugins/texteditor/texteditor.cpp b/src/plugins/texteditor/texteditor.cpp index 1cedb6bad95..df51f2bfe21 100644 --- a/src/plugins/texteditor/texteditor.cpp +++ b/src/plugins/texteditor/texteditor.cpp @@ -3104,10 +3104,7 @@ void TextEditorWidgetPrivate::updateSyntaxInfoBar(const Highlighter::Definitions InfoBarEntry::GlobalSuppression::Enabled); info.setCustomButtonInfo(BaseTextEditor::tr("Download Definitions"), [missing, this]() { m_document->infoBar()->removeInfo(missing); - Highlighter::downloadDefinitions([widget = QPointer(q)]() { - if (widget) - widget->configureGenericHighlighter(); - }); + Highlighter::downloadDefinitions(); }); infoBar->removeInfo(multiple); @@ -4337,7 +4334,7 @@ void TextEditorWidgetPrivate::paintCurrentLineHighlight(const PaintEventData &da QColor color = m_document->fontSettings().toTextCharFormat(C_CURRENT_LINE).background().color(); // set alpha, otherwise we cannot see block highlighting and find scope underneath color.setAlpha(128); - if (!data.isEditable && !data.eventRect.contains(lineRect.toRect())) { + if (!data.eventRect.contains(lineRect.toRect())) { QRect updateRect = data.eventRect; updateRect.setLeft(0); updateRect.setRight(data.viewportRect.width() - int(data.offset.x())); @@ -5643,7 +5640,8 @@ void TextEditorWidget::showDefaultContextMenu(QContextMenuEvent *e, Id menuConte void TextEditorWidget::addHoverHandler(BaseHoverHandler *handler) { - d->m_hoverHandlers.append(handler); + if (!d->m_hoverHandlers.contains(handler)) + d->m_hoverHandlers.append(handler); } void TextEditorWidget::removeHoverHandler(BaseHoverHandler *handler) diff --git a/src/plugins/webassembly/webassemblyrunconfiguration.cpp b/src/plugins/webassembly/webassemblyrunconfiguration.cpp index f4c56630fde..9e0b3185471 100644 --- a/src/plugins/webassembly/webassemblyrunconfiguration.cpp +++ b/src/plugins/webassembly/webassemblyrunconfiguration.cpp @@ -68,7 +68,7 @@ public: auto webBrowserAspect = addAspect(target); auto effectiveEmrunCall = addAspect(); - effectiveEmrunCall->setLabelText(tr("Effective emrun call:")); + effectiveEmrunCall->setLabelText(EmrunRunConfigurationFactory::tr("Effective emrun call:")); effectiveEmrunCall->setDisplayStyle(BaseStringAspect::TextEditDisplay); effectiveEmrunCall->setReadOnly(true); @@ -117,7 +117,7 @@ RunWorkerFactory::WorkerCreator makeEmrunWorker() // Factories EmrunRunConfigurationFactory::EmrunRunConfigurationFactory() - : FixedRunConfigurationFactory(EmrunRunConfiguration::tr("Launch with emrun")) + : FixedRunConfigurationFactory(EmrunRunConfigurationFactory::tr("Launch with emrun")) { registerRunConfiguration(Constants::WEBASSEMBLY_RUNCONFIGURATION_EMRUN); addSupportedTargetDeviceType(Constants::WEBASSEMBLY_DEVICE_TYPE); diff --git a/src/plugins/webassembly/webassemblyrunconfiguration.h b/src/plugins/webassembly/webassemblyrunconfiguration.h index af6af51e816..d58db86d3c9 100644 --- a/src/plugins/webassembly/webassemblyrunconfiguration.h +++ b/src/plugins/webassembly/webassemblyrunconfiguration.h @@ -33,6 +33,8 @@ namespace Internal { class EmrunRunConfigurationFactory : public ProjectExplorer::FixedRunConfigurationFactory { + Q_DECLARE_TR_FUNCTIONS(WebAssembly::Internal::EmrunRunConfigurationFactory) + public: EmrunRunConfigurationFactory(); }; diff --git a/src/shared/qbs b/src/shared/qbs index a703c788abc..3e5268b0888 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit a703c788abc0035bafe53a05370900db0a3ac43c +Subproject commit 3e5268b08883eb98ab539887d63985f149e02241 diff --git a/src/tools/qml2puppet/CMakeLists.txt b/src/tools/qml2puppet/CMakeLists.txt index d2f43adc1b3..46a82eeecee 100644 --- a/src/tools/qml2puppet/CMakeLists.txt +++ b/src/tools/qml2puppet/CMakeLists.txt @@ -109,6 +109,7 @@ extend_qtc_executable(qml2puppet SOURCES cameracontrolhelper.cpp cameracontrolhelper.h mousearea3d.cpp mousearea3d.h + camerageometry.cpp camerageometry.h ) extend_qtc_executable(qml2puppet diff --git a/src/tools/qml2puppet/qml2puppet.qbs b/src/tools/qml2puppet/qml2puppet.qbs index 5bf57a534c7..540a2a3c08c 100644 --- a/src/tools/qml2puppet/qml2puppet.qbs +++ b/src/tools/qml2puppet/qml2puppet.qbs @@ -199,6 +199,8 @@ QtcTool { "editor3d/cameracontrolhelper.h", "editor3d/mousearea3d.cpp", "editor3d/mousearea3d.h", + "editor3d/camerageometry.cpp", + "editor3d/camerageometry.h", "qml2puppetmain.cpp", ] } diff --git a/tests/system/objects.map b/tests/system/objects.map index 407acfb5cd8..1c9db182075 100644 --- a/tests/system/objects.map +++ b/tests/system/objects.map @@ -134,6 +134,7 @@ :Qt Creator.Stop_QToolButton {text='Stop' type='QToolButton' unnamed='1' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.Timeline_QDockWidget {container=':Qt Creator.DebugModeWidget_QSplitter' name='QmlProfiler.Timeline.DockDockWidget' type='QDockWidget' visible='1'} :Qt Creator.Timeline_QTabBar {aboveWidget=':Qt Creator.Timeline_QDockWidget' container=':Qt Creator.DebugModeWidget_QSplitter' type='QTabBar' unnamed='1' visible='1'} +:Qt Creator.WelcomeScreenStackedWidget {name='WelcomeScreenStackedWidget' type='QStackedWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.replaceEdit_Utils::FilterLineEdit {name='replaceEdit' type='Utils::FancyLineEdit' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.scrollArea_QScrollArea {type='ProjectExplorer::PanelsWidget' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} :Qt Creator.splitter_QSplitter {name='splitter' type='QSplitter' visible='1' window=':Qt Creator_Core::Internal::MainWindow'} diff --git a/tests/system/shared/project.py b/tests/system/shared/project.py index 193ef324af7..4ad7889cb7e 100644 --- a/tests/system/shared/project.py +++ b/tests/system/shared/project.py @@ -31,9 +31,9 @@ def openQbsProject(projectPath): def openQmakeProject(projectPath, targets=Targets.desktopTargetClasses(), fromWelcome=False): cleanUpUserFiles(projectPath) if fromWelcome: - wsButtonFrame, wsButtonLabel = getWelcomeScreenMainButton('Open Project') + wsButtonFrame, wsButtonLabel = getWelcomeScreenMainButton('Open') if not all((wsButtonFrame, wsButtonLabel)): - test.fatal("Could not find 'Open Project' button on Welcome Page.") + test.fatal("Could not find 'Open' button on Welcome Page.") return [] mouseClick(wsButtonLabel) else: @@ -79,9 +79,9 @@ def openCmakeProject(projectPath, buildDir): # this list can be used in __chooseTargets__() def __createProjectOrFileSelectType__(category, template, fromWelcome = False, isProject=True): if fromWelcome: - wsButtonFrame, wsButtonLabel = getWelcomeScreenMainButton("New Project") + wsButtonFrame, wsButtonLabel = getWelcomeScreenMainButton("New") if not all((wsButtonFrame, wsButtonLabel)): - test.fatal("Could not find 'New Project' button on Welcome Page") + test.fatal("Could not find 'New' button on Welcome Page") return [] mouseClick(wsButtonLabel) else: diff --git a/tests/system/shared/welcome.py b/tests/system/shared/welcome.py index f6338a91fa5..86f773e275a 100644 --- a/tests/system/shared/welcome.py +++ b/tests/system/shared/welcome.py @@ -46,16 +46,14 @@ def getWelcomeScreenSideBarButton(buttonLabel, isUrlButton = False): return __getWelcomeScreenButtonHelper__(buttonLabel, sideBar, isUrlButton) def getWelcomeScreenMainButton(buttonLabel): - stackedWidget = waitForObject("{type='QStackedWidget' name='WelcomeScreenStackedWidget' " - "window=':Qt Creator_Core::Internal::MainWindow'}") + stackedWidget = waitForObject(":Qt Creator.WelcomeScreenStackedWidget") currentStackWidget = stackedWidget.currentWidget() return __getWelcomeScreenButtonHelper__(buttonLabel, currentStackWidget) def getWelcomeTreeView(treeViewLabel): try: - return waitForObject("{aboveWidget={text='%s' type='QLabel' unnamed='1' visible='1' " - "window=':Qt Creator_Core::Internal::MainWindow'} " - "type='QTreeView' unnamed='1' visible='1'}" % treeViewLabel) + return waitForObjectExists("{container=':Qt Creator.WelcomeScreenStackedWidget' " + "name='%s' type='QTreeView' visible='1'}" % treeViewLabel) except: return None