Merge remote-tracking branch 'origin/4.11'

Conflicts:
	src/plugins/genericprojectmanager/genericprojectplugin.cpp
	src/plugins/projectexplorer/environmentaspect.cpp
	src/plugins/projectexplorer/environmentaspect.h
	src/plugins/projectexplorer/environmentaspectwidget.cpp

Change-Id: Id21d62cf14419febd1e06c9b429fcdf4501c0eaf
This commit is contained in:
Eike Ziller
2019-11-11 12:58:11 +01:00
114 changed files with 4948 additions and 764 deletions

View File

@@ -38,7 +38,7 @@ if (APPLE)
set(_IDE_PLUGIN_PATH "${_IDE_OUTPUT_PATH}/PlugIns") set(_IDE_PLUGIN_PATH "${_IDE_OUTPUT_PATH}/PlugIns")
set(_IDE_LIBRARY_BASE_PATH "Frameworks") set(_IDE_LIBRARY_BASE_PATH "Frameworks")
set(_IDE_LIBRARY_PATH "${_IDE_OUTPUT_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_DATA_PATH "${_IDE_OUTPUT_PATH}/Resources")
set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc") set(_IDE_DOC_PATH "${_IDE_OUTPUT_PATH}/Resources/doc")
set(_IDE_BIN_PATH "${_IDE_OUTPUT_PATH}/MacOS") 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) endfunction(separate_object_libraries)
function(set_explicit_moc target_name file) 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) 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}") target_sources(${target_name} PRIVATE "${file_moc}")
endfunction() endfunction()

View File

@@ -1,2 +1,2 @@
[Paths] [Paths]
Plugins = ../../PlugIns Plugins = ../../../PlugIns

5
dist/installer/mac/libexec_qt.conf vendored Normal file
View File

@@ -0,0 +1,5 @@
[Paths]
Prefix = ../..
Imports = Imports/qtquick1
Qml2Imports = Imports/qtquick2
Plugins = PlugIns

View File

@@ -1,4 +1,5 @@
[Paths] [Paths]
Imports = ../../Imports/qtquick1 Prefix = ../../..
Qml2Imports = ../../Imports/qtquick2 Imports = Imports/qtquick1
Plugins = ../../PlugIns Qml2Imports = Imports/qtquick2
Plugins = PlugIns

View File

@@ -48,7 +48,7 @@ Module {
? ide_app_target + ".app/Contents/Resources" ? ide_app_target + ".app/Contents/Resources"
: "share/qtcreator" : "share/qtcreator"
property string ide_libexec_path: qbs.targetOS.contains("macos") 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 ? ide_app_path
: "libexec/qtcreator" : "libexec/qtcreator"
property string ide_bin_path: qbs.targetOS.contains("macos") property string ide_bin_path: qbs.targetOS.contains("macos")

View File

@@ -107,7 +107,7 @@ osx {
IDE_LIBRARY_PATH = $$IDE_OUTPUT_PATH/Frameworks IDE_LIBRARY_PATH = $$IDE_OUTPUT_PATH/Frameworks
IDE_PLUGIN_PATH = $$IDE_OUTPUT_PATH/PlugIns 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_DATA_PATH = $$IDE_OUTPUT_PATH/Resources
IDE_DOC_PATH = $$IDE_DATA_PATH/doc IDE_DOC_PATH = $$IDE_DATA_PATH/doc
IDE_BIN_PATH = $$IDE_OUTPUT_PATH/MacOS IDE_BIN_PATH = $$IDE_OUTPUT_PATH/MacOS
@@ -118,7 +118,7 @@ osx {
INSTALL_LIBRARY_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Frameworks INSTALL_LIBRARY_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Frameworks
INSTALL_PLUGIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/PlugIns 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_DATA_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/Resources
INSTALL_DOC_PATH = $$INSTALL_DATA_PATH/doc INSTALL_DOC_PATH = $$INSTALL_DATA_PATH/doc
INSTALL_BIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/MacOS INSTALL_BIN_PATH = $$QTC_PREFIX/$${IDE_APP_TARGET}.app/Contents/MacOS

View File

@@ -30,6 +30,7 @@
app_path="$1" app_path="$1"
resource_path="$app_path/Contents/Resources" resource_path="$app_path/Contents/Resources"
libexec_path="$app_path/Contents/Resources/libexec"
bin_src="$2" bin_src="$2"
translation_src="$3" translation_src="$3"
plugin_src="$4" plugin_src="$4"
@@ -76,6 +77,7 @@ if [ -d "$quick1_src" ]; then
echo "- Copying Qt Quick 1 imports" echo "- Copying Qt Quick 1 imports"
mkdir -p "$importsDir" mkdir -p "$importsDir"
cp -R "$quick1_src"/ "$importsDir"/ cp -R "$quick1_src"/ "$importsDir"/
find "$importsDir" -path "*.dylib.dSYM*" -delete
fi fi
fi fi
@@ -86,6 +88,7 @@ if [ -d "$quick2_src" ]; then
echo "- Copying Qt Quick 2 imports" echo "- Copying Qt Quick 2 imports"
mkdir -p "$imports2Dir" mkdir -p "$imports2Dir"
cp -R "$quick2_src"/ "$imports2Dir"/ cp -R "$quick2_src"/ "$imports2Dir"/
find "$imports2Dir" -path "*.dylib.dSYM*" -delete
fi fi
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 cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qt.conf" "$resource_path/qt.conf" || exit 1
fi 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 # copy ios tools' qt.conf
if [ ! -f "$resource_path/ios/qt.conf" ]; then if [ ! -f "$libexec_path/ios/qt.conf" ]; then
echo "- Copying ios/qt.conf" echo "- Copying libexec/ios/qt.conf"
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/ios_qt.conf" "$resource_path/ios/qt.conf" || exit 1 cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/ios_qt.conf" "$libexec_path/ios/qt.conf" || exit 1
fi fi
# copy qml2puppet's qt.conf # copy qml2puppet's qt.conf
if [ ! -f "$resource_path/qmldesigner/qt.conf" ]; then if [ ! -f "$libexec_path/qmldesigner/qt.conf" ]; then
echo "- Copying qmldesigner/qt.conf" echo "- Copying libexec/qmldesigner/qt.conf"
cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qmldesigner_qt.conf" "$resource_path/qmldesigner/qt.conf" || exit 1 cp -f "$(dirname "${BASH_SOURCE[0]}")/../dist/installer/mac/qmldesigner_qt.conf" "$libexec_path/qmldesigner/qt.conf" || exit 1
fi fi
# copy Qt translations # copy Qt translations
@@ -120,50 +129,40 @@ if [ $LLVM_INSTALL_DIR ]; then
echo "- Copying libclang" echo "- Copying libclang"
mkdir -p "$app_path/Contents/Frameworks" || exit 1 mkdir -p "$app_path/Contents/Frameworks" || exit 1
# use recursive copy to make it copy symlinks as symlinks # use recursive copy to make it copy symlinks as symlinks
mkdir -p "$resource_path/clang/bin" mkdir -p "$libexec_path/clang/bin"
mkdir -p "$resource_path/clang/lib" 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/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 clangsource="$LLVM_INSTALL_DIR"/bin/clang
clanglinktarget="$(readlink "$clangsource")" clanglinktarget="$(readlink "$clangsource")"
cp -Rf "$clangsource" "$resource_path/clang/bin/" || exit 1 cp -Rf "$clangsource" "$libexec_path/clang/bin/" || exit 1
if [ $clanglinktarget ]; then 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 fi
clangdsource="$LLVM_INSTALL_DIR"/bin/clangd 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 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 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 fi
clangbackendArgument="-executable=$resource_path/clangbackend" clangbackendArgument="-executable=$libexec_path/clangbackend"
clangpchmanagerArgument="-executable=$resource_path/clangpchmanagerbackend" clangpchmanagerArgument="-executable=$libexec_path/clangpchmanagerbackend"
clangrefactoringArgument="-executable=$resource_path/clangrefactoringbackend" clangrefactoringArgument="-executable=$libexec_path/clangrefactoringbackend"
fi fi
#### macdeployqt #### macdeployqt
if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then
qml2puppetapp="$resource_path/qmldesigner/qml2puppet" qml2puppetapp="$libexec_path/qmldesigner/qml2puppet"
if [ -f "$qml2puppetapp" ]; then if [ -f "$qml2puppetapp" ]; then
qml2puppetArgument="-executable=$qml2puppetapp" qml2puppetArgument="-executable=$qml2puppetapp"
fi fi
qbsapp="$app_path/Contents/MacOS/qbs" qbsapp="$app_path/Contents/MacOS/qbs"
if [ -f "$qbsapp" ]; then
echo "- Running macdeployqt ($bin_src/macdeployqt)" qbsArguments=("-executable=$qbsapp" \
"$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" \
"-executable=$qbsapp-config" \ "-executable=$qbsapp-config" \
"-executable=$qbsapp-config-ui" \ "-executable=$qbsapp-config-ui" \
"-executable=$qbsapp-qmltypes" \ "-executable=$qbsapp-qmltypes" \
@@ -171,6 +170,19 @@ if [ ! -d "$app_path/Contents/Frameworks/QtCore.framework" ]; then
"-executable=$qbsapp-setup-qt" \ "-executable=$qbsapp-setup-qt" \
"-executable=$qbsapp-setup-toolchains" \ "-executable=$qbsapp-setup-toolchains" \
"-executable=$qbsapp-create-project" \ "-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" \ "$qml2puppetArgument" \
"$clangbackendArgument" "$clangpchmanagerArgument" "$clangrefactoringArgument" || exit 1 "$clangbackendArgument" "$clangpchmanagerArgument" "$clangrefactoringArgument" || exit 1

View File

@@ -27,104 +27,29 @@ import QtQuick 2.0
import QtQuick3D 1.0 import QtQuick3D 1.0
import MouseArea3D 1.0 import MouseArea3D 1.0
Model { DirectionalDraggable {
id: arrow id: arrow
rotationOrder: Node.XYZr
source: "meshes/arrow.mesh" 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 positionCommit()
signal positionMove() signal positionMove()
materials: DefaultMaterial { function localPos(sceneRelativeDistance)
id: material
emissiveColor: "white"
lighting: DefaultMaterial.NoLighting
}
function handlePressed(mouseArea, pointerPosition)
{ {
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( var newScenePos = Qt.vector3d(
_targetStartPos.x + sceneRelativeDistance.x, _targetStartPos.x + sceneRelativeDistance.x,
_targetStartPos.y + sceneRelativeDistance.y, _targetStartPos.y + sceneRelativeDistance.y,
_targetStartPos.z + sceneRelativeDistance.z); _targetStartPos.z + sceneRelativeDistance.z);
return targetNode.parent.mapPositionFromScene(newScenePos); return targetNode.parent.mapPositionFromScene(newScenePos);
} }
function handleDragged(mouseArea, pointerPosition) onDragged: {
{ targetNode.position = localPos(sceneRelativeDistance);
if (!targetNode) positionMove();
return;
targetNode.position = posInParent(mouseArea, pointerPosition);
arrow.positionMove();
} }
function handleReleased(mouseArea, pointerPosition) onReleased: {
{ targetNode.position = localPos(sceneRelativeDistance);
if (!targetNode) positionCommit();
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)
} }
} }

View File

@@ -25,17 +25,27 @@
import QtQuick 2.0 import QtQuick 2.0
import QtQuick3D 1.0 import QtQuick3D 1.0
import CameraGeometry 1.0
IconGizmo { IconGizmo {
id: cameraGizmo id: cameraGizmo
iconSource: "qrc:///qtquickplugin/mockfiles/images/camera-pick-icon.png" 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: [ gizmoModel.materials: [
DefaultMaterial { DefaultMaterial {
id: defaultMaterial id: defaultMaterial
emissiveColor: "blue" emissiveColor: "blue"
lighting: DefaultMaterial.NoLighting lighting: DefaultMaterial.NoLighting
cullingMode: Material.DisableCulling
} }
] ]
} }

View File

@@ -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)
}
}

View File

@@ -38,7 +38,7 @@ Window {
title: "3D" title: "3D"
flags: Qt.WindowStaysOnTopHint | Qt.Window | Qt.WindowTitleHint | Qt.WindowCloseButtonHint 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 showEditLight: editLightCheckbox.checked
property alias usePerspective: usePerspectiveCheckbox.checked property alias usePerspective: usePerspectiveCheckbox.checked
@@ -46,10 +46,11 @@ Window {
property var lightGizmos: [] property var lightGizmos: []
property var cameraGizmos: [] property var cameraGizmos: []
property rect viewPortRect: Qt.rect(0, 0, 1000, 1000)
signal objectClicked(var object) signal objectClicked(var object)
signal commitObjectPosition(var object) signal commitObjectProperty(var object, var propName)
signal moveObjectPosition(var object) signal changeObjectProperty(var object, var propName)
function selectObject(object) { function selectObject(object) {
selectedNode = object; selectedNode = object;
@@ -75,10 +76,14 @@ Window {
{ {
var component = Qt.createComponent("CameraGizmo.qml"); var component = Qt.createComponent("CameraGizmo.qml");
if (component.status === Component.Ready) { if (component.status === Component.Ready) {
var gizmo = component.createObject(overlayScene, var geometryName = designStudioNativeCameraControlHelper.generateUniqueName("CameraGeometry");
{"view3D": overlayView, "targetNode": obj}); var gizmo = component.createObject(
overlayScene,
{"view3D": overlayView, "targetNode": obj, "geometryName": geometryName,
"viewPortRect": viewPortRect});
cameraGizmos[cameraGizmos.length] = gizmo; cameraGizmos[cameraGizmos.length] = gizmo;
gizmo.selected.connect(emitObjectClicked); gizmo.selected.connect(emitObjectClicked);
gizmo.viewPortRect = Qt.binding(function() {return viewPortRect;});
} }
} }
@@ -113,11 +118,26 @@ Window {
position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition position: viewWindow.selectedNode ? viewWindow.selectedNode.scenePosition
: Qt.vector3d(0, 0, 0) : Qt.vector3d(0, 0, 0)
globalOrientation: globalControl.checked globalOrientation: globalControl.checked
visible: selectedNode visible: selectedNode && moveToolControl.checked
view3D: overlayView view3D: overlayView
onPositionCommit: viewWindow.commitObjectPosition(selectedNode) onPositionCommit: viewWindow.commitObjectProperty(selectedNode, "position")
onPositionMove: viewWindow.moveObjectPosition(selectedNode) 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 { AutoScaleHelper {
@@ -156,10 +176,12 @@ Window {
} }
PointLight { PointLight {
id: pointLight id: editLight
visible: showEditLight visible: showEditLight
position: usePerspective ? editPerspectiveCamera.position position: usePerspective ? editPerspectiveCamera.position
: editOrthoCamera.position : editOrthoCamera.position
quadraticFade: 0
linearFade: 0
} }
PerspectiveCamera { PerspectiveCamera {
@@ -181,16 +203,16 @@ Window {
id: overlayView id: overlayView
anchors.fill: parent anchors.fill: parent
camera: usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera camera: usePerspective ? overlayPerspectiveCamera : overlayOrthoCamera
scene: overlayScene importScene: overlayScene
} }
Overlay2D { Overlay2D {
id: gizmoLabel id: gizmoLabel
targetNode: moveGizmo targetNode: moveGizmo.visible ? moveGizmo : scaleGizmo
targetView: overlayView targetView: overlayView
offsetX: 0 offsetX: 0
offsetY: 45 offsetY: 45
visible: moveGizmo.dragging visible: targetNode.dragging
Rectangle { Rectangle {
color: "white" color: "white"
@@ -203,11 +225,18 @@ Window {
id: gizmoLabelText id: gizmoLabelText
text: { text: {
var l = Qt.locale(); var l = Qt.locale();
selectedNode var targetProperty;
? qsTr("x:") + Number(selectedNode.position.x).toLocaleString(l, 'f', 1) if (viewWindow.selectedNode) {
+ qsTr(" y:") + Number(selectedNode.position.y).toLocaleString(l, 'f', 1) if (gizmoLabel.targetNode === moveGizmo)
+ qsTr(" z:") + Number(selectedNode.position.z).toLocaleString(l, 'f', 1) 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 anchors.centerIn: parent
} }
@@ -252,6 +281,19 @@ Window {
text: qsTr("Use Global Orientation") text: qsTr("Use Global Orientation")
onCheckedChanged: cameraControl.forceActiveFocus() 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 { Text {

View File

@@ -45,7 +45,6 @@ Node {
Model { Model {
id: gizmoModel id: gizmoModel
scale: Qt.vector3d(0.05, 0.05, 0.05)
visible: iconGizmo.visible visible: iconGizmo.visible
} }
Overlay2D { Overlay2D {

View File

@@ -31,6 +31,7 @@ IconGizmo {
iconSource: "qrc:///qtquickplugin/mockfiles/images/light-pick-icon.png" iconSource: "qrc:///qtquickplugin/mockfiles/images/light-pick-icon.png"
gizmoModel.source: "#Sphere" gizmoModel.source: "#Sphere"
gizmoModel.scale: Qt.vector3d(0.10, 0.10, 0.10)
gizmoModel.materials: [ gizmoModel.materials: [
DefaultMaterial { DefaultMaterial {
id: defaultMaterial id: defaultMaterial

View File

@@ -35,7 +35,8 @@ Node {
property Node targetNode: null property Node targetNode: null
property bool globalOrientation: true property bool globalOrientation: true
readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging readonly property bool dragging: arrowX.dragging || arrowY.dragging || arrowZ.dragging
|| centerMouseArea.dragging || planeX.dragging || planeY.dragging || planeZ.dragging
|| centerBall.dragging
signal positionCommit() signal positionCommit()
signal positionMove() signal positionMove()
@@ -45,12 +46,12 @@ Node {
Arrow { Arrow {
id: arrowX id: arrowX
objectName: "Arrow X"
rotation: Qt.vector3d(0, 0, -90) rotation: Qt.vector3d(0, 0, -90)
targetNode: moveGizmo.targetNode targetNode: moveGizmo.targetNode
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(1, 0, 0, 1)) 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 view3D: moveGizmo.view3D
active: moveGizmo.visible
onPositionCommit: moveGizmo.positionCommit() onPositionCommit: moveGizmo.positionCommit()
onPositionMove: moveGizmo.positionMove() onPositionMove: moveGizmo.positionMove()
@@ -58,12 +59,12 @@ Node {
Arrow { Arrow {
id: arrowY id: arrowY
objectName: "Arrow Y"
rotation: Qt.vector3d(0, 0, 0) rotation: Qt.vector3d(0, 0, 0)
targetNode: moveGizmo.targetNode targetNode: moveGizmo.targetNode
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1)) color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1))
: Qt.rgba(0, 0, 1, 1) : Qt.rgba(0, 0.6, 0, 1)
view3D: moveGizmo.view3D view3D: moveGizmo.view3D
active: moveGizmo.visible
onPositionCommit: moveGizmo.positionCommit() onPositionCommit: moveGizmo.positionCommit()
onPositionMove: moveGizmo.positionMove() onPositionMove: moveGizmo.positionMove()
@@ -71,85 +72,83 @@ Node {
Arrow { Arrow {
id: arrowZ id: arrowZ
objectName: "Arrow Z"
rotation: Qt.vector3d(90, 0, 0) rotation: Qt.vector3d(90, 0, 0)
targetNode: moveGizmo.targetNode targetNode: moveGizmo.targetNode
color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0.6, 0, 1)) color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0, 0, 1, 1))
: Qt.rgba(0, 0.6, 0, 1) : Qt.rgba(0, 0, 1, 1)
view3D: moveGizmo.view3D view3D: moveGizmo.view3D
active: moveGizmo.visible
onPositionCommit: moveGizmo.positionCommit() onPositionCommit: moveGizmo.positionCommit()
onPositionMove: moveGizmo.positionMove() 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()
} }
Model { 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()
}
}
PlanarMoveHandle {
id: centerBall id: centerBall
source: "#Sphere" source: "#Sphere"
scale: Qt.vector3d(0.024, 0.024, 0.024) color: highlightOnHover && (hovering || dragging) ? Qt.lighter(Qt.rgba(0.5, 0.5, 0.5, 1))
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) : Qt.rgba(0.5, 0.5, 0.5, 1)
lighting: DefaultMaterial.NoLighting
}
MouseArea3D {
id: centerMouseArea
view3D: moveGizmo.view3D
x: -60
y: -60
width: 120
height: 120
rotation: view3D.camera.rotation rotation: view3D.camera.rotation
grabsMouse: moveGizmo.targetNode
priority: 1 priority: 1
targetNode: moveGizmo.targetNode
property var _pointerPosPressed view3D: moveGizmo.view3D
property var _targetStartPos active: moveGizmo.visible
function posInParent(pointerPosition) onPositionCommit: moveGizmo.positionCommit()
{ onPositionMove: moveGizmo.positionMove()
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();
}
}
} }
} }

View File

@@ -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)
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}
}
}

View File

@@ -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();
}
}

View File

@@ -24,6 +24,8 @@
****************************************************************************/ ****************************************************************************/
#include "cameracontrolhelper.h" #include "cameracontrolhelper.h"
#include <QHash>
namespace QmlDesigner { namespace QmlDesigner {
namespace Internal { namespace Internal {
@@ -65,5 +67,12 @@ void CameraControlHelper::requestOverlayUpdate()
m_overlayUpdateTimer.start(); m_overlayUpdateTimer.start();
} }
QString CameraControlHelper::generateUniqueName(const QString &nameRoot)
{
static QHash<QString, int> counters;
int count = counters[nameRoot]++;
return QStringLiteral("%1_%2").arg(nameRoot).arg(count);
}
} }
} }

View File

@@ -42,6 +42,7 @@ public:
void setEnabled(bool enabled); void setEnabled(bool enabled);
Q_INVOKABLE void requestOverlayUpdate(); Q_INVOKABLE void requestOverlayUpdate();
Q_INVOKABLE QString generateUniqueName(const QString &nameRoot);
public slots: public slots:
void handleUpdateTimer(); void handleUpdateTimer();

View File

@@ -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 <QtQuick3DRuntimeRender/private/qssgrendergeometry_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrendercamera_p.h>
#include <QtQuick3D/private/qquick3dcustomcamera_p.h>
#include <QtQuick3D/private/qquick3dfrustumcamera_p.h>
#include <QtQuick3D/private/qquick3dorthographiccamera_p.h>
#include <QtQuick3D/private/qquick3dperspectivecamera_p.h>
#include <limits>
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<QQuick3DPerspectiveCamera *>(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<QQuick3DFrustumCamera *>(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<QQuick3DOrthographicCamera *>(m_camera)) {
QObject::connect(orthoCamera, &QQuick3DOrthographicCamera::clipNearChanged,
this, &CameraGeometry::update);
QObject::connect(orthoCamera, &QQuick3DOrthographicCamera::clipFarChanged,
this, &CameraGeometry::update);
} else if (auto customCamera = qobject_cast<QQuick3DCustomCamera *>(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<QSSGRenderGeometry *>(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<float *>(vertexData.data());
auto indexPtr = reinterpret_cast<quint16 *>(indexData.data());
QSSGRenderCamera *camera = m_camera->cameraNode();
if (qobject_cast<QQuick3DOrthographicCamera *>(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<float>::lowest();
static const float floatMax = std::numeric_limits<float>::max();
auto vertexPtr = reinterpret_cast<QVector3D *>(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

View File

@@ -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 <QtQuick3D/private/qquick3dgeometry_p.h>
#include <QtQuick3D/private/qquick3dcamera_p.h>
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

View File

@@ -1,5 +1,7 @@
HEADERS += $$PWD/cameracontrolhelper.h \ HEADERS += $$PWD/cameracontrolhelper.h \
$$PWD/mousearea3d.h $$PWD/mousearea3d.h \
$$PWD/camerageometry.h
SOURCES += $$PWD/cameracontrolhelper.cpp \ SOURCES += $$PWD/cameracontrolhelper.cpp \
$$PWD/mousearea3d.cpp $$PWD/mousearea3d.cpp \
$$PWD/camerageometry.cpp

View File

@@ -60,6 +60,11 @@ bool MouseArea3D::grabsMouse() const
return m_grabsMouse; return m_grabsMouse;
} }
bool MouseArea3D::active() const
{
return m_active;
}
qreal MouseArea3D::x() const qreal MouseArea3D::x() const
{ {
return m_x; return m_x;
@@ -103,6 +108,15 @@ void MouseArea3D::setGrabsMouse(bool grabsMouse)
emit grabsMouseChanged(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) void MouseArea3D::setX(qreal x)
{ {
if (qFuzzyCompare(m_x, x)) if (qFuzzyCompare(m_x, x))
@@ -190,6 +204,80 @@ QVector3D MouseArea3D::rayIntersectsPlane(const QVector3D &rayPos0,
return rayPos0 + distanceFromRayPos0ToPlane * rayDirection; 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 QVector3D MouseArea3D::getMousePosInPlane(const QPointF &mousePosInView) const
{ {
const QVector3D mousePos1(float(mousePosInView.x()), float(mousePosInView.y()), 0); 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) bool MouseArea3D::eventFilter(QObject *, QEvent *event)
{ {
if (m_grabsMouse && s_mouseGrab && s_mouseGrab != this if (!m_active || (m_grabsMouse && s_mouseGrab && s_mouseGrab != this
&& (m_priority <= s_mouseGrab->m_priority || s_mouseGrab->m_dragging)) { && (m_priority <= s_mouseGrab->m_priority || s_mouseGrab->m_dragging))) {
return false; return false;
} }
@@ -227,7 +315,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos()); m_mousePosInPlane = getMousePosInPlane(mouseEvent->pos());
if (mouseOnTopOfMouseArea(m_mousePosInPlane)) { if (mouseOnTopOfMouseArea(m_mousePosInPlane)) {
setDragging(true); setDragging(true);
emit pressed(m_mousePosInPlane); emit pressed(m_mousePosInPlane, mouseEvent->globalPos());
if (m_grabsMouse) { if (m_grabsMouse) {
if (s_mouseGrab && s_mouseGrab != this) { if (s_mouseGrab && s_mouseGrab != this) {
s_mouseGrab->setDragging(false); s_mouseGrab->setDragging(false);
@@ -250,7 +338,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
if (qFuzzyCompare(mousePosInPlane.z(), -1)) if (qFuzzyCompare(mousePosInPlane.z(), -1))
mousePosInPlane = m_mousePosInPlane; mousePosInPlane = m_mousePosInPlane;
setDragging(false); setDragging(false);
emit released(mousePosInPlane); emit released(mousePosInPlane, mouseEvent->globalPos());
if (m_grabsMouse) { if (m_grabsMouse) {
if (s_mouseGrab && s_mouseGrab != this) { if (s_mouseGrab && s_mouseGrab != this) {
s_mouseGrab->setDragging(false); s_mouseGrab->setDragging(false);
@@ -290,7 +378,7 @@ bool MouseArea3D::eventFilter(QObject *, QEvent *event)
if (m_dragging && !qFuzzyCompare(mousePosInPlane.z(), -1)) { if (m_dragging && !qFuzzyCompare(mousePosInPlane.z(), -1)) {
m_mousePosInPlane = mousePosInPlane; m_mousePosInPlane = mousePosInPlane;
emit dragged(mousePosInPlane); emit dragged(mousePosInPlane, mouseEvent->globalPos());
} }
break; break;

View File

@@ -49,6 +49,7 @@ class MouseArea3D : public QQuick3DNode
Q_PROPERTY(bool hovering READ hovering NOTIFY hoveringChanged) Q_PROPERTY(bool hovering READ hovering NOTIFY hoveringChanged)
Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged) Q_PROPERTY(bool dragging READ dragging NOTIFY draggingChanged)
Q_PROPERTY(int priority READ priority WRITE setPriority NOTIFY priorityChanged) Q_PROPERTY(int priority READ priority WRITE setPriority NOTIFY priorityChanged)
Q_PROPERTY(int active READ active WRITE setActive NOTIFY activeChanged)
Q_INTERFACES(QQmlParserStatus) Q_INTERFACES(QQmlParserStatus)
@@ -66,10 +67,12 @@ public:
bool hovering() const; bool hovering() const;
bool dragging() const; bool dragging() const;
bool grabsMouse() const; bool grabsMouse() const;
bool active() const;
public slots: public slots:
void setView3D(QQuick3DViewport *view3D); void setView3D(QQuick3DViewport *view3D);
void setGrabsMouse(bool grabsMouse); void setGrabsMouse(bool grabsMouse);
void setActive(bool active);
void setX(qreal x); void setX(qreal x);
void setY(qreal y); void setY(qreal y);
@@ -82,6 +85,10 @@ public slots:
const QVector3D &planePos, const QVector3D &planePos,
const QVector3D &planeNormal) const; const QVector3D &planeNormal) const;
Q_INVOKABLE QVector3D getNewScale(QQuick3DNode *node, const QVector3D &startScale,
const QVector3D &pressPos,
const QVector3D &sceneRelativeDistance, bool global);
signals: signals:
void view3DChanged(); void view3DChanged();
@@ -93,9 +100,10 @@ signals:
void hoveringChanged(); void hoveringChanged();
void draggingChanged(); void draggingChanged();
void pressed(const QVector3D &pointerPosition); void activeChanged(bool active);
void released(const QVector3D &pointerPosition); void pressed(const QVector3D &scenePos, const QPoint &screenPos);
void dragged(const QVector3D &pointerPosition); void released(const QVector3D &scenePos, const QPoint &screenPos);
void dragged(const QVector3D &scenePos, const QPoint &screenPos);
void grabsMouseChanged(bool grabsMouse); void grabsMouseChanged(bool grabsMouse);
protected: protected:
@@ -118,6 +126,7 @@ private:
bool m_hovering = false; bool m_hovering = false;
bool m_dragging = false; bool m_dragging = false;
bool m_active = false;
QVector3D getMousePosInPlane(const QPointF &mousePosInView) const; QVector3D getMousePosInPlane(const QPointF &mousePosInView) const;

View File

@@ -61,6 +61,7 @@
#include "dummycontextobject.h" #include "dummycontextobject.h"
#include "../editor3d/cameracontrolhelper.h" #include "../editor3d/cameracontrolhelper.h"
#include "../editor3d/mousearea3d.h" #include "../editor3d/mousearea3d.h"
#include "../editor3d/camerageometry.h"
#include <designersupportdelegate.h> #include <designersupportdelegate.h>
@@ -85,6 +86,7 @@ QObject *Qt5InformationNodeInstanceServer::createEditView3D(QQmlEngine *engine)
#ifdef QUICK3D_MODULE #ifdef QUICK3D_MODULE
qmlRegisterType<QmlDesigner::Internal::MouseArea3D>("MouseArea3D", 1, 0, "MouseArea3D"); qmlRegisterType<QmlDesigner::Internal::MouseArea3D>("MouseArea3D", 1, 0, "MouseArea3D");
qmlRegisterType<QmlDesigner::Internal::CameraGeometry>("CameraGeometry", 1, 0, "CameraGeometry");
#endif #endif
QQmlComponent component(engine, QUrl("qrc:/qtquickplugin/mockfiles/EditView3D.qml")); 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(objectClicked(QVariant)), this, SLOT(objectClicked(QVariant)));
QObject::connect(window, SIGNAL(commitObjectPosition(QVariant)), QObject::connect(window, SIGNAL(commitObjectProperty(QVariant, QVariant)),
this, SLOT(handleObjectPositionCommit(QVariant))); this, SLOT(handleObjectPropertyCommit(QVariant, QVariant)));
QObject::connect(window, SIGNAL(moveObjectPosition(QVariant)), QObject::connect(window, SIGNAL(changeObjectProperty(QVariant, QVariant)),
this, SLOT(handleObjectPositionMove(QVariant))); this, SLOT(handleObjectPropertyChange(QVariant, QVariant)));
QObject::connect(&m_moveTimer, &QTimer::timeout, QObject::connect(&m_propertyChangeTimer, &QTimer::timeout,
this, &Qt5InformationNodeInstanceServer::handleObjectPositionMoveTimeout); this, &Qt5InformationNodeInstanceServer::handleObjectPropertyChangeTimeout);
//For macOS we have to use the 4.1 core profile //For macOS we have to use the 4.1 core profile
QSurfaceFormat surfaceFormat = window->requestedFormat(); 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); modifyVariantValue(object, propName.toByteArray(),
m_movedNode = {}; ValuesModifiedCommand::TransactionOption::End);
m_moveTimer.stop(); 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()) { PropertyName propertyName(propName.toByteArray());
modifyVariantValue(object, "position", ValuesModifiedCommand::TransactionOption::Start); if (m_changedProperty != propertyName || m_changedNode != object) {
} else { if (!m_changedNode.isNull())
if (!m_moveTimer.isActive()) handleObjectPropertyCommit(m_changedNode, m_changedProperty);
m_moveTimer.start(); 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) : Qt5InformationNodeInstanceServer::Qt5InformationNodeInstanceServer(NodeInstanceClientInterface *nodeInstanceClient) :
Qt5NodeInstanceServer(nodeInstanceClient) Qt5NodeInstanceServer(nodeInstanceClient)
{ {
m_moveTimer.setInterval(100); m_propertyChangeTimer.setInterval(100);
} }
void Qt5InformationNodeInstanceServer::sendTokenBack() void Qt5InformationNodeInstanceServer::sendTokenBack()
@@ -282,9 +300,10 @@ void Qt5InformationNodeInstanceServer::modifyProperties(
nodeInstanceClient()->valuesModified(createValuesModifiedCommand(properties)); 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( QObject *Qt5InformationNodeInstanceServer::findRootNodeOf3DViewport(
@@ -307,7 +326,6 @@ void Qt5InformationNodeInstanceServer::findCamerasAndLights(
const QList<ServerNodeInstance> &instanceList, const QList<ServerNodeInstance> &instanceList,
QObjectList &cameras, QObjectList &lights) const QObjectList &cameras, QObjectList &lights) const
{ {
QObjectList objList;
for (const ServerNodeInstance &instance : instanceList) { for (const ServerNodeInstance &instance : instanceList) {
if (instance.isSubclassOf("QQuick3DCamera")) if (instance.isSubclassOf("QQuick3DCamera"))
cameras << instance.internalObject(); cameras << instance.internalObject();
@@ -316,6 +334,16 @@ void Qt5InformationNodeInstanceServer::findCamerasAndLights(
} }
} }
ServerNodeInstance Qt5InformationNodeInstanceServer::findViewPort(
const QList<ServerNodeInstance> &instanceList)
{
for (const ServerNodeInstance &instance : instanceList) {
if (instance.isSubclassOf("QQuick3DViewport"))
return instance;
}
return ServerNodeInstance();
}
void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeInstance> &instanceList) void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeInstance> &instanceList)
{ {
ServerNodeInstance root = rootNodeInstance(); ServerNodeInstance root = rootNodeInstance();
@@ -341,8 +369,17 @@ void Qt5InformationNodeInstanceServer::setup3DEditView(const QList<ServerNodeIns
sceneProperty.write(objectToVariant(node)); sceneProperty.write(objectToVariant(node));
QQmlProperty parentProperty(node, "parent", context()); QQmlProperty parentProperty(node, "parent", context());
parentProperty.write(objectToVariant(m_editView3D)); parentProperty.write(objectToVariant(m_editView3D));
QQmlProperty completeSceneProperty(m_editView3D, "showLight", context()); QQmlProperty showLightProperty(m_editView3D, "showLight", context());
completeSceneProperty.write(showCustomLight); showLightProperty.write(showCustomLight);
m_viewPortInstance = findViewPort(instanceList);
if (m_viewPortInstance.internalObject()) {
QObject::connect(m_viewPortInstance.internalObject(), SIGNAL(widthChanged()),
this, SLOT(updateViewPortRect()));
QObject::connect(m_viewPortInstance.internalObject(), SIGNAL(heightChanged()),
this, SLOT(updateViewPortRect()));
updateViewPortRect();
}
// Create camera and light gizmos // Create camera and light gizmos
QObjectList cameras; QObjectList cameras;

View File

@@ -51,8 +51,9 @@ public:
private slots: private slots:
void objectClicked(const QVariant &object); void objectClicked(const QVariant &object);
void handleObjectPositionCommit(const QVariant &object); void handleObjectPropertyCommit(const QVariant &object, const QVariant &propName);
void handleObjectPositionMove(const QVariant &object); void handleObjectPropertyChange(const QVariant &object, const QVariant &propName);
void updateViewPortRect();
protected: protected:
void collectItemChangesAndSendChangeCommands() override; void collectItemChangesAndSendChangeCommands() override;
@@ -64,12 +65,13 @@ protected:
void modifyProperties(const QVector<InstancePropertyValueTriple> &properties); void modifyProperties(const QVector<InstancePropertyValueTriple> &properties);
private: private:
void handleObjectPositionMoveTimeout(); void handleObjectPropertyChangeTimeout();
QObject *createEditView3D(QQmlEngine *engine); QObject *createEditView3D(QQmlEngine *engine);
void setup3DEditView(const QList<ServerNodeInstance> &instanceList); void setup3DEditView(const QList<ServerNodeInstance> &instanceList);
QObject *findRootNodeOf3DViewport(const QList<ServerNodeInstance> &instanceList) const; QObject *findRootNodeOf3DViewport(const QList<ServerNodeInstance> &instanceList) const;
void findCamerasAndLights( const QList<ServerNodeInstance> &instanceList, void findCamerasAndLights( const QList<ServerNodeInstance> &instanceList,
QObjectList &cameras, QObjectList &lights) const; QObjectList &cameras, QObjectList &lights) const;
ServerNodeInstance findViewPort(const QList<ServerNodeInstance> &instanceList);
QVector<InstancePropertyValueTriple> vectorToPropertyValue(const ServerNodeInstance &instance, QVector<InstancePropertyValueTriple> vectorToPropertyValue(const ServerNodeInstance &instance,
const PropertyName &propertyName, const PropertyName &propertyName,
const QVariant &variant); const QVariant &variant);
@@ -81,8 +83,10 @@ private:
QSet<ServerNodeInstance> m_parentChangedSet; QSet<ServerNodeInstance> m_parentChangedSet;
QList<ServerNodeInstance> m_completedComponentList; QList<ServerNodeInstance> m_completedComponentList;
QList<TokenCommand> m_tokenList; QList<TokenCommand> m_tokenList;
QTimer m_moveTimer; QTimer m_propertyChangeTimer;
QVariant m_movedNode; QVariant m_changedNode;
PropertyName m_changedProperty;
ServerNodeInstance m_viewPortInstance;
}; };
} // namespace QmlDesigner } // namespace QmlDesigner

View File

@@ -15,7 +15,14 @@
<file>mockfiles/LightGizmo.qml</file> <file>mockfiles/LightGizmo.qml</file>
<file>mockfiles/IconGizmo.qml</file> <file>mockfiles/IconGizmo.qml</file>
<file>mockfiles/Overlay2D.qml</file> <file>mockfiles/Overlay2D.qml</file>
<file>mockfiles/DirectionalDraggable.qml</file>
<file>mockfiles/PlanarDraggable.qml</file>
<file>mockfiles/PlanarMoveHandle.qml</file>
<file>mockfiles/PlanarScaleHandle.qml</file>
<file>mockfiles/ScaleRod.qml</file>
<file>mockfiles/ScaleGizmo.qml</file>
<file>mockfiles/meshes/arrow.mesh</file> <file>mockfiles/meshes/arrow.mesh</file>
<file>mockfiles/meshes/scalerod.mesh</file>
<file>mockfiles/images/camera-pick-icon.png</file> <file>mockfiles/images/camera-pick-icon.png</file>
<file>mockfiles/images/camera-pick-icon@2x.png</file> <file>mockfiles/images/camera-pick-icon@2x.png</file>
<file>mockfiles/images/light-pick-icon.png</file> <file>mockfiles/images/light-pick-icon.png</file>

View File

@@ -44,6 +44,8 @@ T.ComboBox {
property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth property real __actionIndicatorWidth: StudioTheme.Values.squareComponentWidth
property real __actionIndicatorHeight: StudioTheme.Values.height property real __actionIndicatorHeight: StudioTheme.Values.height
property alias textInput: comboBoxInput
signal compressedActivated(int index) signal compressedActivated(int index)
width: StudioTheme.Values.squareComponentWidth * 5 width: StudioTheme.Values.squareComponentWidth * 5

View File

@@ -54,10 +54,10 @@ while read -r line; do
done < <(env) done < <(env)
''' '''
def system_login_script(): def system_login_script_bash():
return 'if [ -f /etc/profile ]; then source /etc/profile; fi\n' return 'if [ -f /etc/profile ]; then source /etc/profile; fi\n'
def login_script(): def login_script_bash():
return ''' return '''
if [ -f $HOME/.bash_profile ]; then if [ -f $HOME/.bash_profile ]; then
source $HOME/.bash_profile source $HOME/.bash_profile
@@ -68,6 +68,16 @@ elif [ -f $HOME/.profile ]; then
fi 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(): def environment_script():
return ''.join(['export ' + quote_shell(key + '=' + os.environ[key]) + '\n' return ''.join(['export ' + quote_shell(key + '=' + os.environ[key]) + '\n'
for key in os.environ]) for key in os.environ])
@@ -98,6 +108,10 @@ end tell
def main(): def main():
# create temporary file to be sourced into bash that deletes itself # create temporary file to be sourced into bash that deletes itself
with NamedTemporaryFile(delete=False) as shell_script: 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) quoted_shell_script = quote_shell(shell_script.name)
commands = (clean_environment_script() + commands = (clean_environment_script() +
system_login_script() + # /etc/profile by default resets the path, so do first 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' + 'cd ' + quote_shell(os.getcwd()) + '\n' +
' '.join([quote_shell(arg) for arg in sys.argv[1:]]) + '\n' + ' '.join([quote_shell(arg) for arg in sys.argv[1:]]) + '\n' +
'rm ' + quoted_shell_script + '\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.write(commands)
shell_script.flush() shell_script.flush()

View File

@@ -2415,7 +2415,7 @@ class CPLUSPLUS_EXPORT AlignofExpressionAST: public ExpressionAST
public: public:
int alignof_token = 0; int alignof_token = 0;
int lparen_token = 0; int lparen_token = 0;
TypeIdAST *typeId; TypeIdAST *typeId = nullptr;
int rparen_token = 0; int rparen_token = 0;
public: public:

View File

@@ -9,7 +9,7 @@
Copyright 2004 Alexander Neundorf (neundorf@kde.org) Copyright 2004 Alexander Neundorf (neundorf@kde.org)
Copyright 2005 Dominik Haumann (dhdev@gmx.de) Copyright 2005 Dominik Haumann (dhdev@gmx.de)
Copyright 2007,2008,2013,2014 Matthew Woehlke (mw_triad@users.sourceforge.net) 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 * * This library is free software; you can redistribute it and/or *
@@ -31,7 +31,7 @@
<language <language
name="CMake" name="CMake"
version="11" version="16"
kateversion="2.4" kateversion="2.4"
section="Other" section="Other"
extensions="CMakeLists.txt;*.cmake;*.cmake.in" extensions="CMakeLists.txt;*.cmake;*.cmake.in"
@@ -70,6 +70,12 @@
{%- endfor %} {%- endfor %}
</list> </list>
<list name="environment-variables">
{%- for var in environment_variables.kw %}
<item>{{var}}</item>
{%- endfor %}
</list>
{%- for kind in properties.kinds %} {%- for kind in properties.kinds %}
<list name="{{ kind|replace('_', '-') }}"> <list name="{{ kind|replace('_', '-') }}">
{%- for prop in properties[kind].kw %} {%- for prop in properties[kind].kw %}
@@ -197,11 +203,27 @@
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="Detect Variable Substitutions"> <context attribute="Normal Text" lineEndContext="#stay" name="Detect Variable Substitutions">
<RegExpr attribute="Environment Variable Substitution" context="#stay" String="\$ENV\{\s*[\w-]+\s*\}" /> <RegExpr attribute="Cache Variable Substitution" context="#stay" String="\$CACHE\{\s*[\w-]+\s*\}" />
<RegExpr attribute="Environment Variable Substitution" context="EnvVarSubst" String="\$ENV\{\s*[\w-]+\s*\}" lookAhead="true" />
<Detect2Chars attribute="Variable Substitution" context="VarSubst" char="$" char1="{" /> <Detect2Chars attribute="Variable Substitution" context="VarSubst" char="$" char1="{" />
<RegExpr attribute="@Variable Substitution" context="@VarSubst" String="@&id_re;@" lookAhead="true" /> <RegExpr attribute="@Variable Substitution" context="@VarSubst" String="@&id_re;@" lookAhead="true" />
</context> </context>
<context attribute="Environment Variable Substitution" lineEndContext="#pop" name="EnvVarSubst">
<DetectIdentifier />
<DetectChar attribute="Environment Variable Substitution" context="EnvVarSubstVar" char="{" />
<DetectChar attribute="Environment Variable Substitution" context="#pop" char="}" />
</context>
<context attribute="Environment Variable Substitution" lineEndContext="#pop" name="EnvVarSubstVar">
<keyword attribute="Standard Environment Variable" context="#stay" String="environment-variables" insensitive="false" />
{%- for var in environment_variables.re %}
<RegExpr attribute="Standard Environment Variable" context="#stay" String="{{var}}" />
{%- endfor %}
<DetectIdentifier />
<DetectChar attribute="Environment Variable Substitution" context="#pop#pop" char="}" />
</context>
<context attribute="Variable Substitution" lineEndContext="#pop" name="VarSubst"> <context attribute="Variable Substitution" lineEndContext="#pop" name="VarSubst">
<IncludeRules context="Detect Builtin Variables" /> <IncludeRules context="Detect Builtin Variables" />
<DetectIdentifier /> <DetectIdentifier />
@@ -300,10 +322,12 @@
<itemData name="Strings" defStyleNum="dsString" spellChecking="true" /> <itemData name="Strings" defStyleNum="dsString" spellChecking="true" />
<itemData name="Escapes" defStyleNum="dsChar" spellChecking="false" /> <itemData name="Escapes" defStyleNum="dsChar" spellChecking="false" />
<itemData name="Builtin Variable" defStyleNum="dsDecVal" color="#c09050" selColor="#c09050" spellChecking="false" /> <itemData name="Builtin Variable" defStyleNum="dsDecVal" color="#c09050" selColor="#c09050" spellChecking="false" />
<itemData name="Internal Name" defStyleNum="dsDecVal" color="#303030" selColor="#303030" spellChecking="false" />
<itemData name="Variable Substitution" defStyleNum="dsDecVal" spellChecking="false" /> <itemData name="Variable Substitution" defStyleNum="dsDecVal" spellChecking="false" />
<itemData name="@Variable Substitution" defStyleNum="dsBaseN" spellChecking="false" /> <itemData name="@Variable Substitution" defStyleNum="dsBaseN" spellChecking="false" />
<itemData name="Internal Name" defStyleNum="dsDecVal" color="#303030" selColor="#303030" spellChecking="false" /> <itemData name="Cache Variable Substitution" defStyleNum="dsFloat" spellChecking="false" />
<itemData name="Environment Variable Substitution" defStyleNum="dsFloat" spellChecking="false" /> <itemData name="Environment Variable Substitution" defStyleNum="dsFloat" spellChecking="false" />
<itemData name="Standard Environment Variable" defStyleNum="dsFloat" spellChecking="false" />
<itemData name="Generator Expression Keyword" defStyleNum="dsKeyword" color="#b84040" selColor="#b84040" spellChecking="false" /> <itemData name="Generator Expression Keyword" defStyleNum="dsKeyword" color="#b84040" selColor="#b84040" spellChecking="false" />
<itemData name="Generator Expression" defStyleNum="dsOthers" color="#b86050" selColor="#b86050" spellChecking="false" /> <itemData name="Generator Expression" defStyleNum="dsOthers" color="#b86050" selColor="#b86050" spellChecking="false" />
<itemData name="Comment" defStyleNum="dsComment" spellChecking="true" /> <itemData name="Comment" defStyleNum="dsComment" spellChecking="true" />

View File

@@ -7,6 +7,7 @@ global-properties:
- AUTORCC_SOURCE_GROUP - AUTORCC_SOURCE_GROUP
- CMAKE_C_KNOWN_FEATURES - CMAKE_C_KNOWN_FEATURES
- CMAKE_CXX_KNOWN_FEATURES - CMAKE_CXX_KNOWN_FEATURES
- CMAKE_ROLE # Since 3.14
- DEBUG_CONFIGURATIONS - DEBUG_CONFIGURATIONS
- DISABLED_FEATURES - DISABLED_FEATURES
- ENABLED_FEATURES - ENABLED_FEATURES
@@ -42,6 +43,7 @@ global-properties:
- FeatureSummary_<TYPE>_DESCRIPTION - FeatureSummary_<TYPE>_DESCRIPTION
directory-properties: directory-properties:
- ADDITIONAL_CLEAN_FILES # Since 3.15
- ADDITIONAL_MAKE_CLEAN_FILES - ADDITIONAL_MAKE_CLEAN_FILES
- BINARY_DIR - BINARY_DIR
- BUILDSYSTEM_TARGETS - 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! # NOTE Copy-n-pasting this list from official docs may contain a redudant item `Example`! Check it!
target-properties: target-properties:
- ADDITIONAL_CLEAN_FILES # Since 3.15
- ALIASED_TARGET - ALIASED_TARGET
- ANDROID_ANT_ADDITIONAL_OPTIONS - ANDROID_ANT_ADDITIONAL_OPTIONS
- ANDROID_API - ANDROID_API
@@ -101,17 +104,24 @@ target-properties:
- ARCHIVE_OUTPUT_NAME_<CONFIG> - ARCHIVE_OUTPUT_NAME_<CONFIG>
- ARCHIVE_OUTPUT_NAME - ARCHIVE_OUTPUT_NAME
- AUTOGEN_BUILD_DIR - AUTOGEN_BUILD_DIR
- AUTOGEN_ORIGIN_DEPENDS # Since 3.14
- AUTOGEN_TARGET_DEPENDS - AUTOGEN_TARGET_DEPENDS
- AUTOMOC_COMPILER_PREDEFINES # Since ???
- AUTOMOC_DEPEND_FILTERS - AUTOMOC_DEPEND_FILTERS
- AUTOMOC_MOC_OPTIONS - AUTOMOC_EXECUTABLE # Since 3.14
- AUTOMOC_MACRO_NAMES
- AUTOMOC_MOC_OPTIONS # Since ???
- AUTOMOC - AUTOMOC
- AUTOUIC - AUTOUIC
- AUTOUIC_EXECUTABLE # Since 3.14
- AUTOUIC_OPTIONS - AUTOUIC_OPTIONS
- AUTOUIC_SEARCH_PATHS - AUTOUIC_SEARCH_PATHS
- AUTORCC - AUTORCC
- AUTORCC_EXECUTABLE # Since 3.14
- AUTORCC_OPTIONS - AUTORCC_OPTIONS
- BINARY_DIR - BINARY_DIR
- BUILD_RPATH - BUILD_RPATH
- BUILD_RPATH_USE_ORIGIN # Since 3.14
- BUILD_WITH_INSTALL_NAME_DIR - BUILD_WITH_INSTALL_NAME_DIR
- BUILD_WITH_INSTALL_RPATH - BUILD_WITH_INSTALL_RPATH
- BUNDLE_EXTENSION - BUNDLE_EXTENSION
@@ -246,6 +256,7 @@ target-properties:
- MACOSX_RPATH - MACOSX_RPATH
- MANUALLY_ADDED_DEPENDENCIES - MANUALLY_ADDED_DEPENDENCIES
- MAP_IMPORTED_CONFIG_<CONFIG> - MAP_IMPORTED_CONFIG_<CONFIG>
- MSVC_RUNTIME_LIBRARY # Since 3.15
- NAME - NAME
- NO_SONAME - NO_SONAME
- NO_SYSTEM_FROM_IMPORTED - NO_SYSTEM_FROM_IMPORTED
@@ -278,6 +289,9 @@ target-properties:
- STATIC_LIBRARY_FLAGS - STATIC_LIBRARY_FLAGS
- STATIC_LIBRARY_OPTIONS # Since 3.13 - STATIC_LIBRARY_OPTIONS # Since 3.13
- SUFFIX - SUFFIX
- Swift_DEPENDENCIES_FILE # Since 3.15
- Swift_MODULE_DIRECTORY # Since 3.15
- Swift_MODULE_NAME # Since 3.15
- TYPE - TYPE
- VERSION - VERSION
- VISIBILITY_INLINES_HIDDEN - VISIBILITY_INLINES_HIDDEN
@@ -298,8 +312,13 @@ target-properties:
- VS_GLOBAL_<variable> - VS_GLOBAL_<variable>
- VS_IOT_EXTENSIONS_VERSION - VS_IOT_EXTENSIONS_VERSION
- VS_IOT_STARTUP_TASK - VS_IOT_STARTUP_TASK
- VS_JUST_MY_CODE_DEBUGGING # Since 3.15
- VS_KEYWORD - VS_KEYWORD
- VS_MOBILE_EXTENSIONS_VERSION - 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_AUXPATH
- VS_SCC_LOCALPATH - VS_SCC_LOCALPATH
- VS_SCC_PROJECTNAME - VS_SCC_PROJECTNAME
@@ -314,9 +333,12 @@ target-properties:
- WINDOWS_EXPORT_ALL_SYMBOLS - WINDOWS_EXPORT_ALL_SYMBOLS
- XCODE_ATTRIBUTE_<an-attribute> - XCODE_ATTRIBUTE_<an-attribute>
- XCODE_EXPLICIT_FILE_TYPE - XCODE_EXPLICIT_FILE_TYPE
- XCODE_GENERATE_SCHEME # Since 3.15
- XCODE_PRODUCT_TYPE - XCODE_PRODUCT_TYPE
- XCODE_SCHEME_ADDRESS_SANITIZER # Since 3.13 - XCODE_SCHEME_ADDRESS_SANITIZER # Since 3.13
- XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN # 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 # Since 3.13
- XCODE_SCHEME_THREAD_SANITIZER_STOP # Since 3.13 - XCODE_SCHEME_THREAD_SANITIZER_STOP # Since 3.13
- XCODE_SCHEME_UNDEFINED_BEHAVIOUR_SANITIZER # 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_LINKER_API_USAGE # Since 3.13
- XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS # Since 3.13 - XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS # Since 3.13
- XCODE_SCHEME_EXECUTABLE # Since 3.13 - XCODE_SCHEME_EXECUTABLE # Since 3.13
- XCODE_SCHEME_ARGUMENTS # Since 3.13
- XCODE_SCHEME_ENVIRONMENT # Since 3.13 - XCODE_SCHEME_ENVIRONMENT # Since 3.13
- XCTEST - XCTEST
@@ -383,6 +404,8 @@ source-properties:
- SKIP_AUTOMOC - SKIP_AUTOMOC
- SKIP_AUTORCC - SKIP_AUTORCC
- SKIP_AUTOUIC - SKIP_AUTOUIC
- Swift_DEPENDENCIES_FILE # Since 3.15
- Swift_DIAGNOSTICS_FILE # Since 3.15
- SYMBOLIC - SYMBOLIC
- VS_COPY_TO_OUT_DIR - VS_COPY_TO_OUT_DIR
- VS_CSHARP_<tagname> - VS_CSHARP_<tagname>
@@ -423,69 +446,95 @@ install-properties:
- CPACK_WIX_ACL - CPACK_WIX_ACL
generator-expressions: generator-expressions:
# Boolean Generator Expressions
# * Logical Operators
- 0 - 0
- 1 - 1
- AND
- ANGLE-R
- BOOL - BOOL
- BUILD_INTERFACE - AND
- 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
- OR - OR
- PLATFORM_ID - NOT
- SEMICOLON # * String Comparisons
- SHELL_PATH
- STREQUAL - STREQUAL
- TARGET_BUNDLE_CONTENT_DIR - EQUAL
- TARGET_BUNDLE_DIR - IN_LIST # Since 3.12
- 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
- VERSION_LESS - VERSION_LESS
- VERSION_GREATER
- VERSION_EQUAL
- VERSION_LESS_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:
# Variables that Provide Information # Variables that Provide Information
- CMAKE_AR - CMAKE_AR
- CMAKE_ARGC - CMAKE_ARGC
- CMAKE_ARGV0 - CMAKE_ARGV<n>
- CMAKE_BINARY_DIR - CMAKE_BINARY_DIR
- CMAKE_BUILD_TOOL - CMAKE_BUILD_TOOL
- CMAKE_CACHEFILE_DIR - CMAKE_CACHEFILE_DIR
@@ -558,6 +607,7 @@ variables:
- CMAKE_SOURCE_DIR - CMAKE_SOURCE_DIR
- CMAKE_STATIC_LIBRARY_PREFIX - CMAKE_STATIC_LIBRARY_PREFIX
- CMAKE_STATIC_LIBRARY_SUFFIX - CMAKE_STATIC_LIBRARY_SUFFIX
- CMAKE_Swift_MODULE_DIRECTORY # Since 3.15
- CMAKE_TOOLCHAIN_FILE - CMAKE_TOOLCHAIN_FILE
- CMAKE_TWEAK_VERSION - CMAKE_TWEAK_VERSION
- CMAKE_VERBOSE_MAKEFILE - CMAKE_VERBOSE_MAKEFILE
@@ -611,7 +661,9 @@ variables:
- CMAKE_ECLIPSE_VERSION - CMAKE_ECLIPSE_VERSION
- CMAKE_ERROR_DEPRECATED - CMAKE_ERROR_DEPRECATED
- CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION - CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION
- CMAKE_EXECUTE_PROCESS_COMMAND_ECHO # Since 3.15
- CMAKE_EXPORT_COMPILE_COMMANDS - CMAKE_EXPORT_COMPILE_COMMANDS
- CMAKE_EXPORT_PACKAGE_REGISTRY # Since 3.15
- CMAKE_EXPORT_NO_PACKAGE_REGISTRY - CMAKE_EXPORT_NO_PACKAGE_REGISTRY
- CMAKE_FIND_APPBUNDLE - CMAKE_FIND_APPBUNDLE
- CMAKE_FIND_FRAMEWORK - CMAKE_FIND_FRAMEWORK
@@ -621,6 +673,8 @@ variables:
- CMAKE_FIND_NO_INSTALL_PREFIX - CMAKE_FIND_NO_INSTALL_PREFIX
- CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY - CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY
- CMAKE_FIND_PACKAGE_NO_SYSTEM_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_PACKAGE_WARN_NO_MODULE
- CMAKE_FIND_ROOT_PATH - CMAKE_FIND_ROOT_PATH
- CMAKE_FIND_ROOT_PATH_MODE_INCLUDE - CMAKE_FIND_ROOT_PATH_MODE_INCLUDE
@@ -639,6 +693,7 @@ variables:
- CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT - CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT
- CMAKE_LIBRARY_PATH - CMAKE_LIBRARY_PATH
- CMAKE_LINK_DIRECTORIES_BEFORE # Since 3.13 - CMAKE_LINK_DIRECTORIES_BEFORE # Since 3.13
- CMAKE_MAXIMUM_RECURSION_DEPTH # Since 3.14
- CMAKE_MFC_FLAG - CMAKE_MFC_FLAG
- CMAKE_MODULE_PATH - CMAKE_MODULE_PATH
- CMAKE_NOT_USING_CONFIG_FLAGS - CMAKE_NOT_USING_CONFIG_FLAGS
@@ -646,6 +701,8 @@ variables:
- CMAKE_POLICY_WARNING_CMP<NNNN> - CMAKE_POLICY_WARNING_CMP<NNNN>
- CMAKE_PREFIX_PATH - CMAKE_PREFIX_PATH
- CMAKE_PROGRAM_PATH - CMAKE_PROGRAM_PATH
- CMAKE_PROJECT_INCLUDE # Since 3.15
- CMAKE_PROJECT_INCLUDE_BEFORE # Since 3.15
- CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE - CMAKE_PROJECT_<PROJECT-NAME>_INCLUDE
- CMAKE_SKIP_INSTALL_ALL_DEPENDENCY - CMAKE_SKIP_INSTALL_ALL_DEPENDENCY
- CMAKE_STAGING_PREFIX - CMAKE_STAGING_PREFIX
@@ -757,6 +814,7 @@ variables:
- CMAKE_ANDROID_STL_TYPE - CMAKE_ANDROID_STL_TYPE
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY - CMAKE_ARCHIVE_OUTPUT_DIRECTORY
- CMAKE_ARCHIVE_OUTPUT_DIRECTORY_<CONFIG> - CMAKE_ARCHIVE_OUTPUT_DIRECTORY_<CONFIG>
- CMAKE_AUTOGEN_ORIGIN_DEPENDS # Since 3.14
- CMAKE_AUTOGEN_PARALLEL - CMAKE_AUTOGEN_PARALLEL
- CMAKE_AUTOGEN_VERBOSE # Since 3.13 - CMAKE_AUTOGEN_VERBOSE # Since 3.13
- CMAKE_AUTOMOC - CMAKE_AUTOMOC
@@ -768,6 +826,7 @@ variables:
- CMAKE_AUTOUIC_OPTIONS - CMAKE_AUTOUIC_OPTIONS
- CMAKE_AUTOUIC_SEARCH_PATHS - CMAKE_AUTOUIC_SEARCH_PATHS
- CMAKE_BUILD_RPATH - CMAKE_BUILD_RPATH
- CMAKE_BUILD_RPATH_USE_ORIGIN # Since 3.14
- CMAKE_BUILD_WITH_INSTALL_NAME_DIR - CMAKE_BUILD_WITH_INSTALL_NAME_DIR
- CMAKE_BUILD_WITH_INSTALL_RPATH - CMAKE_BUILD_WITH_INSTALL_RPATH
- CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY - CMAKE_COMPILE_PDB_OUTPUT_DIRECTORY
@@ -781,8 +840,13 @@ variables:
- CMAKE_EXE_LINKER_FLAGS_<CONFIG>_INIT - CMAKE_EXE_LINKER_FLAGS_<CONFIG>_INIT
- CMAKE_EXE_LINKER_FLAGS_INIT - CMAKE_EXE_LINKER_FLAGS_INIT
- CMAKE_FOLDER # Since 3.12 - CMAKE_FOLDER # Since 3.12
- CMAKE_FRAMEWORK # Since 3.15
- CMAKE_Fortran_FORMAT - CMAKE_Fortran_FORMAT
- CMAKE_Fortran_MODULE_DIRECTORY - 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_GNUtoMS
- CMAKE_INCLUDE_CURRENT_DIR - CMAKE_INCLUDE_CURRENT_DIR
- CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE - CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE
@@ -814,6 +878,8 @@ variables:
- CMAKE_MODULE_LINKER_FLAGS_<CONFIG> - CMAKE_MODULE_LINKER_FLAGS_<CONFIG>
- CMAKE_MODULE_LINKER_FLAGS_<CONFIG>_INIT - CMAKE_MODULE_LINKER_FLAGS_<CONFIG>_INIT
- 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_NINJA_OUTPUT_PATH_PREFIX
- CMAKE_NO_BUILTIN_CHRPATH - CMAKE_NO_BUILTIN_CHRPATH
- CMAKE_NO_SYSTEM_FROM_IMPORTED - CMAKE_NO_SYSTEM_FROM_IMPORTED
@@ -843,6 +909,7 @@ variables:
- CMAKE_VS_GLOBALS # Since 3.13 - CMAKE_VS_GLOBALS # Since 3.13
- CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD - CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD
- CMAKE_VS_INCLUDE_PACKAGE_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_EXCLUDE_DIRECTORIES # Since 3.12
- CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES # Since 3.12 - CMAKE_VS_SDK_EXECUTABLE_DIRECTORIES # Since 3.12
- CMAKE_VS_SDK_INCLUDE_DIRECTORIES # Since 3.12 - CMAKE_VS_SDK_INCLUDE_DIRECTORIES # Since 3.12
@@ -986,6 +1053,7 @@ variables:
- CTEST_P4_UPDATE_OPTIONS - CTEST_P4_UPDATE_OPTIONS
- CTEST_SCP_COMMAND - CTEST_SCP_COMMAND
- CTEST_SITE - CTEST_SITE
- CTEST_SUBMIT_URL # Since 3.14
- CTEST_SOURCE_DIRECTORY - CTEST_SOURCE_DIRECTORY
- CTEST_SVN_COMMAND - CTEST_SVN_COMMAND
- CTEST_SVN_OPTIONS - CTEST_SVN_OPTIONS
@@ -996,6 +1064,7 @@ variables:
- CTEST_UPDATE_COMMAND - CTEST_UPDATE_COMMAND
- CTEST_UPDATE_OPTIONS - CTEST_UPDATE_OPTIONS
- CTEST_UPDATE_VERSION_ONLY - CTEST_UPDATE_VERSION_ONLY
- CTEST_UPDATE_VERSION_OVERRIDE # Since 3.15
- CTEST_USE_LAUNCHERS - CTEST_USE_LAUNCHERS
# Variables for CPack # Variables for CPack
- CPACK_ABSOLUTE_DESTINATION_FILES - CPACK_ABSOLUTE_DESTINATION_FILES
@@ -1064,6 +1133,7 @@ variables:
- CMAKE_REQUIRED_DEFINITIONS - CMAKE_REQUIRED_DEFINITIONS
- CMAKE_REQUIRED_FLAGS - CMAKE_REQUIRED_FLAGS
- CMAKE_REQUIRED_INCLUDES - CMAKE_REQUIRED_INCLUDES
- CMAKE_REQUIRED_LINK_OPTIONS # Since 3.14
- CMAKE_REQUIRED_LIBRARIES - CMAKE_REQUIRED_LIBRARIES
- CMAKE_REQUIRED_QUIET - CMAKE_REQUIRED_QUIET
# - CheckTypeSize # - CheckTypeSize
@@ -1198,6 +1268,7 @@ variables:
- CPACK_IFW_PACKAGE_BANNER - CPACK_IFW_PACKAGE_BANNER
- CPACK_IFW_PACKAGE_BACKGROUND - CPACK_IFW_PACKAGE_BACKGROUND
- CPACK_IFW_PACKAGE_WIZARD_STYLE - CPACK_IFW_PACKAGE_WIZARD_STYLE
- CPACK_IFW_PACKAGE_STYLE_SHEET # Since 3.15
- CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH - CPACK_IFW_PACKAGE_WIZARD_DEFAULT_WIDTH
- CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT - CPACK_IFW_PACKAGE_WIZARD_DEFAULT_HEIGHT
- CPACK_IFW_PACKAGE_TITLE_COLOR - CPACK_IFW_PACKAGE_TITLE_COLOR
@@ -1546,7 +1617,59 @@ variables:
# - UseSWIG # - UseSWIG
- CMAKE_SWIG_FLAGS - CMAKE_SWIG_FLAGS
- CMAKE_SWIG_OUTDIR - CMAKE_SWIG_OUTDIR
- SWIG_OUTFILE_DIR
- SWIG_MODULE_<name>_EXTRA_DEPS - SWIG_MODULE_<name>_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
- <PackageName>_ROOT
- VERBOSE
# Environment Variables for Languages
- ASM<DIALECT>
- ASM<DIALECT>FLAGS
- 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
- <PackageName>_DIR
- CMAKE_PREFIX_PATH
- CMAKE_FRAMEWORK_PATH
- CMAKE_APPBUNDLE_PATH
- PATH
scripting-commands: scripting-commands:
- -
@@ -1670,11 +1793,21 @@ scripting-commands:
, ERROR_FILE , ERROR_FILE
, OUTPUT_QUIET , OUTPUT_QUIET
, ERROR_QUIET , ERROR_QUIET
, COMMAND_ECHO # Since 3.15
, OUTPUT_STRIP_TRAILING_WHITESPACE , OUTPUT_STRIP_TRAILING_WHITESPACE
, ERROR_STRIP_TRAILING_WHITESPACE , ERROR_STRIP_TRAILING_WHITESPACE
, ENCODING , 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 name: file
named-args: [ named-args: [
@@ -1746,6 +1879,7 @@ scripting-commands:
, DIRECTORY_PERMISSIONS , DIRECTORY_PERMISSIONS
, NO_SOURCE_PERMISSIONS , NO_SOURCE_PERMISSIONS
, USE_SOURCE_PERMISSIONS , USE_SOURCE_PERMISSIONS
, FOLLOW_SYMLINK_CHAIN # Since 3.15
, FILES_MATCHING , FILES_MATCHING
, PATTERN , PATTERN
, REGEX , REGEX
@@ -1760,6 +1894,9 @@ scripting-commands:
# Sub-options of UPLOAD/DOWNLOAD since 3.11 # Sub-options of UPLOAD/DOWNLOAD since 3.11
, NETRC , NETRC
, NETRC_FILE , NETRC_FILE
# New sub-options since 3.14
, READ_SYMLINK
, SIZE
] ]
special-args: [ special-args: [
UTF-8 UTF-8
@@ -1871,7 +2008,21 @@ scripting-commands:
property-args: &get_directory_property [directory-properties] property-args: &get_directory_property [directory-properties]
- -
name: get_filename_component 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 name: get_property
named-args: [GLOBAL, DIRECTORY, TARGET, SOURCE, INSTALL, TEST, CACHE, VARIABLE, PROPERTY, SET, DEFINED, BRIEF_DOCS, FULL_DOCS] named-args: [GLOBAL, DIRECTORY, TARGET, SOURCE, INSTALL, TEST, CACHE, VARIABLE, PROPERTY, SET, DEFINED, BRIEF_DOCS, FULL_DOCS]
@@ -1933,6 +2084,10 @@ scripting-commands:
, FOR , FOR
# NOTE Another `REGEX` named arg has already added # NOTE Another `REGEX` named arg has already added
, OUTPUT_VARIABLE , OUTPUT_VARIABLE
# Since 3.15
# NOTE Another `PREPEND` named arg has already added
, POP_FRONT
, POP_BACK
] ]
# Since 3.13 # Since 3.13
special-args: [STRING, FILE_BASENAME, SENSITIVE, INSENSITIVE, ASCENDING, DESCENDING] special-args: [STRING, FILE_BASENAME, SENSITIVE, INSENSITIVE, ASCENDING, DESCENDING]
@@ -1951,7 +2106,19 @@ scripting-commands:
special-args: [DECIMAL, HEXADECIMAL] special-args: [DECIMAL, HEXADECIMAL]
- -
name: message 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 name: option
- -
@@ -1993,6 +2160,7 @@ scripting-commands:
, SUBSTRING , SUBSTRING
, STRIP , STRIP
, GENEX_STRIP , GENEX_STRIP
, REPEAT # Since 3.15
, COMPARE , COMPARE
, LESS , LESS
, GREATER , GREATER
@@ -2055,6 +2223,7 @@ project-commands:
, WORKING_DIRECTORY , WORKING_DIRECTORY
, COMMENT , COMMENT
, DEPFILE , DEPFILE
, JOB_POOL # Since 3.15
, VERBATIM , VERBATIM
, APPEND , APPEND
, USES_TERMINAL , USES_TERMINAL
@@ -2064,6 +2233,7 @@ project-commands:
, PRE_LINK , PRE_LINK
, POST_BUILD , POST_BUILD
] ]
nested-parentheses?: true
- -
name: add_custom_target name: add_custom_target
named-args: [ named-args: [
@@ -2075,12 +2245,14 @@ project-commands:
, WORKING_DIRECTORY , WORKING_DIRECTORY
, COMMENT , COMMENT
, DEPFILE , DEPFILE
, JOB_POOL # Since 3.15
, VERBATIM , VERBATIM
, APPEND , APPEND
, USES_TERMINAL , USES_TERMINAL
, COMMAND_EXPAND_LISTS , COMMAND_EXPAND_LISTS
, SOURCES , SOURCES
] ]
nested-parentheses?: true
- -
name: add_definitions name: add_definitions
- -
@@ -2099,6 +2271,7 @@ project-commands:
- -
name: add_test name: add_test
named-args: [NAME, COMMAND, CONFIGURATIONS, WORKING_DIRECTORY] named-args: [NAME, COMMAND, CONFIGURATIONS, WORKING_DIRECTORY]
nested-parentheses?: true
- -
name: aux_source_directory name: aux_source_directory
- -
@@ -2347,6 +2520,7 @@ project-commands:
, SOURCES , SOURCES
, COMPILE_DEFINITIONS , COMPILE_DEFINITIONS
, LINK_LIBRARIES , LINK_LIBRARIES
, LINK_OPTIONS # Since 3.14
, COPY_FILE , COPY_FILE
, COPY_FILE_ERROR , COPY_FILE_ERROR
, <LANG>_STANDARD , <LANG>_STANDARD
@@ -2361,6 +2535,7 @@ project-commands:
, CMAKE_FLAGS , CMAKE_FLAGS
, COMPILE_DEFINITIONS , COMPILE_DEFINITIONS
, LINK_LIBRARIES , LINK_LIBRARIES
, LINK_OPTIONS # Since 3.14
, COMPILE_OUTPUT_VARIABLE , COMPILE_OUTPUT_VARIABLE
, RUN_OUTPUT_VARIABLE , RUN_OUTPUT_VARIABLE
, OUTPUT_VARIABLE , OUTPUT_VARIABLE
@@ -2414,7 +2589,19 @@ ctest-commands:
named-args: [TRACK, APPEND, QUIET] named-args: [TRACK, APPEND, QUIET]
- -
name: ctest_submit 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 name: ctest_test
named-args: [ named-args: [

View File

@@ -3,7 +3,7 @@
# #
# Generate Kate syntax file for CMake # Generate Kate syntax file for CMake
# #
# Copyright (c) 2017, Alex Turbov <i.zaufi@gmail.com> # Copyright (c) 2017-2019 Alex Turbov <i.zaufi@gmail.com>
# #
# To install prerequisites: # To install prerequisites:
# #
@@ -33,6 +33,7 @@ _PROPERTY_KEYS = [
, 'install-properties' , 'install-properties'
] ]
_KW_RE_LIST = ['kw', 're'] _KW_RE_LIST = ['kw', 're']
_VAR_KIND_LIST = ['variables', 'environment-variables']
def try_transform_placeholder_string_to_regex(name): 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: if 'CMAKE_MATCH_' in m:
return '\\bCMAKE_MATCH_[0-9]+\\b' 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 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): def cli(input_yaml, template):
data = yaml.load(input_yaml) data = yaml.load(input_yaml)
# Partition `variables` list into "pure" words and regexes to match # Partition `variables` and `environment-variables` lists into "pure" (key)words and regexes to match
data['variables'] = { for var_key in _VAR_KIND_LIST:
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[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['variables']['re'] = [*map(lambda x: try_transform_placeholder_string_to_regex(x), data['variables']['re'])] 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 # Transform properties and make all-properties list
data['properties'] = {} 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]) props, props_re = partition_iterable(lambda x: _TEMPLATED_NAME.search(x) is None, data[prop])
del 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] = {
data['properties'][python_prop_list_name]['re'] = [*map(lambda x: try_transform_placeholder_string_to_regex(x), props_re)] 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)] data['properties']['kinds'] = [*map(lambda name: name.replace('-', '_'), _PROPERTY_KEYS)]
# Make all commands list # 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['generator_expressions'] = data['generator-expressions']
data['environment_variables'] = data['environment-variables']
del data['generator-expressions']
del data['environment-variables']
env = jinja2.Environment( env = jinja2.Environment(
keep_trailing_newline=True keep_trailing_newline=True

View File

@@ -42,7 +42,14 @@ if ($root == 1)
} }
else else
{ {
if ($file =~ /<language[^>]+hidden="[^"]*"/) {
$file =~ s/<language([^>]+)name="([^"]*)"/<language$1name="$2\/PHP"/s;
$file =~ s/<language([^>]+)hidden="[^"]*"/<language$1hidden="true"/s;
}
else
{
$file =~ s/<language([^>]+)name="([^"]*)"/<language$1name="$2\/PHP" hidden="true"/s; $file =~ s/<language([^>]+)name="([^"]*)"/<language$1name="$2\/PHP" hidden="true"/s;
}
$file =~ s/<language([^>]+)section="[^"]*"/<language$1section="Other"/s; $file =~ s/<language([^>]+)section="[^"]*"/<language$1section="Other"/s;
$file =~ s/<language([^>]+)extensions="[^"]*"/<language$1extensions=""/s; $file =~ s/<language([^>]+)extensions="[^"]*"/<language$1extensions=""/s;
$file =~ s/<language([^>]+)mimetype="[^"]*"/<language$1mimetype=""/s; $file =~ s/<language([^>]+)mimetype="[^"]*"/<language$1mimetype=""/s;
@@ -51,7 +58,8 @@ else
$findphp = "<context name=\"FindPHP\" attribute=\"Normal Text\" lineEndContext=\"#stay\">\n<RegExpr context=\"##PHP/PHP\" String=\"&lt;\\?(?:=|php)?\" lookAhead=\"true\" />\n</context>\n"; $findphp = "<context name=\"FindPHP\" attribute=\"Normal Text\" lineEndContext=\"#stay\">\n<RegExpr context=\"##PHP/PHP\" String=\"&lt;\\?(?:=|php)?\" lookAhead=\"true\" />\n</context>\n";
$file =~ s/<IncludeRules\s([^>]*)context="([^"#]*)##(?!Alerts|Doxygen|Modelines)([^"]+)"/<IncludeRules $1context="$2##$3\/PHP"/g; $file =~ s/<IncludeRules\s([^>]*)context="([^"#]*)##(?!Alerts|Doxygen|Modelines)([^"]+)"/<IncludeRules $1context="$2##$3\/PHP"/g;
$file =~ s/(<context\s[^>]*>)/$1\n<IncludeRules context="FindPHP" \/>/g; $file =~ s/(<context\s[^>]*[^>\/]>)/$1\n<IncludeRules context="FindPHP" \/>/g;
$file =~ s/(<context\s[^>]*[^>\/])\s*\/>/$1>\n<IncludeRules context="FindPHP" \/>\n<\/context>/g;
$file =~ s/(?=<\/contexts\s*>)/$findphp/; $file =~ s/(?=<\/contexts\s*>)/$findphp/;
print $file; print $file;

View File

@@ -279,9 +279,10 @@
--> -->
<xs:element name="list"> <xs:element name="list">
<xs:complexType> <xs:complexType>
<xs:sequence> <xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element minOccurs="0" maxOccurs="unbounded" ref="item"/> <xs:element ref="item"/>
</xs:sequence> <xs:element ref="include"/>
</xs:choice>
<xs:attribute name="name" use="required"/> <xs:attribute name="name" use="required"/>
</xs:complexType> </xs:complexType>
</xs:element> </xs:element>
@@ -290,6 +291,11 @@
contains string used in <keyword> contains string used in <keyword>
--> -->
<xs:element name="item" type="xs:string"/> <xs:element name="item" type="xs:string"/>
<!--
List include
contains a name of <keyword>
-->
<xs:element name="include" type="xs:string"/>
<!-- List of contexts --> <!-- List of contexts -->
<xs:element name="contexts"> <xs:element name="contexts">
<xs:complexType> <xs:complexType>
@@ -305,6 +311,7 @@
lineEndContext: Next context if end of line is encountered lineEndContext: Next context if end of line is encountered
lineEmptyContext: Next context if an empty line is encountered [optional] lineEmptyContext: Next context if an empty line is encountered [optional]
fallthrough: Use a fallthrough context [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] fallthroughContext: Fall through to this context [optional]
dynamic: Dynamic context [boolean, optional] dynamic: Dynamic context [boolean, optional]
noIndentationBasedFolding: Python uses indentation based folding. However, Python has parts where noIndentationBasedFolding: Python uses indentation based folding. However, Python has parts where
@@ -314,7 +321,6 @@
TODO: TODO:
- Explain fallthrough. - 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? - Make lineEndContext optional, defaults to '#stay'. Reasonable?
--> -->
<xs:element name="context"> <xs:element name="context">
@@ -344,7 +350,15 @@
<xs:attribute name="attribute" use="required"/> <xs:attribute name="attribute" use="required"/>
<xs:attribute name="lineEndContext" use="required"/> <xs:attribute name="lineEndContext" use="required"/>
<xs:attribute name="lineEmptyContext"/> <xs:attribute name="lineEmptyContext"/>
<xs:attribute name="fallthrough" type="xs:boolean"/> <xs:attribute name="fallthrough">
<xs:simpleType>
<!-- alway true since 5.62 -->
<xs:restriction base="xs:token">
<xs:enumeration value="1"/>
<xs:enumeration value="true"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name="fallthroughContext"/> <xs:attribute name="fallthroughContext"/>
<xs:attribute name="dynamic" type="xs:boolean"/> <xs:attribute name="dynamic" type="xs:boolean"/>
<xs:attribute name="noIndentationBasedFolding" type="xs:boolean"/> <xs:attribute name="noIndentationBasedFolding" type="xs:boolean"/>

View File

@@ -9,7 +9,7 @@
Copyright 2004 Alexander Neundorf (neundorf@kde.org) Copyright 2004 Alexander Neundorf (neundorf@kde.org)
Copyright 2005 Dominik Haumann (dhdev@gmx.de) Copyright 2005 Dominik Haumann (dhdev@gmx.de)
Copyright 2007,2008,2013,2014 Matthew Woehlke (mw_triad@users.sourceforge.net) 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 * * This library is free software; you can redistribute it and/or *
@@ -31,7 +31,7 @@
<language <language
name="CMake" name="CMake"
version="12" version="16"
kateversion="2.4" kateversion="2.4"
section="Other" section="Other"
extensions="CMakeLists.txt;*.cmake;*.cmake.in" extensions="CMakeLists.txt;*.cmake;*.cmake.in"
@@ -248,6 +248,7 @@
</list> </list>
<list name="execute_process_nargs"> <list name="execute_process_nargs">
<item>COMMAND</item> <item>COMMAND</item>
<item>COMMAND_ECHO</item>
<item>ENCODING</item> <item>ENCODING</item>
<item>ERROR_FILE</item> <item>ERROR_FILE</item>
<item>ERROR_QUIET</item> <item>ERROR_QUIET</item>
@@ -268,6 +269,8 @@
<item>AUTO</item> <item>AUTO</item>
<item>NONE</item> <item>NONE</item>
<item>OEM</item> <item>OEM</item>
<item>STDERR</item>
<item>STDOUT</item>
<item>UTF8</item> <item>UTF8</item>
</list> </list>
<list name="file_nargs"> <list name="file_nargs">
@@ -287,6 +290,7 @@
<item>FILES_MATCHING</item> <item>FILES_MATCHING</item>
<item>FILE_PERMISSIONS</item> <item>FILE_PERMISSIONS</item>
<item>FOLLOW_SYMLINKS</item> <item>FOLLOW_SYMLINKS</item>
<item>FOLLOW_SYMLINK_CHAIN</item>
<item>GENERATE</item> <item>GENERATE</item>
<item>GLOB</item> <item>GLOB</item>
<item>GLOB_RECURSE</item> <item>GLOB_RECURSE</item>
@@ -567,6 +571,8 @@
<item>LENGTH</item> <item>LENGTH</item>
<item>ORDER</item> <item>ORDER</item>
<item>OUTPUT_VARIABLE</item> <item>OUTPUT_VARIABLE</item>
<item>POP_BACK</item>
<item>POP_FRONT</item>
<item>PREPEND</item> <item>PREPEND</item>
<item>REGEX</item> <item>REGEX</item>
<item>REMOVE_AT</item> <item>REMOVE_AT</item>
@@ -602,10 +608,14 @@
</list> </list>
<list name="message_nargs"> <list name="message_nargs">
<item>AUTHOR_WARNING</item> <item>AUTHOR_WARNING</item>
<item>DEBUG</item>
<item>DEPRECATION</item> <item>DEPRECATION</item>
<item>FATAL_ERROR</item> <item>FATAL_ERROR</item>
<item>NOTICE</item>
<item>SEND_ERROR</item> <item>SEND_ERROR</item>
<item>STATUS</item> <item>STATUS</item>
<item>TRACE</item>
<item>VERBOSE</item>
<item>WARNING</item> <item>WARNING</item>
</list> </list>
<list name="separate_arguments_nargs"> <list name="separate_arguments_nargs">
@@ -671,6 +681,7 @@
<item>RANDOM</item> <item>RANDOM</item>
<item>RANDOM_SEED</item> <item>RANDOM_SEED</item>
<item>REGEX</item> <item>REGEX</item>
<item>REPEAT</item>
<item>REPLACE</item> <item>REPLACE</item>
<item>REVERSE</item> <item>REVERSE</item>
<item>SHA1</item> <item>SHA1</item>
@@ -737,6 +748,7 @@
<item>DEPENDS</item> <item>DEPENDS</item>
<item>DEPFILE</item> <item>DEPFILE</item>
<item>IMPLICIT_DEPENDS</item> <item>IMPLICIT_DEPENDS</item>
<item>JOB_POOL</item>
<item>MAIN_DEPENDENCY</item> <item>MAIN_DEPENDENCY</item>
<item>OUTPUT</item> <item>OUTPUT</item>
<item>POST_BUILD</item> <item>POST_BUILD</item>
@@ -757,6 +769,7 @@
<item>DEPENDS</item> <item>DEPENDS</item>
<item>DEPFILE</item> <item>DEPFILE</item>
<item>IMPLICIT_DEPENDS</item> <item>IMPLICIT_DEPENDS</item>
<item>JOB_POOL</item>
<item>SOURCES</item> <item>SOURCES</item>
<item>USES_TERMINAL</item> <item>USES_TERMINAL</item>
<item>VERBATIM</item> <item>VERBATIM</item>
@@ -1135,6 +1148,7 @@
<item>TRACK</item> <item>TRACK</item>
</list> </list>
<list name="ctest_submit_nargs"> <list name="ctest_submit_nargs">
<item>BUILD_ID</item>
<item>CDASH_UPLOAD</item> <item>CDASH_UPLOAD</item>
<item>CDASH_UPLOAD_TYPE</item> <item>CDASH_UPLOAD_TYPE</item>
<item>FILES</item> <item>FILES</item>
@@ -1144,6 +1158,7 @@
<item>RETRY_COUNT</item> <item>RETRY_COUNT</item>
<item>RETRY_DELAY</item> <item>RETRY_DELAY</item>
<item>RETURN_VALUE</item> <item>RETURN_VALUE</item>
<item>SUBMIT_URL</item>
</list> </list>
<list name="ctest_test_nargs"> <list name="ctest_test_nargs">
<item>APPEND</item> <item>APPEND</item>
@@ -1214,7 +1229,6 @@
<item>CMAKE_AR</item> <item>CMAKE_AR</item>
<item>CMAKE_ARCHIVE_OUTPUT_DIRECTORY</item> <item>CMAKE_ARCHIVE_OUTPUT_DIRECTORY</item>
<item>CMAKE_ARGC</item> <item>CMAKE_ARGC</item>
<item>CMAKE_ARGV0</item>
<item>CMAKE_AUTOGEN_ORIGIN_DEPENDS</item> <item>CMAKE_AUTOGEN_ORIGIN_DEPENDS</item>
<item>CMAKE_AUTOGEN_PARALLEL</item> <item>CMAKE_AUTOGEN_PARALLEL</item>
<item>CMAKE_AUTOGEN_VERBOSE</item> <item>CMAKE_AUTOGEN_VERBOSE</item>
@@ -1288,10 +1302,12 @@
<item>CMAKE_ERROR_DEPRECATED</item> <item>CMAKE_ERROR_DEPRECATED</item>
<item>CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION</item> <item>CMAKE_ERROR_ON_ABSOLUTE_INSTALL_DESTINATION</item>
<item>CMAKE_EXECUTABLE_SUFFIX</item> <item>CMAKE_EXECUTABLE_SUFFIX</item>
<item>CMAKE_EXECUTE_PROCESS_COMMAND_ECHO</item>
<item>CMAKE_EXE_LINKER_FLAGS</item> <item>CMAKE_EXE_LINKER_FLAGS</item>
<item>CMAKE_EXE_LINKER_FLAGS_INIT</item> <item>CMAKE_EXE_LINKER_FLAGS_INIT</item>
<item>CMAKE_EXPORT_COMPILE_COMMANDS</item> <item>CMAKE_EXPORT_COMPILE_COMMANDS</item>
<item>CMAKE_EXPORT_NO_PACKAGE_REGISTRY</item> <item>CMAKE_EXPORT_NO_PACKAGE_REGISTRY</item>
<item>CMAKE_EXPORT_PACKAGE_REGISTRY</item>
<item>CMAKE_EXTRA_GENERATOR</item> <item>CMAKE_EXTRA_GENERATOR</item>
<item>CMAKE_EXTRA_INCLUDE_FILES</item> <item>CMAKE_EXTRA_INCLUDE_FILES</item>
<item>CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES</item> <item>CMAKE_EXTRA_SHARED_LIBRARY_SUFFIXES</item>
@@ -1305,6 +1321,7 @@
<item>CMAKE_FIND_PACKAGE_NAME</item> <item>CMAKE_FIND_PACKAGE_NAME</item>
<item>CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY</item> <item>CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY</item>
<item>CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY</item> <item>CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY</item>
<item>CMAKE_FIND_PACKAGE_PREFER_CONFIG</item>
<item>CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS</item> <item>CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS</item>
<item>CMAKE_FIND_PACKAGE_SORT_DIRECTION</item> <item>CMAKE_FIND_PACKAGE_SORT_DIRECTION</item>
<item>CMAKE_FIND_PACKAGE_SORT_ORDER</item> <item>CMAKE_FIND_PACKAGE_SORT_ORDER</item>
@@ -1315,6 +1332,7 @@
<item>CMAKE_FIND_ROOT_PATH_MODE_PACKAGE</item> <item>CMAKE_FIND_ROOT_PATH_MODE_PACKAGE</item>
<item>CMAKE_FIND_ROOT_PATH_MODE_PROGRAM</item> <item>CMAKE_FIND_ROOT_PATH_MODE_PROGRAM</item>
<item>CMAKE_FOLDER</item> <item>CMAKE_FOLDER</item>
<item>CMAKE_FRAMEWORK</item>
<item>CMAKE_FRAMEWORK_PATH</item> <item>CMAKE_FRAMEWORK_PATH</item>
<item>CMAKE_Fortran_FORMAT</item> <item>CMAKE_Fortran_FORMAT</item>
<item>CMAKE_Fortran_MODDIR_DEFAULT</item> <item>CMAKE_Fortran_MODDIR_DEFAULT</item>
@@ -1432,6 +1450,8 @@
<item>CMAKE_MODULE_LINKER_FLAGS</item> <item>CMAKE_MODULE_LINKER_FLAGS</item>
<item>CMAKE_MODULE_LINKER_FLAGS_INIT</item> <item>CMAKE_MODULE_LINKER_FLAGS_INIT</item>
<item>CMAKE_MODULE_PATH</item> <item>CMAKE_MODULE_PATH</item>
<item>CMAKE_MSVCIDE_RUN_PATH</item>
<item>CMAKE_MSVC_RUNTIME_LIBRARY</item>
<item>CMAKE_NETRC</item> <item>CMAKE_NETRC</item>
<item>CMAKE_NETRC_FILE</item> <item>CMAKE_NETRC_FILE</item>
<item>CMAKE_NINJA_OUTPUT_PATH_PREFIX</item> <item>CMAKE_NINJA_OUTPUT_PATH_PREFIX</item>
@@ -1454,6 +1474,8 @@
<item>CMAKE_PROGRAM_PATH</item> <item>CMAKE_PROGRAM_PATH</item>
<item>CMAKE_PROJECT_DESCRIPTION</item> <item>CMAKE_PROJECT_DESCRIPTION</item>
<item>CMAKE_PROJECT_HOMEPAGE_URL</item> <item>CMAKE_PROJECT_HOMEPAGE_URL</item>
<item>CMAKE_PROJECT_INCLUDE</item>
<item>CMAKE_PROJECT_INCLUDE_BEFORE</item>
<item>CMAKE_PROJECT_NAME</item> <item>CMAKE_PROJECT_NAME</item>
<item>CMAKE_PROJECT_VERSION</item> <item>CMAKE_PROJECT_VERSION</item>
<item>CMAKE_PROJECT_VERSION_MAJOR</item> <item>CMAKE_PROJECT_VERSION_MAJOR</item>
@@ -1465,6 +1487,7 @@
<item>CMAKE_REQUIRED_FLAGS</item> <item>CMAKE_REQUIRED_FLAGS</item>
<item>CMAKE_REQUIRED_INCLUDES</item> <item>CMAKE_REQUIRED_INCLUDES</item>
<item>CMAKE_REQUIRED_LIBRARIES</item> <item>CMAKE_REQUIRED_LIBRARIES</item>
<item>CMAKE_REQUIRED_LINK_OPTIONS</item>
<item>CMAKE_REQUIRED_QUIET</item> <item>CMAKE_REQUIRED_QUIET</item>
<item>CMAKE_ROOT</item> <item>CMAKE_ROOT</item>
<item>CMAKE_RUNTIME_OUTPUT_DIRECTORY</item> <item>CMAKE_RUNTIME_OUTPUT_DIRECTORY</item>
@@ -1509,6 +1532,7 @@
<item>CMAKE_SYSTEM_PROGRAM_PATH</item> <item>CMAKE_SYSTEM_PROGRAM_PATH</item>
<item>CMAKE_SYSTEM_VERSION</item> <item>CMAKE_SYSTEM_VERSION</item>
<item>CMAKE_Swift_LANGUAGE_VERSION</item> <item>CMAKE_Swift_LANGUAGE_VERSION</item>
<item>CMAKE_Swift_MODULE_DIRECTORY</item>
<item>CMAKE_THREAD_LIBS_INIT</item> <item>CMAKE_THREAD_LIBS_INIT</item>
<item>CMAKE_THREAD_PREFER_PTHREAD</item> <item>CMAKE_THREAD_PREFER_PTHREAD</item>
<item>CMAKE_TOOLCHAIN_FILE</item> <item>CMAKE_TOOLCHAIN_FILE</item>
@@ -1529,6 +1553,7 @@
<item>CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD</item> <item>CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD</item>
<item>CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD</item> <item>CMAKE_VS_INCLUDE_PACKAGE_TO_DEFAULT_BUILD</item>
<item>CMAKE_VS_INTEL_Fortran_PROJECT_VERSION</item> <item>CMAKE_VS_INTEL_Fortran_PROJECT_VERSION</item>
<item>CMAKE_VS_JUST_MY_CODE_DEBUGGING</item>
<item>CMAKE_VS_MSBUILD_COMMAND</item> <item>CMAKE_VS_MSBUILD_COMMAND</item>
<item>CMAKE_VS_NsightTegra_VERSION</item> <item>CMAKE_VS_NsightTegra_VERSION</item>
<item>CMAKE_VS_PLATFORM_NAME</item> <item>CMAKE_VS_PLATFORM_NAME</item>
@@ -1658,6 +1683,7 @@
<item>CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR</item> <item>CPACK_IFW_PACKAGE_REMOVE_TARGET_DIR</item>
<item>CPACK_IFW_PACKAGE_RESOURCES</item> <item>CPACK_IFW_PACKAGE_RESOURCES</item>
<item>CPACK_IFW_PACKAGE_START_MENU_DIRECTORY</item> <item>CPACK_IFW_PACKAGE_START_MENU_DIRECTORY</item>
<item>CPACK_IFW_PACKAGE_STYLE_SHEET</item>
<item>CPACK_IFW_PACKAGE_TITLE</item> <item>CPACK_IFW_PACKAGE_TITLE</item>
<item>CPACK_IFW_PACKAGE_TITLE_COLOR</item> <item>CPACK_IFW_PACKAGE_TITLE_COLOR</item>
<item>CPACK_IFW_PACKAGE_WATERMARK</item> <item>CPACK_IFW_PACKAGE_WATERMARK</item>
@@ -1908,6 +1934,7 @@
<item>CTEST_UPDATE_COMMAND</item> <item>CTEST_UPDATE_COMMAND</item>
<item>CTEST_UPDATE_OPTIONS</item> <item>CTEST_UPDATE_OPTIONS</item>
<item>CTEST_UPDATE_VERSION_ONLY</item> <item>CTEST_UPDATE_VERSION_ONLY</item>
<item>CTEST_UPDATE_VERSION_OVERRIDE</item>
<item>CTEST_USE_LAUNCHERS</item> <item>CTEST_USE_LAUNCHERS</item>
<item>CYGWIN</item> <item>CYGWIN</item>
<item>EXECUTABLE_OUTPUT_PATH</item> <item>EXECUTABLE_OUTPUT_PATH</item>
@@ -1990,6 +2017,45 @@
<item>XCODE</item> <item>XCODE</item>
<item>XCODE_VERSION</item> <item>XCODE_VERSION</item>
</list> </list>
<list name="environment-variables">
<item>CC</item>
<item>CFLAGS</item>
<item>CMAKE_APPBUNDLE_PATH</item>
<item>CMAKE_BUILD_PARALLEL_LEVEL</item>
<item>CMAKE_CONFIG_TYPE</item>
<item>CMAKE_FRAMEWORK_PATH</item>
<item>CMAKE_GENERATOR</item>
<item>CMAKE_GENERATOR_INSTANCE</item>
<item>CMAKE_GENERATOR_PLATFORM</item>
<item>CMAKE_GENERATOR_TOOLSET</item>
<item>CMAKE_MSVCIDE_RUN_PATH</item>
<item>CMAKE_NO_VERBOSE</item>
<item>CMAKE_OSX_ARCHITECTURES</item>
<item>CMAKE_PREFIX_PATH</item>
<item>CSFLAGS</item>
<item>CTEST_INTERACTIVE_DEBUG_MODE</item>
<item>CTEST_OUTPUT_ON_FAILURE</item>
<item>CTEST_PARALLEL_LEVEL</item>
<item>CTEST_PROGRESS_OUTPUT</item>
<item>CTEST_USE_LAUNCHERS_DEFAULT</item>
<item>CUDACXX</item>
<item>CUDAFLAGS</item>
<item>CUDAHOSTCXX</item>
<item>CXX</item>
<item>CXXFLAGS</item>
<item>DASHBOARD_TEST_FROM_CTEST</item>
<item>DESTDIR</item>
<item>FC</item>
<item>FFLAGS</item>
<item>LDFLAGS</item>
<item>MACOSX_DEPLOYMENT_TARGET</item>
<item>PATH</item>
<item>RC</item>
<item>RCFLAGS</item>
<item>SWIFTC</item>
<item>VERBOSE</item>
</list>
<list name="global-properties"> <list name="global-properties">
<item>ALLOW_DUPLICATE_CUSTOM_TARGETS</item> <item>ALLOW_DUPLICATE_CUSTOM_TARGETS</item>
<item>AUTOGEN_SOURCE_GROUP</item> <item>AUTOGEN_SOURCE_GROUP</item>
@@ -2032,6 +2098,7 @@
<item>XCODE_EMIT_EFFECTIVE_PLATFORM_NAME</item> <item>XCODE_EMIT_EFFECTIVE_PLATFORM_NAME</item>
</list> </list>
<list name="directory-properties"> <list name="directory-properties">
<item>ADDITIONAL_CLEAN_FILES</item>
<item>ADDITIONAL_MAKE_CLEAN_FILES</item> <item>ADDITIONAL_MAKE_CLEAN_FILES</item>
<item>BINARY_DIR</item> <item>BINARY_DIR</item>
<item>BUILDSYSTEM_TARGETS</item> <item>BUILDSYSTEM_TARGETS</item>
@@ -2064,6 +2131,7 @@
<item>VS_STARTUP_PROJECT</item> <item>VS_STARTUP_PROJECT</item>
</list> </list>
<list name="target-properties"> <list name="target-properties">
<item>ADDITIONAL_CLEAN_FILES</item>
<item>ALIASED_TARGET</item> <item>ALIASED_TARGET</item>
<item>ANDROID_ANT_ADDITIONAL_OPTIONS</item> <item>ANDROID_ANT_ADDITIONAL_OPTIONS</item>
<item>ANDROID_API</item> <item>ANDROID_API</item>
@@ -2207,6 +2275,7 @@
<item>MACOSX_FRAMEWORK_INFO_PLIST</item> <item>MACOSX_FRAMEWORK_INFO_PLIST</item>
<item>MACOSX_RPATH</item> <item>MACOSX_RPATH</item>
<item>MANUALLY_ADDED_DEPENDENCIES</item> <item>MANUALLY_ADDED_DEPENDENCIES</item>
<item>MSVC_RUNTIME_LIBRARY</item>
<item>NAME</item> <item>NAME</item>
<item>NO_SONAME</item> <item>NO_SONAME</item>
<item>NO_SYSTEM_FROM_IMPORTED</item> <item>NO_SYSTEM_FROM_IMPORTED</item>
@@ -2232,6 +2301,9 @@
<item>STATIC_LIBRARY_FLAGS</item> <item>STATIC_LIBRARY_FLAGS</item>
<item>STATIC_LIBRARY_OPTIONS</item> <item>STATIC_LIBRARY_OPTIONS</item>
<item>SUFFIX</item> <item>SUFFIX</item>
<item>Swift_DEPENDENCIES_FILE</item>
<item>Swift_MODULE_DIRECTORY</item>
<item>Swift_MODULE_NAME</item>
<item>TYPE</item> <item>TYPE</item>
<item>VERSION</item> <item>VERSION</item>
<item>VISIBILITY_INLINES_HIDDEN</item> <item>VISIBILITY_INLINES_HIDDEN</item>
@@ -2249,8 +2321,12 @@
<item>VS_GLOBAL_ROOTNAMESPACE</item> <item>VS_GLOBAL_ROOTNAMESPACE</item>
<item>VS_IOT_EXTENSIONS_VERSION</item> <item>VS_IOT_EXTENSIONS_VERSION</item>
<item>VS_IOT_STARTUP_TASK</item> <item>VS_IOT_STARTUP_TASK</item>
<item>VS_JUST_MY_CODE_DEBUGGING</item>
<item>VS_KEYWORD</item> <item>VS_KEYWORD</item>
<item>VS_MOBILE_EXTENSIONS_VERSION</item> <item>VS_MOBILE_EXTENSIONS_VERSION</item>
<item>VS_NO_SOLUTION_DEPLOY</item>
<item>VS_PACKAGE_REFERENCES</item>
<item>VS_PROJECT_IMPORT</item>
<item>VS_SCC_AUXPATH</item> <item>VS_SCC_AUXPATH</item>
<item>VS_SCC_LOCALPATH</item> <item>VS_SCC_LOCALPATH</item>
<item>VS_SCC_PROJECTNAME</item> <item>VS_SCC_PROJECTNAME</item>
@@ -2264,10 +2340,12 @@
<item>WIN32_EXECUTABLE</item> <item>WIN32_EXECUTABLE</item>
<item>WINDOWS_EXPORT_ALL_SYMBOLS</item> <item>WINDOWS_EXPORT_ALL_SYMBOLS</item>
<item>XCODE_EXPLICIT_FILE_TYPE</item> <item>XCODE_EXPLICIT_FILE_TYPE</item>
<item>XCODE_GENERATE_SCHEME</item>
<item>XCODE_PRODUCT_TYPE</item> <item>XCODE_PRODUCT_TYPE</item>
<item>XCODE_SCHEME_ADDRESS_SANITIZER</item> <item>XCODE_SCHEME_ADDRESS_SANITIZER</item>
<item>XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN</item> <item>XCODE_SCHEME_ADDRESS_SANITIZER_USE_AFTER_RETURN</item>
<item>XCODE_SCHEME_ARGUMENTS</item> <item>XCODE_SCHEME_ARGUMENTS</item>
<item>XCODE_SCHEME_DEBUG_AS_ROOT</item>
<item>XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER</item> <item>XCODE_SCHEME_DISABLE_MAIN_THREAD_CHECKER</item>
<item>XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS</item> <item>XCODE_SCHEME_DYNAMIC_LIBRARY_LOADS</item>
<item>XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE</item> <item>XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE</item>
@@ -2309,6 +2387,8 @@
<item>SKIP_AUTORCC</item> <item>SKIP_AUTORCC</item>
<item>SKIP_AUTOUIC</item> <item>SKIP_AUTOUIC</item>
<item>SYMBOLIC</item> <item>SYMBOLIC</item>
<item>Swift_DEPENDENCIES_FILE</item>
<item>Swift_DIAGNOSTICS_FILE</item>
<item>VS_COPY_TO_OUT_DIR</item> <item>VS_COPY_TO_OUT_DIR</item>
<item>VS_DEPLOYMENT_CONTENT</item> <item>VS_DEPLOYMENT_CONTENT</item>
<item>VS_DEPLOYMENT_LOCATION</item> <item>VS_DEPLOYMENT_LOCATION</item>
@@ -2375,61 +2455,76 @@
<list name="generator-expressions"> <list name="generator-expressions">
<item>0</item> <item>0</item>
<item>1</item> <item>1</item>
<item>AND</item>
<item>ANGLE-R</item>
<item>BOOL</item> <item>BOOL</item>
<item>BUILD_INTERFACE</item> <item>AND</item>
<item>COMMA</item>
<item>COMPILE_FEATURES</item>
<item>COMPILE_LANGUAGE</item>
<item>CONFIG</item>
<item>CXX_COMPILER_ID</item>
<item>CXX_COMPILER_VERSION</item>
<item>C_COMPILER_ID</item>
<item>C_COMPILER_VERSION</item>
<item>EQUAL</item>
<item>GENEX_EVAL</item>
<item>IF</item>
<item>INSTALL_INTERFACE</item>
<item>INSTALL_PREFIX</item>
<item>IN_LIST</item>
<item>JOIN</item>
<item>LINK_ONLY</item>
<item>LOWER_CASE</item>
<item>MAKE_C_IDENTIFIER</item>
<item>NOT</item>
<item>OR</item> <item>OR</item>
<item>PLATFORM_ID</item> <item>NOT</item>
<item>SEMICOLON</item>
<item>SHELL_PATH</item>
<item>STREQUAL</item> <item>STREQUAL</item>
<item>TARGET_BUNDLE_CONTENT_DIR</item> <item>EQUAL</item>
<item>TARGET_BUNDLE_DIR</item> <item>IN_LIST</item>
<item>TARGET_EXISTS</item>
<item>TARGET_FILE</item>
<item>TARGET_FILE_DIR</item>
<item>TARGET_FILE_NAME</item>
<item>TARGET_GENEX_EVAL</item>
<item>TARGET_LINKER_FILE</item>
<item>TARGET_LINKER_FILE_DIR</item>
<item>TARGET_LINKER_FILE_NAME</item>
<item>TARGET_NAME</item>
<item>TARGET_NAME_IF_EXISTS</item>
<item>TARGET_OBJECTS</item>
<item>TARGET_PDB_FILE</item>
<item>TARGET_PDB_FILE_DIR</item>
<item>TARGET_PDB_FILE_NAME</item>
<item>TARGET_POLICY</item>
<item>TARGET_PROPERTY</item>
<item>TARGET_SONAME_FILE</item>
<item>TARGET_SONAME_FILE_DIR</item>
<item>TARGET_SONAME_FILE_NAME</item>
<item>UPPER_CASE</item>
<item>VERSION_EQUAL</item>
<item>VERSION_GREATER</item>
<item>VERSION_GREATER_EQUAL</item>
<item>VERSION_LESS</item> <item>VERSION_LESS</item>
<item>VERSION_GREATER</item>
<item>VERSION_EQUAL</item>
<item>VERSION_LESS_EQUAL</item> <item>VERSION_LESS_EQUAL</item>
<item>VERSION_GREATER_EQUAL</item>
<item>TARGET_EXISTS</item>
<item>CONFIG</item>
<item>PLATFORM_ID</item>
<item>C_COMPILER_ID</item>
<item>CXX_COMPILER_ID</item>
<item>CUDA_COMPILER_ID</item>
<item>Fortran_COMPILER_ID</item>
<item>C_COMPILER_VERSION</item>
<item>CXX_COMPILER_VERSION</item>
<item>CUDA_COMPILER_VERSION</item>
<item>Fortran_COMPILER_VERSION</item>
<item>TARGET_POLICY</item>
<item>COMPILE_FEATURES</item>
<item>COMPILE_LANG_AND_ID</item>
<item>COMPILE_LANGUAGE</item>
<item>ANGLE-R</item>
<item>COMMA</item>
<item>SEMICOLON</item>
<item>IF</item>
<item>JOIN</item>
<item>REMOVE_DUPLICATES</item>
<item>FILTER</item>
<item>LOWER_CASE</item>
<item>UPPER_CASE</item>
<item>GENEX_EVAL</item>
<item>TARGET_GENEX_EVAL</item>
<item>TARGET_NAME_IF_EXISTS</item>
<item>TARGET_FILE</item>
<item>TARGET_FILE_BASE_NAME</item>
<item>TARGET_FILE_PREFIX</item>
<item>TARGET_FILE_SUFFIX</item>
<item>TARGET_FILE_NAME</item>
<item>TARGET_FILE_DIR</item>
<item>TARGET_LINKER_FILE</item>
<item>TARGET_LINKER_FILE_BASE_NAME</item>
<item>TARGET_LINKER_FILE_PREFIX</item>
<item>TARGET_LINKER_FILE_SUFFIX</item>
<item>TARGET_LINKER_FILE_NAME</item>
<item>TARGET_LINKER_FILE_DIR</item>
<item>TARGET_SONAME_FILE</item>
<item>TARGET_SONAME_FILE</item>
<item>TARGET_SONAME_FILE_NAME</item>
<item>TARGET_SONAME_FILE_DIR</item>
<item>TARGET_PDB_FILE</item>
<item>TARGET_PDB_FILE_BASE_NAME</item>
<item>TARGET_PDB_FILE_NAME</item>
<item>TARGET_PDB_FILE_DIR</item>
<item>TARGET_BUNDLE_DIR</item>
<item>TARGET_BUNDLE_CONTENT_DIR</item>
<item>TARGET_PROPERTY</item>
<item>INSTALL_PREFIX</item>
<item>TARGET_NAME</item>
<item>LINK_ONLY</item>
<item>INSTALL_INTERFACE</item>
<item>BUILD_INTERFACE</item>
<item>MAKE_C_IDENTIFIER</item>
<item>TARGET_OBJECTS</item>
<item>SHELL_PATH</item>
</list> </list>
<contexts> <contexts>
@@ -2662,11 +2757,18 @@
<DetectChar attribute="Normal Text" context="execute_process_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="execute_process_ctx_op" char="(" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="execute_process_ctx_op"> <context attribute="Normal Text" lineEndContext="#stay" name="execute_process_ctx_op">
<DetectChar attribute="Normal Text" context="execute_process_ctx_op_nested" char="(" />
<IncludeRules context="EndCmdPop2" /> <IncludeRules context="EndCmdPop2" />
<keyword attribute="Named Args" context="#stay" String="execute_process_nargs" /> <keyword attribute="Named Args" context="#stay" String="execute_process_nargs" />
<keyword attribute="Special Args" context="#stay" String="execute_process_sargs" /> <keyword attribute="Special Args" context="#stay" String="execute_process_sargs" />
<IncludeRules context="User Function Args" /> <IncludeRules context="User Function Args" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="execute_process_ctx_op_nested">
<IncludeRules context="EndCmdPop" />
<keyword attribute="Named Args" context="#stay" String="execute_process_nargs" />
<keyword attribute="Special Args" context="#stay" String="execute_process_sargs" />
<IncludeRules context="User Function Args" />
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="file_ctx"> <context attribute="Normal Text" lineEndContext="#stay" name="file_ctx">
<DetectChar attribute="Normal Text" context="file_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="file_ctx_op" char="(" />
</context> </context>
@@ -2978,18 +3080,30 @@
<DetectChar attribute="Normal Text" context="add_custom_command_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="add_custom_command_ctx_op" char="(" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_custom_command_ctx_op"> <context attribute="Normal Text" lineEndContext="#stay" name="add_custom_command_ctx_op">
<DetectChar attribute="Normal Text" context="add_custom_command_ctx_op_nested" char="(" />
<IncludeRules context="EndCmdPop2" /> <IncludeRules context="EndCmdPop2" />
<keyword attribute="Named Args" context="#stay" String="add_custom_command_nargs" /> <keyword attribute="Named Args" context="#stay" String="add_custom_command_nargs" />
<IncludeRules context="User Function Args" /> <IncludeRules context="User Function Args" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_custom_command_ctx_op_nested">
<IncludeRules context="EndCmdPop" />
<keyword attribute="Named Args" context="#stay" String="add_custom_command_nargs" />
<IncludeRules context="User Function Args" />
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_custom_target_ctx"> <context attribute="Normal Text" lineEndContext="#stay" name="add_custom_target_ctx">
<DetectChar attribute="Normal Text" context="add_custom_target_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="add_custom_target_ctx_op" char="(" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_custom_target_ctx_op"> <context attribute="Normal Text" lineEndContext="#stay" name="add_custom_target_ctx_op">
<DetectChar attribute="Normal Text" context="add_custom_target_ctx_op_nested" char="(" />
<IncludeRules context="EndCmdPop2" /> <IncludeRules context="EndCmdPop2" />
<keyword attribute="Named Args" context="#stay" String="add_custom_target_nargs" /> <keyword attribute="Named Args" context="#stay" String="add_custom_target_nargs" />
<IncludeRules context="User Function Args" /> <IncludeRules context="User Function Args" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_custom_target_ctx_op_nested">
<IncludeRules context="EndCmdPop" />
<keyword attribute="Named Args" context="#stay" String="add_custom_target_nargs" />
<IncludeRules context="User Function Args" />
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_definitions_ctx"> <context attribute="Normal Text" lineEndContext="#stay" name="add_definitions_ctx">
<DetectChar attribute="Normal Text" context="add_definitions_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="add_definitions_ctx_op" char="(" />
</context> </context>
@@ -3039,10 +3153,16 @@
<DetectChar attribute="Normal Text" context="add_test_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="add_test_ctx_op" char="(" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_test_ctx_op"> <context attribute="Normal Text" lineEndContext="#stay" name="add_test_ctx_op">
<DetectChar attribute="Normal Text" context="add_test_ctx_op_nested" char="(" />
<IncludeRules context="EndCmdPop2" /> <IncludeRules context="EndCmdPop2" />
<keyword attribute="Named Args" context="#stay" String="add_test_nargs" /> <keyword attribute="Named Args" context="#stay" String="add_test_nargs" />
<IncludeRules context="User Function Args" /> <IncludeRules context="User Function Args" />
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="add_test_ctx_op_nested">
<IncludeRules context="EndCmdPop" />
<keyword attribute="Named Args" context="#stay" String="add_test_nargs" />
<IncludeRules context="User Function Args" />
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="aux_source_directory_ctx"> <context attribute="Normal Text" lineEndContext="#stay" name="aux_source_directory_ctx">
<DetectChar attribute="Normal Text" context="aux_source_directory_ctx_op" char="(" /> <DetectChar attribute="Normal Text" context="aux_source_directory_ctx_op" char="(" />
</context> </context>
@@ -3619,6 +3739,7 @@
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_&id_re;_STANDARD_LIBRARIES\b" /> <RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_&id_re;_STANDARD_LIBRARIES\b" />
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_&id_re;_VISIBILITY_PRESET\b" /> <RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_&id_re;_VISIBILITY_PRESET\b" />
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_ARCHIVE_OUTPUT_DIRECTORY_&id_re;\b" /> <RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_ARCHIVE_OUTPUT_DIRECTORY_&id_re;\b" />
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_ARGV[0-9]+\b" />
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_&id_re;\b" /> <RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_COMPILE_PDB_OUTPUT_DIRECTORY_&id_re;\b" />
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_DISABLE_FIND_PACKAGE_&id_re;\b" /> <RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_DISABLE_FIND_PACKAGE_&id_re;\b" />
<RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_EXE_LINKER_FLAGS_&id_re;\b" /> <RegExpr attribute="Builtin Variable" context="#stay" String="\bCMAKE_EXE_LINKER_FLAGS_&id_re;\b" />
@@ -3727,11 +3848,28 @@
</context> </context>
<context attribute="Normal Text" lineEndContext="#stay" name="Detect Variable Substitutions"> <context attribute="Normal Text" lineEndContext="#stay" name="Detect Variable Substitutions">
<RegExpr attribute="Environment Variable Substitution" context="#stay" String="\$ENV\{\s*[\w-]+\s*\}" /> <RegExpr attribute="Cache Variable Substitution" context="#stay" String="\$CACHE\{\s*[\w-]+\s*\}" />
<RegExpr attribute="Environment Variable Substitution" context="EnvVarSubst" String="\$ENV\{\s*[\w-]+\s*\}" lookAhead="true" />
<Detect2Chars attribute="Variable Substitution" context="VarSubst" char="$" char1="{" /> <Detect2Chars attribute="Variable Substitution" context="VarSubst" char="$" char1="{" />
<RegExpr attribute="@Variable Substitution" context="@VarSubst" String="@&id_re;@" lookAhead="true" /> <RegExpr attribute="@Variable Substitution" context="@VarSubst" String="@&id_re;@" lookAhead="true" />
</context> </context>
<context attribute="Environment Variable Substitution" lineEndContext="#pop" name="EnvVarSubst">
<DetectIdentifier />
<DetectChar attribute="Environment Variable Substitution" context="EnvVarSubstVar" char="{" />
<DetectChar attribute="Environment Variable Substitution" context="#pop" char="}" />
</context>
<context attribute="Environment Variable Substitution" lineEndContext="#pop" name="EnvVarSubstVar">
<keyword attribute="Standard Environment Variable" context="#stay" String="environment-variables" insensitive="false" />
<RegExpr attribute="Standard Environment Variable" context="#stay" String="\b&id_re;_DIR\b" />
<RegExpr attribute="Standard Environment Variable" context="#stay" String="\b&id_re;_ROOT\b" />
<RegExpr attribute="Standard Environment Variable" context="#stay" String="\bASM&id_re;\b" />
<RegExpr attribute="Standard Environment Variable" context="#stay" String="\bASM&id_re;FLAGS\b" />
<DetectIdentifier />
<DetectChar attribute="Environment Variable Substitution" context="#pop#pop" char="}" />
</context>
<context attribute="Variable Substitution" lineEndContext="#pop" name="VarSubst"> <context attribute="Variable Substitution" lineEndContext="#pop" name="VarSubst">
<IncludeRules context="Detect Builtin Variables" /> <IncludeRules context="Detect Builtin Variables" />
<DetectIdentifier /> <DetectIdentifier />
@@ -3830,10 +3968,12 @@
<itemData name="Strings" defStyleNum="dsString" spellChecking="true" /> <itemData name="Strings" defStyleNum="dsString" spellChecking="true" />
<itemData name="Escapes" defStyleNum="dsChar" spellChecking="false" /> <itemData name="Escapes" defStyleNum="dsChar" spellChecking="false" />
<itemData name="Builtin Variable" defStyleNum="dsDecVal" color="#c09050" selColor="#c09050" spellChecking="false" /> <itemData name="Builtin Variable" defStyleNum="dsDecVal" color="#c09050" selColor="#c09050" spellChecking="false" />
<itemData name="Internal Name" defStyleNum="dsDecVal" color="#303030" selColor="#303030" spellChecking="false" />
<itemData name="Variable Substitution" defStyleNum="dsDecVal" spellChecking="false" /> <itemData name="Variable Substitution" defStyleNum="dsDecVal" spellChecking="false" />
<itemData name="@Variable Substitution" defStyleNum="dsBaseN" spellChecking="false" /> <itemData name="@Variable Substitution" defStyleNum="dsBaseN" spellChecking="false" />
<itemData name="Internal Name" defStyleNum="dsDecVal" color="#303030" selColor="#303030" spellChecking="false" /> <itemData name="Cache Variable Substitution" defStyleNum="dsFloat" spellChecking="false" />
<itemData name="Environment Variable Substitution" defStyleNum="dsFloat" spellChecking="false" /> <itemData name="Environment Variable Substitution" defStyleNum="dsFloat" spellChecking="false" />
<itemData name="Standard Environment Variable" defStyleNum="dsFloat" spellChecking="false" />
<itemData name="Generator Expression Keyword" defStyleNum="dsKeyword" color="#b84040" selColor="#b84040" spellChecking="false" /> <itemData name="Generator Expression Keyword" defStyleNum="dsKeyword" color="#b84040" selColor="#b84040" spellChecking="false" />
<itemData name="Generator Expression" defStyleNum="dsOthers" color="#b86050" selColor="#b86050" spellChecking="false" /> <itemData name="Generator Expression" defStyleNum="dsOthers" color="#b86050" selColor="#b86050" spellChecking="false" />
<itemData name="Comment" defStyleNum="dsComment" spellChecking="true" /> <itemData name="Comment" defStyleNum="dsComment" spellChecking="true" />

View File

@@ -38,7 +38,8 @@ Changelog:
--> -->
<language name="CSS" version="8" kateversion="5.0" section="Markup" extensions="*.css" indenter="cstyle" mimetype="text/css" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL" priority="10"> <language name="CSS" version="9" kateversion="5.0" section="Markup" extensions="*.css" indenter="cstyle" mimetype="text/css" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL" priority="10">
<!-- https://www.w3.org/Style/CSS/current-work -->
<highlighting> <highlighting>
<list name="properties"> <list name="properties">
@@ -1258,8 +1259,9 @@ Changelog:
<item>selection</item> <item>selection</item>
</list> </list>
<list name="pseudoclass-not"> <list name="pseudoclass-selector">
<item>not</item> <item>not</item>
<item>matches</item>
</list> </list>
<list name="pseudoclasses-@page"> <list name="pseudoclasses-@page">
@@ -1383,8 +1385,8 @@ Changelog:
<keyword attribute="Value Keyword" context="#stay" String="value keywords" /> <keyword attribute="Value Keyword" context="#stay" String="value keywords" />
<keyword attribute="Value" context="#stay" String="values" /> <keyword attribute="Value" context="#stay" String="values" />
<keyword attribute="Color" context="#stay" String="colors" /> <keyword attribute="Color" context="#stay" String="colors" />
<RegExpr attribute="Color" context="#stay" String="#([0-9A-Fa-f]{3}){1,2}\b" /> <RegExpr attribute="Color" context="#stay" String="#([0-9A-Fa-f]{3,4}){1,2}\b" />
<RegExpr attribute="Number" context="FindUnits" String="[-+]?[0-9.]+(?![-+])" /> <RegExpr attribute="Number" context="FindUnits" String="[-+]?([0-9]+(\.[0-9]+)?|\.[0-9]+)([eE][+-]?[0-9]+)?(?![-+])" />
<RegExpr attribute="Normal Text" context="#stay" String="[-]?(&nmstart;)(&nmchar;)*" /> <RegExpr attribute="Normal Text" context="#stay" String="[-]?(&nmstart;)(&nmchar;)*" />
</context> </context>
@@ -1393,7 +1395,8 @@ Changelog:
</context> </context>
<context name="FindUnits" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop"> <context name="FindUnits" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<RegExpr attribute="Unit" context="#stay" String="(%|(em|ex|ch|rem|vw|vh|vm|px|in|cm|mm|pt|pc|deg|rad|grad|turn|ms|s|Hz|kHz)\b)(?![-+])" /> <!-- https://drafts.csswg.org/css-values-4/#lengths -->
<RegExpr attribute="Unit" context="#stay" String="(%|(em|ex|cap|ch|ic|rem|lh|rlh|vw|vh|vi|vb|vmin|vmax|cm|mm|Q|in|pc|pt|px|deg|rad|grad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx|x)\b)(?![-+])" />
</context> </context>
<!-- find strings // "some words" 'some words' --> <!-- find strings // "some words" 'some words' -->
@@ -1548,7 +1551,7 @@ Changelog:
<context name="SelectorPseudo" attribute="Selector Pseudo" lineEndContext="#pop"> <context name="SelectorPseudo" attribute="Selector Pseudo" lineEndContext="#pop">
<DetectChar attribute="Selector Pseudo" context="SelectorPseudoElements" char=":" /> <DetectChar attribute="Selector Pseudo" context="SelectorPseudoElements" char=":" />
<keyword attribute="Selector Pseudo" context="SelectorPseudoValueSelector" String="pseudoclass-not" /> <keyword attribute="Selector Pseudo" context="SelectorPseudoValueSelector" String="pseudoclass-selector" />
<keyword attribute="Selector Pseudo" context="SelectorPseudoValue" String="pseudoclasses" /> <keyword attribute="Selector Pseudo" context="SelectorPseudoValue" String="pseudoclasses" />
<RegExpr attribute="Selector Pseudo" context="SelectorPseudoValue" String="[-a-zA-Z][-a-zA-Z0-9]*" /> <RegExpr attribute="Selector Pseudo" context="SelectorPseudoValue" String="[-a-zA-Z][-a-zA-Z0-9]*" />
</context> </context>

View File

@@ -5,7 +5,7 @@
<!ENTITY attributeName "[A-Za-z_:*#\(\[][\)\]\w.:_-]*"> <!ENTITY attributeName "[A-Za-z_:*#\(\[][\)\]\w.:_-]*">
<!ENTITY entref "&amp;(#[0-9]+|#[xX][0-9A-Fa-f]+|&name;);"> <!ENTITY entref "&amp;(#[0-9]+|#[xX][0-9A-Fa-f]+|&name;);">
]> ]>
<language name="HTML" version="7" kateversion="3.4" section="Markup" extensions="*.htm;*.html;*.shtml;*.shtm" mimetype="text/html" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL" priority="10"> <language name="HTML" version="9" kateversion="5.53" section="Markup" extensions="*.htm;*.html;*.shtml;*.shtm" mimetype="text/html" author="Wilbert Berendsen (wilbert@kde.nl)" license="LGPL" priority="10">
<highlighting> <highlighting>
<contexts> <contexts>
@@ -20,8 +20,19 @@
<StringDetect attribute="CDATA" context="CDATA" String="&lt;![CDATA[" beginRegion="cdata" /> <StringDetect attribute="CDATA" context="CDATA" String="&lt;![CDATA[" beginRegion="cdata" />
<RegExpr attribute="Doctype" context="Doctype" String="&lt;!DOCTYPE\s+" insensitive="true" beginRegion="doctype" /> <RegExpr attribute="Doctype" context="Doctype" String="&lt;!DOCTYPE\s+" insensitive="true" beginRegion="doctype" />
<RegExpr attribute="Processing Instruction" context="PI" String="&lt;\?[\w:-]*" beginRegion="pi" /> <RegExpr attribute="Processing Instruction" context="PI" String="&lt;\?[\w:-]*" beginRegion="pi" />
<IncludeRules context="FindSpecialHTMLTags" />
<IncludeRules context="FindHTMLTags" />
<!-- as long as kde gives DTDs the text/html mimetype--><IncludeRules context="FindDTDRules" />
<IncludeRules context="FindEntityRefs" />
</context>
<!-- This allows you to insert HTML tags in other syntax definitions -->
<context name="FindSpecialHTMLTags" attribute="Normal Text" lineEndContext="#stay">
<RegExpr attribute="Element" context="CSS" String="&lt;style\b" insensitive="true" beginRegion="style" /> <RegExpr attribute="Element" context="CSS" String="&lt;style\b" insensitive="true" beginRegion="style" />
<RegExpr attribute="Element" context="JS" String="&lt;script\b" insensitive="true" beginRegion="script" /> <RegExpr attribute="Element" context="JS" String="&lt;script\b" insensitive="true" beginRegion="script" />
</context>
<context name="FindHTMLTags" attribute="Normal Text" lineEndContext="#stay">
<RegExpr attribute="Element" context="El Open" String="&lt;pre\b" insensitive="true" beginRegion="pre" /> <RegExpr attribute="Element" context="El Open" String="&lt;pre\b" insensitive="true" beginRegion="pre" />
<RegExpr attribute="Element" context="El Open" String="&lt;div\b" insensitive="true" beginRegion="div" /> <RegExpr attribute="Element" context="El Open" String="&lt;div\b" insensitive="true" beginRegion="div" />
<RegExpr attribute="Element" context="El Open" String="&lt;table\b" insensitive="true" beginRegion="table" /> <RegExpr attribute="Element" context="El Open" String="&lt;table\b" insensitive="true" beginRegion="table" />
@@ -54,8 +65,6 @@
<RegExpr attribute="Element" context="El Close" String="&lt;/nav\b" insensitive="true" endRegion="nav" /> <RegExpr attribute="Element" context="El Close" String="&lt;/nav\b" insensitive="true" endRegion="nav" />
<RegExpr attribute="Element" context="El Close" String="&lt;/section\b" insensitive="true" endRegion="section" /> <RegExpr attribute="Element" context="El Close" String="&lt;/section\b" insensitive="true" endRegion="section" />
<RegExpr attribute="Element" context="El Close" String="&lt;/&name;" /> <RegExpr attribute="Element" context="El Close" String="&lt;/&name;" />
<!-- as long as kde gives DTDs the text/html mimetype--><IncludeRules context="FindDTDRules" />
<IncludeRules context="FindEntityRefs" />
</context> </context>
<context name="FindEntityRefs" attribute="Other Text" lineEndContext="#stay"> <context name="FindEntityRefs" attribute="Other Text" lineEndContext="#stay">

View File

@@ -12,7 +12,7 @@
** http://tools.ietf.org/html/rfc4627 ** http://tools.ietf.org/html/rfc4627
*************************************************************************** ***************************************************************************
--> -->
<language name="JSON" section="Markup" version="3" kateversion="2.4" extensions="*.json;.kateproject;.arcconfig;*.gltf" mimetype="application/json" author="Sebastian Pipping (sebastian@pipping.org)" license="GPL"> <language name="JSON" section="Markup" version="4" kateversion="2.4" extensions="*.json;.kateproject;.arcconfig;*.geojson;*.gltf" mimetype="application/json" author="Sebastian Pipping (sebastian@pipping.org)" license="GPL">
<highlighting> <highlighting>
<list name="Constants"> <list name="Constants">
<item>null</item> <item>null</item>

View File

@@ -6,6 +6,7 @@
Dual-Licensed under both GPL and BSD licenses. Dual-Licensed under both GPL and BSD licenses.
Extended 2009 Claes Holmerson. http://github.com/claes/kate-markdown/ Extended 2009 Claes Holmerson. http://github.com/claes/kate-markdown/
Extended 2019 Nibaldo González S. <nibgonz@gmail.com> (changes under MIT license).
--> -->
<!-- <!--
The [^\s]{1} is in the regex to avoid interfering with bullet list which The [^\s]{1} is in the regex to avoid interfering with bullet list which
@@ -15,189 +16,623 @@
Match space or newline, followed by "*", followed by one non-space, Match space or newline, followed by "*", followed by one non-space,
followed by anything non-asterisk, followed by "*", followed by followed by anything non-asterisk, followed by "*", followed by
space, end-of-sentence punctuation, or the end of the line. space, end-of-sentence punctuation, or the end of the line.
TODO: We can be more specific and highlight text combinations in bold,
italic and strikethrough.
Example: **bold text and _italic and bold text_**
__bold and ~~strikeout and bold~~__
--> -->
<!DOCTYPE language SYSTEM "language.dtd" <!DOCTYPE language SYSTEM "language.dtd"
[ [
<!ENTITY strongemphasisregex "(\s|^)[\*_]{3}[^\*_]+[\*_]{3}(\s|\.|,|;|:|\-|\?|$)"> <!-- NOTE: To correctly detect bold, italic or strike out text, use minimal="true" in RegExpr rules -->
<!ENTITY strongregex "(\s|^)[\*_]{2}[^\s]{1}[^\*_]+[\*_]{2}(\s|\.|,|;|:|\-|\?|$)"> <!ENTITY contentregex_ast "(?:(?:[^\*\s\\]|\\.)(?:[^\\]|\\.)*)?(?:[^\*\s\\]|\\\S)">
<!ENTITY emphasisregex "(\s|^)[\*_]{1}[^\s]{1}[^\*_]+[\*_]{1}(\s|\.|,|;|:|\-|\?|$)"> <!ENTITY contentregex_und "(?:(?:[^_\s\\]|\\.)(?:[^\\]|\\.)*)?(?:[^_\s\\]|\\\S)">
<!ENTITY reflinkregex '\[[^\]\^]+\]\s*\[[^\]]*\]\s*(\s+\"[^\"]*\"){0,1}'> <!-- strong + emphasis text -->
<!ENTITY reflinktargetregex '\[[^\]\^]+\]\:\s+[^\s]+(\s+\"[^\"]*\"){0,1}'> <!ENTITY strongemphasisregex_ast "\*{3,5}&contentregex_ast;\*{3}">
<!ENTITY footnoteregex "\[\^[^\]]+\]"> <!ENTITY strongemphasisregex_und "\b_{3,5}&contentregex_und;_{3}">
<!ENTITY inlinelinkregex "\[[^\]\^]+\]\s*\([^\(]*\)"> <!ENTITY strongemphasisregex_ast_und "\*{2,5}(?:(?:_|_{3}|_{5})&contentregex_und;_+|(?:_{2}|_{4})&contentregex_und;_)\*{2}">
<!ENTITY inlineimageregex "\!\[[^\]\^]+\]\([^\(]*\)"> <!ENTITY strongemphasisregex_ast_und2 "\*_{2,5}&contentregex_und;_{2,5}\*(?!\*)">
<!ENTITY refimageregex "\!\[[^\]\^]+\]\[[^\[]*\]"> <!ENTITY strongemphasisregex_und_ast "\b_{2,5}(?:(?:\*|\*{3}|\*{5})&contentregex_ast;\*+|(?:\*{2}|\*{4})&contentregex_ast;\*)_{2}">
<!ENTITY autolinkregex '&lt;(https?|ftp):[^\"&gt;\s]+&gt;'> <!ENTITY strongemphasisregex_und_ast2 "\b_(?:\*{2,5}&contentregex_ast;\*{2,5}_{0,4}|_{0,4}\*{2,5}&contentregex_ast;\*{2,5})_\b">
<!ENTITY mailtolinkregex "&lt;(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)&gt;"> <!-- strong text -->
<!ENTITY rulerregex "\s*([\*\-_]\s?){3,}\s*"> <!ENTITY strongregex_ast "\*{2}(?:&contentregex_ast;\*{2}|\*{1,3}&contentregex_ast;\*{2}(?!\*))">
<!ENTITY strongregex_und "\b_{2}(?:&contentregex_und;_{2}|_{1,3}&contentregex_und;_{2}(?!_))">
<!-- emphasis text -->
<!ENTITY emphasisregex_ast "\*(?:&contentregex_ast;\*|\*{1,4}&contentregex_ast;\*(?!\*))">
<!ENTITY emphasisregex_und "\b_(?:&contentregex_und;_+|_{1,4}&contentregex_und;_)\b">
<!-- links -->
<!ENTITY startlink "(?:https?|ftp)\://">
<!ENTITY link "&startlink;[^&quot;&gt;\s]+">
<!-- link in normal text -->
<!ENTITY implicitlink "\b&startlink;[^&quot;&gt;\s`\)]*[^\s!&quot;&apos;`\(\)\*,\.:;&lt;&gt;\?~\]\}\\](?=[[:punct:]]*(?:[\s\)]|$))">
<!-- references: [name], [name][id], [name][id] "title", [name](https://example.com) -->
<!ENTITY refchar "(?:\\.|[^\]\\])">
<!ENTITY refname "(?:\\.|[^\s\[\]\\])&refchar;*">
<!ENTITY reflinkid "\s*(?:&refname;)?">
<!ENTITY reflinkidregex "(?:\s?\[&reflinkid;\]|\((?:\\.|[^\(\)\\])*\))">
<!ENTITY reflinkregex "\[(?:(?=\s*&refname;\])|\s+(?=\]))">
<!-- target ref.: [id]: https://example.com "Title" -->
<!ENTITY reflinktargetregex '\[\s*(?:&refname;|\s)\]\:\s+(?=\S)'>
<!-- footnote: [^name] -->
<!ENTITY footnoteregex "\[\^&refchar;+\]">
<!-- image: ![title](https://example.com), ![title][id] -->
<!ENTITY startinlineimage "\!\[(?:\\.|[^\[\]\\])*\]\(">
<!ENTITY endinlineimage "(?:\\.|[^\(\)\\])*\)">
<!ENTITY inlineimageregex "&startinlineimage;(?=&endinlineimage;)">
<!ENTITY refimageregex "\!\[(?:\\.|[^\[\]\\])*\]\[&reflinkid;\]">
<!-- autolink & email: <https://example.com>, <example@kde.org>, <mailto:example@kde.org> -->
<!ENTITY autolinkregex '&lt;&link;&gt;'>
<!ENTITY email "[\-\.\w]+\@[\-a-z0-9]+(?:\.[\-a-z0-9]+)*\.[a-z]+">
<!ENTITY mailtolinkregex "&lt;(?:mailto:)?(?=&email;&gt;)">
<!-- horizontal rule: avoid conflicts with strong-emphasis text, lists and code blocks -->
<!ENTITY rulerregex "\s*(?:(?:\*\s*){3,}|(?:_\s*){3,}|(?:\-\s*){3,})\s*$">
<!-- two spaces at end of line generates linebreak --> <!-- two spaces at end of line generates linebreak -->
<!ENTITY linebreakregex " $"> <!ENTITY linebreakregex " $">
<!ENTITY strikeoutregex "[~]{2}[^~].*[^~][~]{2}"> <!-- strikethrough text, pandoc style -->
<!-- pandoc style --> <!ENTITY strikeoutregex "[~]{2}[^~](?:.*[^~])?[~]{2}">
<!-- start of fenced code block -->
<!ENTITY fcode "(`{3,}|~{3,})">
<!-- end of line & empty line -->
<!ENTITY end "\s*$">
<!ENTITY emptyline "^\s*$">
<!-- indented code block -->
<!ENTITY indentedcodeblock "(?:\s{4}|\t).*$">
<!-- bullet of list -->
<!ENTITY listbullet "[\*\+\-]">
<!-- metadata key & name of html tag -->
<!ENTITY metadatakey "[a-zA-Z0-9][\w\-\s]*\:">
<!ENTITY htmlname "[A-Za-z_\:][\w\.\:\-]*">
<!-- comment -->
<!ENTITY startcomment "&lt;!--">
<!ENTITY endcomment "--&gt;">
<!ENTITY checkbox "\[[ x]\](?=\s)">
]> ]>
<language name="Markdown" version="6" kateversion="5.0" section="Markup" extensions="*.md;*.mmd;*.markdown" priority="15" author="Darrin Yeager, Claes Holmerson" license="GPL,BSD">
<language name="Markdown" version="10" kateversion="5.53" section="Markup" extensions="*.md;*.mmd;*.markdown" priority="15" author="Darrin Yeager, Claes Holmerson" license="GPL,BSD">
<highlighting> <highlighting>
<contexts> <contexts>
<context attribute="Normal Text" lineEndContext="#stay" name="Normal Text"> <!-- Start of the Markdown document: find metadata or code block -->
<DetectChar context="blockquote" char="&gt;" column="0"/> <context name="Start Document" attribute="Normal Text" lineEndContext="Normal Text" lineEmptyContext="Normal Text" fallthrough="true" fallthroughContext="Normal Text">
<RegExpr attribute="h1" String="^#\s.*[#]?$"/> <!-- Some titles: (Title|Author|Date|Copyright|Revision|CSS|LaTeX\ XSLT|Categories|Tags|BaseName|Excerpt) -->
<RegExpr attribute="h2" String="^##\s.*[#]?$"/> <!-- Metadata: Markdown format -->
<RegExpr attribute="h3" String="^###\s.*[#]?$"/> <RegExpr attribute="Metadata" context="metadata" String="\-{3}&end;" column="0" beginRegion="metadata"/>
<RegExpr attribute="h4" String="^####\s.*[#]?$"/> <!-- Metadata: MultiMarkdown format -->
<RegExpr attribute="h5" String="^#####\s.*[#]?$"/> <RegExpr attribute="Metadata Title" context="metadata-mm-value" String="^&metadatakey;(?=\s|$)" column="0"/>
<RegExpr attribute="h6" String="^######\s.*[#]?$"/> <!-- Code Block -->
<RegExpr attribute="ruler" String="&rulerregex;"/> <RegExpr attribute="Code" context="find-code-block-start" String="^&indentedcodeblock;" column="0"/>
<RegExpr attribute="strong" String="&strongregex;"/> </context>
<RegExpr attribute="emphasis" String="&emphasisregex;"/> <context name="metadata" attribute="Metadata" lineEndContext="#stay">
<RegExpr attribute="strongemphasis" String="&strongemphasisregex;"/> <StringDetect attribute="Metadata" context="#pop!Normal Text" String="---" column="0" endRegion="metadata"/>
<RegExpr attribute="code" String="^([\s]{4,}|\t+).*$"/> <StringDetect attribute="Metadata" context="#pop!Normal Text" String="..." column="0" endRegion="metadata"/>
<RegExpr context="bullet" String="^[\*\+\-]\s"/> <RegExpr attribute="Metadata Title" String="^&metadatakey;(?=\s|$)" column="0"/>
<RegExpr context="numlist" String="^[\d]+\.\s"/> </context>
<RegExpr attribute="meta" String="^(Title|Author|Date|Copyright|Revision|CSS|LaTeX\ XSLT|Categories|Tags|BaseName|Excerpt):(.*)+$"/> <context name="metadata-mm-value" attribute="Metadata" lineEndContext="#pop!metadata-mm"/>
<context name="metadata-mm" attribute="Metadata" lineEndContext="#stay" lineEmptyContext="#pop!Normal Text" fallthrough="true" fallthroughContext="#pop!Normal Text">
<!-- Find Metadata key or value -->
<RegExpr attribute="Metadata Title" context="#pop!metadata-mm-value" String="^&metadatakey;(?=\s|$)" column="0"/>
<RegExpr attribute="Metadata" context="#pop!metadata-mm-value" String="^(?:\s{4}|\t)" column="0"/>
</context>
<context name="find-code-block-start" attribute="Normal Text" lineEndContext="#stay" lineEmptyContext="#stay" fallthrough="true" fallthroughContext="#pop!Normal Text">
<IncludeRules context="find-code-block"/>
</context>
<!-- Normal Text Document -->
<context name="Normal Text" attribute="Normal Text" lineEndContext="#stay" lineEmptyContext="find-code-block">
<!-- Header -->
<DetectChar context="find-header" char="#" column="0" lookAhead="true"/>
<RegExpr attribute="Header H1" String="(?:\=\s*){2,}$" firstNonSpace="true"/>
<!-- Highlight code block after line only with spaces or comment -->
<RegExpr attribute="Normal Text" context="find-code-block" String="&emptyline;" column="0"/>
<StringDetect attribute="Comment" context="find-code-block" String="&startcomment;" column="0" lookAhead="true"/>
<!-- Horizontal rules, Blockquotes and Lists.
NOTE: The indentation of the lists is captured. -->
<RegExpr attribute="Horizontal Rule" context="find-code-block" String="^&rulerregex;" column="0"/>
<DetectChar attribute="Blockquote" context="blockquote" char="&gt;" firstNonSpace="true"/>
<RegExpr attribute="List" context="list" String="(\s*)&listbullet;(\s+)" column="0"/>
<RegExpr attribute="Number List" context="numlist" String="(\s*)\d\.(\s+)" column="0"/>
<RegExpr attribute="Number List" context="numlist2" String="(\s*)\d\d+\.(\s+)" column="0"/>
<!-- Find Strong, Emphasis and Strikethrough Text -->
<DetectChar context="find-strong-normal" char="*" lookAhead="true"/>
<DetectChar context="find-emphasis-normal" char="_" lookAhead="true"/>
<RegExpr attribute="Strikethrough Text" minimal="true" String="&strikeoutregex;"/>
<!-- Common -->
<IncludeRules context="inc"/> <IncludeRules context="inc"/>
<RegExpr attribute="Normal Text: Link" String="&implicitlink;"/>
</context> </context>
<context attribute="blockquote" lineEndContext="#stay" lineEmptyContext="#pop" name="blockquote"> <!-- Find indented code blocks. These are only allowed after an empty line or on the first line -->
<RegExpr attribute="bq-strong" String="&strongregex;"/> <context name="find-code-block" attribute="Normal Text" lineEndContext="#stay" lineEmptyContext="#stay" fallthrough="true" fallthroughContext="#pop">
<RegExpr attribute="bq-emphasis" String="&emphasisregex;"/> <RegExpr attribute="Code" String="^&indentedcodeblock;" column="0"/>
<RegExpr attribute="Normal Text" String="&end;" />
<RegExpr attribute="Comment" context="comment" String="\s*&startcomment;" column="0" beginRegion="comment"/>
<RegExpr attribute="Comment" context="comment" String="\s*&startcomment;(?=.*&endcomment;)" beginRegion="comment"/>
</context>
<context name="find-header" attribute="Normal Text" lineEndContext="#pop">
<RegExpr attribute="Header H1" context="#pop" String="^#\s.*[#]?$"/>
<RegExpr attribute="Header H2" context="#pop" String="^##\s.*[#]?$"/>
<RegExpr attribute="Header H3" context="#pop" String="^###\s.*[#]?$"/>
<RegExpr attribute="Header H4" context="#pop" String="^####\s.*[#]?$"/>
<RegExpr attribute="Header H5" context="#pop" String="^#####\s.*[#]?$"/>
<RegExpr attribute="Header H6" context="#pop" String="^######\s.*[#]?$"/>
<DetectChar attribute="Normal Text" context="#pop" char="#"/>
</context>
<context name="find-strong-normal" attribute="Normal Text" lineEndContext="#pop">
<RegExpr attribute="Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und;"/>
<RegExpr attribute="Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und2;"/>
<RegExpr attribute="Strong Text" context="#pop" minimal="true" String="&strongregex_ast;"/>
<RegExpr attribute="Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast;"/>
<RegExpr attribute="Emphasis Text" context="#pop" minimal="true" String="&emphasisregex_ast;"/>
<DetectChar attribute="Normal Text" context="#pop" char="*"/>
</context>
<context name="find-emphasis-normal" attribute="Normal Text" lineEndContext="#pop">
<RegExpr attribute="Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast;"/>
<RegExpr attribute="Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast2;"/>
<RegExpr attribute="Strong Text" context="#pop" minimal="true" String="&strongregex_und;"/>
<RegExpr attribute="Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und;"/>
<RegExpr attribute="Emphasis Text" context="#pop" minimal="true" String="&emphasisregex_und;"/>
<DetectChar attribute="Normal Text" context="#pop" char="_"/>
</context>
<!-- Blockquote -->
<context name="blockquote" attribute="Blockquote: Normal Text" lineEndContext="#stay" lineEmptyContext="#pop">
<IncludeRules context="default-blockquote-1"/>
<!-- Find code block -->
<RegExpr attribute="Normal Text" context="#pop!find-code-block" String="&emptyline;" column="0"/>
<StringDetect attribute="Comment" context="#pop!find-code-block" String="&startcomment;" column="0" lookAhead="true"/>
<IncludeRules context="default-blockquote-2"/>
</context>
<!-- Blockquote within a list -->
<context name="blockquote-list" attribute="Blockquote: Normal Text" lineEndContext="#stay" lineEmptyContext="#pop">
<IncludeRules context="default-blockquote-1"/>
<!-- Don't find code block -->
<RegExpr attribute="Normal Text" context="#pop" String="&emptyline;" column="0"/>
<StringDetect attribute="Comment" context="#pop!comment" String="&startcomment;" firstNonSpace="true"/>
<IncludeRules context="default-blockquote-2"/>
</context>
<context name="default-blockquote-1" attribute="Blockquote: Normal Text" lineEndContext="#stay">
<DetectChar attribute="Blockquote" char="&gt;" firstNonSpace="true"/>
<!-- End with header, horizontal rule or list/numlist -->
<RegExpr context="#pop" String="(?:\s*(?:&listbullet;|[\d]+\.)\s|#{1,6}\s|&rulerregex;)" column="0" lookAhead="true"/>
</context>
<context name="default-blockquote-2" attribute="Blockquote: Normal Text" lineEndContext="#stay">
<!-- Strong, emphasis, strong-emphasis and strikethrough text -->
<AnyChar context="find-strong-emphasis-blockquote" String="*_" lookAhead="true"/>
<RegExpr attribute="Blockquote: Strikethrough Text" minimal="true" String="&strikeoutregex;"/>
<!-- Common -->
<IncludeRules context="inc"/> <IncludeRules context="inc"/>
<RegExpr attribute="Blockquote: Link" String="&implicitlink;"/>
</context> </context>
<context attribute="bullet" lineEndContext="#stay" lineEmptyContext="#pop" name="bullet"> <context name="find-strong-emphasis-blockquote" attribute="Blockquote: Normal Text" lineEndContext="#pop">
<RegExpr attribute="bl-strong" String="&strongregex;"/> <RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und;"/>
<RegExpr attribute="bl-emphasis" String="&emphasisregex;"/> <RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast;"/>
<RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und2;"/>
<RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast2;"/>
<RegExpr attribute="Blockquote: Strong Text" context="#pop" minimal="true" String="&strongregex_ast;"/>
<RegExpr attribute="Blockquote: Strong Text" context="#pop" minimal="true" String="&strongregex_und;"/>
<RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast;"/>
<RegExpr attribute="Blockquote: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und;"/>
<RegExpr attribute="Blockquote: Emphasis Text" context="#pop" minimal="true" String="&emphasisregex_ast;" />
<RegExpr attribute="Blockquote: Emphasis Text" context="#pop" minimal="true" String="&emphasisregex_und;"/>
<AnyChar attribute="Blockquote: Normal Text" context="#pop" String="*_"/>
</context>
<!-- List and Numbered List -->
<!-- NOTE: The indentation of the lists is captured. New paragraphs, code blocks, blockquotes or
horizontal rules must have an indentation equal to or greater than the list, to be part of it. -->
<!-- * list -->
<context name="list" attribute="List: Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="content-list">
<!-- Find indented code blocks, blockquotes and horizontal rules -->
<RegExpr attribute="Code" String="%1%2\s&indentedcodeblock;" column="0" dynamic="true"/>
<RegExpr attribute="Blockquote" context="blockquote-list" String="%1%2\s+&gt;" column="0" dynamic="true"/>
<RegExpr attribute="Horizontal Rule" String="%1%2\s+&rulerregex;" column="0" dynamic="true"/>
<RegExpr String="&emptyline;" column="0"/>
<!-- Text with the same indentation captured corresponds to the item list -->
<RegExpr context="content-list" String="%1%2\s" column="0" lookAhead="true" dynamic="true"/>
<!-- Finish when the text has a lower indentation than the list -->
<RegExpr context="#pop" String="^\s*\S" column="0" lookAhead="true"/>
<!-- Highlight checkbox at the start of the item (task list) -->
<RegExpr attribute="List: Checkbox" context="content-list" String="\s*&checkbox;"/>
</context>
<!-- 1. numlist (one digit) -->
<context name="numlist" attribute="List: Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="content-list">
<!-- Find indented code blocks, blockquotes and horizontal rules -->
<RegExpr attribute="Code" String="%1%2\s{2}&indentedcodeblock;" column="0" dynamic="true"/>
<RegExpr attribute="Blockquote" context="blockquote-list" String="%1%2\s{2,}&gt;" column="0" dynamic="true"/>
<RegExpr attribute="Horizontal Rule" String="%1%2\s{2,}&rulerregex;" column="0" dynamic="true"/>
<RegExpr String="&emptyline;" column="0"/>
<!-- Text with the same indentation captured -->
<RegExpr context="content-list" String="%1%2\s{2}" column="0" lookAhead="true" dynamic="true"/>
<!-- Finish when the text has a lower indentation than the list -->
<RegExpr context="#pop" String="^\s*\S" column="0" lookAhead="true"/>
</context>
<!-- 10. numlist (two or more digits) -->
<context name="numlist2" attribute="List: Normal Text" lineEndContext="#stay" fallthrough="true" fallthroughContext="content-list">
<!-- Find indented code blocks, blockquotes and horizontal rules -->
<RegExpr attribute="Code" String="%1%2\s{3}&indentedcodeblock;" column="0" dynamic="true"/>
<RegExpr attribute="Blockquote" context="blockquote-list" String="%1%2\s{3,}&gt;" column="0" dynamic="true"/>
<RegExpr attribute="Horizontal Rule" String="%1%2\s{3,}&rulerregex;" column="0" dynamic="true"/>
<RegExpr String="&emptyline;" column="0"/>
<!-- Text with the same indentation captured -->
<RegExpr context="content-list" String="%1%2\s{3}" column="0" lookAhead="true" dynamic="true"/>
<!-- Finish when the text has a lower indentation than the list -->
<RegExpr context="#pop" String="^\s*\S" column="0" lookAhead="true"/>
</context>
<!-- NOTE: Empty lines, blockquotes and horizontal rules send to contexts "list", "numlist" or "numlist2" (#pop),
to check the indentation of the text and determine if the content of the list ends. -->
<context name="content-list" attribute="List: Normal Text" lineEndContext="#stay" lineEmptyContext="#pop">
<RegExpr context="#pop" String="&emptyline;" column="0"/>
<!-- Blockquote and horzontal rule (check indentation) -->
<RegExpr context="#pop" String="^\s*(?:&gt;|&rulerregex;)" column="0" lookAhead="true"/>
<!-- End with header or new list/numlist -->
<RegExpr context="#pop#pop" String="(?:\s*(?:&listbullet;|[\d]+\.)\s|#{1,6}\s)" column="0" lookAhead="true"/>
<!-- Strong, emphasis, strong-emphasis and strikethrough text -->
<AnyChar context="find-strong-emphasis-list" String="*_" lookAhead="true"/>
<RegExpr attribute="List: Strikethrough Text" minimal="true" String="&strikeoutregex;"/>
<!-- Common -->
<IncludeRules context="inc"/> <IncludeRules context="inc"/>
<RegExpr attribute="List: Link" String="&implicitlink;"/>
</context> </context>
<context attribute="numlist" lineEndContext="#stay" lineEmptyContext="#pop" name="numlist"> <context name="find-strong-emphasis-list" attribute="List: Normal Text" lineEndContext="#pop">
<RegExpr attribute="nl-strong" String="&strongregex;"/> <RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und;"/>
<RegExpr attribute="nl-emphasis" String="&emphasisregex;"/> <RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast;"/>
<IncludeRules context="inc"/> <RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast_und2;"/>
<RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und_ast2;"/>
<RegExpr attribute="List: Strong Text" context="#pop" minimal="true" String="&strongregex_ast;"/>
<RegExpr attribute="List: Strong Text" context="#pop" minimal="true" String="&strongregex_und;"/>
<RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_ast;"/>
<RegExpr attribute="List: Strong-Emphasis Text" context="#pop" minimal="true" String="&strongemphasisregex_und;"/>
<RegExpr attribute="List: Emphasis Text" context="#pop" minimal="true" String="&emphasisregex_ast;" />
<RegExpr attribute="List: Emphasis Text" context="#pop" minimal="true" String="&emphasisregex_und;"/>
<AnyChar attribute="List: Normal Text" context="#pop" String="*_"/>
</context> </context>
<context attribute="comment" lineEndContext="#stay" name="comment">
<RegExpr String="--&gt;" attribute="comment" context="#pop" endRegion="comment"/> <!-- Comments -->
<context name="comment" attribute="Comment" lineEndContext="#stay">
<StringDetect attribute="Comment" context="#pop" String="&endcomment;" endRegion="comment"/>
<IncludeRules context="##Alerts"/>
<IncludeRules context="##Modelines"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="bash-code">
<WordDetect attribute="code" context="#pop" String="```"/> <!-- Fenced Code Blocks -->
<context name="find-lang-fenced-code" attribute="Normal Text" lineEndContext="#pop">
<!-- Apply syntax highlighting to fenced code blocks for some languages -->
<RegExpr attribute="Fenced Code" context="#pop!code" String="&fcode;&end;"/>
<RegExpr attribute="Fenced Code" context="#pop!bash-code" String="&fcode;\s*(?:bash(?:rc|_profile|_login|_logout)?|shell|sh|zsh|profile|PKGBUILD|APKBUILD|ebuild|eclass|nix)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!cpp-code" String="&fcode;\s*(?:[ch]pp|[ch]\+\+|[ch]xx|h?cc|hh|cuh?|ino|pde|moc)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!csharp-code" String="&fcode;\s*(?:cs|csharp|c\#)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!cmake-code" String="&fcode;\s*(?:cmake|CMakeLists(?:\.txt)?)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!css-code" String="&fcode;\s*css&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!c-code" String="&fcode;\s*[ch]&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!doxygen-code" String="&fcode;\s*doxygen&end;" insensitive="true"/> <!-- Block comment of Doxygen -->
<RegExpr attribute="Fenced Code" context="#pop!email-code" String="&fcode;\s*(?:email|emlx?|mbo?x)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!go-code" String="&fcode;\s*go(?:lang)?&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!hamlet-code" String="&fcode;\s*[wxs]?hamlet&end;" insensitive="true"/> <!-- Included in the Haskell definition -->
<RegExpr attribute="Fenced Code" context="#pop!haskell-code" String="&fcode;\s*(?:haskell|c?hs|hs\-boot)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!html-code" String="&fcode;\s*(?:[sx]?html?|inc|tmpl|tpl)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!java-code" String="&fcode;\s*(?:java|bsh)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!javascript-code" String="&fcode;\s*(?:javascript|m?js|es6|kwinscript|julius)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!jsx-code" String="&fcode;\s*(?:jsx|tsx|(?:java|type)script\-react)&end;" insensitive="true"/> <!-- Included in the HTML definition. Also apply for TSX. -->
<RegExpr attribute="Fenced Code" context="#pop!json-code" String="&fcode;\s*(?:json5?|gltf)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!matlab-code" String="&fcode;\s*matlab&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!markdown-code" String="&fcode;\s*(?:markdown|m?md)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!mustache-code" String="&fcode;\s*(?:handlebars|hbs|mustache|mst|ractive|hogan|hulk)&end;" insensitive="true"/> <!-- Included in the HTML definition -->
<RegExpr attribute="Fenced Code" context="#pop!perl-code" String="&fcode;\s*(?:perl|p[lm]|pod|psgi|vcl|perl6|p[lm]?6|nqp)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!php-code" String="&fcode;\s*(?:php[3457t]?|wml|phtml?|aw|ctp)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!python-code" String="&fcode;\s*(?:python[23]?|py[23w]?|[rc]py|sconstruct|gypi?)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!qml-code" String="&fcode;\s*qml(?:types)?&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!r-code" String="&fcode;\s*(?:r|rprofile|rscript)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!rest-code" String="&fcode;\s*(?:rst|rest|restructuredtext)&end;" insensitive="true"/> <!-- Included in the CMake definition -->
<RegExpr attribute="Fenced Code" context="#pop!ruby-code" String="&fcode;\s*(?:ruby|rbx?|rjs|rake|f?cgi|gemspec|irbrc|ru|prawn|Appraisals|(?:Rake|Cap|Chef|Gem|Guard|Hobo|Vagrant||Rant|Berks|Thor|Puppet)file|rxml|(?:xml|js)\.erb)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!rust-code" String="&fcode;\s*(?:rust|rs)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!mysql-code" String="&fcode;\s*(?:mysql|sql|ddl)&end;" insensitive="true"/> <!-- Included in the PHP definition -->
<RegExpr attribute="Fenced Code" context="#pop!typescript-code" String="&fcode;\s*(?:typescript|ts)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!xml-code" String="&fcode;\s*(?:xml|xsd|xspf|tld|jsp|c?pt|dtml|rss|opml|svg|daml|rdf|ui|kcfg|qrc|wsdl|scxml|xbel|dae|sch|brd|docbook)&end;" insensitive="true"/>
<RegExpr attribute="Fenced Code" context="#pop!code" String="&fcode;.*$"/>
</context>
<context name="code" attribute="Code" lineEndContext="#stay"> <!-- Unknown language -->
<RegExpr attribute="Fenced Code" context="#pop" String="%1[~`]*(?=&end;)" firstNonSpace="true" dynamic="true" endRegion="code-block"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="bash-code">
<IncludeRules context="code"/>
<IncludeRules context="##Bash" includeAttrib="true"/> <IncludeRules context="##Bash" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="cmake-code"> <context attribute="Normal Text" lineEndContext="#stay" name="cmake-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##CMake" includeAttrib="true"/> <IncludeRules context="##CMake" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="cpp-code"> <context attribute="Normal Text" lineEndContext="#stay" name="c-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##C" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="cpp-code">
<IncludeRules context="code"/>
<IncludeRules context="##C++" includeAttrib="true"/> <IncludeRules context="##C++" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="css-code"> <context attribute="Normal Text" lineEndContext="#stay" name="csharp-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##C#" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="css-code">
<IncludeRules context="code"/>
<IncludeRules context="##CSS" includeAttrib="true"/> <IncludeRules context="##CSS" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="email-code"> <context attribute="Normal Text" lineEndContext="#stay" name="doxygen-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="BlockComment##Doxygen" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="email-code">
<IncludeRules context="code"/>
<IncludeRules context="##Email" includeAttrib="true"/> <IncludeRules context="##Email" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="haskell-code"> <context attribute="Normal Text" lineEndContext="#stay" name="go-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##Go" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="hamlet-code">
<IncludeRules context="code"/>
<IncludeRules context="##Hamlet" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="haskell-code">
<IncludeRules context="code"/>
<IncludeRules context="##Haskell" includeAttrib="true"/> <IncludeRules context="##Haskell" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="html-code"> <context attribute="Normal Text" lineEndContext="#stay" name="html-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##HTML" includeAttrib="true"/> <IncludeRules context="##HTML" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="json-code"> <context attribute="Normal Text" lineEndContext="#stay" name="java-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##Java" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="javascript-code">
<IncludeRules context="code"/>
<IncludeRules context="Normal##JavaScript" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="jsx-code">
<IncludeRules context="code"/>
<IncludeRules context="Normal##JavaScript React" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="json-code">
<IncludeRules context="code"/>
<IncludeRules context="##JSON" includeAttrib="true"/> <IncludeRules context="##JSON" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="php-code"> <context attribute="Normal Text" lineEndContext="#stay" lineEmptyContext="find-code-block" name="markdown-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="Normal Text"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="matlab-code">
<IncludeRules context="code"/>
<IncludeRules context="##Matlab" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="mustache-code">
<IncludeRules context="code"/>
<IncludeRules context="##Mustache/Handlebars (HTML)" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="perl-code">
<IncludeRules context="code"/>
<IncludeRules context="##Perl" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="php-code">
<IncludeRules context="code"/>
<IncludeRules context="phpsource##PHP/PHP" includeAttrib="true"/> <IncludeRules context="phpsource##PHP/PHP" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="python-code"> <context attribute="Normal Text" lineEndContext="#stay" name="python-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##Python" includeAttrib="true"/> <IncludeRules context="##Python" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="qml-code"> <context attribute="Normal Text" lineEndContext="#stay" name="qml-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##QML" includeAttrib="true"/> <IncludeRules context="##QML" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="rust-code"> <context attribute="Normal Text" lineEndContext="#stay" name="r-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##R Script" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="rest-code">
<IncludeRules context="code"/>
<IncludeRules context="##reStructuredText" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="ruby-code">
<IncludeRules context="code"/>
<IncludeRules context="##Ruby" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="rust-code">
<IncludeRules context="code"/>
<IncludeRules context="##Rust" includeAttrib="true"/> <IncludeRules context="##Rust" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="xml-code"> <context attribute="Normal Text" lineEndContext="#stay" name="mysql-code">
<WordDetect attribute="code" context="#pop" String="```"/> <IncludeRules context="code"/>
<IncludeRules context="##SQL (MySQL)" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="typescript-code">
<IncludeRules context="code"/>
<IncludeRules context="Normal##TypeScript" includeAttrib="true"/>
</context>
<context attribute="Normal Text" lineEndContext="#stay" name="xml-code">
<IncludeRules context="code"/>
<IncludeRules context="##XML" includeAttrib="true"/> <IncludeRules context="##XML" includeAttrib="true"/>
</context> </context>
<context attribute="code" lineEndContext="#stay" name="code">
<WordDetect attribute="code" context="#pop" String="```"/> <!-- Common -->
<context name="inc" attribute="Normal Text" lineEndContext="#stay">
<!-- Code -->
<RegExpr attribute="Code" String="`[^`]+`(?!`)"/>
<RegExpr attribute="Code" minimal="true" String="`{2}[^`](?:.*[^`])?`{2}(?!`)"/>
<RegExpr attribute="Code" minimal="true" String="`{3}[^`](?:.*[^`])?`{3}(?!`)"/>
<RegExpr attribute="Code" minimal="true" String="`{4}[^`](?:.*[^`])?`{4}(?!`)"/>
<RegExpr attribute="Code" minimal="true" String="`{5,}[^`](?:.*[^`])?`{5,}"/>
<!-- Find Fenced Code Block -->
<RegExpr attribute="Fenced Code" context="find-lang-fenced-code" String="`{3,}(?=[^`]*$)" firstNonSpace="true" lookAhead="true" beginRegion="code-block"/>
<RegExpr attribute="Fenced Code" context="find-lang-fenced-code" String="~{3,}(?=[^~]*$)" firstNonSpace="true" lookAhead="true" beginRegion="code-block"/>
<!-- Comment -->
<StringDetect attribute="Comment" context="comment" String="&startcomment;" beginRegion="comment"/>
<!-- Links and References -->
<RegExpr attribute="Reference-Link Target" context="reflinktarget" String="&reflinktargetregex;" firstNonSpace="true"/>
<RegExpr attribute="Footnote" String="&footnoteregex;"/>
<RegExpr attribute="Reference-Link" context="find-reflink" String="&reflinkregex;"/>
<RegExpr attribute="Inline Image" context="inlineimage" String="&inlineimageregex;"/>
<RegExpr attribute="Reference Image" String="&refimageregex;"/>
<RegExpr attribute="Auto-Link" context="autolink" String="&autolinkregex;" lookAhead="true"/>
<RegExpr attribute="Mailto-Link" context="mailtolink" String="&mailtolinkregex;"/>
<!-- Line Break -->
<RegExpr attribute="Line Break" minimal="true" String="&linebreakregex;"/>
<!-- Backslash Escapes -->
<Detect2Chars attribute="Backslash Escape" char="\" char1="\"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="`"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="*"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="_"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="{"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="}"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="["/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="]"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="("/>
<Detect2Chars attribute="Backslash Escape" char="\" char1=")"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="#"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="+"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="-"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="."/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="!"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="&lt;"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="&gt;"/>
<Detect2Chars attribute="Backslash Escape" char="\" char1="&amp;"/>
<!-- Inline HTML -->
<RegExpr attribute="EntityRef" String="&amp;(?:#[0-9]+|#[xX][0-9A-Fa-f]+|&htmlname;);"/>
<RegExpr context="find-html-block" String="&lt;/?&htmlname;(?:[\s&gt;]|/&gt;|$)" lookAhead="true"/>
</context> </context>
<context attribute="common" name="inc" lineEndContext="#stay"> <context name="find-html-block" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<RegExpr attribute="code" String="`[^`]+`"/> <IncludeRules context="FindSpecialHTMLTags##HTML"/>
<RegExpr context="comment" String="&lt;!--" beginRegion="comment"/> <IncludeRules context="FindHTMLTags##HTML"/>
<RegExpr attribute="reflink" String="&reflinkregex;"/> </context>
<RegExpr attribute="footnote" String="&footnoteregex;"/>
<RegExpr attribute="inlinelink" String="&inlinelinkregex;"/> <!-- Links and email: <https://example.com>, <example@kde.org> -->
<RegExpr attribute="reflinktarget" String="&reflinktargetregex;"/> <context name="autolink" attribute="Auto-Link" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<RegExpr attribute="inlineimage" String="&inlineimageregex;"/> <DetectChar attribute="Auto-Link" char="&lt;"/>
<RegExpr attribute="refimage" String="&refimageregex;"/> <DetectChar attribute="Auto-Link" context="#pop" char="&gt;"/>
<RegExpr attribute="autolink" String="&autolinkregex;"/> <RegExpr attribute="Link" String="&startlink;[^&quot;&gt;\s]+"/>
<RegExpr attribute="mailtolink" String="&mailtolinkregex;"/> </context>
<RegExpr attribute="strikeout" minimal="true" String="&strikeoutregex;"/> <context name="mailtolink" attribute="Email" lineEndContext="#pop">
<RegExpr attribute="linebreak" minimal="true" String="&linebreakregex;"/> <DetectChar attribute="Mailto-Link" context="#pop" char="&gt;"/>
<WordDetect attribute="code" context="bash-code" String="```bash"/> </context>
<WordDetect attribute="code" context="cmake-code" String="```cmake"/>
<WordDetect attribute="code" context="cpp-code" String="```cpp"/> <!-- References: [example][id], [example](http://example.com) -->
<WordDetect attribute="code" context="css-code" String="```css"/> <context name="find-reflink" attribute="Reference-Link Name" lineEndContext="#pop">
<WordDetect attribute="code" context="email-code" String="```email"/> <Detect2Chars attribute="Reference-Link Name" char="\" char1="]"/>
<WordDetect attribute="code" context="haskell-code" String="```haskell"/> <RegExpr attribute="Reference-Link" context="#pop!find-reflink-id" String="\](?=&reflinkidregex;)"/> <!-- Find id -->
<WordDetect attribute="code" context="html-code" String="```html"/> <DetectChar attribute="Reference-Link" context="#pop" char="]"/>
<WordDetect attribute="code" context="json-code" String="```json"/> <!-- Image as link or reference -->
<WordDetect attribute="code" context="php-code" String="```php"/> <RegExpr attribute="Inline Image" context="inlineimage" String="&startinlineimage;(?=&endinlineimage;&refchar;*\])"/>
<WordDetect attribute="code" context="python-code" String="```python"/> <RegExpr attribute="Reference Image" String="&refimageregex;(?=&refchar;*\])"/>
<WordDetect attribute="code" context="qml-code" String="```qml"/> <RegExpr attribute="Reference-Link Name" context="#stay" String="(?:\[(?:\\.|[^\[\]\\])*\](?:\\.|[^\[\]\\])*)+(?=\])" minimal="true"/>
<WordDetect attribute="code" context="rust-code" String="```rust"/> </context>
<WordDetect attribute="code" context="xml-code" String="```xml"/> <context name="find-reflink-id" attribute="Reference-Link" lineEndContext="#pop">
<StringDetect attribute="code" context="code" String="```"/> <DetectSpaces />
<!-- Ref.: [an example][id] "Optional title" -->
<DetectChar attribute="Reference-Link" context="#pop!reflink-id" char="["/>
<!-- Inline Ref.: [an example](http://example.com/ "Title") -->
<DetectChar attribute="Reference-Link" context="#pop!reflink-inline-id" char="("/>
</context>
<context name="reflink-inline-id" attribute="Reference-Link" lineEndContext="#pop">
<Detect2Chars attribute="Reference-Link" char="\" char1=")"/>
<DetectChar attribute="Reference-Link" context="#pop" char=")"/>
<RegExpr attribute="Reference-Link: Link" String="\b&startlink;(?:\\.|[^&quot;&gt;\s\)\\])+"/>
<RegExpr attribute="Reference-Link: Email" String="\b&email;\b"/>
</context>
<context name="reflink-id" attribute="Reference-Link ID" lineEndContext="#pop">
<Detect2Chars attribute="Reference-Link ID" char="\" char1="]"/>
<DetectChar attribute="Reference-Link" context="#pop!reflink-title" char="]"/>
<RegExpr attribute="Reference-Link: Link" String="\b&startlink;(?:\\.|[^&quot;&gt;\s\]\\])+"/>
</context>
<!-- [an example][id] "title" -->
<context name="reflink-title" attribute="Normal Text" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<RegExpr attribute="Reference-Link" context="#pop" String="\s+&quot;(?:\\.|[^&quot;\\])*&quot;"/>
</context>
<!-- Target Ref.: [foo]: http://example.com/ "Optional Title Here" -->
<context name="reflinktarget" attribute="Reference-Link Target" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<RegExpr attribute="Reference-Link Target: Link" context="#pop!reflinktarget-title" String="\s*&link;(?=\s|$)"/>
<RegExpr attribute="Reference-Link Target" context="#pop!reflinktarget-link" String="\s*&lt;(?=&link;&gt;(?:\s|$))"/>
<RegExpr attribute="Reference-Link Target" context="#pop!reflinktarget-title" String="\s*#[\w\.\:\-]+\b"/>
</context>
<context name="reflinktarget-link" attribute="Reference-Link Target" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<DetectChar attribute="Reference-Link Target" context="#pop!reflinktarget-title" char="&gt;"/>
<RegExpr attribute="Reference-Link Target: Link" String="&link;"/>
</context>
<context name="reflinktarget-title" attribute="Reference-Link Target" lineEndContext="#pop" fallthrough="true" fallthroughContext="#pop">
<DetectSpaces attribute="Reference-Link Target"/>
<RegExpr attribute="Reference-Link Target" context="#pop" String="&quot;(?:\\.|[^&quot;\\])*&quot;"/>
<RegExpr attribute="Reference-Link Target" context="#pop" String="&apos;(?:\\.|[^&apos;\\])*&apos;"/>
<RegExpr attribute="Reference-Link Target" context="#pop" String="\((?:\\.|[^\)\\])*\)"/>
</context>
<!-- Image -->
<context name="inlineimage" attribute="Inline Image" lineEndContext="#pop">
<DetectChar attribute="Inline Image" context="#pop" char=")"/>
<Detect2Chars attribute="Inline Image" char="\" char1=")"/>
<RegExpr attribute="Inline Image: Link" String="\b&startlink;(?:\\.|[^&quot;&gt;\s\)\\])+"/>
</context> </context>
</contexts> </contexts>
<itemDatas> <itemDatas>
<itemData name="Normal Text" defStyleNum="dsNormal"/> <itemData name="Normal Text" defStyleNum="dsNormal"/>
<itemData name="common" defStyleNum="dsNormal"/> <itemData name="Emphasis Text" defStyleNum="dsNormal" italic="true"/>
<itemData name="strongemphasis" defStyleNum="dsNormal" italic="true" bold="true"/> <itemData name="Strong Text" defStyleNum="dsNormal" bold="true"/>
<itemData name="emphasis" defStyleNum="dsNormal" italic="true"/> <itemData name="Strong-Emphasis Text" defStyleNum="dsNormal" italic="true" bold="true"/>
<itemData name="strong" defStyleNum="dsNormal" bold="true"/> <itemData name="Strikethrough Text" defStyleNum="dsNormal" strikeOut="true"/>
<itemData name="ruler" defStyleNum="dsNormal" bold="true"/> <itemData name="Normal Text: Link" defStyleNum="dsNormal" underline="true" spellChecking="false"/>
<itemData name="strikeout" defStyleNum="dsNormal" strikeOut="true"/> <itemData name="Horizontal Rule" defStyleNum="dsNormal" bold="true" spellChecking="false"/>
<itemData name="linebreak" defStyleNum="dsNormal" underline="true" color="#999999"/> <itemData name="Line Break" defStyleNum="dsNormal" underline="true" color="#999999" spellChecking="false"/>
<itemData name="h1" defStyleNum="dsFunction" bold="true"/> <itemData name="Header H1" defStyleNum="dsFunction" bold="true"/>
<itemData name="h2" defStyleNum="dsFunction" bold="true"/> <itemData name="Header H2" defStyleNum="dsFunction" bold="true"/>
<itemData name="h3" defStyleNum="dsFunction" bold="true"/> <itemData name="Header H3" defStyleNum="dsFunction" bold="true"/>
<itemData name="h4" defStyleNum="dsFunction" bold="true"/> <itemData name="Header H4" defStyleNum="dsFunction" bold="true"/>
<itemData name="h5" defStyleNum="dsFunction" bold="true"/> <itemData name="Header H5" defStyleNum="dsFunction" bold="true"/>
<itemData name="h6" defStyleNum="dsFunction" bold="true"/> <itemData name="Header H6" defStyleNum="dsFunction" bold="true"/>
<itemData name="blockquote" defStyleNum="dsDataType"/> <itemData name="Blockquote" defStyleNum="dsAttribute" spellChecking="false"/>
<itemData name="bq-emphasis" defStyleNum="dsDataType" italic="true"/> <itemData name="Blockquote: Normal Text" defStyleNum="dsAttribute"/>
<itemData name="bq-strong" defStyleNum="dsDataType" bold="true"/> <itemData name="Blockquote: Emphasis Text" defStyleNum="dsAttribute" italic="true"/>
<itemData name="bullet" defStyleNum="dsString"/> <itemData name="Blockquote: Strong Text" defStyleNum="dsAttribute" bold="true"/>
<itemData name="bl-emphasis" defStyleNum="dsString" italic="true"/> <itemData name="Blockquote: Strong-Emphasis Text" defStyleNum="dsAttribute" italic="true" bold="true"/>
<itemData name="bl-strong" defStyleNum="dsString" bold="true"/> <itemData name="Blockquote: Strikethrough Text" defStyleNum="dsAttribute" strikeOut="true"/>
<itemData name="numlist" defStyleNum="dsString"/> <itemData name="Blockquote: Link" defStyleNum="dsAttribute" underline="true" spellChecking="false"/>
<itemData name="nl-emphasis" defStyleNum="dsString" italic="true"/> <itemData name="List" defStyleNum="dsSpecialString" bold="1" spellChecking="false"/>
<itemData name="nl-strong" defStyleNum="dsString" bold="true"/> <itemData name="Number List" defStyleNum="dsSpecialString" spellChecking="false"/>
<itemData name="comment" defStyleNum="dsComment"/> <itemData name="List: Normal Text" defStyleNum="dsNormal"/>
<itemData name="code" defStyleNum="dsBaseN"/> <itemData name="List: Emphasis Text" defStyleNum="dsNormal" italic="true"/>
<itemData name="reflink" defStyleNum="dsOthers" underline="true"/> <itemData name="List: Strong Text" defStyleNum="dsNormal" bold="true"/>
<itemData name="inlinelink" defStyleNum="dsOthers" underline="true"/> <itemData name="List: Strong-Emphasis Text" defStyleNum="dsNormal" italic="true" bold="true"/>
<itemData name="autolink" defStyleNum="dsOthers" underline="true"/> <itemData name="List: Strikethrough Text" defStyleNum="dsNormal" strikeOut="true"/>
<itemData name="mailtolink" defStyleNum="dsOthers" underline="true"/> <itemData name="List: Link" defStyleNum="dsNormal" underline="true" spellChecking="false"/>
<itemData name="footnote" defStyleNum="dsOthers" italic="true"/> <itemData name="List: Checkbox" defStyleNum="dsVariable" spellChecking="false"/>
<itemData name="meta" defStyleNum="dsComment"/> <itemData name="Comment" defStyleNum="dsComment"/>
<itemData name="reflinktarget" defStyleNum="dsOthers" italic="false" bold="false"/> <itemData name="Code" defStyleNum="dsInformation"/>
<itemData name="inlineimage" defStyleNum="dsAlert" italic="false" bold="false"/> <itemData name="Fenced Code" defStyleNum="dsInformation" spellChecking="false"/>
<itemData name="refimage" defStyleNum="dsAlert" italic="false" bold="false"/> <itemData name="Auto-Link" defStyleNum="dsOthers" spellChecking="false"/>
<itemData name="Link" defStyleNum="dsOthers" underline="true" spellChecking="false"/>
<itemData name="Mailto-Link" defStyleNum="dsOthers" spellChecking="false"/>
<itemData name="Email" defStyleNum="dsOthers" italic="true" underline="true" spellChecking="false"/>
<itemData name="Footnote" defStyleNum="dsOthers" italic="true"/>
<itemData name="Reference-Link" defStyleNum="dsComment" italic="false"/>
<itemData name="Reference-Link Name" defStyleNum="dsOthers" underline="true" italic="false"/>
<itemData name="Reference-Link ID" defStyleNum="dsComment" italic="false"/>
<itemData name="Reference-Link: Link" defStyleNum="dsComment" underline="true" italic="false" spellChecking="false"/>
<itemData name="Reference-Link: Email" defStyleNum="dsComment" italic="true" underline="true" spellChecking="false"/>
<itemData name="Reference-Link Target" defStyleNum="dsOthers" italic="false" bold="false"/>
<itemData name="Reference-Link Target: Link" defStyleNum="dsOthers" underline="true" spellChecking="false"/>
<itemData name="Inline Image" defStyleNum="dsAlert" italic="false" bold="false"/>
<itemData name="Reference Image" defStyleNum="dsAlert" italic="false" bold="false"/>
<itemData name="Inline Image: Link" defStyleNum="dsAlert" italic="false" bold="false" underline="true"/>
<itemData name="Metadata Title" defStyleNum="dsAnnotation"/>
<itemData name="Metadata" defStyleNum="dsComment" italic="0"/>
<itemData name="Backslash Escape" defStyleNum="dsSpecialChar" spellChecking="false"/>
<itemData name="EntityRef" defStyleNum="dsDecVal" spellChecking="false"/>
</itemDatas> </itemDatas>
</highlighting> </highlighting>
<general> <general>
<keywords additionalDeliminator="`"/>
<comments> <comments>
<comment name="multiLine" start="&lt;!--" end="--&gt;" region="comment"/> <comment name="multiLine" start="&startcomment;" end="&endcomment;" region="comment"/>
</comments> </comments>
</general> </general>
</language> </language>
<!-- kate: replace-tabs on; indent-width 2; tab-width 2; -->

View File

@@ -39,7 +39,7 @@
Enhance tr/// and y/// support. Enhance tr/// and y/// support.
--> -->
<language name="Perl" version="8" kateversion="2.4" section="Scripts" extensions="*.pl;*.PL;*.pm;*.pl6;*.PL6;*.p6;*.pm6;" mimetype="application/x-perl;text/x-perl" priority="5" author="Anders Lund (anders@alweb.dk)" license="LGPLv2"> <language name="Perl" version="9" kateversion="2.4" section="Scripts" extensions="*.pl;*.PL;*.pm" mimetype="application/x-perl;text/x-perl" priority="5" author="Anders Lund (anders@alweb.dk)" license="LGPLv2">
<highlighting> <highlighting>
<list name="keywords"> <list name="keywords">
<item>if</item> <item>if</item>

File diff suppressed because it is too large Load Diff

View File

@@ -32,7 +32,6 @@
#include <QCommandLineParser> #include <QCommandLineParser>
#include <QCoreApplication> #include <QCoreApplication>
#include <QFile> #include <QFile>
#include <QVector>
#include <iostream> #include <iostream>

View File

@@ -24,7 +24,6 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QTextStream>
#include <QVariant> #include <QVariant>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QJsonDocument> #include <QJsonDocument>
@@ -59,6 +58,7 @@ QStringList readListing(const QString &fileName)
if (xml.hasError()) { if (xml.hasError()) {
qWarning() << "XML error while reading" << fileName << " - " qWarning() << "XML error while reading" << fileName << " - "
<< qPrintable(xml.errorString()) << "@ offset" << xml.characterOffset(); << qPrintable(xml.errorString()) << "@ offset" << xml.characterOffset();
listing.clear();
} }
return listing; return listing;
@@ -69,7 +69,7 @@ QStringList readListing(const QString &fileName)
* @param extensions extensions string to check * @param extensions extensions string to check
* @return valid? * @return valid?
*/ */
bool checkExtensions(QString extensions) bool checkExtensions(const QString &extensions)
{ {
// get list of extensions // get list of extensions
const QStringList extensionParts = extensions.split(QLatin1Char(';'), QString::SkipEmptyParts); 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(); const QString c = xml.attributes().value(QLatin1String("char")).toString();
if (c.size() != 1) { if (c.size() != 1) {
qWarning() << hlFilename << "line" << xml.lineNumber() << "'char' must contain exactly one char:" << c; 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(); const QString c = xml.attributes().value(QLatin1String("char1")).toString();
if (c.size() != 1) { if (c.size() != 1) {
qWarning() << hlFilename << "line" << xml.lineNumber() << "'char1' must contain exactly one char:" << c; 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(); const QString name = xml.attributes().value(QLatin1String("name")).toString();
if (m_existingNames.contains(name)) { if (m_existingNames.contains(name)) {
qWarning() << m_filename << "list duplicate:" << name; qWarning() << m_filename << "list duplicate:" << name;
m_success = false;
} }
m_existingNames.insert(name); m_existingNames.insert(name);
} else if (xml.name() == QLatin1String("keyword")) { } else if (xml.name() == QLatin1String("keyword")) {
@@ -296,7 +299,7 @@ public:
bool check() const bool check() const
{ {
bool success = true; bool success = m_success;
const auto invalidNames = m_usedNames - m_existingNames; const auto invalidNames = m_usedNames - m_existingNames;
if (!invalidNames.isEmpty()) { if (!invalidNames.isEmpty()) {
qWarning() << m_filename << "Reference of non-existing keyword list:" << invalidNames; qWarning() << m_filename << "Reference of non-existing keyword list:" << invalidNames;
@@ -306,6 +309,7 @@ public:
const auto unusedNames = m_existingNames - m_usedNames; const auto unusedNames = m_existingNames - m_usedNames;
if (!unusedNames.isEmpty()) { if (!unusedNames.isEmpty()) {
qWarning() << m_filename << "Unused keyword lists:" << unusedNames; qWarning() << m_filename << "Unused keyword lists:" << unusedNames;
success = false;
} }
return success; return success;
@@ -315,14 +319,27 @@ private:
QString m_filename; QString m_filename;
QSet<QString> m_usedNames; QSet<QString> m_usedNames;
QSet<QString> m_existingNames; QSet<QString> 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 class ContextChecker
{ {
public: 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) void processElement(const QString &hlFilename, const QString &hlName, QXmlStreamReader &xml)
{ {
if (xml.name() == QLatin1String("context")) { if (xml.name() == QLatin1String("context")) {
@@ -336,22 +353,28 @@ public:
if (language.existingContextNames.contains(name)) { if (language.existingContextNames.contains(name)) {
qWarning() << hlFilename << "Duplicate context:" << name; qWarning() << hlFilename << "Duplicate context:" << name;
m_success = false;
} else { } else {
language.existingContextNames.insert(name); language.existingContextNames.insert(name);
} }
if (xml.attributes().value(QLatin1String("fallthroughContext")).toString() == QLatin1String("#stay")) { if (xml.attributes().value(QLatin1String("fallthroughContext")).toString() == QLatin1String("#stay")) {
qWarning() << hlFilename << "possible infinite loop due to fallthroughContext=\"#stay\" in context " << name; 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("lineEndContext")).toString());
processContext(hlName, xml.attributes().value(QLatin1String("lineEmptyContext")).toString()); processContext(hlName, xml.attributes().value(QLatin1String("lineEmptyContext")).toString());
processContext(hlName, xml.attributes().value(QLatin1String("fallthroughContext")).toString()); processContext(hlName, xml.attributes().value(QLatin1String("fallthroughContext")).toString());
} else if (xml.name() == QLatin1String("include")) {
// <include> tag inside <list>
processVersion(hlFilename, hlName, xml, {5, 53}, QLatin1String("<include>"));
} else { } else {
if (xml.attributes().hasAttribute(QLatin1String("context"))) { if (xml.attributes().hasAttribute(QLatin1String("context"))) {
const QString context = xml.attributes().value(QLatin1String("context")).toString(); const QString context = xml.attributes().value(QLatin1String("context")).toString();
if (context.isEmpty()) { if (context.isEmpty()) {
qWarning() << hlFilename << "Missing context name in line" << xml.lineNumber(); qWarning() << hlFilename << "Missing context name in line" << xml.lineNumber();
m_success = false;
} else { } else {
processContext(hlName, context); processContext(hlName, context);
} }
@@ -361,7 +384,30 @@ public:
bool check() const bool check() const
{ {
bool success = true; bool success = m_success;
// recursive search for the required miximal version
struct GetRequiredVersion
{
QHash<const Language*, Version> versionMap;
Version operator()(const QHash<QString, Language> &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) { for (auto &language : m_contextMap) {
const auto invalidContextNames = language.usedContextNames - language.existingContextNames; const auto invalidContextNames = language.usedContextNames - language.existingContextNames;
if (!invalidContextNames.isEmpty()) { if (!invalidContextNames.isEmpty()) {
@@ -374,6 +420,12 @@ public:
qWarning() << language.hlFilename << "Unused contexts:" << unusedNames; qWarning() << language.hlFilename << "Unused contexts:" << unusedNames;
success = false; 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; return success;
@@ -405,6 +457,7 @@ private:
} else if (list.size() == 2) { } else if (list.size() == 2) {
// specific context of other language, e.g. Comment##ISO C++ // specific context of other language, e.g. Comment##ISO C++
m_contextMap[list[1]].usedContextNames.insert(list[0]); m_contextMap[list[1]].usedContextNames.insert(list[0]);
m_contextMap[language].usedLanguageName.insert(list[1]);
} }
return; return;
} }
@@ -418,6 +471,34 @@ private:
} }
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 class Language
{ {
public: public:
@@ -435,6 +516,12 @@ private:
// holds all existing context names // holds all existing context names
QSet<QString> existingContextNames; QSet<QString> existingContextNames;
// holds all existing language names
QSet<QString> usedLanguageName;
// kateversion language attribute
Version version;
}; };
/** /**
@@ -442,6 +529,7 @@ private:
* Example key: "Doxygen" * Example key: "Doxygen"
*/ */
QHash<QString, Language> m_contextMap; QHash<QString, Language> m_contextMap;
bool m_success = true;
}; };
/** /**
@@ -461,6 +549,7 @@ public:
if (!name.isEmpty()) { if (!name.isEmpty()) {
if (m_existingAttributeNames.contains(name)) { if (m_existingAttributeNames.contains(name)) {
qWarning() << m_filename << "itemData duplicate:" << name; qWarning() << m_filename << "itemData duplicate:" << name;
m_success = false;
} else { } else {
m_existingAttributeNames.insert(name); m_existingAttributeNames.insert(name);
} }
@@ -469,6 +558,7 @@ public:
const QString name = xml.attributes().value(QLatin1String("attribute")).toString(); const QString name = xml.attributes().value(QLatin1String("attribute")).toString();
if (name.isEmpty()) { if (name.isEmpty()) {
qWarning() << m_filename << "specified attribute is empty:" << xml.name(); qWarning() << m_filename << "specified attribute is empty:" << xml.name();
m_success = false;
} else { } else {
m_usedAttributeNames.insert(name); m_usedAttributeNames.insert(name);
} }
@@ -477,7 +567,7 @@ public:
bool check() const bool check() const
{ {
bool success = true; bool success = m_success;
const auto invalidNames = m_usedAttributeNames - m_existingAttributeNames; const auto invalidNames = m_usedAttributeNames - m_existingAttributeNames;
if (!invalidNames.isEmpty()) { if (!invalidNames.isEmpty()) {
qWarning() << m_filename << "Reference of non-existing itemData attributes:" << invalidNames; qWarning() << m_filename << "Reference of non-existing itemData attributes:" << invalidNames;
@@ -487,6 +577,7 @@ public:
auto unusedNames = m_existingAttributeNames - m_usedAttributeNames; auto unusedNames = m_existingAttributeNames - m_usedAttributeNames;
if (!unusedNames.isEmpty()) { if (!unusedNames.isEmpty()) {
qWarning() << m_filename << "Unused itemData:" << unusedNames; qWarning() << m_filename << "Unused itemData:" << unusedNames;
success = false;
} }
return success; return success;
@@ -496,6 +587,7 @@ private:
QString m_filename; QString m_filename;
QSet<QString> m_usedAttributeNames; QSet<QString> m_usedAttributeNames;
QSet<QString> m_existingAttributeNames; QSet<QString> m_existingAttributeNames;
bool m_success = true;
}; };
} }
@@ -594,8 +686,11 @@ int main(int argc, char *argv[])
AttributeChecker attributeChecker(hlFilename); AttributeChecker attributeChecker(hlFilename);
KeywordChecker keywordChecker(hlFilename); KeywordChecker keywordChecker(hlFilename);
const QString hlName = hl[QStringLiteral("name")].toString(); const QString hlName = hl[QStringLiteral("name")].toString();
contextChecker.setKateVersion(xml.attributes().value(QStringLiteral("kateversion")), hlFilename, hlName);
// scan for broken regex or keywords with spaces // scan for broken regex or keywords with spaces
while (!xml.atEnd()) { while (!xml.atEnd()) {
xml.readNext(); xml.readNext();

View File

@@ -69,6 +69,8 @@ if(BUILD_QCH)
LINK_QCHS LINK_QCHS
Qt5Core_QCH Qt5Core_QCH
Qt5Gui_QCH Qt5Gui_QCH
INCLUDE_DIRS
${CMAKE_CURRENT_BINARY_DIR}
BLANK_MACROS BLANK_MACROS
KSYNTAXHIGHLIGHTING_EXPORT KSYNTAXHIGHLIGHTING_EXPORT
KSYNTAXHIGHLIGHTING_DEPRECATED KSYNTAXHIGHLIGHTING_DEPRECATED

View File

@@ -61,10 +61,8 @@ void Context::load(QXmlStreamReader& reader)
m_attribute = reader.attributes().value(QStringLiteral("attribute")).toString(); m_attribute = reader.attributes().value(QStringLiteral("attribute")).toString();
m_lineEndContext.parse(reader.attributes().value(QStringLiteral("lineEndContext"))); m_lineEndContext.parse(reader.attributes().value(QStringLiteral("lineEndContext")));
m_lineEmptyContext.parse(reader.attributes().value(QStringLiteral("lineEmptyContext"))); 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"))); m_fallthroughContext.parse(reader.attributes().value(QStringLiteral("fallthroughContext")));
if (m_fallthroughContext.isStay()) m_fallthrough = !m_fallthroughContext.isStay();
m_fallthrough = false;
m_noIndentationBasedFolding = Xml::attrToBool(reader.attributes().value(QStringLiteral("noIndentationBasedFolding"))); m_noIndentationBasedFolding = Xml::attrToBool(reader.attributes().value(QStringLiteral("noIndentationBasedFolding")));
reader.readNext(); reader.readNext();

View File

@@ -39,7 +39,6 @@
#include "xml_p.h" #include "xml_p.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QDebug>
#include <QFile> #include <QFile>
#include <QHash> #include <QHash>
#include <QJsonObject> #include <QJsonObject>
@@ -234,6 +233,19 @@ QStringList Definition::keywordList(const QString& name) const
return list ? list->keywords() : QStringList(); 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<Format> Definition::formats() const QVector<Format> Definition::formats() const
{ {
d->load(); d->load();

View File

@@ -26,9 +26,8 @@
#include "ksyntaxhighlighting_export.h" #include "ksyntaxhighlighting_export.h"
#include <QTypeInfo>
#include <QPair> #include <QPair>
#include <QVector>
#include <memory> #include <memory>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -329,10 +328,28 @@ public:
/** /**
* Returns the list of keywords for the keyword list @p name. * Returns the list of keywords for the keyword list @p name.
* @since 5.49 * @since 5.49
* @see keywordLists() * @see keywordLists(), setKeywordList()
*/ */
QStringList keywordList(const QString& name) const; 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. * 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. * The order of the Format items equals the order of the itemDatas in the xml file.

View File

@@ -101,7 +101,7 @@ public:
QVector<QPair<QChar, QString>> characterEncodings; QVector<QPair<QChar, QString>> characterEncodings;
QString fileName; QString fileName;
QString name = QStringLiteral(QT_TRANSLATE_NOOP("Syntax highlighting", "None")); QString name = QStringLiteral(QT_TRANSLATE_NOOP("Language", "None"));
QString section; QString section;
QString style; QString style;
QString indenter; QString indenter;

View File

@@ -27,7 +27,6 @@
#include "ksyntaxhighlighting_logging.h" #include "ksyntaxhighlighting_logging.h"
#include "ksyntaxhighlighting_version.h" #include "ksyntaxhighlighting_version.h"
#include <QDebug>
#include <QDir> #include <QDir>
#include <QFile> #include <QFile>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>

View File

@@ -30,7 +30,6 @@
#include "xml_p.h" #include "xml_p.h"
#include <QColor> #include <QColor>
#include <QDebug>
#include <QMetaEnum> #include <QMetaEnum>
#include <QXmlStreamReader> #include <QXmlStreamReader>
@@ -207,6 +206,46 @@ bool Format::spellCheck() const
return d->spellCheck; 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) void FormatPrivate::load(QXmlStreamReader& reader)
{ {

View File

@@ -28,7 +28,6 @@
#include "theme.h" #include "theme.h"
#include <QExplicitlySharedDataPointer> #include <QExplicitlySharedDataPointer>
#include <QTypeInfo>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QColor; class QColor;
@@ -139,6 +138,70 @@ public:
*/ */
bool spellCheck() const; 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: private:
friend class FormatPrivate; friend class FormatPrivate;
QExplicitlySharedDataPointer<FormatPrivate> d; QExplicitlySharedDataPointer<FormatPrivate> d;

View File

@@ -29,7 +29,6 @@
#include "theme.h" #include "theme.h"
#include "ksyntaxhighlighting_logging.h" #include "ksyntaxhighlighting_logging.h"
#include <QDebug>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QTextStream> #include <QTextStream>

View File

@@ -26,7 +26,6 @@
#include "definition_p.h" #include "definition_p.h"
#include "ksyntaxhighlighting_logging.h" #include "ksyntaxhighlighting_logging.h"
#include <QDebug>
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <algorithm> #include <algorithm>

View File

@@ -24,9 +24,8 @@
#ifndef KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H #ifndef KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H
#define KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H #define KSYNTAXHIGHLIGHTING_KEYWORDLIST_P_H
#include <QSet>
#include <QString> #include <QString>
#include <QVector> #include <QStringList>
#include <vector> #include <vector>
@@ -60,6 +59,14 @@ public:
return m_keywords; 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. */ /** Checks if @p str is a keyword in this list. */
bool contains(const QStringRef &str) const bool contains(const QStringRef &str) const
{ {

View File

@@ -30,7 +30,6 @@
#include "ksyntaxhighlighting_logging.h" #include "ksyntaxhighlighting_logging.h"
#include "wildcardmatcher_p.h" #include "wildcardmatcher_p.h"
#include <QDebug>
#include <QDirIterator> #include <QDirIterator>
#include <QFile> #include <QFile>
#include <QFileInfo> #include <QFileInfo>

View File

@@ -101,9 +101,6 @@ Definition Rule::definition() const
void Rule::setDefinition(const Definition &def) void Rule::setDefinition(const Definition &def)
{ {
m_def = 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) bool Rule::load(QXmlStreamReader &reader)
@@ -140,6 +137,9 @@ bool Rule::load(QXmlStreamReader &reader)
void Rule::resolveContext() void Rule::resolveContext()
{ {
m_context.resolve(m_def.definition()); 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) void Rule::resolveAttributeFormat(Context *lookupContext)
@@ -612,8 +612,10 @@ MatchResult RegExpr::doMatch(const QString& text, int offset, const QStringList
/** /**
* no match * 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()) if (text.size() - offset < m_word.size())
return offset; 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; return offset;
if (text.midRef(offset, m_word.size()).compare(m_word, m_caseSensitivity) != 0) if (text.midRef(offset, m_word.size()).compare(m_word, m_caseSensitivity) != 0)
return offset; 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 + m_word.size();
return offset; return offset;

View File

@@ -34,7 +34,6 @@
#include <QRegularExpression> #include <QRegularExpression>
#include <QString> #include <QString>
#include <QVector>
#include <memory> #include <memory>

View File

@@ -27,7 +27,6 @@
#include "ksyntaxhighlighting_export.h" #include "ksyntaxhighlighting_export.h"
#include <QExplicitlySharedDataPointer> #include <QExplicitlySharedDataPointer>
#include <QTypeInfo>
namespace KSyntaxHighlighting { namespace KSyntaxHighlighting {

View File

@@ -29,7 +29,6 @@
#include "state.h" #include "state.h"
#include "theme.h" #include "theme.h"
#include <QDebug>
Q_DECLARE_METATYPE(QTextBlock) Q_DECLARE_METATYPE(QTextBlock)

View File

@@ -24,7 +24,6 @@
#ifndef KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H #ifndef KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H
#define KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H #define KSYNTAXHIGHLIGHTING_TEXTSTYLEDATA_P_H
#include <QColor>
namespace KSyntaxHighlighting { namespace KSyntaxHighlighting {

View File

@@ -32,7 +32,6 @@
#include <QJsonValue> #include <QJsonValue>
#include <QMetaEnum> #include <QMetaEnum>
#include <QDebug>
using namespace KSyntaxHighlighting; using namespace KSyntaxHighlighting;

View File

@@ -251,7 +251,7 @@ public:
QdbDeviceWizard(QWidget *parent) QdbDeviceWizard(QWidget *parent)
: QWizard(parent) : QWizard(parent)
{ {
setWindowTitle(QdbDeviceWizard::tr("Boot2Qt Network Device Setup")); setWindowTitle(QdbDevice::tr("Boot2Qt Network Device Setup"));
settingsPage.setCommitPage(true); settingsPage.setCommitPage(true);
enum { SettingsPageId }; enum { SettingsPageId };

View File

@@ -34,6 +34,8 @@ namespace Internal {
class QdbDevice : public RemoteLinux::LinuxDevice class QdbDevice : public RemoteLinux::LinuxDevice
{ {
Q_DECLARE_TR_FUNCTIONS(Qdb::Internal::QdbDevice)
public: public:
typedef QSharedPointer<QdbDevice> Ptr; typedef QSharedPointer<QdbDevice> Ptr;
typedef QSharedPointer<const QdbDevice> ConstPtr; typedef QSharedPointer<const QdbDevice> ConstPtr;

View File

@@ -106,7 +106,7 @@ void ConfigModelItemDelegate::setModelData(QWidget *editor, QAbstractItemModel *
if (data.type == ConfigModel::DataItem::FILE || data.type == ConfigModel::DataItem::DIRECTORY) { if (data.type == ConfigModel::DataItem::FILE || data.type == ConfigModel::DataItem::DIRECTORY) {
auto edit = static_cast<Utils::PathChooser *>(editor); auto edit = static_cast<Utils::PathChooser *>(editor);
if (edit->rawPath() != data.value) if (edit->rawPath() != data.value)
model->setData(index, edit->fileName().toUserOutput(), Qt::EditRole); model->setData(index, edit->fileName().toString(), Qt::EditRole);
return; return;
} else if (!data.values.isEmpty()) { } else if (!data.values.isEmpty()) {
auto edit = static_cast<QComboBox *>(editor); auto edit = static_cast<QComboBox *>(editor);

View File

@@ -39,6 +39,7 @@ namespace Internal {
class CtfStatisticsModel : public QAbstractTableModel class CtfStatisticsModel : public QAbstractTableModel
{ {
Q_OBJECT
public: public:
enum Role { enum Role {

View File

@@ -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(); clearAll();

View File

@@ -99,8 +99,7 @@ GenericProjectPluginPrivate::GenericProjectPluginPrivate()
genericProject->editFilesTriggered(); genericProject->editFilesTriggered();
}); });
const auto removeDirAction = new QAction(GenericProjectPlugin::tr("Remove Directory"), this);
const auto removeDirAction = new QAction(tr("Remove Directory"), this);
Command * const cmd = ActionManager::registerAction(removeDirAction, "GenericProject.RemoveDir", Command * const cmd = ActionManager::registerAction(removeDirAction, "GenericProject.RemoveDir",
Context(PEC::C_PROJECT_TREE)); Context(PEC::C_PROJECT_TREE));
ActionManager::actionContainer(PEC::M_FOLDERCONTEXT)->addAction(cmd, PEC::G_FOLDER_OTHER); ActionManager::actionContainer(PEC::M_FOLDERCONTEXT)->addAction(cmd, PEC::G_FOLDER_OTHER);

View File

@@ -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()}; 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) if (flags & QTextDocument::FindWholeWords)
term = QString("\\b%1\\b").arg(term); term = QString("\\b%1\\b").arg(term);
const QRegularExpression::PatternOptions patternOptions const QRegularExpression::PatternOptions patternOptions

View File

@@ -79,14 +79,14 @@ public:
: BuildStepConfigWidget(buildStep), m_buildStep(buildStep) : BuildStepConfigWidget(buildStep), m_buildStep(buildStep)
{ {
auto buildArgumentsLabel = new QLabel(this); auto buildArgumentsLabel = new QLabel(this);
buildArgumentsLabel->setText(tr("Base arguments:")); buildArgumentsLabel->setText(IosBuildStep::tr("Base arguments:"));
m_buildArgumentsTextEdit = new QPlainTextEdit(this); m_buildArgumentsTextEdit = new QPlainTextEdit(this);
m_buildArgumentsTextEdit->setPlainText(QtcProcess::joinArgs(m_buildStep->baseArguments())); m_buildArgumentsTextEdit->setPlainText(QtcProcess::joinArgs(m_buildStep->baseArguments()));
m_resetDefaultsButton = new QPushButton(this); m_resetDefaultsButton = new QPushButton(this);
m_resetDefaultsButton->setLayoutDirection(Qt::RightToLeft); 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); m_resetDefaultsButton->setEnabled(!m_buildStep->m_useDefaultArguments);
auto extraArgumentsLabel = new QLabel(this); auto extraArgumentsLabel = new QLabel(this);
@@ -101,9 +101,9 @@ public:
gridLayout->addWidget(extraArgumentsLabel, 2, 0, 1, 1); gridLayout->addWidget(extraArgumentsLabel, 2, 0, 1, 1);
gridLayout->addWidget(m_extraArgumentsLineEdit, 2, 1, 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(); updateDetails();

View File

@@ -377,7 +377,7 @@ void Client::activateDocument(TextEditor::TextDocument *document)
for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) { for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) {
updateEditorToolBar(editor); updateEditorToolBar(editor);
if (auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor)) if (auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor))
textEditor->editorWidget()->addHoverHandler(hoverHandler()); textEditor->editorWidget()->addHoverHandler(&m_hoverHandler);
} }
} }
@@ -387,6 +387,10 @@ void Client::deactivateDocument(TextEditor::TextDocument *document)
resetAssistProviders(document); resetAssistProviders(document);
if (TextEditor::SyntaxHighlighter *highlighter = document->syntaxHighlighter()) if (TextEditor::SyntaxHighlighter *highlighter = document->syntaxHighlighter())
highlighter->clearAllExtraFormats(); highlighter->clearAllExtraFormats();
for (Core::IEditor *editor : Core::DocumentModel::editorsForDocument(document)) {
if (auto textEditor = qobject_cast<TextEditor::BaseTextEditor *>(editor))
textEditor->editorWidget()->removeHoverHandler(&m_hoverHandler);
}
} }
bool Client::documentOpen(TextEditor::TextDocument *document) const bool Client::documentOpen(TextEditor::TextDocument *document) const

View File

@@ -34,6 +34,7 @@ const char DEVICE_ID[] = "McuSupport.Device";
const char MCUSUPPORT_QT_VERSION[] = "Qt4ProjectManager.QtVersion.McuSupport"; const char MCUSUPPORT_QT_VERSION[] = "Qt4ProjectManager.QtVersion.McuSupport";
const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration"; const char RUNCONFIGURATION[] = "McuSupport.RunConfiguration";
const char SETTINGS_ID[] = "CC.McuSupport.Configuration"; const char SETTINGS_ID[] = "CC.McuSupport.Configuration";
const char KIT_BOARD_VENDOR_KEY[] = "McuSupport.BoardVendor";
const char KIT_BOARD_MODEL_KEY[] = "McuSupport.BoardModel"; const char KIT_BOARD_MODEL_KEY[] = "McuSupport.BoardModel";
const char ENVVAR_ARMGCC_DIR[] = "ARMGCC_DIR"; const char ENVVAR_ARMGCC_DIR[] = "ARMGCC_DIR";

View File

@@ -198,10 +198,13 @@ void PackageOptions::updateStatus()
m_statusLabel->setText(statusText); 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<PackageOptions*> &packages) const QVector<PackageOptions*> &packages)
: m_model(model) : m_vendor(vendor)
, m_model(model)
, m_toolChainFile(toolChainFileName) , m_toolChainFile(toolChainFileName)
, m_qulPlatform(qulPlatform)
, m_packages(packages) , m_packages(packages)
{ {
} }
@@ -216,11 +219,21 @@ QString BoardOptions::toolChainFile() const
return m_toolChainFile; return m_toolChainFile;
} }
QString BoardOptions::qulPlatform() const
{
return m_qulPlatform;
}
QVector<PackageOptions *> BoardOptions::packages() const QVector<PackageOptions *> BoardOptions::packages() const
{ {
return m_packages; return m_packages;
} }
QString BoardOptions::vendor() const
{
return m_vendor;
}
static PackageOptions *createQulPackage() static PackageOptions *createQulPackage()
{ {
auto result = new PackageOptions( auto result = new PackageOptions(
@@ -313,7 +326,8 @@ static PackageOptions *createSeggerJLinkPackage()
{ {
const QString defaultPath = const QString defaultPath =
Utils::HostOsInfo::isWindowsHost() ? Utils::HostOsInfo::isWindowsHost() ?
QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles")) + "/SEGGER/JLink" QDir::fromNativeSeparators(qEnvironmentVariable("ProgramFiles(x86)"))
+ "/SEGGER/JLink"
: QString("%{Env:SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH}"); : QString("%{Env:SEGGER_JLINK_SOFTWARE_AND_DOCUMENTATION_PATH}");
auto result = new PackageOptions( auto result = new PackageOptions(
PackageOptions::tr("SEGGER JLink"), PackageOptions::tr("SEGGER JLink"),
@@ -342,15 +356,21 @@ McuSupportOptions::McuSupportOptions(QObject *parent)
qulPackage}; qulPackage};
auto nxpPackages = {armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage, auto nxpPackages = {armGccPackage, evkbImxrt1050SdkPackage, seggerJLinkPackage,
qulPackage}; qulPackage};
auto desktopPackages = {qulPackage};
packages = {armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage, packages = {armGccPackage, stm32CubeFwF7SdkPackage, stm32CubeProgrammerPackage,
evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage}; evkbImxrt1050SdkPackage, seggerJLinkPackage, qulPackage};
boards.append(new BoardOptions( const QString vendorStm = "STM";
"stm32f7508", "CMake/stm32f7508-discovery.cmake", stmPackages)); const QString vendorNxp = "NXP";
boards.append(new BoardOptions( const QString vendorQt = "Qt";
"stm32f769i", "CMake/stm32f769i-discovery.cmake", stmPackages)); boards.append(new BoardOptions(vendorStm,
boards.append(new BoardOptions( "stm32f7508", "CMake/stm32f7508-discovery.cmake", "", stmPackages));
"evkbimxrt1050", "CMake/evkbimxrt1050-toolchain.cmake", nxpPackages)); 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) for (auto package : packages)
connect(package, &PackageOptions::changed, [this](){ connect(package, &PackageOptions::changed, [this](){
@@ -400,17 +420,24 @@ static ProjectExplorer::ToolChain* armGccToolchain(const Utils::FilePath &path,
return toolChain; return toolChain;
} }
static bool isDesktop(const BoardOptions* board)
{
return board->qulPlatform() == "Qt";
}
static void setKitProperties(ProjectExplorer::Kit *k, const BoardOptions* board) static void setKitProperties(ProjectExplorer::Kit *k, const BoardOptions* board)
{ {
using namespace ProjectExplorer; 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->setValue(Constants::KIT_BOARD_MODEL_KEY, board->model());
k->setAutoDetected(false); k->setAutoDetected(false);
k->setIrrelevantAspects({ if (!isDesktop(board)) {
SysRootKitAspect::id(), k->setIrrelevantAspects({SysRootKitAspect::id(),
"QtSupport.QtInformation" // QtKitAspect::id() "QtSupport.QtInformation" // QtKitAspect::id()
}); });
}
} }
static void setKitToolchains(ProjectExplorer::Kit *k, const QString &armGccPath) 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; using namespace CMakeProjectManager;
CMakeConfig config = CMakeConfigurationKitAspect::configuration(k); CMakeConfig config = CMakeConfigurationKitAspect::configuration(k);
if (!board->toolChainFile().isEmpty())
config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE", config.append(CMakeConfigItem("CMAKE_TOOLCHAIN_FILE",
("%{CurrentBuild:Env:Qul_DIR}/" + ("%{CurrentBuild:Env:Qul_DIR}/" +
board->toolChainFile()).toUtf8())); 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); CMakeConfigurationKitAspect::setConfiguration(k, config);
if (Utils::HostOsInfo::isWindowsHost()) if (Utils::HostOsInfo::isWindowsHost())
CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM"); CMakeGeneratorKitAspect::setGenerator(k, "NMake Makefiles JOM");
@@ -504,9 +540,11 @@ ProjectExplorer::Kit *McuSupportOptions::kit(const BoardOptions* board)
KitGuard kitGuard(k); KitGuard kitGuard(k);
setKitProperties(k, board); setKitProperties(k, board);
if (!isDesktop(board)) {
setKitToolchains(k, armGccPath); setKitToolchains(k, armGccPath);
setKitDebugger(k, armGccPath); setKitDebugger(k, armGccPath);
setKitDevice(k); setKitDevice(k);
}
setKitEnvironment(k, board); setKitEnvironment(k, board);
setKitCMakeOptions(k, board); setKitCMakeOptions(k, board);

View File

@@ -101,16 +101,20 @@ class BoardOptions : public QObject
Q_OBJECT Q_OBJECT
public: public:
BoardOptions(const QString &model, const QString &toolChainFile, BoardOptions(const QString &vendor, const QString &model, const QString &toolChainFile,
const QVector<PackageOptions *> &packages); const QString &qulPlatform, const QVector<PackageOptions *> &packages);
QString vendor() const;
QString model() const; QString model() const;
QString toolChainFile() const; QString toolChainFile() const;
QString qulPlatform() const;
QVector<PackageOptions *> packages() const; QVector<PackageOptions *> packages() const;
private: private:
const QString m_vendor;
const QString m_model; const QString m_model;
const QString m_toolChainFile; const QString m_toolChainFile;
const QString m_qulPlatform;
const QVector<PackageOptions*> m_packages; const QVector<PackageOptions*> m_packages;
}; };

View File

@@ -108,14 +108,14 @@ void McuSupportOptionsWidget::updateStatus()
{ {
const QVector<BoardOptions*> validBoards = m_options->validBoards(); const QVector<BoardOptions*> validBoards = m_options->validBoards();
m_statusLabel->setText(validBoards.isEmpty() m_statusLabel->setText(validBoards.isEmpty()
? McuSupportOptionsPage::tr("No devices and kits can currently be generated. " ? McuSupportOptionsPage::tr("No kits can currently be generated. "
"Select a board and provide the package paths. " "Select a target and provide the package paths. "
"Afterwards, press Apply to generate device and kit for " "Afterwards, press Apply to generate a kit for "
"your board.") "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 " "%1 "
"Press Apply to generate device and kit for " "Press Apply to generate a kit for "
"your board.").arg(ulOfBoardModels(validBoards))); "your target.").arg(ulOfBoardModels(validBoards)));
} }
void McuSupportOptionsWidget::showBoardPackages(int boardIndex) void McuSupportOptionsWidget::showBoardPackages(int boardIndex)

View File

@@ -49,24 +49,26 @@ static CommandLine flashAndRunCommand(Target *target)
const CMakeProjectManager::CMakeTool *tool = const CMakeProjectManager::CMakeTool *tool =
CMakeProjectManager::CMakeKitAspect::cmakeTool(target->kit()); 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(), { return CommandLine(tool->filePath(), {
"--build", "--build",
".", ".",
"--target", "--target",
QString("flash_%1_and_bootloader").arg(projectName) targetName
}); });
} }
class FlashAndRunConfiguration : public ProjectExplorer::RunConfiguration FlashAndRunConfiguration::FlashAndRunConfiguration(Target *target, Core::Id id)
{
public:
FlashAndRunConfiguration(Target *target, Core::Id id)
: RunConfiguration(target, id) : RunConfiguration(target, id)
{ {
auto effectiveFlashAndRunCall = addAspect<BaseStringAspect>(); auto effectiveFlashAndRunCall = addAspect<BaseStringAspect>();
effectiveFlashAndRunCall->setLabelText(tr("Effective flash and run call:")); effectiveFlashAndRunCall->setLabelText(tr("Effective flash and run call:"));
effectiveFlashAndRunCall->setDisplayStyle(BaseStringAspect::TextEditDisplay); effectiveFlashAndRunCall->setDisplayStyle(BaseStringAspect::TextEditDisplay);
effectiveFlashAndRunCall->setReadOnly(true);
auto updateConfiguration = [target, effectiveFlashAndRunCall] { auto updateConfiguration = [target, effectiveFlashAndRunCall] {
effectiveFlashAndRunCall->setValue(flashAndRunCommand(target).toUserOutput()); effectiveFlashAndRunCall->setValue(flashAndRunCommand(target).toUserOutput());
@@ -74,12 +76,12 @@ public:
updateConfiguration(); updateConfiguration();
connect(target->activeBuildConfiguration(), &BuildConfiguration::buildDirectoryChanged, connect(target->activeBuildConfiguration(),
this, updateConfiguration); &BuildConfiguration::buildDirectoryChanged,
connect(target->project(), &Project::displayNameChanged, this,
this, updateConfiguration); updateConfiguration);
} connect(target->project(), &Project::displayNameChanged, this, updateConfiguration);
}; }
class FlashAndRunWorker : public SimpleTargetRunner class FlashAndRunWorker : public SimpleTargetRunner
{ {

View File

@@ -37,6 +37,14 @@ public:
EmrunRunConfigurationFactory(); EmrunRunConfigurationFactory();
}; };
class FlashAndRunConfiguration : public ProjectExplorer::RunConfiguration
{
Q_OBJECT
public:
FlashAndRunConfiguration(ProjectExplorer::Target *target, Core::Id id);
};
ProjectExplorer::RunWorkerFactory::WorkerCreator makeFlashAndRunWorker(); ProjectExplorer::RunWorkerFactory::WorkerCreator makeFlashAndRunWorker();
} // namespace Internal } // namespace Internal

View File

@@ -73,12 +73,20 @@ void EnvironmentAspect::setUserEnvironmentChanges(const Utils::EnvironmentItems
Utils::Environment EnvironmentAspect::environment() const Utils::Environment EnvironmentAspect::environment() const
{ {
QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return Environment()); Environment env = modifiedBaseEnvironment();
Environment env = baseEnvironment();
env.modify(m_userChanges); env.modify(m_userChanges);
return env; 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 const QStringList EnvironmentAspect::displayNames() const
{ {
return Utils::transform(m_baseEnvironments, &BaseEnvironment::displayName); 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)); 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 QString EnvironmentAspect::currentDisplayName() const
{ {
QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return {}); QTC_ASSERT(m_base >= 0 && m_base < m_baseEnvironments.size(), return {});

View File

@@ -46,6 +46,9 @@ public:
// The environment including the user's modifications. // The environment including the user's modifications.
Utils::Environment environment() const; Utils::Environment environment() const;
// Environment including modifiers, but without explicit user changes.
Utils::Environment modifiedBaseEnvironment() const;
int baseEnvironmentBase() const; int baseEnvironmentBase() const;
void setBaseEnvironmentBase(int base); void setBaseEnvironmentBase(int base);
@@ -57,8 +60,6 @@ public:
void addPreferredBaseEnvironment(const QString &displayName, void addPreferredBaseEnvironment(const QString &displayName,
const std::function<Utils::Environment()> &getter); const std::function<Utils::Environment()> &getter);
// The environment the user chose as base for his modifications.
Utils::Environment baseEnvironment() const;
QString currentDisplayName() const; QString currentDisplayName() const;
const QStringList displayNames() const; const QStringList displayNames() const;

View File

@@ -75,7 +75,7 @@ EnvironmentAspectWidget::EnvironmentAspectWidget(EnvironmentAspect *aspect, QWid
const EnvironmentWidget::Type widgetType = aspect->isLocal() const EnvironmentWidget::Type widgetType = aspect->isLocal()
? EnvironmentWidget::TypeLocal : EnvironmentWidget::TypeRemote; ? EnvironmentWidget::TypeLocal : EnvironmentWidget::TypeRemote;
m_environmentWidget = new EnvironmentWidget(this, widgetType, baseEnvironmentWidget); 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->setBaseEnvironmentText(m_aspect->currentDisplayName());
m_environmentWidget->setUserChanges(m_aspect->userEnvironmentChanges()); m_environmentWidget->setUserChanges(m_aspect->userEnvironmentChanges());
m_environmentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_environmentWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
@@ -106,7 +106,7 @@ void EnvironmentAspectWidget::baseEnvironmentSelected(int idx)
{ {
m_ignoreChange = true; m_ignoreChange = true;
m_aspect->setBaseEnvironmentBase(idx); m_aspect->setBaseEnvironmentBase(idx);
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName()); m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName());
m_ignoreChange = false; m_ignoreChange = false;
} }
@@ -122,7 +122,7 @@ void EnvironmentAspectWidget::changeBaseEnvironment()
m_baseEnvironmentComboBox->setCurrentIndex(i); m_baseEnvironmentComboBox->setCurrentIndex(i);
} }
m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName()); m_environmentWidget->setBaseEnvironmentText(m_aspect->currentDisplayName());
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
} }
void EnvironmentAspectWidget::userChangesEdited() void EnvironmentAspectWidget::userChangesEdited()
@@ -143,7 +143,7 @@ void EnvironmentAspectWidget::environmentChanged()
{ {
if (m_ignoreChange) if (m_ignoreChange)
return; return;
m_environmentWidget->setBaseEnvironment(m_aspect->baseEnvironment()); m_environmentWidget->setBaseEnvironment(m_aspect->modifiedBaseEnvironment());
} }
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -499,9 +499,10 @@ public:
class TreeView : public QTreeView class TreeView : public QTreeView
{ {
public: public:
TreeView(QWidget *parent) TreeView(QWidget *parent, const QString &name)
: QTreeView(parent) : QTreeView(parent)
{ {
setObjectName(name);
header()->hide(); header()->hide();
setMouseTracking(true); // To enable hover. setMouseTracking(true); // To enable hover.
setIndentation(0); setIndentation(0);
@@ -559,13 +560,13 @@ public:
recentProjectsLabel->setFont(sizedFont(16, this)); recentProjectsLabel->setFont(sizedFont(16, this));
recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects")); recentProjectsLabel->setText(ProjectWelcomePage::tr("Projects"));
auto sessionsList = new TreeView(this); auto sessionsList = new TreeView(this, "Sessions");
sessionsList->setModel(projectWelcomePage->m_sessionModel); sessionsList->setModel(projectWelcomePage->m_sessionModel);
sessionsList->header()->setSectionHidden(1, true); // The "last modified" column. sessionsList->header()->setSectionHidden(1, true); // The "last modified" column.
sessionsList->setItemDelegate(&m_sessionDelegate); sessionsList->setItemDelegate(&m_sessionDelegate);
sessionsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); sessionsList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
auto projectsList = new TreeView(this); auto projectsList = new TreeView(this, "Recent Projects");
projectsList->setUniformRowHeights(true); projectsList->setUniformRowHeights(true);
projectsList->setModel(projectWelcomePage->m_projectModel); projectsList->setModel(projectWelcomePage->m_projectModel);
projectsList->setItemDelegate(&m_projectDelegate); projectsList->setItemDelegate(&m_projectDelegate);

View File

@@ -408,9 +408,13 @@ void Target::addRunConfiguration(RunConfiguration *rc)
// Check that we don't have a configuration with the same displayName // Check that we don't have a configuration with the same displayName
QString configurationDisplayName = rc->displayName(); QString configurationDisplayName = rc->displayName();
QStringList displayNames = Utils::transform(d->m_runConfigurations, &RunConfiguration::displayName); if (!configurationDisplayName.isEmpty()) {
configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName, displayNames); QStringList displayNames = Utils::transform(d->m_runConfigurations,
&RunConfiguration::displayName);
configurationDisplayName = Utils::makeUniquelyNumbered(configurationDisplayName,
displayNames);
rc->setDisplayName(configurationDisplayName); rc->setDisplayName(configurationDisplayName);
}
d->m_runConfigurations.push_back(rc); d->m_runConfigurations.push_back(rc);

View File

@@ -10,6 +10,7 @@ QtcPlugin {
Depends { name: "TextEditor" } Depends { name: "TextEditor" }
Depends { name: "ProjectExplorer" } Depends { name: "ProjectExplorer" }
Depends { name: "LanguageClient" } Depends { name: "LanguageClient" }
Depends { name: "LanguageServerProtocol" }
Group { Group {
name: "General" name: "General"

View File

@@ -62,9 +62,9 @@ public:
, m_executable(new Utils::PathChooser()) , m_executable(new Utils::PathChooser())
{ {
auto mainLayout = new QGridLayout(); 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(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); mainLayout->addWidget(m_executable, 1, 1);
m_executable->setExpectedKind(Utils::PathChooser::ExistingCommand); m_executable->setExpectedKind(Utils::PathChooser::ExistingCommand);
setLayout(mainLayout); setLayout(mainLayout);
@@ -138,12 +138,12 @@ InterpreterOptionsWidget::InterpreterOptionsWidget(const QList<Interpreter> &int
this, this,
&InterpreterOptionsWidget::currentChanged); &InterpreterOptionsWidget::currentChanged);
auto buttonLayout = new QVBoxLayout(); 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); 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); m_deleteButton->setEnabled(false);
connect(m_deleteButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::deleteItem); 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); m_makeDefaultButton->setEnabled(false);
connect(m_makeDefaultButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::makeDefault); connect(m_makeDefaultButton, &QPushButton::pressed, this, &InterpreterOptionsWidget::makeDefault);
mainLayout->addLayout(layout); mainLayout->addLayout(layout);
@@ -230,9 +230,9 @@ private:
InterpreterOptionsPage::InterpreterOptionsPage() InterpreterOptionsPage::InterpreterOptionsPage()
{ {
setId(Constants::C_PYTHONOPTIONS_PAGE_ID); setId(Constants::C_PYTHONOPTIONS_PAGE_ID);
setDisplayName(tr("Interpreters")); setDisplayName(PythonSettings::tr("Interpreters"));
setCategory(Constants::C_PYTHON_SETTINGS_CATEGORY); setCategory(Constants::C_PYTHON_SETTINGS_CATEGORY);
setDisplayCategory(tr("Python")); setDisplayCategory(PythonSettings::tr("Python"));
setCategoryIcon(Utils::Icon({{":/python/images/settingscategory_python.png", setCategoryIcon(Utils::Icon({{":/python/images/settingscategory_python.png",
Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint)); Utils::Theme::PanelTextColorDark}}, Utils::Icon::Tint));
} }
@@ -385,7 +385,7 @@ static void addPythonsFromRegistry(QList<Interpreter> &pythons)
const FilePath &executable = FilePath::fromUserInput(regVal.toString()); const FilePath &executable = FilePath::fromUserInput(regVal.toString());
if (executable.exists() && !alreadyRegistered(pythons, executable)) { if (executable.exists() && !alreadyRegistered(pythons, executable)) {
pythons << Interpreter{QUuid::createUuid().toString(), pythons << Interpreter{QUuid::createUuid().toString(),
name + InterpreterOptionsPage::tr(" (Windowed)"), name + PythonSettings::tr(" (Windowed)"),
FilePath::fromUserInput(regVal.toString())}; FilePath::fromUserInput(regVal.toString())};
} }
} }

View File

@@ -355,7 +355,7 @@ void QbsInstallStepConfigWidget::updateState()
m_commandLineTextEdit->setPlainText(command); m_commandLineTextEdit->setPlainText(command);
setSummaryText(tr("<b>Qbs:</b> %1").arg(command)); setSummaryText(QbsInstallStep::tr("<b>Qbs:</b> %1").arg(command));
} }
// -------------------------------------------------------------------- // --------------------------------------------------------------------

View File

@@ -84,7 +84,7 @@ protected:
bool visit(AST::UiPublicMember *node) override 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)); const ObjectValue * objectValue = m_context->lookupType(m_document.data(), QStringList(m_typeName));
if (objectValue == m_typeValue) if (objectValue == m_typeValue)
m_implemenations.append(node->typeToken); m_implemenations.append(node->typeToken);

View File

@@ -109,7 +109,7 @@ void AlignDistribute::setModelNodeBackend(const QVariant &modelNodeBackend)
// The purpose of this function is to suppress the following warning: // The purpose of this function is to suppress the following warning:
// Warning: Property declaration modelNodeBackendProperty has no READ accessor // Warning: Property declaration modelNodeBackendProperty has no READ accessor
// function or associated MEMBER variable. The property will be invalid. // function or associated MEMBER variable. The property will be invalid.
QVariant AlignDistribute::getModelNodeBackend() const QVariant AlignDistribute::modelNodeBackend() const
{ {
return {}; return {};
} }

View File

@@ -44,7 +44,7 @@ class AlignDistribute : public QObject
Q_PROPERTY(bool selectionContainsRootItem READ selectionContainsRootItem NOTIFY Q_PROPERTY(bool selectionContainsRootItem READ selectionContainsRootItem NOTIFY
modelNodeBackendChanged) modelNodeBackendChanged)
Q_PROPERTY(QVariant modelNodeBackendProperty READ getModelNodeBackend WRITE setModelNodeBackend Q_PROPERTY(QVariant modelNodeBackendProperty READ modelNodeBackend WRITE setModelNodeBackend
NOTIFY modelNodeBackendChanged) NOTIFY modelNodeBackendChanged)
public: public:
@@ -68,7 +68,6 @@ public:
bool selectionContainsRootItem() const; bool selectionContainsRootItem() const;
void setModelNodeBackend(const QVariant &modelNodeBackend); void setModelNodeBackend(const QVariant &modelNodeBackend);
QVariant getModelNodeBackend() const;
static void registerDeclarativeType(); static void registerDeclarativeType();
@@ -83,6 +82,9 @@ public:
signals: signals:
void modelNodeBackendChanged(); void modelNodeBackendChanged();
private:
QVariant modelNodeBackend() const;
private: private:
using CompareFunction = std::function<bool(const ModelNode &, const ModelNode &)>; using CompareFunction = std::function<bool(const ModelNode &, const ModelNode &)>;

View File

@@ -164,6 +164,7 @@ public:
bool hasModelNodeForInternalId(qint32 internalId) const; bool hasModelNodeForInternalId(qint32 internalId) const;
QList<ModelNode> allModelNodes() const; QList<ModelNode> allModelNodes() const;
QList<ModelNode> allModelNodesOfType(const TypeName &typeName) const;
void emitDocumentMessage(const QList<DocumentMessage> &errors, const QList<DocumentMessage> &warnings = QList<DocumentMessage>()); void emitDocumentMessage(const QList<DocumentMessage> &errors, const QList<DocumentMessage> &warnings = QList<DocumentMessage>());
void emitDocumentMessage(const QString &error); void emitDocumentMessage(const QString &error);

View File

@@ -107,6 +107,8 @@ public:
bool hasParentProperty() const; bool hasParentProperty() const;
const QList<ModelNode> directSubModelNodes() const; const QList<ModelNode> directSubModelNodes() const;
const QList<ModelNode> directSubModelNodesOfType(const TypeName &typeName) const;
const QList<ModelNode> allSubModelNodes() const; const QList<ModelNode> allSubModelNodes() const;
const QList<ModelNode> allSubModelNodesAndThisNode() const; const QList<ModelNode> allSubModelNodesAndThisNode() const;
bool hasAnySubModelNodes() const; bool hasAnySubModelNodes() const;

View File

@@ -57,14 +57,7 @@ public:
const QPointF &position, const QPointF &position,
QmlItemNode parentQmlItemNode); 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, static QmlItemNode createQmlItemNodeFromImage(AbstractView *view,
const QString &imageName, const QString &imageName,
const QPointF &position, const QPointF &position,

View File

@@ -33,6 +33,7 @@
#include <QStringList> #include <QStringList>
#include <QRectF> #include <QRectF>
#include <QTransform> #include <QTransform>
#include <QVector3D>
namespace QmlDesigner { namespace QmlDesigner {
@@ -44,6 +45,26 @@ class QMLDESIGNERCORE_EXPORT QmlVisualNode : public QmlObjectNode
{ {
friend class QmlAnchors; friend class QmlAnchors;
public: public:
class Position
{
friend class QmlVisualNode;
public:
Position() {}
Position(const QPointF &position) :
m_2dPos(position)
{}
Position(const QVector3D &position) :
m_3dPos(position)
{}
QList<QPair<PropertyName, QVariant>> propertyPairList() const;
private:
QPointF m_2dPos;
QVector3D m_3dPos;
};
QmlVisualNode() : QmlObjectNode() {} QmlVisualNode() : QmlObjectNode() {}
QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {} QmlVisualNode(const ModelNode &modelNode) : QmlObjectNode(modelNode) {}
bool isValid() const override; bool isValid() const override;
@@ -64,7 +85,31 @@ public:
void setVisibilityOverride(bool visible); void setVisibilityOverride(bool visible);
bool visibilityOverride() const; bool visibilityOverride() const;
void initializePosition(const Position &position);
static bool isItemOr3DNode(const ModelNode &modelNode); 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); QMLDESIGNERCORE_EXPORT uint qHash(const QmlItemNode &node);

View File

@@ -39,6 +39,7 @@
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/algorithm.h>
#include <QRegExp> #include <QRegExp>
@@ -635,6 +636,13 @@ QList<ModelNode> AbstractView::allModelNodes() const
return toModelNodeList(model()->d->allNodes()); return toModelNodeList(model()->d->allNodes());
} }
QList<ModelNode> 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) void AbstractView::emitDocumentMessage(const QString &error)
{ {
emitDocumentMessage({DocumentMessage(error)}); emitDocumentMessage({DocumentMessage(error)});

View File

@@ -42,6 +42,8 @@
#include "nodeproperty.h" #include "nodeproperty.h"
#include <rewriterview.h> #include <rewriterview.h>
#include <utils/algorithm.h>
#include <QHash> #include <QHash>
#include <QRegExp> #include <QRegExp>
#include <QSet> #include <QSet>
@@ -775,6 +777,13 @@ const QList<ModelNode> ModelNode::directSubModelNodes() const
return toModelNodeList(internalNode()->allDirectSubNodes(), view()); return toModelNodeList(internalNode()->allDirectSubNodes(), view());
} }
const QList<ModelNode> 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 \brief returns all ModelNodes that are direct or indirect children of this ModelNode

View File

@@ -93,75 +93,6 @@ QmlItemNode QmlItemNode::createQmlItemNode(AbstractView *view,
return QmlItemNode(createQmlObjectNode(view, itemLibraryEntry, position, parentQmlItemNode)); 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<PropertyName, QString>;
QList<PropertyBindingEntry> propertyBindingList;
QList<PropertyBindingEntry> propertyEnumList;
if (itemLibraryEntry.qmlSource().isEmpty()) {
QList<QPair<PropertyName, QVariant> > 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) QmlItemNode QmlItemNode::createQmlItemNodeFromImage(AbstractView *view, const QString &imageName, const QPointF &position, QmlItemNode parentQmlItemNode)
{ {
if (!parentQmlItemNode.isValid()) if (!parentQmlItemNode.isValid())

View File

@@ -39,6 +39,8 @@
#include "modelmerger.h" #include "modelmerger.h"
#include "rewritingexception.h" #include "rewritingexception.h"
#include <utils/qtcassert.h>
#include <QUrl> #include <QUrl>
#include <QPlainTextEdit> #include <QPlainTextEdit>
#include <QFileInfo> #include <QFileInfo>
@@ -74,7 +76,6 @@ bool QmlVisualNode::isRootNode() const
return modelNode().isValid() && modelNode().isRootNode(); return modelNode().isValid() && modelNode().isRootNode();
} }
QList<QmlVisualNode> QmlVisualNode::children() const QList<QmlVisualNode> QmlVisualNode::children() const
{ {
QList<ModelNode> childrenList; QList<ModelNode> childrenList;
@@ -166,6 +167,23 @@ bool QmlVisualNode::visibilityOverride() const
return false; 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 QmlModelStateGroup QmlVisualNode::states() const
{ {
if (isValid()) if (isValid())
@@ -174,6 +192,131 @@ QmlModelStateGroup QmlVisualNode::states() const
return QmlModelStateGroup(); 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<Model> inputModel(Model::create("QtQuick.Item", 1, 0, view->model()));
inputModel->setFileUrl(view->model()->fileUrl());
QPlainTextEdit textEdit;
textEdit.setPlainText(source);
NotIndentingTextEditModifier modifier(&textEdit);
QScopedPointer<RewriterView> 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<PropertyName, QString>;
QList<PropertyBindingEntry> propertyBindingList;
QList<PropertyBindingEntry> propertyEnumList;
if (itemLibraryEntry.qmlSource().isEmpty()) {
QList<QPair<PropertyName, QVariant> > 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<ModelNode> quickViews = view->allModelNodesOfType("QtQuick3D.View3D");
QTC_ASSERT(!quickViews.isEmpty(), return {});
const ModelNode quickView = quickViews.first();
QList<ModelNode> nodes = quickView.directSubModelNodesOfType("QtQuick3D.Node");
QTC_ASSERT(!nodes.isEmpty(), return {});
const ModelNode node = nodes.first();
return node.defaultNodeListProperty();
}
QList<ModelNode> toModelNodeList(const QList<QmlVisualNode> &qmlVisualNodeList) QList<ModelNode> toModelNodeList(const QList<QmlVisualNode> &qmlVisualNodeList)
{ {
QList<ModelNode> modelNodeList; QList<ModelNode> modelNodeList;
@@ -263,4 +406,20 @@ QmlModelState QmlModelStateGroup::state(const QString &name) const
return QmlModelState(); return QmlModelState();
} }
QList<QPair<PropertyName, QVariant> > QmlVisualNode::Position::propertyPairList() const
{
QList<QPair<PropertyName, QVariant> > 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 } //QmlDesigner

View File

@@ -200,7 +200,7 @@ QmlPreviewPluginPrivate::QmlPreviewPluginPrivate(QmlPreviewPlugin *parent)
Core::Context projectTreeContext(Constants::C_PROJECT_TREE); Core::Context projectTreeContext(Constants::C_PROJECT_TREE);
menu = Core::ActionManager::actionContainer(Constants::M_FILECONTEXT); 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); action->setEnabled(false);
connect(q, &QmlPreviewPlugin::runningPreviewsChanged, connect(q, &QmlPreviewPlugin::runningPreviewsChanged,
action, [action](const QmlPreviewRunControlList &previews) { action, [action](const QmlPreviewRunControlList &previews) {

Some files were not shown because too many files have changed in this diff Show More